Fixed a bug in the gpio readall command on model B's (caused by a side-effect

of changing it for the B+)

Aded a gpio command: usbp hi/low - to change the usb power
This commit is contained in:
Gordon Henderson
2014-07-17 22:23:57 +01:00
parent dca8a19fb8
commit df45388f64
8 changed files with 308 additions and 293 deletions

View File

@@ -13,11 +13,11 @@ gpio \- Command-line access to Raspberry Pi's GPIO
.PP
.B gpio
.B [ \-x extension:params ]
.B mode/read/write/aread/awrite/pwm ...
.B mode/read/write/aread/awrite/pwm/pwmTone ...
.PP
.B gpio
.B [ \-p ]
.B read/write/wb
.B read/write/toggle/wb
.B ...
.PP
.B gpio
@@ -39,6 +39,10 @@ gpio \- Command-line access to Raspberry Pi's GPIO
group value
.PP
.B gpio
.B usbp
high | low
.PP
.B gpio
.B pwm-bal/pwm-ms
.PP
.B gpio
@@ -231,6 +235,13 @@ Change the pad driver value for the given pad group to the supplied drive
value. Group is 0, 1 or 2 and value is 0-7. Do not use unless you are
absolutely sure you know what you're doing.
.TP
.B usbp
high | low
Change the USB current limiter to high (1.2 amps) or low (the default, 600mA)
This is only applicable to the model B+
.TP
.B pwm-bal/pwm-ms
Change the PWM mode to balanced (the default) or mark:space ratio (traditional)

View File

@@ -46,8 +46,6 @@ extern int wiringPiDebug ;
// External functions I can't be bothered creating a separate .h file for:
extern void doReadall (void) ;
extern void doReadallOld (void) ;
extern void doPins (void) ;
#ifndef TRUE
@@ -55,8 +53,9 @@ extern void doPins (void) ;
# define FALSE (1==2)
#endif
#define VERSION "2.18"
#define I2CDETECT "/usr/sbin/i2cdetect"
#define VERSION "2.20"
#define PI_USB_POWER_CONTROL 38
#define I2CDETECT "/usr/sbin/i2cdetect"
int wpMode ;
@@ -75,6 +74,7 @@ char *usage = "Usage: gpio -v\n"
" gpio pwmc <divider> \n"
" gpio load spi/i2c\n"
" gpio i2cd/i2cdetect\n"
" gpio usbp high/low\n"
" gpio gbr <channel>\n"
" gpio gbw <channel> <value>" ; // No trailing newline needed here.
@@ -717,6 +717,58 @@ static void doPadDrive (int argc, char *argv [])
}
/*
* doUsbP:
* Control USB Power - High (1.2A) or Low (600mA)
* gpio usbp high/low
*********************************************************************************
*/
static void doUsbP (int argc, char *argv [])
{
int model, rev, mem, maker, overVolted ;
if (argc != 3)
{
fprintf (stderr, "Usage: %s usbp high|low\n", argv [0]) ;
exit (1) ;
}
// Make sure we're on a B+
piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
if (model != PI_MODEL_BP)
{
fprintf (stderr, "USB power contol is applicable to B+ boards only.\n") ;
exit (1) ;
}
// Need to force BCM_GPIO mode:
wiringPiSetupGpio () ;
if ((strcasecmp (argv [2], "high") == 0) || (strcasecmp (argv [2], "hi") == 0))
{
digitalWrite (PI_USB_POWER_CONTROL, 1) ;
pinMode (PI_USB_POWER_CONTROL, OUTPUT) ;
printf ("Switched to HIGH current USB (1.2A)\n") ;
return ;
}
if ((strcasecmp (argv [2], "low") == 0) || (strcasecmp (argv [2], "lo") == 0))
{
digitalWrite (PI_USB_POWER_CONTROL, 0) ;
pinMode (PI_USB_POWER_CONTROL, OUTPUT) ;
printf ("Switched to LOW current USB (600mA)\n") ;
return ;
}
fprintf (stderr, "Usage: %s usbp high|low\n", argv [0]) ;
exit (1) ;
}
/*
* doGbw:
* gpio gbw channel value
@@ -1069,8 +1121,7 @@ static void doPwmClock (int argc, char *argv [])
int main (int argc, char *argv [])
{
int i ;
int model, rev, mem ;
char *maker ;
int model, rev, mem, maker, overVolted ;
if (getenv ("WIRINGPI_DEBUG") != NULL)
{
@@ -1115,10 +1166,19 @@ int main (int argc, char *argv [])
printf ("This is free software with ABSOLUTELY NO WARRANTY.\n") ;
printf ("For details type: %s -warranty\n", argv [0]) ;
printf ("\n") ;
piBoardId (&model, &rev, &mem, &maker) ;
printf ("Raspberry Pi Details:\n") ;
printf (" Type: %s, Revision: %s, Memory: %dMB, Maker: %s\n",
piModelNames [model], piRevisionNames [rev], mem, maker) ;
piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
if (model == PI_MODEL_UNKNOWN)
{
printf ("Your Raspberry Pi has an unknown model type. Please report this to\n") ;
printf (" projects@drogon.net\n") ;
printf ("with a copy of your /proc/cpuinfo if possible\n") ;
}
else
{
printf ("Raspberry Pi Details:\n") ;
printf (" Type: %s, Revision: %s, Memory: %dMB, Maker: %s %s\n",
piModelNames [model], piRevisionNames [rev], mem, piMakerNames [maker], overVolted ? "[OV]" : "") ;
}
return 0 ;
}
@@ -1255,7 +1315,8 @@ int main (int argc, char *argv [])
else if (strcasecmp (argv [1], "pwmc" ) == 0) doPwmClock (argc, argv) ;
else if (strcasecmp (argv [1], "pwmTone" ) == 0) doPwmTone (argc, argv) ;
else if (strcasecmp (argv [1], "drive" ) == 0) doPadDrive (argc, argv) ;
else if (strcasecmp (argv [1], "readall" ) == 0) doReadallOld () ;
else if (strcasecmp (argv [1], "usbp" ) == 0) doUsbP (argc, argv) ;
else if (strcasecmp (argv [1], "readall" ) == 0) doReadall () ;
else if (strcasecmp (argv [1], "nreadall" ) == 0) doReadall () ;
else if (strcasecmp (argv [1], "pins" ) == 0) doPins () ;
else if (strcasecmp (argv [1], "i2cdetect") == 0) doI2Cdetect (argc, argv) ;

View File

@@ -23,59 +23,11 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <ctype.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <wiringPi.h>
extern int wpMode ;
void doPins (void)
{
int model, rev, mem ;
char *maker ;
piBoardId (&model, &rev, &mem, &maker) ;
if (model == PI_MODEL_CM)
{
printf ("This Raspberry Pi is a Compute Module.\n") ;
printf (" (who knows what's been done to the pins!)\n") ;
return ;
}
printf ("This Raspberry Pi is a revision %d board.\n", piBoardRev ()) ;
printf (
" +-----+--------+------------+--------+-----+\n"
" | Pin | Name || P1 Pin || Name | Pin |\n"
" +-----+--------+------------+--------+-----+\n"
" | | 3.3v || 1 oo 2 || 5v | |\n"
" | 8 | SDA || 3 oo 4 || 5v | |\n"
" | 9 | SCL || 5 oo 6 || Gnd | |\n"
" | 7 | GPIO 7 || 7 oo 8 || TxD | 15 |\n"
" | | GND || 9 oo 10 || RxD | 16 |\n"
" | 0 | GPIO 0 || 11 oo 12 || GPIO 1 | 1 |\n"
" | 2 | GPIO 2 || 13 oo 14 || Gnd | |\n"
" | 3 | GPIO 3 || 15 oo 16 || GPIO 4 | 4 |\n"
" | | 3.3v || 17 oo 18 || GPIO 5 | 5 |\n"
" | 12 | MOSI || 19 oo 20 || Gnd | |\n"
" | 13 | MISO || 21 oo 22 || GPIO 6 | 6 |\n"
" | 14 | SCLK || 23 oo 24 || CE 0 | 10 |\n"
" | | Gnd || 25 oo 26 || CE 1 | 11 |\n"
" +-----+--------+------------+--------+-----+\n") ;
/***
+---
| 5v| 5v| Gnd | TxD | RxD | G1 | Gnd | G4 | G5 | G
| 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 | 24 | 26 |\n"
| 1 | 3 | 5 | 7 | 9 | 11 | 13 | 15 | 17 | 19 | 21 | 23 | 25 |\n"
***/
printf ("The pins command has been deprecated - sorry. Please use the\n") ;
printf (" gpio readall\n") ;
printf ("command to get a list of the pinnouts for your Pi.\n") ;
}

View File

@@ -75,34 +75,11 @@ static void doReadallExternal (void)
*********************************************************************************
*/
static char *pinNames [] =
{
"GPIO 0", "GPIO 1", "GPIO 2", "GPIO 3", "GPIO 4", "GPIO 5", "GPIO 6", "GPIO 7",
"SDA ", "SCL ",
"CE0 ", "CE1 ", "MOSI ", "MISO ", "SCLK ",
"TxD ", "RxD ",
"GPIO 8", "GPIO 9", "GPIO10", "GPIO11",
} ;
static char *alts [] =
{
"IN", "OUT", "ALT5", "ALT4", "ALT0", "ALT1", "ALT2", "ALT3"
} ;
static int wpiToPhys [64] =
{
11, 12, 13, 15, 16, 18, 22, 7, // 0...7
3, 5, // 8...9
24, 26, 19, 21, 23, // 10..14
8, 10, // 15..16
53, 54, 55, 56, // 17..20
0,0,0,0,0,0,0,0,0,0,0, // 20..31
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 32..47
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 47..63
} ;
// The other mappings needed are in wiringPi.c
static int physToWpi [64] =
{
-1, // 0
@@ -126,10 +103,14 @@ static int physToWpi [64] =
24, 27,
25, 28,
-1, 29,
-1, -1, -1, -1, -1, -1, -1, // ... 47
-1, -1, -1, -1, -1, // ... 52
17, 18, 19, 20, // ... 53, 54, 55, 56 - P5
-1, -1, -1, -1, -1, -1, -1, // ... 63
-1, -1,
-1, -1,
-1, -1,
-1, -1,
-1, -1,
17, 18,
19, 20,
-1, -1, -1, -1, -1, -1, -1, -1, -1
} ;
static char *physNames [64] =
@@ -149,7 +130,7 @@ static char *physNames [64] =
" MISO", "GPIO. 6",
" SCLK", "CE0 ",
" 0v", "CE1 ",
" SDA.0", "SCL0 ",
" SDA.0", "SCL.0 ",
"GPIO.21", "0v ",
"GPIO.22", "GPIO.26",
"GPIO.23", "0v ",
@@ -166,29 +147,27 @@ static char *physNames [64] =
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
} ;
/*
* readallPhys:
* Given a physical pin output the data on it and the next pin:
*| BCM | wPi | Name | Mode | Val| Physical |Val | Mode | Name | wPi | BCM |
*********************************************************************************
*/
static void readallPhys (int physPin)
{
int pin ;
/**/ if (wpMode == WPI_MODE_GPIO)
{
if (physPinToGpio (physPin) == -1)
printf (" | ") ;
else
printf (" | %3d", physPinToGpio (physPin)) ;
}
else if (wpMode != WPI_MODE_PHYS)
{
if (physToWpi [physPin] == -1)
printf (" | ") ;
else
printf (" | %3d", physToWpi [physPin]) ;
}
if (physPinToGpio (physPin) == -1)
printf (" | | ") ;
else
printf (" | %3d | %3d", physPinToGpio (physPin), physToWpi [physPin]) ;
printf (" | %s", physNames [physPin]) ;
if (physToWpi [physPin] == -1)
printf (" | | ") ;
printf (" | | ") ;
else
{
/**/ if (wpMode == WPI_MODE_GPIO)
@@ -199,7 +178,7 @@ static void readallPhys (int physPin)
pin = physToWpi [physPin] ;
printf (" | %4s", alts [getAlt (pin)]) ;
printf (" | %s", (digitalRead (pin) == LOW) ? "Lo" : "Hi") ;
printf (" | %d", digitalRead (pin)) ;
}
// Pin numbers:
@@ -211,7 +190,7 @@ static void readallPhys (int physPin)
// Same, reversed
if (physToWpi [physPin] == -1)
printf (" | | ") ;
printf (" | | ") ;
else
{
/**/ if (wpMode == WPI_MODE_GPIO)
@@ -221,40 +200,24 @@ static void readallPhys (int physPin)
else
pin = physToWpi [physPin] ;
printf (" | %s", (digitalRead (pin) == LOW) ? "Lo" : "Hi") ;
printf (" | %d", digitalRead (pin)) ;
printf (" | %-4s", alts [getAlt (pin)]) ;
}
printf (" | %-5s", physNames [physPin]) ;
/**/ if (wpMode == WPI_MODE_GPIO)
{
if (physPinToGpio (physPin) == -1)
printf (" | ") ;
else
printf (" | %-3d", physPinToGpio (physPin)) ;
}
else if (wpMode != WPI_MODE_PHYS)
{
if (physToWpi [physPin] == -1)
printf (" | ") ;
else
printf (" | %-3d", physToWpi [physPin]) ;
}
if (physToWpi [physPin] == -1)
printf (" | | ") ;
else
printf (" | %-3d | %-3d", physToWpi [physPin], physPinToGpio (physPin)) ;
printf (" |\n") ;
}
int cmReadall (void)
void cmReadall (void)
{
int model, rev, mem ;
int pin ;
char *maker ;
piBoardId (&model, &rev, &mem, &maker) ;
if (model != PI_MODEL_CM)
return FALSE ;
printf ("+-----+------+-------+ +-----+------+-------+\n") ;
printf ("| Pin | Mode | Value | | Pin | Mode | Value |\n") ;
@@ -273,8 +236,44 @@ int cmReadall (void)
}
printf ("+-----+------+-------+ +-----+------+-------+\n") ;
}
return TRUE ;
/*
* abReadall:
* Read all the pins on the model A or B.
*********************************************************************************
*/
void abReadall (int model, int rev)
{
int pin ;
char *type ;
if (model == PI_MODEL_A)
type = " A" ;
else
if (rev == PI_VERSION_2)
type = "B2" ;
else
type = "B1" ;
printf (" +-----+-----+---------+------+---+-Model %s-+---+------+---------+-----+-----+\n", type) ;
printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ;
printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ;
for (pin = 1 ; pin <= 26 ; pin += 2)
readallPhys (pin) ;
if (rev == PI_VERSION_2) // B version 2
{
printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ;
for (pin = 51 ; pin <= 54 ; pin += 2)
readallPhys (pin) ;
}
printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ;
printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ;
printf (" +-----+-----+---------+------+---+-Model %s-+---+------+---------+-----+-----+\n", type) ;
}
@@ -284,36 +283,24 @@ int cmReadall (void)
*********************************************************************************
*/
int bPlusReadall (void)
void bPlusReadall (void)
{
int model, rev, mem ;
int pin ;
char *maker ;
char *name ;
piBoardId (&model, &rev, &mem, &maker) ;
if (model != PI_MODEL_BPLUS)
return FALSE ;
/**/ if (wpMode == WPI_MODE_GPIO)
name = "BCM" ;
else
name = "wPi" ;
printf (" +-----+---------+------+----+--B Plus--+----+------+---------+-----+\n") ;
printf (" | %s | Name | Mode | Val| Physical |Val | Mode | Name | %s |\n", name, name) ;
printf (" +-----+---------+------+----+----++----+----+------+---------+-----+\n") ;
printf (" +-----+-----+---------+------+---+--B Plus--+---+------+---------+-----+-----+\n") ;
printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ;
printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ;
for (pin = 1 ; pin <= 40 ; pin += 2)
readallPhys (pin) ;
printf (" +-----+---------+------+----+----++----+----+------+---------+-----+\n") ;
return TRUE ;
printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ;
printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ;
printf (" +-----+-----+---------+------+---+--B Plus--+---+------+---------+-----+-----+\n") ;
}
void doReadall (void)
{
int pin ;
int model, rev, mem, maker, overVolted ;
if (wiringPiNodes != NULL) // External readall
{
@@ -321,73 +308,14 @@ void doReadall (void)
return ;
}
if (cmReadall ())
return ;
piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
if (bPlusReadall ())
return ;
/**/ if (wpMode == WPI_MODE_GPIO)
{
printf (" +-----+-------+------+----+-Rev%d-----+----+------+-------+-----+\n", piBoardRev ()) ;
printf (" | BCM | Name | Mode | Val| Physical |Val | Mode | Name | BCM |\n") ;
printf (" +-----+-------+------+----+----++----+----+------+-------+-----+\n") ;
for (pin = 1 ; pin <= 26 ; pin += 2)
readallPhys (pin) ;
printf (" +-----+-------+------+----+----++----+----+------+-------+-----+\n") ;
}
else if (wpMode == WPI_MODE_PHYS)
{
printf (" +-------+------+----+-Rev%d-----+----+------+-------+\n", piBoardRev ()) ;
printf (" | Name | Mode | Val| Physical |Val | Mode | Name |\n") ;
printf (" +-------+------+----+----++----+----+------+-------+\n") ;
for (pin = 1 ; pin <= 26 ; pin += 2)
readallPhys (pin) ;
printf (" +-------+------+----+----++----+----+------+-------+\n") ;
}
else // wiringPi
{
printf (" +-----+-------+------+----+-Rev%d-----+----+------+-------+-----+\n", piBoardRev ()) ;
printf (" | wPi | Name | Mode | Val| Physical |Val | Mode | Name | wPi |\n") ;
printf (" +-----+-------+------+----+----++----+----+------+-------+-----+\n") ;
for (pin = 1 ; pin <= 26 ; pin += 2)
readallPhys (pin) ;
printf (" +-----+-------+------+----+----++----+----+------+-------+-----+\n") ;
}
}
void doReadallOld (void)
{
int pin ;
if (wiringPiNodes != NULL) // External readall
{
doReadallExternal () ;
return ;
}
if (cmReadall ())
return ;
if (bPlusReadall ())
return ;
printf ("+----------+-Rev%d-+------+--------+------+-------+\n", piBoardRev ()) ;
printf ("| wiringPi | GPIO | Phys | Name | Mode | Value |\n") ;
printf ("+----------+------+------+--------+------+-------+\n") ;
for (pin = 0 ; pin < 64 ; ++pin) // Crude, but effective
{
if (wpiPinToGpio (pin) == -1)
continue ;
printf ("| %6d | %3d | %3d | %s | %-4s | %-4s |\n",
pin, wpiPinToGpio (pin), wpiToPhys [pin],
pinNames [pin],
alts [getAlt (pin)],
digitalRead (pin) == HIGH ? "High" : "Low ") ;
}
printf ("+----------+------+------+--------+------+-------+\n") ;
/**/ if ((model == PI_MODEL_A) || (model == PI_MODEL_B))
abReadall (model, rev) ;
else if (model == PI_MODEL_BP)
bPlusReadall () ;
else if (model == PI_MODEL_CM)
cmReadall () ;
else
printf ("Oops - unable to determine board type... model: %d\n", model) ;
}