@@ -319,9 +319,7 @@ the GPIO from a non-root program, then you need to make sure that the | |||
module \fIbcm2835_gpiomem\fR is loaded at boot time. This should happen | |||
automatically when you enable the device tree in raspi-config. You may | |||
also need some additional information in /etc/udev/rules.d/ to change the | |||
mode and ownership of the /dev/gpiomem file. Finally, you need to set | |||
the environment variable \fIWIRINGPI_GPIOMEM\fR. This will go-away | |||
in future releases once the /dev/gpiomem interface is fully operational. | |||
mode and ownership of the /dev/gpiomem file. | |||
.SH "SEE ALSO" | |||
@@ -61,8 +61,8 @@ extern void doQmode (int argc, char *argv[]); | |||
int wpMode; | |||
char *usage = "Usage: gpio -v Show version info\n" | |||
" gpio -h Show Help\n" | |||
" gpio[-b|-p|-w] ... Use bcm-gpio/physical/WiringPi pin numbering scheme.\n" | |||
" gpio -h|-help|--help|help|h Show Help\n" | |||
" gpio [-b|-p|-w] ... Use bcm-gpio/physical/WiringPi pin numbering scheme.\n" | |||
" If none specified, BCM GPIO numbering is used by default.\n" | |||
" [-x extension:params][[ -x ...]] ...\n" | |||
" gpio <mode/read/write/aread/awritewb/pwm/pwmTone/clock> ...\n" | |||
@@ -82,33 +82,12 @@ char *usage = "Usage: gpio -v Show version info\n" | |||
" gpio wb <value>\n" | |||
" gpio usbp high/low"; // No trailing newline needed here. | |||
#ifdef NOT_FOR_NOW | |||
/* | |||
* decodePin: | |||
* Decode a pin "number" which can actually be a pin name to represent | |||
* one of the Pi's on-board pins. | |||
********************************************************************************* | |||
*/ | |||
static int decodePin (const char *str) | |||
{ | |||
// The first case - see if it's a number: | |||
if (isdigit (str[0])) | |||
return atoi (str); | |||
return 0; | |||
} | |||
#endif | |||
/* | |||
* findExecutable: | |||
* Code to locate the path to the given executable. We have a fixed list | |||
* of locations to try which completely overrides any $PATH environment. | |||
* This may be detrimental, however it avoids the reliance on $PATH | |||
* which may be a security issue when this program is run a set-uid-root. | |||
* which may be a security issue when this program is run as set-uid-root. | |||
********************************************************************************* | |||
*/ | |||
static const char *searchPath[] = | |||
@@ -1146,7 +1125,7 @@ static void doPwmClock (int argc, char *argv[]) | |||
/* | |||
* doVersion: | |||
* Handle the ever more complicated version command and print out | |||
* some usefull information. | |||
* some useful information. | |||
********************************************************************************* | |||
*/ | |||
@@ -1167,15 +1146,17 @@ static void doVersion (char *argv[]) | |||
printf ("For details type: \"%s -warranty\"\n", basename(argv[0])); | |||
printf ("\n"); | |||
piBoardId (&model, &proc, &rev, &mem, &maker, &warranty); | |||
uint32_t fullRev = piBoardId (&model, &proc, &rev, &mem, &maker, &warranty); | |||
printf ("Raspberry Pi Details\n" | |||
" Revision string: 0x%08X\n" | |||
" Type : %s\n" | |||
" Processor: %s\n" | |||
" Revision : %s\n" | |||
" Memory : %s\n" | |||
" Maker : %s\n" | |||
" %s\n", | |||
fullRev, | |||
piModelNames[model], | |||
piProcessorNames[proc], | |||
piRevisionNames[rev], | |||
@@ -1238,7 +1219,13 @@ int main (int argc, char *argv[]) | |||
} | |||
// Help | |||
if (strcasecmp (argv[1], "-h") == 0) | |||
if ( | |||
(strcasecmp (argv[1], "h") == 0) || | |||
(strcasecmp (argv[1], "-h") == 0) || | |||
(strcasecmp (argv[1], "-help") == 0) || | |||
(strcasecmp (argv[1], "--help") == 0) || | |||
(strcasecmp (argv[1], "help") == 0) | |||
) | |||
{ | |||
printf ("%s\n", usage); | |||
exit (EXIT_SUCCESS); | |||
@@ -83,7 +83,6 @@ | |||
// Environment Variables | |||
#define ENV_DEBUG "WIRINGPI_DEBUG" | |||
#define ENV_CODES "WIRINGPI_CODES" | |||
#define ENV_GPIOMEM "WIRINGPI_GPIOMEM" | |||
// Extend wiringPi with other pin-based devices and keep track of | |||
@@ -93,6 +92,8 @@ struct wiringPiNodeStruct *wiringPiNodes = NULL; | |||
// BCM Magic | |||
#define BCM_PASSWORD 0x5A000000 | |||
// Full revision string | |||
static uint32_t fullRevision = 0; | |||
// The BCM2835 has 54 GPIO pins. | |||
// BCM2835 data sheet, Page 90 onwards. | |||
@@ -879,7 +880,7 @@ int piGpioLayout (void) | |||
********************************************************************************* | |||
*/ | |||
void piBoardId (int *model, int *proc, int *rev, int *mem, int *maker, int *warranty) | |||
uint32_t piBoardId (int *model, int *proc, int *rev, int *mem, int *maker, int *warranty) | |||
{ | |||
FILE *cpuFd; | |||
char line[120]; | |||
@@ -928,12 +929,14 @@ void piBoardId (int *model, int *proc, int *rev, int *mem, int *maker, int *warr | |||
piGpioLayoutOops ("Bogus \"Revision\" line (no hex digit at start of revision)"); | |||
revision = (unsigned int)strtol (c, NULL, 16); // Hex number with no leading 0x | |||
// Save full revision number | |||
fullRevision = revision; | |||
// Check for new way: Bit 23 of the revision number | |||
if ((revision & (1 << 23)) != 0) // New way | |||
{ | |||
if (wiringPiDebug) | |||
printf ("piBoardId: New Way: revision is: %08X\n", revision); | |||
printf ("piBoardId: New Way: revision is: 0x%08X\n", revision); | |||
bRev = (revision & (0x0F << 0)) >> 0; | |||
bType = (revision & (0xFF << 4)) >> 4; | |||
@@ -1007,6 +1010,8 @@ void piBoardId (int *model, int *proc, int *rev, int *mem, int *maker, int *warr | |||
else { *model = 0 ; *rev = 0 ; *mem = 0; *maker = 0; } | |||
} | |||
return fullRevision; | |||
} | |||
@@ -1135,7 +1140,11 @@ void pwmSetClock (int divisor) | |||
{ | |||
divisor = 540*divisor/192; | |||
} | |||
divisor &= 4095; // @XXX @TODO Probably constrain to 0xFFF instead of masking? | |||
// Keep divisor in range. | |||
if (divisor > 4095) | |||
{ | |||
divisor = 4095; | |||
} | |||
if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) | |||
{ | |||
@@ -24,6 +24,8 @@ | |||
#ifndef __WIRING_PI_H__ | |||
#define __WIRING_PI_H__ | |||
#include <stdint.h> | |||
#include <stdbool.h> | |||
#ifndef TRUE | |||
# define TRUE true | |||
@@ -236,7 +238,7 @@ extern void analogWrite (int pin, int value); | |||
// On-Board Raspberry Pi hardware specific stuff | |||
extern int piGpioLayout (void); | |||
extern void piBoardId (int *model, int *proc, int *rev, int *mem, int *maker, int *overVolted); | |||
extern uint32_t piBoardId (int *model, int *proc, int *rev, int *mem, int *maker, int *overVolted); | |||
extern int wpiPinToGpio (int wpiPin); | |||
extern int physPinToGpio (int physPin); | |||
extern void setPadDrive (int group, int value); | |||