From 1584f9315e9c5ecbe3fa7d2fe7b837e1ae1bd89d Mon Sep 17 00:00:00 2001 From: Jim Parziale Date: Tue, 8 Mar 2022 17:29:06 -0500 Subject: [PATCH] Updates based on latest RPi revision codes --- People | 33 - VERSION | 2 +- debian-template/wiringPi/DEBIAN/control | 2 +- debian-template/wiringPi/DEBIAN/postinst | 0 debian-template/wiringPi/DEBIAN/postrm | 0 examples/Makefile | 0 examples/blink.sh | 0 examples/pwm.c | 0 examples/q2w/blink.sh | 0 examples/servo.c | 0 gpio/Makefile | 0 gpio/gpio.c | 1267 ++++++++-------- gpio/pintest | 0 gpio/readall.c | 96 +- version.h | 4 +- wiringPi/Makefile | 59 +- wiringPi/drcNet.c | 12 +- wiringPi/softServo.c | 0 wiringPi/wiringPi.c | 2302 ++++++++++++++---------------- wiringPi/wiringPi.h | 409 +++--- wiringPi/wiringPiSPI.c | 0 21 files changed, 1964 insertions(+), 2222 deletions(-) delete mode 100644 People mode change 100755 => 100644 debian-template/wiringPi/DEBIAN/postinst mode change 100755 => 100644 debian-template/wiringPi/DEBIAN/postrm mode change 100755 => 100644 examples/Makefile mode change 100644 => 100755 examples/blink.sh mode change 100755 => 100644 examples/pwm.c mode change 100644 => 100755 examples/q2w/blink.sh mode change 100755 => 100644 examples/servo.c mode change 100755 => 100644 gpio/Makefile mode change 100755 => 100644 gpio/gpio.c mode change 100755 => 100644 gpio/pintest mode change 100755 => 100644 gpio/readall.c mode change 100755 => 100644 wiringPi/softServo.c mode change 100755 => 100644 wiringPi/wiringPi.c mode change 100755 => 100644 wiringPi/wiringPi.h mode change 100755 => 100644 wiringPi/wiringPiSPI.c diff --git a/People b/People deleted file mode 100644 index b339494..0000000 --- a/People +++ /dev/null @@ -1,33 +0,0 @@ - -Just a quick note to some people who've provided help, suggestions, -bug-fixes, etc. along the way... - -Nick Lott: (And others) - Hints about making it work with C++ - -Philipp Stefan Neininger: - Minor bug in the Makefile to do with cross compiling - -Chris McSweeny - Hints and tips about the use of arithmetic in gettimeofday() - inside the dealyMicrosecondsHard() function. - And spotting a couple of schoolboy errors in the (experimental) - softServo code, prompting me to completely re-write it. - -Armin (Via projects website) - Some pointers about the i2c-dev.h files. - -Arno Wagner - Suggestions for the mmap calls in wiringPiSetup() - -CHARLES Thibaut: - A small issue in softTone - -Xian Stannard - Fixing some typos in the man page! - -Andre Crone - Suggested the __WIRING_PI.H__ round wiringPi.h - -Rik Teerling - Pointing out some silly mistooks in the I2C code... diff --git a/VERSION b/VERSION index b93b4f2..80bf4d0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.71 +2.72 diff --git a/debian-template/wiringPi/DEBIAN/control b/debian-template/wiringPi/DEBIAN/control index 31697b8..40262ba 100644 --- a/debian-template/wiringPi/DEBIAN/control +++ b/debian-template/wiringPi/DEBIAN/control @@ -1,5 +1,5 @@ Package: wiringpi -Version: 2.71 +Version: 2.72 Section: libraries Priority: optional Architecture: armhf diff --git a/debian-template/wiringPi/DEBIAN/postinst b/debian-template/wiringPi/DEBIAN/postinst old mode 100755 new mode 100644 diff --git a/debian-template/wiringPi/DEBIAN/postrm b/debian-template/wiringPi/DEBIAN/postrm old mode 100755 new mode 100644 diff --git a/examples/Makefile b/examples/Makefile old mode 100755 new mode 100644 diff --git a/examples/blink.sh b/examples/blink.sh old mode 100644 new mode 100755 diff --git a/examples/pwm.c b/examples/pwm.c old mode 100755 new mode 100644 diff --git a/examples/q2w/blink.sh b/examples/q2w/blink.sh old mode 100644 new mode 100755 diff --git a/examples/servo.c b/examples/servo.c old mode 100755 new mode 100644 diff --git a/gpio/Makefile b/gpio/Makefile old mode 100755 new mode 100644 diff --git a/gpio/gpio.c b/gpio/gpio.c old mode 100755 new mode 100644 index 4a130e3..81cc5bc --- a/gpio/gpio.c +++ b/gpio/gpio.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -42,13 +43,12 @@ #include "../version.h" -extern int wiringPiDebug ; +extern int wiringPiDebug; // External functions I can't be bothered creating a separate .h file for: - -extern void doReadall (void) ; -extern void doAllReadall (void) ; -extern void doQmode (int argc, char *argv []) ; +extern void doReadall (void); +extern void doAllReadall (void); +extern void doQmode (int argc, char *argv[]); #ifndef TRUE # define TRUE (1==1) @@ -60,13 +60,13 @@ extern void doQmode (int argc, char *argv []) ; #define MODPROBE "modprobe" #define RMMOD "rmmod" -int wpMode ; +int wpMode; -char *usage = "Usage: gpio -v Show Version\n" +char *usage = "Usage: gpio -v Show version info\n" " gpio -h Show Help\n" - " gpio -V Show gpio Layout version\n" - " gpio [-g|-1|-p] ... Use bcm-gpio/physical/piFace pin numbering scheme...\n" - " [-x extension:params] [[ -x ...]] ...\n" +// " gpio -V Show gpio layout version (1.x)\n" + " gpio[-g|-1|-p] ... Use bcm-gpio/physical/piFace pin numbering scheme...\n" + " [-x extension:params][[ -x ...]] ...\n" " gpio ...\n" " gpio \n" " gpio readall/allreadall\n" @@ -84,7 +84,7 @@ char *usage = "Usage: gpio -v Show Version\n" " gpio wb \n" " gpio usbp high/low\n" " gpio gbr \n" - " gpio gbw " ; // No trailing newline needed here. + " gpio gbw "; // No trailing newline needed here. #ifdef NOT_FOR_NOW /* @@ -99,10 +99,10 @@ static int decodePin (const char *str) // The first case - see if it's a number: - if (isdigit (str [0])) - return atoi (str) ; + if (isdigit (str[0])) + return atoi (str); - return 0 ; + return 0; } #endif @@ -115,8 +115,7 @@ static int decodePin (const char *str) * which may be a security issue when this program is run a set-uid-root. ********************************************************************************* */ - -static const char *searchPath [] = +static const char *searchPath[] = { "/sbin", "/usr/sbin", @@ -125,26 +124,26 @@ static const char *searchPath [] = "/usr/local/bin", "/usr/local/sbin", NULL, -} ; +}; static char *findExecutable (const char *progName) { - static char *path = NULL ; - int len = strlen (progName) ; - int i = 0 ; - struct stat statBuf ; + static char *path = NULL; + int len = strlen (progName); + int i = 0; + struct stat statBuf; - for (i = 0 ; searchPath [i] != NULL ; ++i) + for (i = 0; searchPath[i] != NULL; ++i) { - path = malloc (strlen (searchPath [i]) + len + 2) ; - sprintf (path, "%s/%s", searchPath [i], progName) ; + path = malloc (strlen (searchPath[i]) + len + 2); + sprintf (path, "%s/%s", searchPath[i], progName); if (stat (path, &statBuf) == 0) - return path ; - free (path) ; + return path; + free (path); } - return NULL ; + return NULL; } @@ -154,20 +153,16 @@ static char *findExecutable (const char *progName) * program so we can access it. ********************************************************************************* */ - static void changeOwner (char *cmd, char *file) { - uid_t uid = getuid () ; - uid_t gid = getgid () ; + uid_t uid = getuid (); + uid_t gid = getgid (); if (chown (file, uid, gid) != 0) { - -// Removed (ignoring) the check for not existing as I'm fed-up with morons telling me that -// the warning message is an error. - + // Ignoring the check for not existing. if (errno != ENOENT) - fprintf (stderr, "%s: Unable to change ownership of %s: %s\n", cmd, file, strerror (errno)) ; + fprintf (stderr, "%s: Unable to change ownership of %s: %s\n", cmd, file, strerror (errno)); } } @@ -177,32 +172,31 @@ static void changeOwner (char *cmd, char *file) * Return true/false if the supplied module is loaded ********************************************************************************* */ - static int moduleLoaded (char *modName) { - int len = strlen (modName) ; - int found = FALSE ; - FILE *fd = fopen ("/proc/modules", "r") ; - char line [80] ; + int len = strlen (modName); + int found = FALSE; + FILE *fd = fopen ("/proc/modules", "r"); + char line[80]; if (fd == NULL) { - fprintf (stderr, "gpio: Unable to check /proc/modules: %s\n", strerror (errno)) ; - exit (1) ; + fprintf (stderr, "gpio: Unable to check /proc/modules: %s\n", strerror (errno)); + exit (1); } while (fgets (line, 80, fd) != NULL) { if (strncmp (line, modName, len) != 0) - continue ; + continue; - found = TRUE ; - break ; + found = TRUE; + break; } - fclose (fd) ; + fclose (fd); - return found ; + return found; } @@ -211,94 +205,93 @@ static int moduleLoaded (char *modName) * Load either the spi or i2c modules and change device ownerships, etc. ********************************************************************************* */ - -static void checkDevTree (char *argv []) +static void checkDevTree (char *argv[]) { - struct stat statBuf ; + struct stat statBuf; if (stat ("/proc/device-tree", &statBuf) == 0) // We're on a devtree system ... { fprintf (stderr, -"%s: Unable to load/unload modules as this Pi has the device tree enabled.\n" -" You need to run the raspi-config program (as root) and select the\n" -" modules (SPI or I2C) that you wish to load/unload there and reboot.\n", argv [0]) ; - exit (1) ; + "%s: Unable to load/unload modules as this Pi has the device tree enabled.\n" + " You need to run the raspi-config program (as root) and select the\n" + " modules (SPI or I2C) that you wish to load/unload there and reboot.\n", argv[0]); + exit (EXIT_FAILURE); } } -static void _doLoadUsage (char *argv []) +static void _doLoadUsage (char *argv[]) { - fprintf (stderr, "Usage: %s load [I2C baudrate in Kb/sec]\n", argv [0]) ; - exit (1) ; + fprintf (stderr, "Usage: %s load [I2C baudrate in Kb/sec]\n", argv[0]); + exit (EXIT_FAILURE); } -static void doLoad (int argc, char *argv []) +static void doLoad (int argc, char *argv[]) { - char *module1, *module2 ; - char cmd [80] ; - char *file1, *file2 ; - char args1 [32], args2 [32] ; + char *module1, *module2; + char cmd[80]; + char *file1, *file2; + char args1[32], args2[32]; - checkDevTree (argv) ; + checkDevTree (argv); if (argc < 3) - _doLoadUsage (argv) ; + _doLoadUsage (argv); - args1 [0] = args2 [0] = 0 ; + args1[0] = args2[0] = 0; - /**/ if (strcasecmp (argv [2], "spi") == 0) + if (strcasecmp (argv[2], "spi") == 0) { - module1 = "spidev" ; - module2 = "spi_bcm2708" ; - file1 = "/dev/spidev0.0" ; - file2 = "/dev/spidev0.1" ; + module1 = "spidev"; + module2 = "spi_bcm2708"; + file1 = "/dev/spidev0.0"; + file2 = "/dev/spidev0.1"; if (argc == 4) { - fprintf (stderr, "%s: Unable to set the buffer size now. Load aborted. Please see the man page.\n", argv [0]) ; - exit (1) ; + fprintf (stderr, "%s: Unable to set the buffer size now. Load aborted. Please see the man page.\n", argv[0]); + exit (1); } else if (argc > 4) - _doLoadUsage (argv) ; + _doLoadUsage (argv); } - else if (strcasecmp (argv [2], "i2c") == 0) + else if (strcasecmp (argv[2], "i2c") == 0) { - module1 = "i2c_dev" ; - module2 = "i2c_bcm2708" ; - file1 = "/dev/i2c-0" ; - file2 = "/dev/i2c-1" ; + module1 = "i2c_dev"; + module2 = "i2c_bcm2708"; + file1 = "/dev/i2c-0"; + file2 = "/dev/i2c-1"; if (argc == 4) - sprintf (args2, " baudrate=%d", atoi (argv [3]) * 1000) ; + sprintf (args2, " baudrate=%d", atoi (argv[3]) * 1000); else if (argc > 4) - _doLoadUsage (argv) ; + _doLoadUsage (argv); } else - _doLoadUsage (argv) ; + _doLoadUsage (argv); if (findExecutable ("modprobe") == NULL) - printf ("No found\n") ; + printf ("No found\n"); if (!moduleLoaded (module1)) { - sprintf (cmd, "%s %s%s", findExecutable (MODPROBE), module1, args1) ; - system (cmd) ; + sprintf (cmd, "%s %s%s", findExecutable (MODPROBE), module1, args1); + system (cmd); } if (!moduleLoaded (module2)) { - sprintf (cmd, "%s %s%s", findExecutable (MODPROBE), module2, args2) ; - system (cmd) ; + sprintf (cmd, "%s %s%s", findExecutable (MODPROBE), module2, args2); + system (cmd); } if (!moduleLoaded (module2)) { - fprintf (stderr, "%s: Unable to load %s\n", argv [0], module2) ; - exit (1) ; + fprintf (stderr, "%s: Unable to load %s\n", argv[0], module2); + exit (1); } - sleep (1) ; // To let things get settled + sleep (1); // To let things get settled - changeOwner (argv [0], file1) ; - changeOwner (argv [0], file2) ; + changeOwner (argv[0], file1); + changeOwner (argv[0], file2); } @@ -307,46 +300,45 @@ static void doLoad (int argc, char *argv []) * Un-Load either the spi or i2c modules and change device ownerships, etc. ********************************************************************************* */ - -static void _doUnLoadUsage (char *argv []) +static void _doUnLoadUsage (char *argv[]) { - fprintf (stderr, "Usage: %s unload \n", argv [0]) ; - exit (1) ; + fprintf (stderr, "Usage: %s unload \n", argv[0]); + exit (1); } -static void doUnLoad (int argc, char *argv []) +static void doUnLoad (int argc, char *argv[]) { - char *module1, *module2 ; - char cmd [80] ; + char *module1, *module2; + char cmd[80]; - checkDevTree (argv) ; + checkDevTree (argv); if (argc != 3) - _doUnLoadUsage (argv) ; + _doUnLoadUsage (argv); - /**/ if (strcasecmp (argv [2], "spi") == 0) + if (strcasecmp (argv[2], "spi") == 0) { - module1 = "spidev" ; - module2 = "spi_bcm2708" ; + module1 = "spidev"; + module2 = "spi_bcm2708"; } - else if (strcasecmp (argv [2], "i2c") == 0) + else if (strcasecmp (argv[2], "i2c") == 0) { - module1 = "i2c_dev" ; - module2 = "i2c_bcm2708" ; + module1 = "i2c_dev"; + module2 = "i2c_bcm2708"; } else - _doUnLoadUsage (argv) ; + _doUnLoadUsage (argv); if (moduleLoaded (module1)) { - sprintf (cmd, "%s %s", findExecutable (RMMOD), module1) ; - system (cmd) ; + sprintf (cmd, "%s %s", findExecutable (RMMOD), module1); + system (cmd); } if (moduleLoaded (module2)) { - sprintf (cmd, "%s %s", findExecutable (RMMOD), module2) ; - system (cmd) ; + sprintf (cmd, "%s %s", findExecutable (RMMOD), module2); + system (cmd); } } @@ -356,29 +348,27 @@ static void doUnLoad (int argc, char *argv []) * Run the i2cdetect command with the right runes for this Pi revision ********************************************************************************* */ - -static void doI2Cdetect (UNU int argc, char *argv []) +static void doI2Cdetect (UNU int argc, char *argv[]) { - int port = piGpioLayout () == 1 ? 0 : 1 ; - char *c, *command ; + int port = piGpioLayout () == 1 ? 0 : 1; + char *c, *command; if ((c = findExecutable (I2CDETECT)) == NULL) { - fprintf (stderr, "%s: Unable to find i2cdetect command: %s\n", argv [0], strerror (errno)) ; - return ; + fprintf (stderr, "%s: Unable to find i2cdetect command: %s\n", argv[0], strerror (errno)); + return; } if (!moduleLoaded ("i2c_dev")) { - fprintf (stderr, "%s: The I2C kernel module(s) are not loaded.\n", argv [0]) ; - return ; + fprintf (stderr, "%s: The I2C kernel module(s) are not loaded.\n", argv[0]); + return; } - command = malloc (strlen (c) + 16) ; - sprintf (command, "%s -y %d", c, port) ; + command = malloc (strlen (c) + 16); + sprintf (command, "%s -y %d", c, port); if (system (command) < 0) - fprintf (stderr, "%s: Unable to run i2cdetect: %s\n", argv [0], strerror (errno)) ; - + fprintf (stderr, "%s: Unable to run i2cdetect: %s\n", argv[0], strerror (errno)); } @@ -387,79 +377,74 @@ static void doI2Cdetect (UNU int argc, char *argv []) * List all GPIO exports ********************************************************************************* */ - -static void doExports (UNU int argc, UNU char *argv []) +static void doExports (UNU int argc, UNU char *argv[]) { - int fd ; - int i, l, first ; - char fName [128] ; - char buf [16] ; + int fd; + int i, l, first; + char fName[128]; + char buf[16]; - for (first = 0, i = 0 ; i < 64 ; ++i) // Crude, but effective + for (first = 0, i = 0; i < 64; ++i) // Crude, but effective { - -// Try to read the direction - - sprintf (fName, "/sys/class/gpio/gpio%d/direction", i) ; + // Try to read the direction + sprintf (fName, "/sys/class/gpio/gpio%d/direction", i); if ((fd = open (fName, O_RDONLY)) == -1) - continue ; + continue; if (first == 0) { - ++first ; - printf ("GPIO Pins exported:\n") ; + ++first; + printf ("GPIO Pins exported:\n"); } - printf ("%4d: ", i) ; + printf ("%4d: ", i); if ((l = read (fd, buf, 16)) == 0) - sprintf (buf, "%s", "?") ; + sprintf (buf, "%s", "?"); - buf [l] = 0 ; - if ((buf [strlen (buf) - 1]) == '\n') - buf [strlen (buf) - 1] = 0 ; - - printf ("%-3s", buf) ; + buf[l] = 0; + if ((buf[strlen (buf) - 1]) == '\n') + buf[strlen (buf) - 1] = 0; - close (fd) ; + printf ("%-3s", buf); -// Try to Read the value + close (fd); - sprintf (fName, "/sys/class/gpio/gpio%d/value", i) ; + // Try to Read the value + sprintf (fName, "/sys/class/gpio/gpio%d/value", i); if ((fd = open (fName, O_RDONLY)) == -1) { - printf ("No Value file (huh?)\n") ; - continue ; + printf ("No Value file (huh?)\n"); + continue; } if ((l = read (fd, buf, 16)) == 0) - sprintf (buf, "%s", "?") ; - - buf [l] = 0 ; - if ((buf [strlen (buf) - 1]) == '\n') - buf [strlen (buf) - 1] = 0 ; + sprintf (buf, "%s", "?"); - printf (" %s", buf) ; + buf[l] = 0; + if ((buf[strlen (buf) - 1]) == '\n') + buf[strlen (buf) - 1] = 0; -// Read any edge trigger file + printf (" %s", buf); - sprintf (fName, "/sys/class/gpio/gpio%d/edge", i) ; + // Read any edge trigger file + sprintf (fName, "/sys/class/gpio/gpio%d/edge", i); if ((fd = open (fName, O_RDONLY)) == -1) { - printf ("\n") ; - continue ; + printf ("\n"); + continue; } if ((l = read (fd, buf, 16)) == 0) - sprintf (buf, "%s", "?") ; + sprintf (buf, "%s", "?"); - buf [l] = 0 ; - if ((buf [strlen (buf) - 1]) == '\n') - buf [strlen (buf) - 1] = 0 ; + buf[l] = 0; + if ((buf[strlen (buf) - 1]) == '\n') + buf[strlen (buf) - 1] = 0; - printf (" %-8s\n", buf) ; + printf (" %-8s\n", buf); - close (fd) ; + close (fd); } } @@ -470,63 +455,61 @@ static void doExports (UNU int argc, UNU char *argv []) * This uses the /sys/class/gpio device interface. ********************************************************************************* */ - -void doExport (int argc, char *argv []) +void doExport (int argc, char *argv[]) { - FILE *fd ; - int pin ; - char *mode ; - char fName [128] ; + FILE *fd; + int pin; + char *mode; + char fName[128]; if (argc != 4) { - fprintf (stderr, "Usage: %s export pin mode\n", argv [0]) ; - exit (1) ; + fprintf (stderr, "Usage: %s export pin mode\n", argv[0]); + exit (1); } - pin = atoi (argv [2]) ; + pin = atoi (argv[2]); - mode = argv [3] ; + mode = argv[3]; if ((fd = fopen ("/sys/class/gpio/export", "w")) == NULL) { - fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv [0], strerror (errno)) ; - exit (1) ; + fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv[0], strerror (errno)); + exit (1); } - fprintf (fd, "%d\n", pin) ; - fclose (fd) ; + fprintf (fd, "%d\n", pin); + fclose (fd); - sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ; + sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin); if ((fd = fopen (fName, "w")) == NULL) { - fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ; - exit (1) ; + fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv[0], pin, strerror (errno)); + exit (1); } - /**/ if ((strcasecmp (mode, "in") == 0) || (strcasecmp (mode, "input") == 0)) - fprintf (fd, "in\n") ; + if ((strcasecmp (mode, "in") == 0) || (strcasecmp (mode, "input") == 0)) + fprintf (fd, "in\n"); else if ((strcasecmp (mode, "out") == 0) || (strcasecmp (mode, "output") == 0)) - fprintf (fd, "out\n") ; + fprintf (fd, "out\n"); else if ((strcasecmp (mode, "high") == 0) || (strcasecmp (mode, "up") == 0)) - fprintf (fd, "high\n") ; + fprintf (fd, "high\n"); else if ((strcasecmp (mode, "low") == 0) || (strcasecmp (mode, "down") == 0)) - fprintf (fd, "low\n") ; + fprintf (fd, "low\n"); else { - fprintf (stderr, "%s: Invalid mode: %s. Should be in, out, high or low\n", argv [1], mode) ; - exit (1) ; + fprintf (stderr, "%s: Invalid mode: %s. Should be in, out, high or low\n", argv[1], mode); + exit (1); } - fclose (fd) ; - -// Change ownership so the current user can actually use it + fclose (fd); - sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ; - changeOwner (argv [0], fName) ; + // Change ownership so the current user can actually use it + sprintf (fName, "/sys/class/gpio/gpio%d/value", pin); + changeOwner (argv[0], fName); - sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ; - changeOwner (argv [0], fName) ; + sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin); + changeOwner (argv[0], fName); } @@ -540,39 +523,40 @@ void doExport (int argc, char *argv []) * to exit the program. Crude but effective. ********************************************************************************* */ - static void wfi (void) - { exit (0) ; } +{ + exit (EXIT_SUCCESS); +} -void doWfi (int argc, char *argv []) +void doWfi (int argc, char *argv[]) { - int pin, mode ; + int pin, mode; if (argc != 4) { - fprintf (stderr, "Usage: %s wfi pin mode\n", argv [0]) ; - exit (1) ; + fprintf (stderr, "Usage: %s wfi pin mode\n", argv[0]); + exit (1); } - pin = atoi (argv [2]) ; + pin = atoi (argv[2]); - /**/ if (strcasecmp (argv [3], "rising") == 0) mode = INT_EDGE_RISING ; - else if (strcasecmp (argv [3], "falling") == 0) mode = INT_EDGE_FALLING ; - else if (strcasecmp (argv [3], "both") == 0) mode = INT_EDGE_BOTH ; + if (strcasecmp (argv[3], "rising") == 0) mode = INT_EDGE_RISING; + else if (strcasecmp (argv[3], "falling") == 0) mode = INT_EDGE_FALLING; + else if (strcasecmp (argv[3], "both") == 0) mode = INT_EDGE_BOTH; else { - fprintf (stderr, "%s: wfi: Invalid mode: %s. Should be rising, falling or both\n", argv [1], argv [3]) ; - exit (1) ; + fprintf (stderr, "%s: wfi: Invalid mode: %s. Should be rising, falling or both\n", argv[1], argv[3]); + exit (1); } if (wiringPiISR (pin, mode, &wfi) < 0) { - fprintf (stderr, "%s: wfi: Unable to setup ISR: %s\n", argv [1], strerror (errno)) ; - exit (1) ; + fprintf (stderr, "%s: wfi: Unable to setup ISR: %s\n", argv[1], strerror (errno)); + exit (1); } for (;;) - delay (9999) ; + delay (9999); } @@ -584,70 +568,67 @@ void doWfi (int argc, char *argv []) * This uses the /sys/class/gpio device interface. ********************************************************************************* */ - -void doEdge (int argc, char *argv []) +void doEdge (int argc, char *argv[]) { - FILE *fd ; - int pin ; - char *mode ; - char fName [128] ; + FILE *fd; + int pin; + char *mode; + char fName[128]; if (argc != 4) { - fprintf (stderr, "Usage: %s edge pin mode\n", argv [0]) ; - exit (1) ; + fprintf (stderr, "Usage: %s edge pin mode\n", argv[0]); + exit (1); } - pin = atoi (argv [2]) ; - mode = argv [3] ; - -// Export the pin and set direction to input + pin = atoi (argv[2]); + mode = argv[3]; + // Export the pin and set direction to input if ((fd = fopen ("/sys/class/gpio/export", "w")) == NULL) { - fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv [0], strerror (errno)) ; - exit (1) ; + fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv[0], strerror (errno)); + exit (1); } - fprintf (fd, "%d\n", pin) ; - fclose (fd) ; + fprintf (fd, "%d\n", pin); + fclose (fd); - sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ; + sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin); if ((fd = fopen (fName, "w")) == NULL) { - fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ; - exit (1) ; + fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv[0], pin, strerror (errno)); + exit (1); } - fprintf (fd, "in\n") ; - fclose (fd) ; + fprintf (fd, "in\n"); + fclose (fd); - sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ; + sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin); if ((fd = fopen (fName, "w")) == NULL) { - fprintf (stderr, "%s: Unable to open GPIO edge interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ; - exit (1) ; + fprintf (stderr, "%s: Unable to open GPIO edge interface for pin %d: %s\n", argv[0], pin, strerror (errno)); + exit (1); } - /**/ if (strcasecmp (mode, "none") == 0) fprintf (fd, "none\n") ; - else if (strcasecmp (mode, "rising") == 0) fprintf (fd, "rising\n") ; - else if (strcasecmp (mode, "falling") == 0) fprintf (fd, "falling\n") ; - else if (strcasecmp (mode, "both") == 0) fprintf (fd, "both\n") ; + if (strcasecmp (mode, "none") == 0) fprintf (fd, "none\n"); + else if (strcasecmp (mode, "rising") == 0) fprintf (fd, "rising\n"); + else if (strcasecmp (mode, "falling") == 0) fprintf (fd, "falling\n"); + else if (strcasecmp (mode, "both") == 0) fprintf (fd, "both\n"); else { - fprintf (stderr, "%s: Invalid mode: %s. Should be none, rising, falling or both\n", argv [1], mode) ; - exit (1) ; + fprintf (stderr, "%s: Invalid mode: %s. Should be none, rising, falling or both\n", argv[1], mode); + exit (1); } -// Change ownership of the value and edge files, so the current user can actually use it! + // Change ownership of the value and edge files, so the current user can actually use it! + sprintf (fName, "/sys/class/gpio/gpio%d/value", pin); + changeOwner (argv[0], fName); - sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ; - changeOwner (argv [0], fName) ; + sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin); + changeOwner (argv[0], fName); - sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ; - changeOwner (argv [0], fName) ; - - fclose (fd) ; + fclose (fd); } @@ -657,28 +638,27 @@ void doEdge (int argc, char *argv []) * This uses the /sys/class/gpio device interface. ********************************************************************************* */ - -void doUnexport (int argc, char *argv []) +void doUnexport (int argc, char *argv[]) { - FILE *fd ; - int pin ; + FILE *fd; + int pin; if (argc != 3) { - fprintf (stderr, "Usage: %s unexport pin\n", argv [0]) ; - exit (1) ; + fprintf (stderr, "Usage: %s unexport pin\n", argv[0]); + exit (1); } - pin = atoi (argv [2]) ; + pin = atoi (argv[2]); if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL) { - fprintf (stderr, "%s: Unable to open GPIO export interface\n", argv [0]) ; - exit (1) ; + fprintf (stderr, "%s: Unable to open GPIO export interface\n", argv[0]); + exit (1); } - fprintf (fd, "%d\n", pin) ; - fclose (fd) ; + fprintf (fd, "%d\n", pin); + fclose (fd); } @@ -689,21 +669,20 @@ void doUnexport (int argc, char *argv []) * This uses the /sys/class/gpio device interface. ********************************************************************************* */ - void doUnexportall (char *progName) { - FILE *fd ; - int pin ; + FILE *fd; + int pin; - for (pin = 0 ; pin < 63 ; ++pin) + for (pin = 0; pin < 63; ++pin) { if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL) { - fprintf (stderr, "%s: Unable to open GPIO export interface\n", progName) ; - exit (1) ; + fprintf (stderr, "%s: Unable to open GPIO export interface\n", progName); + exit (1); } - fprintf (fd, "%d\n", pin) ; - fclose (fd) ; + fprintf (fd, "%d\n", pin); + fclose (fd); } } @@ -713,12 +692,11 @@ void doUnexportall (char *progName) * Reset the GPIO pins - as much as we can do ********************************************************************************* */ - static void doReset (UNU char *progName) { - printf ("GPIO Reset is dangerous and has been removed from the gpio command.\n") ; - printf (" - Please write a shell-script to reset the GPIO pins into the state\n") ; - printf (" that you need them in for your applications.\n") ; + printf ("GPIO Reset is dangerous and has been removed from the gpio command.\n"); + printf (" - Please write a shell-script to reset the GPIO pins into the state\n"); + printf (" that you need them in for your applications.\n"); } @@ -727,43 +705,42 @@ static void doReset (UNU char *progName) * gpio mode pin mode ... ********************************************************************************* */ - -void doMode (int argc, char *argv []) +void doMode (int argc, char *argv[]) { - int pin ; - char *mode ; + int pin; + char *mode; if (argc != 4) { - fprintf (stderr, "Usage: %s mode pin mode\n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - - mode = argv [3] ; - - /**/ if (strcasecmp (mode, "in") == 0) pinMode (pin, INPUT) ; - else if (strcasecmp (mode, "input") == 0) pinMode (pin, INPUT) ; - else if (strcasecmp (mode, "out") == 0) pinMode (pin, OUTPUT) ; - else if (strcasecmp (mode, "output") == 0) pinMode (pin, OUTPUT) ; - else if (strcasecmp (mode, "pwm") == 0) pinMode (pin, PWM_OUTPUT) ; - else if (strcasecmp (mode, "pwmTone") == 0) pinMode (pin, PWM_TONE_OUTPUT) ; - else if (strcasecmp (mode, "clock") == 0) pinMode (pin, GPIO_CLOCK) ; - else if (strcasecmp (mode, "up") == 0) pullUpDnControl (pin, PUD_UP) ; - else if (strcasecmp (mode, "down") == 0) pullUpDnControl (pin, PUD_DOWN) ; - else if (strcasecmp (mode, "tri") == 0) pullUpDnControl (pin, PUD_OFF) ; - else if (strcasecmp (mode, "off") == 0) pullUpDnControl (pin, PUD_OFF) ; - else if (strcasecmp (mode, "alt0") == 0) pinModeAlt (pin, 0b100) ; - else if (strcasecmp (mode, "alt1") == 0) pinModeAlt (pin, 0b101) ; - else if (strcasecmp (mode, "alt2") == 0) pinModeAlt (pin, 0b110) ; - else if (strcasecmp (mode, "alt3") == 0) pinModeAlt (pin, 0b111) ; - else if (strcasecmp (mode, "alt4") == 0) pinModeAlt (pin, 0b011) ; - else if (strcasecmp (mode, "alt5") == 0) pinModeAlt (pin, 0b010) ; + fprintf (stderr, "Usage: %s mode pin mode\n", argv[0]); + exit (1); + } + + pin = atoi (argv[2]); + + mode = argv[3]; + + /**/ if (strcasecmp (mode, "in") == 0) pinMode (pin, INPUT); + else if (strcasecmp (mode, "input") == 0) pinMode (pin, INPUT); + else if (strcasecmp (mode, "out") == 0) pinMode (pin, OUTPUT); + else if (strcasecmp (mode, "output") == 0) pinMode (pin, OUTPUT); + else if (strcasecmp (mode, "pwm") == 0) pinMode (pin, PWM_OUTPUT); + else if (strcasecmp (mode, "pwmTone") == 0) pinMode (pin, PWM_TONE_OUTPUT); + else if (strcasecmp (mode, "clock") == 0) pinMode (pin, GPIO_CLOCK); + else if (strcasecmp (mode, "up") == 0) pullUpDnControl (pin, PUD_UP); + else if (strcasecmp (mode, "down") == 0) pullUpDnControl (pin, PUD_DOWN); + else if (strcasecmp (mode, "tri") == 0) pullUpDnControl (pin, PUD_OFF); + else if (strcasecmp (mode, "off") == 0) pullUpDnControl (pin, PUD_OFF); + else if (strcasecmp (mode, "alt0") == 0) pinModeAlt (pin, 0b100); + else if (strcasecmp (mode, "alt1") == 0) pinModeAlt (pin, 0b101); + else if (strcasecmp (mode, "alt2") == 0) pinModeAlt (pin, 0b110); + else if (strcasecmp (mode, "alt3") == 0) pinModeAlt (pin, 0b111); + else if (strcasecmp (mode, "alt4") == 0) pinModeAlt (pin, 0b011); + else if (strcasecmp (mode, "alt5") == 0) pinModeAlt (pin, 0b010); else { - fprintf (stderr, "%s: Invalid mode: %s. Should be in/out/pwm/clock/up/down/tri\n", argv [1], mode) ; - exit (1) ; + fprintf (stderr, "%s: Invalid mode: %s. Should be in/out/pwm/clock/up/down/tri\n", argv[1], mode); + exit (1); } } @@ -773,33 +750,32 @@ void doMode (int argc, char *argv []) * gpio drive group value ********************************************************************************* */ - -static void doPadDrive (int argc, char *argv []) +static void doPadDrive (int argc, char *argv[]) { - int group, val ; + int group, val; if (argc != 4) { - fprintf (stderr, "Usage: %s drive group value\n", argv [0]) ; - exit (1) ; + fprintf (stderr, "Usage: %s drive group value\n", argv[0]); + exit (1); } - group = atoi (argv [2]) ; - val = atoi (argv [3]) ; + group = atoi (argv[2]); + val = atoi (argv[3]); if ((group < 0) || (group > 2)) { - fprintf (stderr, "%s: drive group not 0, 1 or 2: %d\n", argv [0], group) ; - exit (1) ; + fprintf (stderr, "%s: drive group not 0, 1 or 2: %d\n", argv[0], group); + exit (1); } if ((val < 0) || (val > 7)) { - fprintf (stderr, "%s: drive value not 0-7: %d\n", argv [0], val) ; - exit (1) ; + fprintf (stderr, "%s: drive value not 0-7: %d\n", argv[0], val); + exit (1); } - setPadDrive (group, val) ; + setPadDrive (group, val); } @@ -810,48 +786,46 @@ static void doPadDrive (int argc, char *argv []) ********************************************************************************* */ -static void doUsbP (int argc, char *argv []) +static void doUsbP (int argc, char *argv[]) { - int model, rev, mem, maker, overVolted ; + int model, proc, rev, mem, maker, overVolted; if (argc != 3) { - fprintf (stderr, "Usage: %s usbp high|low\n", argv [0]) ; - exit (1) ; + 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) ; + // Make sure we're on a B+ + piBoardId (&model, &proc, &rev, &mem, &maker, &overVolted); - if (!((model == PI_MODEL_BP) || (model == PI_MODEL_2))) + if (!((model == PI_MODEL_BP) || (model == PI_MODEL_2B))) { - fprintf (stderr, "USB power contol is applicable to B+ and v2 boards only.\n") ; - exit (1) ; + fprintf (stderr, "USB power contol is applicable to B+ and v2 boards only.\n"); + exit (1); } - -// Make sure we start in BCM_GPIO mode - wiringPiSetupGpio () ; + // Make sure we start in BCM_GPIO mode + wiringPiSetupGpio (); - if ((strcasecmp (argv [2], "high") == 0) || (strcasecmp (argv [2], "hi") == 0)) + 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 ; + 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)) + 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 ; + 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) ; + fprintf (stderr, "Usage: %s usbp high|low\n", argv[0]); + exit (1); } @@ -862,38 +836,38 @@ static void doUsbP (int argc, char *argv []) ********************************************************************************* */ -static void doGbw (int argc, char *argv []) +static void doGbw (int argc, char *argv[]) { - int channel, value ; + int channel, value; if (argc != 4) { - fprintf (stderr, "Usage: %s gbw \n", argv [0]) ; - exit (1) ; + fprintf (stderr, "Usage: %s gbw \n", argv[0]); + exit (1); } - channel = atoi (argv [2]) ; - value = atoi (argv [3]) ; + channel = atoi (argv[2]); + value = atoi (argv[3]); if ((channel < 0) || (channel > 1)) { - fprintf (stderr, "%s: gbw: Channel number must be 0 or 1\n", argv [0]) ; - exit (1) ; + fprintf (stderr, "%s: gbw: Channel number must be 0 or 1\n", argv[0]); + exit (1); } if ((value < 0) || (value > 255)) { - fprintf (stderr, "%s: gbw: Value must be from 0 to 255\n", argv [0]) ; - exit (1) ; + fprintf (stderr, "%s: gbw: Value must be from 0 to 255\n", argv[0]); + exit (1); } if (gertboardAnalogSetup (64) < 0) { - fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ; - exit (1) ; + fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)); + exit (1); } - analogWrite (64 + channel, value) ; + analogWrite (64 + channel, value); } @@ -904,31 +878,31 @@ static void doGbw (int argc, char *argv []) ********************************************************************************* */ -static void doGbr (int argc, char *argv []) +static void doGbr (int argc, char *argv[]) { - int channel ; + int channel; if (argc != 3) { - fprintf (stderr, "Usage: %s gbr \n", argv [0]) ; - exit (1) ; + fprintf (stderr, "Usage: %s gbr \n", argv[0]); + exit (1); } - channel = atoi (argv [2]) ; + channel = atoi (argv[2]); if ((channel < 0) || (channel > 1)) { - fprintf (stderr, "%s: gbr: Channel number must be 0 or 1\n", argv [0]) ; - exit (1) ; + fprintf (stderr, "%s: gbr: Channel number must be 0 or 1\n", argv[0]); + exit (1); } if (gertboardAnalogSetup (64) < 0) { - fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ; - exit (1) ; + fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)); + exit (1); } - printf ("%d\n", analogRead (64 + channel)) ; + printf ("%d\n", analogRead (64 + channel)); } @@ -938,29 +912,29 @@ static void doGbr (int argc, char *argv []) ********************************************************************************* */ -static void doWrite (int argc, char *argv []) +static void doWrite (int argc, char *argv[]) { - int pin, val ; + int pin, val; if (argc != 4) { - fprintf (stderr, "Usage: %s write pin value\n", argv [0]) ; - exit (1) ; + fprintf (stderr, "Usage: %s write pin value\n", argv[0]); + exit (1); } - pin = atoi (argv [2]) ; + pin = atoi (argv[2]); - /**/ if ((strcasecmp (argv [3], "up") == 0) || (strcasecmp (argv [3], "on") == 0)) - val = 1 ; - else if ((strcasecmp (argv [3], "down") == 0) || (strcasecmp (argv [3], "off") == 0)) - val = 0 ; + /**/ if ((strcasecmp (argv[3], "up") == 0) || (strcasecmp (argv[3], "on") == 0)) + val = 1; + else if ((strcasecmp (argv[3], "down") == 0) || (strcasecmp (argv[3], "off") == 0)) + val = 0; else - val = atoi (argv [3]) ; + val = atoi (argv[3]); /**/ if (val == 0) - digitalWrite (pin, LOW) ; + digitalWrite (pin, LOW); else - digitalWrite (pin, HIGH) ; + digitalWrite (pin, HIGH); } @@ -970,21 +944,21 @@ static void doWrite (int argc, char *argv []) ********************************************************************************* */ -static void doAwrite (int argc, char *argv []) +static void doAwrite (int argc, char *argv[]) { - int pin, val ; + int pin, val; if (argc != 4) { - fprintf (stderr, "Usage: %s awrite pin value\n", argv [0]) ; - exit (1) ; + fprintf (stderr, "Usage: %s awrite pin value\n", argv[0]); + exit (1); } - pin = atoi (argv [2]) ; + pin = atoi (argv[2]); - val = atoi (argv [3]) ; + val = atoi (argv[3]); - analogWrite (pin, val) ; + analogWrite (pin, val); } @@ -994,19 +968,19 @@ static void doAwrite (int argc, char *argv []) ********************************************************************************* */ -static void doWriteByte (int argc, char *argv []) +static void doWriteByte (int argc, char *argv[]) { - int val ; + int val; if (argc != 3) { - fprintf (stderr, "Usage: %s wb value\n", argv [0]) ; - exit (1) ; + fprintf (stderr, "Usage: %s wb value\n", argv[0]); + exit (1); } - val = (int)strtol (argv [2], NULL, 0) ; + val = (int)strtol (argv[2], NULL, 0); - digitalWriteByte (val) ; + digitalWriteByte (val); } @@ -1016,21 +990,21 @@ static void doWriteByte (int argc, char *argv []) ********************************************************************************* */ -static void doReadByte (int argc, char *argv [], int printHex) +static void doReadByte (int argc, char *argv[], int printHex) { - int val ; + int val; if (argc != 2) { - fprintf (stderr, "Usage: %s rbx|rbd\n", argv [0]) ; - exit (1) ; + fprintf (stderr, "Usage: %s rbx|rbd\n", argv[0]); + exit (1); } - val = digitalReadByte () ; + val = digitalReadByte (); if (printHex) - printf ("%02X\n", val) ; + printf ("%02X\n", val); else - printf ("%d\n", val) ; + printf ("%d\n", val); } @@ -1040,20 +1014,20 @@ static void doReadByte (int argc, char *argv [], int printHex) ********************************************************************************* */ -void doRead (int argc, char *argv []) +void doRead (int argc, char *argv[]) { - int pin, val ; + int pin, val; if (argc != 3) { - fprintf (stderr, "Usage: %s read pin\n", argv [0]) ; - exit (1) ; + fprintf (stderr, "Usage: %s read pin\n", argv[0]); + exit (1); } - pin = atoi (argv [2]) ; - val = digitalRead (pin) ; + pin = atoi (argv[2]); + val = digitalRead (pin); - printf ("%s\n", val == 0 ? "0" : "1") ; + printf ("%s\n", val == 0 ? "0" : "1"); } @@ -1063,15 +1037,15 @@ void doRead (int argc, char *argv []) ********************************************************************************* */ -void doAread (int argc, char *argv []) +void doAread (int argc, char *argv[]) { if (argc != 3) { - fprintf (stderr, "Usage: %s aread pin\n", argv [0]) ; - exit (1) ; + fprintf (stderr, "Usage: %s aread pin\n", argv[0]); + exit (1); } - printf ("%d\n", analogRead (atoi (argv [2]))) ; + printf ("%d\n", analogRead (atoi (argv[2]))); } @@ -1081,19 +1055,19 @@ void doAread (int argc, char *argv []) ********************************************************************************* */ -void doToggle (int argc, char *argv []) +void doToggle (int argc, char *argv[]) { - int pin ; + int pin; if (argc != 3) { - fprintf (stderr, "Usage: %s toggle pin\n", argv [0]) ; - exit (1) ; + fprintf (stderr, "Usage: %s toggle pin\n", argv[0]); + exit (1); } - pin = atoi (argv [2]) ; + pin = atoi (argv[2]); - digitalWrite (pin, !digitalRead (pin)) ; + digitalWrite (pin, !digitalRead (pin)); } @@ -1103,23 +1077,23 @@ void doToggle (int argc, char *argv []) ********************************************************************************* */ -void doBlink (int argc, char *argv []) +void doBlink (int argc, char *argv[]) { - int pin ; + int pin; if (argc != 3) { - fprintf (stderr, "Usage: %s blink pin\n", argv [0]) ; - exit (1) ; + fprintf (stderr, "Usage: %s blink pin\n", argv[0]); + exit (1); } - pin = atoi (argv [2]) ; + pin = atoi (argv[2]); - pinMode (pin, OUTPUT) ; + pinMode (pin, OUTPUT); for (;;) { - digitalWrite (pin, !digitalRead (pin)) ; - delay (500) ; + digitalWrite (pin, !digitalRead (pin)); + delay (500); } } @@ -1131,20 +1105,20 @@ void doBlink (int argc, char *argv []) ********************************************************************************* */ -void doPwmTone (int argc, char *argv []) +void doPwmTone (int argc, char *argv[]) { - int pin, freq ; + int pin, freq; if (argc != 4) { - fprintf (stderr, "Usage: %s pwmTone \n", argv [0]) ; - exit (1) ; + fprintf (stderr, "Usage: %s pwmTone \n", argv[0]); + exit (1); } - pin = atoi (argv [2]) ; - freq = atoi (argv [3]) ; + pin = atoi (argv[2]); + freq = atoi (argv[3]); - pwmToneWrite (pin, freq) ; + pwmToneWrite (pin, freq); } @@ -1154,21 +1128,21 @@ void doPwmTone (int argc, char *argv []) ********************************************************************************* */ -void doClock (int argc, char *argv []) +void doClock (int argc, char *argv[]) { - int pin, freq ; + int pin, freq; if (argc != 4) { - fprintf (stderr, "Usage: %s clock \n", argv [0]) ; - exit (1) ; + fprintf (stderr, "Usage: %s clock \n", argv[0]); + exit (1); } - pin = atoi (argv [2]) ; + pin = atoi (argv[2]); - freq = atoi (argv [3]) ; + freq = atoi (argv[3]); - gpioClockSet (pin, freq) ; + gpioClockSet (pin, freq); } @@ -1178,21 +1152,21 @@ void doClock (int argc, char *argv []) ********************************************************************************* */ -void doPwm (int argc, char *argv []) +void doPwm (int argc, char *argv[]) { - int pin, val ; + int pin, val; if (argc != 4) { - fprintf (stderr, "Usage: %s pwm \n", argv [0]) ; - exit (1) ; + fprintf (stderr, "Usage: %s pwm \n", argv[0]); + exit (1); } - pin = atoi (argv [2]) ; + pin = atoi (argv[2]); - val = atoi (argv [3]) ; + val = atoi (argv[3]); - pwmWrite (pin, val) ; + pwmWrite (pin, val); } @@ -1204,49 +1178,49 @@ void doPwm (int argc, char *argv []) static void doPwmMode (int mode) { - pwmSetMode (mode) ; + pwmSetMode (mode); } -static void doPwmRange (int argc, char *argv []) +static void doPwmRange (int argc, char *argv[]) { - unsigned int range ; + unsigned int range; if (argc != 3) { - fprintf (stderr, "Usage: %s pwmr \n", argv [0]) ; - exit (1) ; + fprintf (stderr, "Usage: %s pwmr \n", argv[0]); + exit (1); } - range = (unsigned int)strtoul (argv [2], NULL, 10) ; + range = (unsigned int)strtoul (argv[2], NULL, 10); if (range == 0) { - fprintf (stderr, "%s: range must be > 0\n", argv [0]) ; - exit (1) ; + fprintf (stderr, "%s: range must be > 0\n", argv[0]); + exit (1); } - pwmSetRange (range) ; + pwmSetRange (range); } -static void doPwmClock (int argc, char *argv []) +static void doPwmClock (int argc, char *argv[]) { - unsigned int clock ; + unsigned int clock; if (argc != 3) { - fprintf (stderr, "Usage: %s pwmc \n", argv [0]) ; - exit (1) ; + fprintf (stderr, "Usage: %s pwmc \n", argv[0]); + exit (1); } - clock = (unsigned int)strtoul (argv [2], NULL, 10) ; + clock = (unsigned int)strtoul (argv[2], NULL, 10); if ((clock < 1) || (clock > 4095)) { - fprintf (stderr, "%s: clock must be between 0 and 4096\n", argv [0]) ; - exit (1) ; + fprintf (stderr, "%s: clock must be between 0 and 4096\n", argv[0]); + exit (1); } - pwmSetClock (clock) ; + pwmSetClock (clock); } @@ -1257,46 +1231,65 @@ static void doPwmClock (int argc, char *argv []) ********************************************************************************* */ -static void doVersion (char *argv []) +static void doVersion (char *argv[]) { - int model, rev, mem, maker, warranty ; - struct stat statBuf ; - char name [80] ; - FILE *fd ; - - int vMaj, vMin ; - - wiringPiVersion (&vMaj, &vMin) ; - printf ("gpio version: %d.%d\n", vMaj, vMin) ; - printf ("Copyright (c) 2012-2018 Gordon Henderson\n") ; - 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, &warranty) ; - - printf ("Raspberry Pi Details:\n") ; - printf (" Type: %s, Revision: %s, Memory: %dMB, Maker: %s %s\n", - piModelNames [model], piRevisionNames [rev], piMemorySize [mem], piMakerNames [maker], warranty ? "[Out of Warranty]" : "") ; - -// Check for device tree - + int model, proc, rev, mem, maker, warranty; + struct stat statBuf; + char name[80]; + FILE *fd; + + int vMaj, vMin; + + wiringPiVersion (&vMaj, &vMin); + printf ("\n"); + printf ("gpio version: %d.%d\n", vMaj, vMin); + printf ("Copyright (c) 2012-2018 Gordon Henderson\n"); + printf ("This is free software with ABSOLUTELY NO WARRANTY.\n"); + printf ("For details type: \"%s -warranty\"\n", basename(argv[0])); + printf ("\n"); + + piBoardId (&model, &proc, &rev, &mem, &maker, &warranty); + + printf ("Raspberry Pi Details\n" + " Type : %s\n" + " Processor: %s\n" + " Revision : %s\n" + " Memory : %dMB\n" + " Maker : %s\n" + " %s\n", + piModelNames[model], + piProcessorNames[proc], + piRevisionNames[rev], + piMemorySize[mem], + piMakerNames[maker], + warranty ? "[Out of Warranty]\n" : ""); + + // Check for device tree if (stat ("/proc/device-tree", &statBuf) == 0) // We're on a devtree system ... - printf (" * Device tree is enabled.\n") ; + { + printf (" * Device tree is enabled.\n"); + } if (stat ("/proc/device-tree/model", &statBuf) == 0) // Output Kernel idea of board type { if ((fd = fopen ("/proc/device-tree/model", "r")) != NULL) { - fgets (name, 80, fd) ; - fclose (fd) ; - printf (" *--> %s\n", name) ; + fgets (name, 80, fd); + fclose (fd); + printf (" * Model string: \"%s\"\n", name); } } if (stat ("/dev/gpiomem", &statBuf) == 0) // User level GPIO is GO - printf (" * This Raspberry Pi supports user-level GPIO access.\n") ; + { + printf (" * This Raspberry Pi supports user-level GPIO access.\n"); + } else - printf (" * Root or sudo required for GPIO access.\n") ; + { + printf (" * Root or sudo required for GPIO access.\n"); + } + + printf ("\n"); } @@ -1306,233 +1299,213 @@ static void doVersion (char *argv []) ********************************************************************************* */ -int main (int argc, char *argv []) +int main (int argc, char *argv[]) { - int i ; + int i; if (getenv ("WIRINGPI_DEBUG") != NULL) { - printf ("gpio: wiringPi debug mode enabled\n") ; - wiringPiDebug = TRUE ; + printf ("gpio: wiringPi debug mode enabled\n"); + wiringPiDebug = TRUE; } if (argc == 1) { fprintf (stderr, -"%s: At your service!\n" -" Type: gpio -h for full details and\n" -" gpio readall for a quick printout of your connector details\n", argv [0]) ; - exit (EXIT_FAILURE) ; + "%s:\n" + " Format: gpio -h for full details and\n" + " gpio readall for a quick printout of your connector details\n", basename(argv[0])); + exit (EXIT_FAILURE); } -// Help - - if (strcasecmp (argv [1], "-h") == 0) + // Help + if (strcasecmp (argv[1], "-h") == 0) { - printf ("%s: %s\n", argv [0], usage) ; - exit (EXIT_SUCCESS) ; + printf ("%s\n", usage); + exit (EXIT_SUCCESS); } -// Version & Warranty -// Wish I could remember why I have both -R and -V ... +// // Version & Warranty +// if (strcmp (argv[1], "-V") == 0) +// { +// printf ("%d\n", piGpioLayout()); +// exit (EXIT_SUCCESS); +// } - if ((strcmp (argv [1], "-R") == 0) || (strcmp (argv [1], "-V") == 0)) + // Version and information + if (strcmp (argv[1], "-v") == 0) { - printf ("%d\n", piGpioLayout ()) ; - exit (EXIT_SUCCESS) ; + doVersion (argv); + exit (EXIT_SUCCESS); } -// Version and information - - if (strcmp (argv [1], "-v") == 0) + if (strcasecmp (argv[1], "-warranty") == 0) { - doVersion (argv) ; - exit (EXIT_SUCCESS) ; - } - - if (strcasecmp (argv [1], "-warranty") == 0) - { - printf ("gpio version: %s\n", VERSION) ; - printf ("Copyright (c) 2012-2018 Gordon Henderson\n") ; - printf ("\n") ; - printf (" This program is free software; you can redistribute it and/or modify\n") ; - printf (" it under the terms of the GNU Leser General Public License as published\n") ; - printf (" by the Free Software Foundation, either version 3 of the License, or\n") ; - printf (" (at your option) any later version.\n") ; - printf ("\n") ; - printf (" This program is distributed in the hope that it will be useful,\n") ; - printf (" but WITHOUT ANY WARRANTY; without even the implied warranty of\n") ; - printf (" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n") ; - printf (" GNU Lesser General Public License for more details.\n") ; - printf ("\n") ; - printf (" You should have received a copy of the GNU Lesser General Public License\n") ; - printf (" along with this program. If not, see .\n") ; - printf ("\n") ; - exit (EXIT_SUCCESS) ; + printf ("gpio version: %s\n", VERSION); + printf ("Copyright (c) 2012-2018 Gordon Henderson\n"); + printf ("\n"); + printf (" This program is free software; you can redistribute it and/or modify\n"); + printf (" it under the terms of the GNU Leser General Public License as published\n"); + printf (" by the Free Software Foundation, either version 3 of the License, or\n"); + printf (" (at your option) any later version.\n"); + printf ("\n"); + printf (" This program is distributed in the hope that it will be useful,\n"); + printf (" but WITHOUT ANY WARRANTY; without even the implied warranty of\n"); + printf (" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"); + printf (" GNU Lesser General Public License for more details.\n"); + printf ("\n"); + printf (" You should have received a copy of the GNU Lesser General Public License\n"); + printf (" along with this program. If not, see .\n"); + printf ("\n"); + exit (EXIT_SUCCESS); } if (geteuid () != 0) { - fprintf (stderr, "%s: Must be root to run. Program should be suid root. This is an error.\n", argv [0]) ; - exit (EXIT_FAILURE) ; + fprintf (stderr, "%s: Must be root to run. Program should be suid root. This is an error.\n", argv[0]); + exit (EXIT_FAILURE); } -// Initial test for /sys/class/gpio operations: - - /**/ if (strcasecmp (argv [1], "exports" ) == 0) { doExports (argc, argv) ; return 0 ; } - else if (strcasecmp (argv [1], "export" ) == 0) { doExport (argc, argv) ; return 0 ; } - else if (strcasecmp (argv [1], "edge" ) == 0) { doEdge (argc, argv) ; return 0 ; } - else if (strcasecmp (argv [1], "unexport" ) == 0) { doUnexport (argc, argv) ; return 0 ; } - else if (strcasecmp (argv [1], "unexportall") == 0) { doUnexportall (argv [0]) ; return 0 ; } - -// Check for load command: - - if (strcasecmp (argv [1], "load" ) == 0) { doLoad (argc, argv) ; return 0 ; } - if (strcasecmp (argv [1], "unload" ) == 0) { doUnLoad (argc, argv) ; return 0 ; } - -// Check for usb power command - - if (strcasecmp (argv [1], "usbp" ) == 0) { doUsbP (argc, argv) ; return 0 ; } + // Initial test for /sys/class/gpio operations: + if (strcasecmp (argv[1], "exports" ) == 0) { doExports (argc, argv); return 0; } + else if (strcasecmp (argv[1], "export" ) == 0) { doExport (argc, argv); return 0; } + else if (strcasecmp (argv[1], "edge" ) == 0) { doEdge (argc, argv); return 0; } + else if (strcasecmp (argv[1], "unexport" ) == 0) { doUnexport (argc, argv); return 0; } + else if (strcasecmp (argv[1], "unexportall") == 0) { doUnexportall (argv[0]); return 0; } -// Gertboard commands + // Check for load command: + if (strcasecmp (argv[1], "load" ) == 0) { doLoad (argc, argv); return 0; } + if (strcasecmp (argv[1], "unload" ) == 0) { doUnLoad (argc, argv); return 0; } - if (strcasecmp (argv [1], "gbr" ) == 0) { doGbr (argc, argv) ; return 0 ; } - if (strcasecmp (argv [1], "gbw" ) == 0) { doGbw (argc, argv) ; return 0 ; } + // Check for usb power command + if (strcasecmp (argv[1], "usbp" ) == 0) { doUsbP (argc, argv); return 0; } -// Check for allreadall command, force Gpio mode + // Gertboard commands + if (strcasecmp (argv[1], "gbr" ) == 0) { doGbr (argc, argv); return 0; } + if (strcasecmp (argv[1], "gbw" ) == 0) { doGbw (argc, argv); return 0; } - if (strcasecmp (argv [1], "allreadall") == 0) + // Check for allreadall command, force Gpio mode + if (strcasecmp (argv[1], "allreadall") == 0) { - wiringPiSetupGpio () ; - doAllReadall () ; - return 0 ; + wiringPiSetupGpio (); + doAllReadall (); + return 0; } -// Check for -g argument - - /**/ if (strcasecmp (argv [1], "-g") == 0) + // Check for -g argument + if (strcasecmp (argv[1], "-g") == 0) { - wiringPiSetupGpio () ; + wiringPiSetupGpio (); - for (i = 2 ; i < argc ; ++i) - argv [i - 1] = argv [i] ; - --argc ; - wpMode = WPI_MODE_GPIO ; + for (i = 2; i < argc; ++i) + argv[i - 1] = argv[i]; + --argc; + wpMode = WPI_MODE_GPIO; } -// Check for -1 argument - - else if (strcasecmp (argv [1], "-1") == 0) + // Check for -1 argument + else if (strcasecmp (argv[1], "-1") == 0) { - wiringPiSetupPhys () ; + wiringPiSetupPhys (); - for (i = 2 ; i < argc ; ++i) - argv [i - 1] = argv [i] ; - --argc ; - wpMode = WPI_MODE_PHYS ; + for (i = 2; i < argc; ++i) + argv[i - 1] = argv[i]; + --argc; + wpMode = WPI_MODE_PHYS; } -// Check for -p argument for PiFace - - else if (strcasecmp (argv [1], "-p") == 0) + // Check for -p argument for PiFace + else if (strcasecmp (argv[1], "-p") == 0) { - piFaceSetup (200) ; + piFaceSetup (200); - for (i = 2 ; i < argc ; ++i) - argv [i - 1] = argv [i] ; - --argc ; - wpMode = WPI_MODE_PIFACE ; + for (i = 2; i < argc; ++i) + argv[i - 1] = argv[i]; + --argc; + wpMode = WPI_MODE_PIFACE; } -// Check for -z argument so we don't actually initialise wiringPi - - else if (strcasecmp (argv [1], "-z") == 0) + // Check for -z argument so we don't actually initialise wiringPi + else if (strcasecmp (argv[1], "-z") == 0) { - for (i = 2 ; i < argc ; ++i) - argv [i - 1] = argv [i] ; - --argc ; - wpMode = WPI_MODE_UNINITIALISED ; + for (i = 2; i < argc; ++i) + argv[i - 1] = argv[i]; + --argc; + wpMode = WPI_MODE_UNINITIALISED; } -// Default to wiringPi mode - + // Default to wiringPi mode else { - wiringPiSetup () ; - wpMode = WPI_MODE_PINS ; + wiringPiSetup (); + wpMode = WPI_MODE_PINS; } -// Check for -x argument to load in a new extension -// -x extension:base:args -// Can load many modules, but unless daemon mode we can only send one -// command at a time. - - while (strcasecmp (argv [1], "-x") == 0) + // Check for -x argument to load in a new extension + // -x extension:base:args + // Can load many modules, but unless daemon mode we can only send one command at a time. + while (strcasecmp (argv[1], "-x") == 0) { if (argc < 3) { - fprintf (stderr, "%s: -x missing extension command.\n", argv [0]) ; - exit (EXIT_FAILURE) ; + fprintf (stderr, "%s: -x missing extension command.\n", argv[0]); + exit (EXIT_FAILURE); } - if (!loadWPiExtension (argv [0], argv [2], TRUE)) + if (!loadWPiExtension (argv[0], argv[2], TRUE)) { - fprintf (stderr, "%s: Extension load failed: %s\n", argv [0], strerror (errno)) ; - exit (EXIT_FAILURE) ; + fprintf (stderr, "%s: Extension load failed: %s\n", argv[0], strerror (errno)); + exit (EXIT_FAILURE); } -// Shift args down by 2 - - for (i = 3 ; i < argc ; ++i) - argv [i - 2] = argv [i] ; - argc -= 2 ; + // Shift args down by 2 + for (i = 3; i < argc; ++i) + argv[i - 2] = argv[i]; + argc -= 2; } if (argc <= 1) { - fprintf (stderr, "%s: no command given\n", argv [0]) ; - exit (EXIT_FAILURE) ; - } - -// Core wiringPi functions - - /**/ if (strcasecmp (argv [1], "mode" ) == 0) doMode (argc, argv) ; - else if (strcasecmp (argv [1], "read" ) == 0) doRead (argc, argv) ; - else if (strcasecmp (argv [1], "write" ) == 0) doWrite (argc, argv) ; - else if (strcasecmp (argv [1], "pwm" ) == 0) doPwm (argc, argv) ; - else if (strcasecmp (argv [1], "awrite" ) == 0) doAwrite (argc, argv) ; - else if (strcasecmp (argv [1], "aread" ) == 0) doAread (argc, argv) ; - -// GPIO Nicies - - else if (strcasecmp (argv [1], "toggle" ) == 0) doToggle (argc, argv) ; - else if (strcasecmp (argv [1], "blink" ) == 0) doBlink (argc, argv) ; - -// Pi Specifics - - else if (strcasecmp (argv [1], "pwm-bal" ) == 0) doPwmMode (PWM_MODE_BAL) ; - else if (strcasecmp (argv [1], "pwm-ms" ) == 0) doPwmMode (PWM_MODE_MS) ; - else if (strcasecmp (argv [1], "pwmr" ) == 0) doPwmRange (argc, 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) doReadall () ; - else if (strcasecmp (argv [1], "nreadall" ) == 0) doReadall () ; - else if (strcasecmp (argv [1], "pins" ) == 0) doReadall () ; - else if (strcasecmp (argv [1], "qmode" ) == 0) doQmode (argc, argv) ; - else if (strcasecmp (argv [1], "i2cdetect") == 0) doI2Cdetect (argc, argv) ; - else if (strcasecmp (argv [1], "i2cd" ) == 0) doI2Cdetect (argc, argv) ; - else if (strcasecmp (argv [1], "reset" ) == 0) doReset (argv [0]) ; - else if (strcasecmp (argv [1], "wb" ) == 0) doWriteByte (argc, argv) ; - else if (strcasecmp (argv [1], "rbx" ) == 0) doReadByte (argc, argv, TRUE) ; - else if (strcasecmp (argv [1], "rbd" ) == 0) doReadByte (argc, argv, FALSE) ; - else if (strcasecmp (argv [1], "clock" ) == 0) doClock (argc, argv) ; - else if (strcasecmp (argv [1], "wfi" ) == 0) doWfi (argc, argv) ; + fprintf (stderr, "[FATAL] %s: no command given\n", basename(argv[0])); + exit (EXIT_FAILURE); + } + + // Core wiringPi functions + if (strcasecmp (argv[1], "mode" ) == 0) doMode (argc, argv); + else if (strcasecmp (argv[1], "read" ) == 0) doRead (argc, argv); + else if (strcasecmp (argv[1], "write" ) == 0) doWrite (argc, argv); + else if (strcasecmp (argv[1], "pwm" ) == 0) doPwm (argc, argv); + else if (strcasecmp (argv[1], "awrite" ) == 0) doAwrite (argc, argv); + else if (strcasecmp (argv[1], "aread" ) == 0) doAread (argc, argv); + + // GPIO utils + else if (strcasecmp (argv[1], "toggle" ) == 0) doToggle (argc, argv); + else if (strcasecmp (argv[1], "blink" ) == 0) doBlink (argc, argv); + + // Pi Specifics + else if (strcasecmp (argv[1], "pwm-bal" ) == 0) doPwmMode (PWM_MODE_BAL); + else if (strcasecmp (argv[1], "pwm-ms" ) == 0) doPwmMode (PWM_MODE_MS); + else if (strcasecmp (argv[1], "pwmr" ) == 0) doPwmRange (argc, 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) doReadall (); + else if (strcasecmp (argv[1], "nreadall" ) == 0) doReadall (); + else if (strcasecmp (argv[1], "pins" ) == 0) doReadall (); + else if (strcasecmp (argv[1], "qmode" ) == 0) doQmode (argc, argv); + else if (strcasecmp (argv[1], "i2cdetect") == 0) doI2Cdetect (argc, argv); + else if (strcasecmp (argv[1], "i2cd" ) == 0) doI2Cdetect (argc, argv); + else if (strcasecmp (argv[1], "reset" ) == 0) doReset (argv[0]); + else if (strcasecmp (argv[1], "wb" ) == 0) doWriteByte (argc, argv); + else if (strcasecmp (argv[1], "rbx" ) == 0) doReadByte (argc, argv, TRUE); + else if (strcasecmp (argv[1], "rbd" ) == 0) doReadByte (argc, argv, FALSE); + else if (strcasecmp (argv[1], "clock" ) == 0) doClock (argc, argv); + else if (strcasecmp (argv[1], "wfi" ) == 0) doWfi (argc, argv); else { - fprintf (stderr, "%s: Unknown command: %s.\n", argv [0], argv [1]) ; - exit (EXIT_FAILURE) ; + fprintf (stderr, "[FATAL] %s: Unknown command: %s.\n", basename(argv[0]), argv[1]); + exit (EXIT_FAILURE); } - return 0 ; + return EXIT_SUCCESS; } diff --git a/gpio/pintest b/gpio/pintest old mode 100755 new mode 100644 diff --git a/gpio/readall.c b/gpio/readall.c old mode 100755 new mode 100644 index 932f8e1..23b584a --- a/gpio/readall.c +++ b/gpio/readall.c @@ -75,15 +75,15 @@ static void doReadallExternal (void) ********************************************************************************* */ -static char *alts [] = +static char *alts[] = { "IN", "OUT", "ALT5", "ALT4", "ALT0", "ALT1", "ALT2", "ALT3" } ; -static int physToWpi [64] = +static int physToWpi[64] = { - -1, // 0 - -1, -1, // 1, 2 + -1, // 0 + -1, -1, // 1, 2 8, -1, 9, -1, 7, 15, @@ -95,48 +95,48 @@ static int physToWpi [64] = 12, -1, 13, 6, 14, 10, - -1, 11, // 25, 26 + -1, 11, // 25, 26 30, 31, // Actually I2C, but not used 21, -1, 22, 26, 23, -1, 24, 27, 25, 28, - -1, 29, - -1, -1, + -1, 29, // 39, 40 + + -1, -1, // 41, 42 -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, - 19, 20, + 19, 20, // 53, 54 -1, -1, -1, -1, -1, -1, -1, -1, -1 } ; -static char *physNames [64] = +static char *physNames[64] = { NULL, - " 3.3v", "5v ", " SDA.1", "5v ", - " SCL.1", "0v ", + " SCL.1", "GND ", "GPIO. 7", "TxD ", - " 0v", "RxD ", + " GND", "RxD ", "GPIO. 0", "GPIO. 1", - "GPIO. 2", "0v ", + "GPIO. 2", "GND ", "GPIO. 3", "GPIO. 4", " 3.3v", "GPIO. 5", - " MOSI", "0v ", + " MOSI", "GND ", " MISO", "GPIO. 6", " SCLK", "CE0 ", - " 0v", "CE1 ", + " GND", "CE1 ", " SDA.0", "SCL.0 ", - "GPIO.21", "0v ", + "GPIO.21", "GND ", "GPIO.22", "GPIO.26", - "GPIO.23", "0v ", + "GPIO.23", "GND ", "GPIO.24", "GPIO.27", "GPIO.25", "GPIO.28", - " 0v", "GPIO.29", + " GND", "GPIO.29", NULL, NULL, NULL, NULL, NULL, NULL, @@ -162,22 +162,22 @@ static void readallPhys (int physPin) if (physPinToGpio (physPin) == -1) printf (" | | ") ; else - printf (" | %3d | %3d", physPinToGpio (physPin), physToWpi [physPin]) ; + printf (" | %3d | %3d", physPinToGpio (physPin), physToWpi[physPin]) ; - printf (" | %s", physNames [physPin]) ; + printf (" | %s", physNames[physPin]) ; - if (physToWpi [physPin] == -1) + if (physToWpi[physPin] == -1) printf (" | | ") ; else { - /**/ if (wpMode == WPI_MODE_GPIO) + if (wpMode == WPI_MODE_GPIO) pin = physPinToGpio (physPin) ; else if (wpMode == WPI_MODE_PHYS) pin = physPin ; else - pin = physToWpi [physPin] ; + pin = physToWpi[physPin] ; - printf (" | %4s", alts [getAlt (pin)]) ; + printf (" | %4s", alts[getAlt (pin)]) ; printf (" | %d", digitalRead (pin)) ; } @@ -189,27 +189,27 @@ static void readallPhys (int physPin) // Same, reversed - if (physToWpi [physPin] == -1) + if (physToWpi[physPin] == -1) printf (" | | ") ; else { - /**/ if (wpMode == WPI_MODE_GPIO) + if (wpMode == WPI_MODE_GPIO) pin = physPinToGpio (physPin) ; else if (wpMode == WPI_MODE_PHYS) pin = physPin ; else - pin = physToWpi [physPin] ; + pin = physToWpi[physPin] ; printf (" | %d", digitalRead (pin)) ; - printf (" | %-4s", alts [getAlt (pin)]) ; + printf (" | %-4s", alts[getAlt (pin)]) ; } - printf (" | %-5s", physNames [physPin]) ; + printf (" | %-5s", physNames[physPin]) ; - if (physToWpi [physPin] == -1) + if (physToWpi [physPin] == -1) printf (" | | ") ; else - printf (" | %-3d | %-3d", physToWpi [physPin], physPinToGpio (physPin)) ; + printf (" | %-3d | %-3d", physToWpi[physPin], physPinToGpio (physPin)) ; printf (" |\n") ; } @@ -233,11 +233,11 @@ static void allReadall (void) for (pin = 0 ; pin < 27 ; ++pin) { printf ("| %3d ", pin) ; - printf ("| %-4s ", alts [getAlt (pin)]) ; + printf ("| %-4s ", alts[getAlt (pin)]) ; printf ("| %s ", digitalRead (pin) == HIGH ? "High" : "Low ") ; printf ("| ") ; printf ("| %3d ", pin + 27) ; - printf ("| %-4s ", alts [getAlt (pin + 27)]) ; + printf ("| %-4s ", alts[getAlt (pin + 27)]) ; printf ("| %s ", digitalRead (pin + 27) == HIGH ? "High" : "Low ") ; printf ("|\n") ; } @@ -303,7 +303,7 @@ static void plus2header (int model) printf (" +-----+-----+---------+------+---+-Pi ZeroW-+---+------+---------+-----+-----+\n") ; else if (model == PI_MODEL_ZERO_2W) printf (" +-----+-----+---------+------+---+Pi Zero 2W+---+------+---------+-----+-----+\n") ; - else if (model == PI_MODEL_2) + else if (model == PI_MODEL_2B) printf (" +-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+\n") ; else if (model == PI_MODEL_3B) printf (" +-----+-----+---------+------+---+---Pi 3B--+---+------+---------+-----+-----+\n") ; @@ -346,7 +346,7 @@ static void piPlusReadall (int model) void doReadall (void) { - int model, rev, mem, maker, overVolted ; + int model, proc, rev, mem, maker, overVolted ; if (wiringPiNodes != NULL) // External readall { @@ -354,18 +354,18 @@ void doReadall (void) return ; } - piBoardId (&model, &rev, &mem, &maker, &overVolted) ; + piBoardId (&model, &proc, &rev, &mem, &maker, &overVolted) ; - /**/ if ((model == PI_MODEL_A) || (model == PI_MODEL_B)) + if ((model == PI_MODEL_A) || (model == PI_MODEL_B)) abReadall (model, rev) ; - else if ((model == PI_MODEL_BP) || (model == PI_MODEL_AP) || - (model == PI_MODEL_2) || - (model == PI_MODEL_3AP) || - (model == PI_MODEL_3B) || (model == PI_MODEL_3BP) || - (model == PI_MODEL_4B) || (model == PI_MODEL_400) || (model == PI_MODEL_CM4) || - (model == PI_MODEL_ZERO) || (model == PI_MODEL_ZERO_W) || (model == PI_MODEL_ZERO_2W)) + else if ((model == PI_MODEL_BP) || (model == PI_MODEL_AP) || + (model == PI_MODEL_2B) || + (model == PI_MODEL_3AP) || + (model == PI_MODEL_3B) || (model == PI_MODEL_3BP) || + (model == PI_MODEL_4B) || (model == PI_MODEL_400) || (model == PI_MODEL_CM4) || + (model == PI_MODEL_ZERO) || (model == PI_MODEL_ZERO_W) || (model == PI_MODEL_ZERO_2W)) piPlusReadall (model) ; - else if ((model == PI_MODEL_CM) || (model == PI_MODEL_CM3) || (model == PI_MODEL_CM3P) ) + else if ((model == PI_MODEL_CM1) || (model == PI_MODEL_CM3) || (model == PI_MODEL_CM3P) ) allReadall () ; else printf ("Oops - unable to determine board type... model: %d\n", model) ; @@ -390,16 +390,16 @@ void doAllReadall (void) ********************************************************************************* */ -void doQmode (int argc, char *argv []) +void doQmode (int argc, char *argv[]) { int pin ; if (argc != 3) { - fprintf (stderr, "Usage: %s qmode pin\n", argv [0]) ; + fprintf (stderr, "Usage: %s qmode pin\n", argv[0]) ; exit (EXIT_FAILURE) ; } - pin = atoi (argv [2]) ; - printf ("%s\n", alts [getAlt (pin)]) ; + pin = atoi (argv[2]) ; + printf ("%s\n", alts[getAlt (pin)]) ; } diff --git a/version.h b/version.h index e54f1d3..d2d73a4 100644 --- a/version.h +++ b/version.h @@ -1,3 +1,3 @@ -#define VERSION "2.71" +#define VERSION "2.72" #define VERSION_MAJOR 2 -#define VERSION_MINOR 71 +#define VERSION_MINOR 72 diff --git a/wiringPi/Makefile b/wiringPi/Makefile index 28501ec..96b88d0 100644 --- a/wiringPi/Makefile +++ b/wiringPi/Makefile @@ -1,4 +1,4 @@ -# +################################################################################# # Makefile: # wiringPi - Wiring Compatable library for the Raspberry Pi # @@ -27,11 +27,11 @@ PREFIX?=/local LDCONFIG?=ldconfig +# Specify "V=1" on the make command line to enable ifneq ($V,1) Q ?= @ endif -STATIC=libwiringPi.a DYNAMIC=libwiringPi.so.$(VERSION) #DEBUG = -g -O0 @@ -46,28 +46,30 @@ LIBS = -lm -lpthread -lrt -lcrypt ############################################################################### -SRC = wiringPi.c \ - wiringSerial.c wiringShift.c \ +SRC = wiringPi.c \ + wiringSerial.c wiringShift.c \ piHiPri.c piThread.c \ wiringPiSPI.c wiringPiI2C.c \ softPwm.c softTone.c \ - mcp23008.c mcp23016.c mcp23017.c \ + mcp23008.c mcp23016.c mcp23017.c \ mcp23s08.c mcp23s17.c \ - sr595.c \ - pcf8574.c pcf8591.c \ - mcp3002.c mcp3004.c mcp4802.c mcp3422.c \ - max31855.c max5322.c ads1115.c \ - sn3218.c \ - bmp180.c htu21d.c ds18b20.c rht03.c \ + sr595.c \ + pcf8574.c pcf8591.c \ + mcp3002.c mcp3004.c mcp4802.c mcp3422.c \ + max31855.c max5322.c ads1115.c \ + sn3218.c \ + bmp180.c htu21d.c ds18b20.c rht03.c \ drcSerial.c drcNet.c \ - pseudoPins.c \ + pseudoPins.c \ wpiExtensions.c HEADERS = $(shell ls *.h) OBJ = $(SRC:.c=.o) -all: $(DYNAMIC) +################################################################################# + +all: $(DYNAMIC) .PHONY: static static: @@ -81,27 +83,29 @@ $(DYNAMIC): $(OBJ) $Q echo [Compile] $< $Q $(CC) -c $(CFLAGS) $< -o $@ +################################################################################# .PHONY: clean clean: $Q echo "[Clean]" - $Q rm -f $(OBJ) $(OBJ_I2C) *~ core tags Makefile.bak libwiringPi.* + $Q rm -vf $(OBJ) $(OBJ_I2C) *~ core tags Makefile.bak libwiringPi.* .PHONY: tags tags: $(SRC) $Q echo [ctags] $Q ctags $(SRC) +################################################################################# .PHONY: install install: $(DYNAMIC) $Q echo "[Install Headers]" - $Q install -m 0755 -d $(DESTDIR)$(PREFIX)/include - $Q install -m 0644 $(HEADERS) $(DESTDIR)$(PREFIX)/include + $Q install -m 0755 -d $(DESTDIR)$(PREFIX)/include + $Q install -m 0644 $(HEADERS) $(DESTDIR)$(PREFIX)/include $Q echo "[Install Dynamic Lib]" - $Q install -m 0755 -d $(DESTDIR)$(PREFIX)/lib - $Q install -m 0755 libwiringPi.so.$(VERSION) $(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION) - $Q ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION) $(DESTDIR)/lib/libwiringPi.so + $Q install -m 0755 -d $(DESTDIR)$(PREFIX)/lib + $Q install -m 0755 libwiringPi.so.$(VERSION) $(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION) + $Q ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION) $(DESTDIR)/lib/libwiringPi.so $Q $(LDCONFIG) .PHONY: check-deb-destdir @@ -113,18 +117,18 @@ endif .PHONY: install-deb install-deb: $(DYNAMIC) check-deb-destdir $Q echo "[Install Headers: deb]" - $Q install -m 0755 -d $(DEB_DESTDIR)/usr/include - $Q install -m 0644 $(HEADERS) $(DEB_DESTDIR)/usr/include + $Q install -m 0755 -d $(DEB_DESTDIR)/usr/include + $Q install -m 0644 $(HEADERS) $(DEB_DESTDIR)/usr/include $Q echo "[Install Dynamic Lib: deb]" - install -m 0755 -d $(DEB_DESTDIR)/usr/lib - install -m 0755 libwiringPi.so.$(VERSION) $(DEB_DESTDIR)/usr/lib/libwiringPi.so.$(VERSION) - ln -sf $(DEB_DESTDIR)/usr/lib/libwiringPi.so.$(VERSION) $(DEB_DESTDIR)/usr/lib/libwiringPi.so + install -m 0755 -d $(DEB_DESTDIR)/usr/lib + install -m 0755 libwiringPi.so.$(VERSION) $(DEB_DESTDIR)/usr/lib/libwiringPi.so.$(VERSION) + ln -sf $(DEB_DESTDIR)/usr/lib/libwiringPi.so.$(VERSION) $(DEB_DESTDIR)/usr/lib/libwiringPi.so .PHONY: uninstall uninstall: $Q echo "[UnInstall]" - $Q cd $(DESTDIR)$(PREFIX)/include/ && rm -f $(HEADERS) - $Q cd $(DESTDIR)$(PREFIX)/lib/ && rm -f libwiringPi.* + $Q cd $(DESTDIR)$(PREFIX)/include/ && rm -vf $(HEADERS) + $Q cd $(DESTDIR)$(PREFIX)/lib/ && rm -vf libwiringPi.* $Q $(LDCONFIG) @@ -132,6 +136,7 @@ uninstall: depend: makedepend -Y $(SRC) $(SRC_I2C) +################################################################################# # DO NOT DELETE wiringPi.o: softPwm.h softTone.h wiringPi.h ../version.h @@ -169,3 +174,5 @@ wpiExtensions.o: mcp23s17.h sr595.h pcf8574.h pcf8591.h mcp3002.h mcp3004.h wpiExtensions.o: mcp4802.h mcp3422.h max31855.h max5322.h ads1115.h sn3218.h wpiExtensions.o: drcSerial.h pseudoPins.h bmp180.h htu21d.h ds18b20.h wpiExtensions.o: wpiExtensions.h + +################################################################################# diff --git a/wiringPi/drcNet.c b/wiringPi/drcNet.c index 71b7435..15c43be 100644 --- a/wiringPi/drcNet.c +++ b/wiringPi/drcNet.c @@ -104,26 +104,24 @@ static int authenticate (int fd, const char *pass) { char *challenge ; char *encrypted ; - char salted [1024] ; + char salted [1024+4] ; // Need to hold 4 more chars - see sprintf below if ((challenge = getChallenge (fd)) == NULL) return -1 ; sprintf (salted, "$6$%s$", challenge) ; encrypted = crypt (pass, salted) ; - -// This is an assertion, or sanity check on my part... -// The '20' comes from the $6$ then the 16 characters of the salt, -// then the terminating $. + // Assertion: + // The '20' comes from the $6$ then the 16 characters of the salt, + // then the terminating $. if (strncmp (encrypted, salted, 20) != 0) { errno = EBADE ; return -1 ; } -// 86 characters is the length of the SHA-256 hash - + // 86 characters is the length of the SHA-256 hash if (write (fd, encrypted + 20, 86) == 86) return 0 ; else diff --git a/wiringPi/softServo.c b/wiringPi/softServo.c old mode 100755 new mode 100644 diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c old mode 100755 new mode 100644 index 6bf39bc..a96599d --- a/wiringPi/wiringPi.c +++ b/wiringPi/wiringPi.c @@ -28,28 +28,31 @@ */ // Revisions: -// 19 Jul 2012: -// Moved to the LGPL -// Added an abstraction layer to the main routines to save a tiny -// bit of run-time and make the clode a little cleaner (if a little -// larger) -// Added waitForInterrupt code -// Added piHiPri code +// 08 March 2022: +// Updates to revisioning from https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#new-style-revision-codes-in-use // -// 9 Jul 2012: -// Added in support to use the /sys/class/gpio interface. -// 2 Jul 2012: -// Fixed a few more bugs to do with range-checking when in GPIO mode. -// 11 Jun 2012: -// Fixed some typos. -// Added c++ support for the .h file -// Added a new function to allow for using my "pin" numbers, or native -// GPIO pin numbers. -// Removed my busy-loop delay and replaced it with a call to delayMicroseconds +// 19 Jul 2012: +// Moved to the LGPL +// Added an abstraction layer to the main routines to save a tiny +// bit of run-time and make the clode a little cleaner (if a little +// larger) +// Added waitForInterrupt code +// Added piHiPri code // -// 02 May 2012: -// Added in the 2 UART pins -// Change maxPins to numPins to more accurately reflect purpose +// 9 Jul 2012: +// Added in support to use the /sys/class/gpio interface. +// 2 Jul 2012: +// Fixed a few more bugs to do with range-checking when in GPIO mode. +// 11 Jun 2012: +// Fixed some typos. +// Added c++ support for the .h file +// Added a new function to allow for using my "pin" numbers, or native +// GPIO pin numbers. +// Removed my busy-loop delay and replaced it with a call to delayMicroseconds +// +// 02 May 2012: +// Added in the 2 UART pins +// Change maxPins to numPins to more accurately reflect purpose #include @@ -78,323 +81,299 @@ #include "../version.h" // Environment Variables - -#define ENV_DEBUG "WIRINGPI_DEBUG" -#define ENV_CODES "WIRINGPI_CODES" -#define ENV_GPIOMEM "WIRINGPI_GPIOMEM" +#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 -// them in this structure - -struct wiringPiNodeStruct *wiringPiNodes = NULL ; +// them in this structure +struct wiringPiNodeStruct *wiringPiNodes = NULL; // BCM Magic - -#define BCM_PASSWORD 0x5A000000 +#define BCM_PASSWORD 0x5A000000 // The BCM2835 has 54 GPIO pins. -// BCM2835 data sheet, Page 90 onwards. -// There are 6 control registers, each control the functions of a block -// of 10 pins. -// Each control register has 10 sets of 3 bits per GPIO pin - the ALT values +// BCM2835 data sheet, Page 90 onwards. +// There are 6 control registers, each control the functions of a block +// of 10 pins. +// Each control register has 10 sets of 3 bits per GPIO pin - the ALT values // -// 000 = GPIO Pin X is an input -// 001 = GPIO Pin X is an output -// 100 = GPIO Pin X takes alternate function 0 -// 101 = GPIO Pin X takes alternate function 1 -// 110 = GPIO Pin X takes alternate function 2 -// 111 = GPIO Pin X takes alternate function 3 -// 011 = GPIO Pin X takes alternate function 4 -// 010 = GPIO Pin X takes alternate function 5 +// 000 = GPIO Pin X is an input +// 001 = GPIO Pin X is an output +// 100 = GPIO Pin X takes alternate function 0 +// 101 = GPIO Pin X takes alternate function 1 +// 110 = GPIO Pin X takes alternate function 2 +// 111 = GPIO Pin X takes alternate function 3 +// 011 = GPIO Pin X takes alternate function 4 +// 010 = GPIO Pin X takes alternate function 5 // // So the 3 bits for port X are: -// X / 10 + ((X % 10) * 3) +// X / 10 + ((X % 10) * 3) // Port function select bits - -#define FSEL_INPT 0b000 -#define FSEL_OUTP 0b001 -#define FSEL_ALT0 0b100 -#define FSEL_ALT1 0b101 -#define FSEL_ALT2 0b110 -#define FSEL_ALT3 0b111 -#define FSEL_ALT4 0b011 -#define FSEL_ALT5 0b010 +#define FSEL_INPT 0b000 +#define FSEL_OUTP 0b001 +#define FSEL_ALT0 0b100 +#define FSEL_ALT1 0b101 +#define FSEL_ALT2 0b110 +#define FSEL_ALT3 0b111 +#define FSEL_ALT4 0b011 +#define FSEL_ALT5 0b010 // Access from ARM Running Linux -// Taken from Gert/Doms code. Some of this is not in the manual -// that I can find )-: +// Taken from Gert/Doms code. Some of this is not in the manual +// that I can find )-: // // Updates in September 2015 - all now static variables (and apologies for the caps) -// due to the Pi v2, v3, etc. and the new /dev/gpiomem interface - -static volatile unsigned int GPIO_PADS ; -static volatile unsigned int GPIO_CLOCK_BASE ; -static volatile unsigned int GPIO_BASE ; -static volatile unsigned int GPIO_TIMER ; -static volatile unsigned int GPIO_PWM ; +// due to the Pi v2, v3, etc. and the new /dev/gpiomem interface +static volatile unsigned int GPIO_PADS; +static volatile unsigned int GPIO_CLOCK_BASE; +static volatile unsigned int GPIO_BASE; +static volatile unsigned int GPIO_TIMER; +static volatile unsigned int GPIO_PWM; -#define PAGE_SIZE (4*1024) -#define BLOCK_SIZE (4*1024) +#define PAGE_SIZE (4*1024) +#define BLOCK_SIZE (4*1024) -static unsigned int usingGpioMem = FALSE ; -static int wiringPiSetuped = FALSE ; +static unsigned int usingGpioMem = FALSE; +static int wiringPiSetuped = FALSE; // PWM -// Word offsets into the PWM control region - -#define PWM_CONTROL 0 -#define PWM_STATUS 1 -#define PWM0_RANGE 4 -#define PWM0_DATA 5 -#define PWM1_RANGE 8 -#define PWM1_DATA 9 - -// Clock regsiter offsets - -#define PWMCLK_CNTL 40 -#define PWMCLK_DIV 41 - -#define PWM0_MS_MODE 0x0080 // Run in MS mode -#define PWM0_USEFIFO 0x0020 // Data from FIFO -#define PWM0_REVPOLAR 0x0010 // Reverse polarity -#define PWM0_OFFSTATE 0x0008 // Ouput Off state -#define PWM0_REPEATFF 0x0004 // Repeat last value if FIFO empty -#define PWM0_SERIAL 0x0002 // Run in serial mode -#define PWM0_ENABLE 0x0001 // Channel Enable - -#define PWM1_MS_MODE 0x8000 // Run in MS mode -#define PWM1_USEFIFO 0x2000 // Data from FIFO -#define PWM1_REVPOLAR 0x1000 // Reverse polarity -#define PWM1_OFFSTATE 0x0800 // Ouput Off state -#define PWM1_REPEATFF 0x0400 // Repeat last value if FIFO empty -#define PWM1_SERIAL 0x0200 // Run in serial mode -#define PWM1_ENABLE 0x0100 // Channel Enable +// Word offsets into the PWM control region +#define PWM_CONTROL 0 +#define PWM_STATUS 1 +#define PWM0_RANGE 4 +#define PWM0_DATA 5 +#define PWM1_RANGE 8 +#define PWM1_DATA 9 + +// Clock regsiter offsets +#define PWMCLK_CNTL 40 +#define PWMCLK_DIV 41 + +#define PWM0_MS_MODE 0x0080 // Run in MS mode +#define PWM0_USEFIFO 0x0020 // Data from FIFO +#define PWM0_REVPOLAR 0x0010 // Reverse polarity +#define PWM0_OFFSTATE 0x0008 // Ouput Off state +#define PWM0_REPEATFF 0x0004 // Repeat last value if FIFO empty +#define PWM0_SERIAL 0x0002 // Run in serial mode +#define PWM0_ENABLE 0x0001 // Channel Enable + +#define PWM1_MS_MODE 0x8000 // Run in MS mode +#define PWM1_USEFIFO 0x2000 // Data from FIFO +#define PWM1_REVPOLAR 0x1000 // Reverse polarity +#define PWM1_OFFSTATE 0x0800 // Ouput Off state +#define PWM1_REPEATFF 0x0400 // Repeat last value if FIFO empty +#define PWM1_SERIAL 0x0200 // Run in serial mode +#define PWM1_ENABLE 0x0100 // Channel Enable // Timer -// Word offsets - -#define TIMER_LOAD (0x400 >> 2) -#define TIMER_VALUE (0x404 >> 2) -#define TIMER_CONTROL (0x408 >> 2) -#define TIMER_IRQ_CLR (0x40C >> 2) -#define TIMER_IRQ_RAW (0x410 >> 2) -#define TIMER_IRQ_MASK (0x414 >> 2) -#define TIMER_RELOAD (0x418 >> 2) -#define TIMER_PRE_DIV (0x41C >> 2) -#define TIMER_COUNTER (0x420 >> 2) +// Word offsets +#define TIMER_LOAD (0x400 >> 2) +#define TIMER_VALUE (0x404 >> 2) +#define TIMER_CONTROL (0x408 >> 2) +#define TIMER_IRQ_CLR (0x40C >> 2) +#define TIMER_IRQ_RAW (0x410 >> 2) +#define TIMER_IRQ_MASK (0x414 >> 2) +#define TIMER_RELOAD (0x418 >> 2) +#define TIMER_PRE_DIV (0x41C >> 2) +#define TIMER_COUNTER (0x420 >> 2) // Locals to hold pointers to the hardware - -static volatile unsigned int *gpio ; -static volatile unsigned int *pwm ; -static volatile unsigned int *clk ; -static volatile unsigned int *pads ; -static volatile unsigned int *timer ; -static volatile unsigned int *timerIrqRaw ; +static volatile unsigned int *gpio; +static volatile unsigned int *pwm; +static volatile unsigned int *clk; +static volatile unsigned int *pads; +static volatile unsigned int *timer; +static volatile unsigned int *timerIrqRaw; // Export variables for the hardware pointers - -volatile unsigned int *_wiringPiGpio ; -volatile unsigned int *_wiringPiPwm ; -volatile unsigned int *_wiringPiClk ; -volatile unsigned int *_wiringPiPads ; -volatile unsigned int *_wiringPiTimer ; -volatile unsigned int *_wiringPiTimerIrqRaw ; +volatile unsigned int *_wiringPiGpio; +volatile unsigned int *_wiringPiPwm; +volatile unsigned int *_wiringPiClk; +volatile unsigned int *_wiringPiPads; +volatile unsigned int *_wiringPiTimer; +volatile unsigned int *_wiringPiTimerIrqRaw; // Data for use with the boardId functions. -// The order of entries here to correspond with the PI_MODEL_X -// and PI_VERSION_X defines in wiringPi.h -// Only intended for the gpio command - use at your own risk! +// The order of entries here to correspond with the PI_MODEL_X +// and PI_VERSION_X defines in wiringPi.h +// Only intended for the gpio command - use at your own risk! // piGpioBase: -// The base address of the GPIO memory mapped hardware IO - -#define GPIO_PERI_BASE_OLD 0x20000000 -#define GPIO_PERI_BASE_2835 0x3F000000 -#define GPIO_PERI_BASE_2711 0xFE000000 - -static volatile unsigned int piGpioBase = 0 ; - -const char *piModelNames [21] = -{ - "Model A", // 0 - "Model B", // 1 - "Model A+", // 2 - "Model B+", // 3 - "Pi 2", // 4 - "Alpha", // 5 - "CM", // 6 - "Unknown07", // 07 - "Pi 3B", // 08 - "Pi Zero", // 09 - "CM3", // 10 - "Unknown11", // 11 - "Pi Zero-W", // 12 - "Pi 3B+", // 13 - "Pi 3A+", // 14 - "Unknown15", // 15 - "CM3+", // 16 - "Pi 4B", // 17 - "Pi Zero2-W", // 18 - "Pi 400", // 19 - "CM4", // 20 -} ; - -const char *piRevisionNames [21] = -{ - "00", - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "20", -} ; - -const char *piMakerNames [16] = -{ - "Sony", // 0 - "Egoman", // 1 - "Embest", // 2 - "Unknown", // 3 - "Embest", // 4 - "Stadium", // 5 - "Unknown06", // 6 - "Unknown07", // 7 - "Unknown08", // 8 - "Unknown09", // 9 - "Unknown10", // 10 - "Unknown11", // 11 - "Unknown12", // 12 - "Unknown13", // 13 - "Unknown14", // 14 - "Unknown15", // 15 -} ; - -const int piMemorySize [8] = -{ - 256, // 0 - 512, // 1 - 1024, // 2 - 2048, // 3 - 4096, // 4 - 8192, // 5 - 0, // 6 - 0, // 7 -} ; +// The base address of the GPIO memory mapped hardware IO +#define GPIO_PERI_BASE_OLD 0x20000000 +#define GPIO_PERI_BASE_2835 0x3F000000 +#define GPIO_PERI_BASE_2711 0xFE000000 + +static volatile unsigned int piGpioBase = 0; + +const char *piModelNames[21] = +{ + "Model A", // 0 + "Model B", // 1 + "Model A+", // 2 + "Model B+", // 3 + "Pi 2B", // 4 + "Alpha", // 5 + "CM1", // 6 + "Unknown07", // 7 + "Pi 3B", // 8 + "Pi Zero", // 9 + "CM3", // 10 + "Unknown11", // 11 + "Pi Zero-W", // 12 + "Pi 3B+", // 13 + "Pi 3A+", // 14 + "Unknown15", // 15 + "CM3+", // 16 + "Pi 4B", // 17 + "Pi Zero2-W", // 18 + "Pi 400", // 19 + "CM4", // 20 +}; + +const char *piRevisionNames[5] = +{ + "1.0", + "1.1", + "1.2", + "1.3", + "1.4" +}; + +const char *piMakerNames[16] = +{ + "Sony", // 0 + "Egoman", // 1 + "Embest", // 2 + "Sony Japan", // 3 + "Embest", // 4 + "Stadium", // 5 + "Unknown06", // 6 + "Unknown07", // 7 + "Unknown08", // 8 + "Unknown09", // 9 + "Unknown10", // 10 + "Unknown11", // 11 + "Unknown12", // 12 + "Unknown13", // 13 + "Unknown14", // 14 + "Unknown15", // 15 +}; + +const char *piProcessorNames[5] = +{ + "BCM2835", + "BCM2836", + "BCM2837", + "BCM2711", + "Unknown" +}; + +// Memory sizes in MB +const int piMemorySize[8] = +{ + 256, // 0 + 512, // 1 + 1024, // 2 + 2048, // 3 + 4096, // 4 + 8192, // 5 + 0, // 6 + 0, // 7 +}; // Time for easy calculations - -static uint64_t epochMilli, epochMicro ; +static uint64_t epochMilli, epochMicro; // Misc - -static int wiringPiMode = WPI_MODE_UNINITIALISED ; -static volatile int pinPass = -1 ; -static pthread_mutex_t pinMutex ; +static int wiringPiMode = WPI_MODE_UNINITIALISED; +static volatile int pinPass = -1; +static pthread_mutex_t pinMutex; // Debugging & Return codes - -int wiringPiDebug = FALSE ; -int wiringPiReturnCodes = FALSE ; +int wiringPiDebug = FALSE; +int wiringPiReturnCodes = TRUE; // Use /dev/gpiomem ? - -int wiringPiTryGpioMem = FALSE ; +int wiringPiTryGpioMem = FALSE; // sysFds: -// Map a file descriptor from the /sys/class/gpio/gpioX/value - -static int sysFds [64] = +// Map a file descriptor from the /sys/class/gpio/gpioX/value +static int sysFds[64] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -} ; +}; // ISR Data - -static void (*isrFunctions [64])(void) ; +static void (*isrFunctions[64])(void); // Doing it the Arduino way with lookup tables... -// Yes, it's probably more innefficient than all the bit-twidling, but it -// does tend to make it all a bit clearer. At least to me! +// Yes, it's probably more innefficient than all the bit-twidling, but it +// does tend to make it all a bit clearer. At least to me! // pinToGpio: -// Take a Wiring pin (0 through X) and re-map it to the BCM_GPIO pin -// Cope for 3 different board revisions here. - -static int *pinToGpio ; +// Take a Wiring pin (0 through X) and re-map it to the BCM_GPIO pin +// Cope for 3 different board revisions here. +static int *pinToGpio; +// Index: WiringPi pin # +// Value @ index: BCM GPIO # // Revision 1, 1.1: - -static int pinToGpioR1 [64] = -{ - 17, 18, 21, 22, 23, 24, 25, 4, // From the Original Wiki - GPIO 0 through 7: wpi 0 - 7 - 0, 1, // I2C - SDA1, SCL1 wpi 8 - 9 - 8, 7, // SPI - CE1, CE0 wpi 10 - 11 - 10, 9, 11, // SPI - MOSI, MISO, SCLK wpi 12 - 14 - 14, 15, // UART - Tx, Rx wpi 15 - 16 - +static int pinToGpioR1[64] = +{ + // From the Original Wiki + 17, 18, 21, 22, 23, 24, 25, 4, // GPIO 0 through 7 : wpi 0 - 7 + 0, 1, // I2C - SDA1, SCL1 : wpi 8 - 9 + 8, 7, // SPI - CE1, CE0 : wpi 10 - 11 + 10, 9, 11, // SPI - MOSI, MISO, SCLK : wpi 12 - 14 + 14, 15, // UART - Tx, Rx : wpi 15 - 16 // Padding: - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 31 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63 -} ; - -// Revision 2: - -static int pinToGpioR2 [64] = -{ - 17, 18, 27, 22, 23, 24, 25, 4, // From the Original Wiki - GPIO 0 through 7: wpi 0 - 7 - 2, 3, // I2C - SDA0, SCL0 wpi 8 - 9 - 8, 7, // SPI - CE1, CE0 wpi 10 - 11 - 10, 9, 11, // SPI - MOSI, MISO, SCLK wpi 12 - 14 - 14, 15, // UART - Tx, Rx wpi 15 - 16 - 28, 29, 30, 31, // Rev 2: New GPIOs 8 though 11 wpi 17 - 20 - 5, 6, 13, 19, 26, // B+ wpi 21, 22, 23, 24, 25 - 12, 16, 20, 21, // B+ wpi 26, 27, 28, 29 - 0, 1, // B+ wpi 30, 31 - +}; + +// Index: WiringPi pin # +// Value @ index: BCM GPIO # +// Revisions 2...: +static int pinToGpioR2[64] = +{ + // From the Original Wiki + 17, 18, 27, 22, 23, 24, 25, 4, // GPIO 0 through 7 : wpi 0 - 7 + 2, 3, // I2C - SDA0, SCL0 : wpi 8 - 9 + 8, 7, // SPI - CE1, CE0 : wpi 10 - 11 + 10, 9, 11, // SPI - MOSI, MISO, SCLK : wpi 12 - 14 + 14, 15, // UART - Tx, Rx : wpi 15 - 16 + 28, 29, 30, 31, // Rev 2: New GPIOs 8 though 11 : wpi 17 - 20 + 5, 6, 13, 19, 26, // B+ : wpi 21, 22, 23, 24, 25 + 12, 16, 20, 21, // B+ : wpi 26, 27, 28, 29 + 0, 1, // B+ : wpi 30, 31 // Padding: - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63 -} ; +}; // physToGpio: -// Take a physical pin (1 through 26) and re-map it to the BCM_GPIO pin -// Cope for 2 different board revisions here. -// Also add in the P5 connector, so the P5 pins are 3,4,5,6, so 53,54,55,56 - -static int *physToGpio ; - -static int physToGpioR1 [64] = -{ - -1, // 0 - -1, -1, // 1, 2 +// Take a physical pin (1 through 26) and re-map it to the BCM_GPIO pin +// Cope for 2 different board revisions here. +// Also add in the P5 connector, so the P5 pins are 3,4,5,6, so 53,54,55,56 +static int *physToGpio; +// Index: Physical pin # +// Value @ index: BCM GPIO # +static int physToGpioR1[64] = +{ + -1, // 0 + -1, -1, // 1, 2 0, -1, 1, -1, 4, 14, @@ -406,17 +385,19 @@ static int physToGpioR1 [64] = 10, -1, 9, 25, 11, 8, - -1, 7, // 25, 26 + -1, 7, // 25, 26 - -1, -1, -1, -1, -1, // ... 31 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63 -} ; + -1, -1, -1, -1, -1, // ... 31 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63 +}; -static int physToGpioR2 [64] = +// Index: Physical pin # +// Value @ index: BCM GPIO # +static int physToGpioR2[64] = { - -1, // 0 - -1, -1, // 1, 2 + -1, // 0 + -1, -1, // 1, 2 2, -1, 3, -1, 4, 14, @@ -428,20 +409,18 @@ static int physToGpioR2 [64] = 10, -1, 9, 25, 11, 8, - -1, 7, // 25, 26 + -1, 7, // 25, 26 // B+ - - 0, 1, + 0, 1, // 27, 28 5, -1, 6, 12, 13, -1, 19, 16, 26, 20, - -1, 21, + -1, 21, // 39, 40 // the P5 connector on the Rev 2 boards: - -1, -1, -1, -1, -1, -1, @@ -453,14 +432,13 @@ static int physToGpioR2 [64] = -1, -1, -1, -1, -1, -1, -} ; +}; // gpioToGPFSEL: -// Map a BCM_GPIO pin to it's Function Selection -// control port. (GPFSEL 0-5) -// Groups of 10 - 3 bits per Function - 30 bits per port - -static uint8_t gpioToGPFSEL [] = +// Map a BCM_GPIO pin to its Function Selection +// control port. (GPFSEL 0-5) +// Groups of 10 - 3 bits per Function - 30 bits per port +static uint8_t gpioToGPFSEL[] = { 0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1, @@ -468,13 +446,12 @@ static uint8_t gpioToGPFSEL [] = 3,3,3,3,3,3,3,3,3,3, 4,4,4,4,4,4,4,4,4,4, 5,5,5,5,5,5,5,5,5,5, -} ; +}; // gpioToShift -// Define the shift up for the 3 bits per pin in each GPFSEL port - -static uint8_t gpioToShift [] = +// Define the shift up for the 3 bits per pin in each GPFSEL port +static uint8_t gpioToShift[] = { 0,3,6,9,12,15,18,21,24,27, 0,3,6,9,12,15,18,21,24,27, @@ -482,72 +459,38 @@ static uint8_t gpioToShift [] = 0,3,6,9,12,15,18,21,24,27, 0,3,6,9,12,15,18,21,24,27, 0,3,6,9,12,15,18,21,24,27, -} ; +}; // gpioToGPSET: -// (Word) offset to the GPIO Set registers for each GPIO pin - -static uint8_t gpioToGPSET [] = +// (Word) offset to the GPIO Set registers for each GPIO pin +static uint8_t gpioToGPSET[] = { 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, -} ; +}; // gpioToGPCLR: -// (Word) offset to the GPIO Clear registers for each GPIO pin - -static uint8_t gpioToGPCLR [] = +// (Word) offset to the GPIO Clear registers for each GPIO pin +static uint8_t gpioToGPCLR[] = { 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, -} ; +}; // gpioToGPLEV: -// (Word) offset to the GPIO Input level registers for each GPIO pin - -static uint8_t gpioToGPLEV [] = +// (Word) offset to the GPIO Input level registers for each GPIO pin +static uint8_t gpioToGPLEV[] = { 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, -} ; - - -#ifdef notYetReady -// gpioToEDS -// (Word) offset to the Event Detect Status - -static uint8_t gpioToEDS [] = -{ - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, -} ; - -// gpioToREN -// (Word) offset to the Rising edge ENable register - -static uint8_t gpioToREN [] = -{ - 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19, - 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, -} ; - -// gpioToFEN -// (Word) offset to the Falling edgde ENable register - -static uint8_t gpioToFEN [] = -{ - 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, - 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, -} ; -#endif +}; // GPPUD: -// GPIO Pin pull up/down register - -#define GPPUD 37 +// GPIO Pin pull up/down register +#define GPPUD 37 /* 2711 has a different mechanism for pin pull-up/down/enable */ #define GPPUPPDN0 57 /* Pin pull-up/down for pins 15:0 */ @@ -555,98 +498,93 @@ static uint8_t gpioToFEN [] = #define GPPUPPDN2 59 /* Pin pull-up/down for pins 47:32 */ #define GPPUPPDN3 60 /* Pin pull-up/down for pins 57:48 */ -static volatile unsigned int piGpioPupOffset = 0 ; +static volatile unsigned int piGpioPupOffset = 0; // gpioToPUDCLK -// (Word) offset to the Pull Up Down Clock regsiter - -static uint8_t gpioToPUDCLK [] = +// (Word) offset to the Pull Up Down Clock regsiter +static uint8_t gpioToPUDCLK[] = { 38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38, 39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39, -} ; +}; // gpioToPwmALT -// the ALT value to put a GPIO pin into PWM mode - -static uint8_t gpioToPwmALT [] = +// the ALT value to put a GPIO pin into PWM mode +static uint8_t gpioToPwmALT[] = { - 0, 0, 0, 0, 0, 0, 0, 0, // 0 -> 7 - 0, 0, 0, 0, FSEL_ALT0, FSEL_ALT0, 0, 0, // 8 -> 15 - 0, 0, FSEL_ALT5, FSEL_ALT5, 0, 0, 0, 0, // 16 -> 23 - 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31 - 0, 0, 0, 0, 0, 0, 0, 0, // 32 -> 39 - FSEL_ALT0, FSEL_ALT0, 0, 0, 0, FSEL_ALT0, 0, 0, // 40 -> 47 - 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55 - 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63 -} ; + 0, 0, 0, 0, 0, 0, 0, 0, // 0 -> 7 + 0, 0, 0, 0, FSEL_ALT0, FSEL_ALT0, 0, 0, // 8 -> 15 + 0, 0, FSEL_ALT5, FSEL_ALT5, 0, 0, 0, 0, // 16 -> 23 + 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31 + 0, 0, 0, 0, 0, 0, 0, 0, // 32 -> 39 + FSEL_ALT0, FSEL_ALT0, 0, 0, 0, FSEL_ALT0, 0, 0, // 40 -> 47 + 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55 + 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63 +}; // gpioToPwmPort -// The port value to put a GPIO pin into PWM mode - -static uint8_t gpioToPwmPort [] = +// The port value to put a GPIO pin into PWM mode +static uint8_t gpioToPwmPort[] = { - 0, 0, 0, 0, 0, 0, 0, 0, // 0 -> 7 - 0, 0, 0, 0, PWM0_DATA, PWM1_DATA, 0, 0, // 8 -> 15 - 0, 0, PWM0_DATA, PWM1_DATA, 0, 0, 0, 0, // 16 -> 23 - 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31 - 0, 0, 0, 0, 0, 0, 0, 0, // 32 -> 39 - PWM0_DATA, PWM1_DATA, 0, 0, 0, PWM1_DATA, 0, 0, // 40 -> 47 - 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55 - 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63 + 0, 0, 0, 0, 0, 0, 0, 0, // 0 -> 7 + 0, 0, 0, 0, PWM0_DATA, PWM1_DATA, 0, 0, // 8 -> 15 + 0, 0, PWM0_DATA, PWM1_DATA, 0, 0, 0, 0, // 16 -> 23 + 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31 + 0, 0, 0, 0, 0, 0, 0, 0, // 32 -> 39 + PWM0_DATA, PWM1_DATA, 0, 0, 0, PWM1_DATA, 0, 0, // 40 -> 47 + 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55 + 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63 -} ; +}; // gpioToGpClkALT: -// ALT value to put a GPIO pin into GP Clock mode. -// On the Pi we can really only use BCM_GPIO_4 and BCM_GPIO_21 -// for clocks 0 and 1 respectively, however I'll include the full -// list for completeness - maybe one day... +// ALT value to put a GPIO pin into GP Clock mode. +// On the Pi we can really only use BCM_GPIO_4 and BCM_GPIO_21 +// for clocks 0 and 1 respectively, however I'll include the full +// list for completeness - maybe one day... -#define GPIO_CLOCK_SOURCE 1 +#define GPIO_CLOCK_SOURCE 1 // gpioToGpClkALT0: - -static uint8_t gpioToGpClkALT0 [] = -{ - 0, 0, 0, 0, FSEL_ALT0, FSEL_ALT0, FSEL_ALT0, 0, // 0 -> 7 - 0, 0, 0, 0, 0, 0, 0, 0, // 8 -> 15 - 0, 0, 0, 0, FSEL_ALT5, FSEL_ALT5, 0, 0, // 16 -> 23 - 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31 - FSEL_ALT0, 0, FSEL_ALT0, 0, 0, 0, 0, 0, // 32 -> 39 - 0, 0, FSEL_ALT0, FSEL_ALT0, FSEL_ALT0, 0, 0, 0, // 40 -> 47 - 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55 - 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63 -} ; +static uint8_t gpioToGpClkALT0[] = +{ + 0, 0, 0, 0, FSEL_ALT0, FSEL_ALT0, FSEL_ALT0, 0, // 0 -> 7 + 0, 0, 0, 0, 0, 0, 0, 0, // 8 -> 15 + 0, 0, 0, 0, FSEL_ALT5, FSEL_ALT5, 0, 0, // 16 -> 23 + 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31 + FSEL_ALT0, 0, FSEL_ALT0, 0, 0, 0, 0, 0, // 32 -> 39 + 0, 0, FSEL_ALT0, FSEL_ALT0, FSEL_ALT0, 0, 0, 0, // 40 -> 47 + 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55 + 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63 +}; // gpioToClk: -// (word) Offsets to the clock Control and Divisor register - -static uint8_t gpioToClkCon [] = -{ - -1, -1, -1, -1, 28, 30, 32, -1, // 0 -> 7 - -1, -1, -1, -1, -1, -1, -1, -1, // 8 -> 15 - -1, -1, -1, -1, 28, 30, -1, -1, // 16 -> 23 - -1, -1, -1, -1, -1, -1, -1, -1, // 24 -> 31 - 28, -1, 28, -1, -1, -1, -1, -1, // 32 -> 39 - -1, -1, 28, 30, 28, -1, -1, -1, // 40 -> 47 - -1, -1, -1, -1, -1, -1, -1, -1, // 48 -> 55 - -1, -1, -1, -1, -1, -1, -1, -1, // 56 -> 63 -} ; - -static uint8_t gpioToClkDiv [] = -{ - -1, -1, -1, -1, 29, 31, 33, -1, // 0 -> 7 - -1, -1, -1, -1, -1, -1, -1, -1, // 8 -> 15 - -1, -1, -1, -1, 29, 31, -1, -1, // 16 -> 23 - -1, -1, -1, -1, -1, -1, -1, -1, // 24 -> 31 - 29, -1, 29, -1, -1, -1, -1, -1, // 32 -> 39 - -1, -1, 29, 31, 29, -1, -1, -1, // 40 -> 47 - -1, -1, -1, -1, -1, -1, -1, -1, // 48 -> 55 - -1, -1, -1, -1, -1, -1, -1, -1, // 56 -> 63 -} ; +// (word) Offsets to the clock Control and Divisor register +static uint8_t gpioToClkCon[] = +{ + -1, -1, -1, -1, 28, 30, 32, -1, // 0 -> 7 + -1, -1, -1, -1, -1, -1, -1, -1, // 8 -> 15 + -1, -1, -1, -1, 28, 30, -1, -1, // 16 -> 23 + -1, -1, -1, -1, -1, -1, -1, -1, // 24 -> 31 + 28, -1, 28, -1, -1, -1, -1, -1, // 32 -> 39 + -1, -1, 28, 30, 28, -1, -1, -1, // 40 -> 47 + -1, -1, -1, -1, -1, -1, -1, -1, // 48 -> 55 + -1, -1, -1, -1, -1, -1, -1, -1, // 56 -> 63 +}; + +static uint8_t gpioToClkDiv[] = +{ + -1, -1, -1, -1, 29, 31, 33, -1, // 0 -> 7 + -1, -1, -1, -1, -1, -1, -1, -1, // 8 -> 15 + -1, -1, -1, -1, 29, 31, -1, -1, // 16 -> 23 + -1, -1, -1, -1, -1, -1, -1, -1, // 24 -> 31 + 29, -1, 29, -1, -1, -1, -1, -1, // 32 -> 39 + -1, -1, 29, 31, 29, -1, -1, -1, // 40 -> 47 + -1, -1, -1, -1, -1, -1, -1, -1, // 48 -> 55 + -1, -1, -1, -1, -1, -1, -1, -1, // 56 -> 63 +}; /* @@ -663,20 +601,21 @@ static uint8_t gpioToClkDiv [] = int wiringPiFailure (int fatal, const char *message, ...) { - va_list argp ; - char buffer [1024] ; + va_list argp; + char buffer[1024]; - if (!fatal && wiringPiReturnCodes) - return -1 ; + va_start (argp, message); + vsnprintf (buffer, 1023, message, argp); + va_end (argp); + + fprintf (stderr, "%s", buffer); - va_start (argp, message) ; - vsnprintf (buffer, 1023, message, argp) ; - va_end (argp) ; + if (!fatal && wiringPiReturnCodes) + return -1; - fprintf (stderr, "%s", buffer) ; - exit (EXIT_FAILURE) ; + exit (EXIT_FAILURE); - return 0 ; + return 0; } @@ -691,9 +630,8 @@ static void setupCheck (const char *fName) { if (!wiringPiSetuped) { - fprintf (stderr, "%s: You have not called one of the wiringPiSetup\n" - " functions, so I'm aborting your program before it crashes anyway.\n", fName) ; - exit (EXIT_FAILURE) ; + fprintf (stderr, "[FATAL] %s: You have not called one of the wiringPiSetup functions. Aborting.\n", fName); + exit (EXIT_FAILURE); } } @@ -708,8 +646,8 @@ static void usingGpioMemCheck (const char *what) { if (usingGpioMem) { - fprintf (stderr, "%s: Unable to do this when using /dev/gpiomem. Try sudo?\n", what) ; - exit (EXIT_FAILURE) ; + fprintf (stderr, "[FATAL] %s: Unable to do this when using /dev/gpiomem. You need to use sudo\n", what); + exit (EXIT_FAILURE); } } @@ -742,213 +680,195 @@ static void usingGpioMemCheck (const char *what) static void piGpioLayoutOops (const char *why) { - fprintf (stderr, "Oops: Unable to determine board revision from /proc/cpuinfo\n") ; - fprintf (stderr, " -> %s\n", why) ; - fprintf (stderr, " -> You'd best google the error to find out why.\n") ; -//fprintf (stderr, " -> http://www.raspberrypi.org/phpBB3/viewtopic.php?p=184410#p184410\n") ; - exit (EXIT_FAILURE) ; + fprintf (stderr, "[FATAL] Unable to determine board revision from /proc/cpuinfo\n"); + fprintf (stderr, " -> %s\n", why); + exit (EXIT_FAILURE); } int piGpioLayout (void) { - FILE *cpuFd ; - char line [120] ; - char *c ; - static int gpioLayout = -1 ; + FILE *cpuFd; + char line[120]; + char *c; + static int gpioLayout = -1; // Set the first time this is called - if (gpioLayout != -1) // No point checking twice - return gpioLayout ; + // If already set, just return the previously-found value. + if (gpioLayout != -1) + return gpioLayout; if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL) - piGpioLayoutOops ("Unable to open /proc/cpuinfo") ; + piGpioLayoutOops ("Unable to open /proc/cpuinfo"); -// Start by looking for the Architecture to make sure we're really running -// on a Pi. I'm getting fed-up with people whinging at me because -// they can't get it to work on weirdFruitPi boards... + // -------------------------------------------- + // Get the model description + while (fgets (line, 120, cpuFd) != NULL) + if (strncmp (line, "Model", 5) == 0) + break; + if (strncmp (line, "Model", 5) != 0) + piGpioLayoutOops ("No \"Model\" line"); + else + { + for (c = line; *c; ++c) + { + if (*c == ':') break; + } + ++c; // Skip colon + // Skip space + while ((*c == ' ') || (*c == '\t')) + { + ++c; + } + if (wiringPiDebug) + { + printf ("piGpioLayout: Model: %s", c); + } + } + + // -------------------------------------------- + // Get hardware architecture. + rewind (cpuFd); while (fgets (line, 120, cpuFd) != NULL) if (strncmp (line, "Hardware", 8) == 0) - break ; + break; if (strncmp (line, "Hardware", 8) != 0) - piGpioLayoutOops ("No \"Hardware\" line") ; - - if (wiringPiDebug) - printf ("piGpioLayout: Hardware: %s\n", line) ; - -// See if it's BCM2708 or BCM2709 or the new BCM2835. - -// OK. As of Kernel 4.8, we have BCM2835 only, regardless of model. -// However I still want to check because it will trap the cheapskates and rip- -// off merchants who want to use wiringPi on non-Raspberry Pi platforms - which -// I do not support so don't email me your bleating whinges about anything -// other than a genuine Raspberry Pi. - -#ifdef DONT_CARE_ANYMORE - if (! (strstr (line, "BCM2708") || strstr (line, "BCM2709") || strstr (line, "BCM2835"))) + piGpioLayoutOops ("No \"Hardware\" line"); + else { - fprintf (stderr, "Unable to determine hardware version. I see: %s,\n", line) ; - fprintf (stderr, " - expecting BCM2708, BCM2709 or BCM2835.\n") ; - fprintf (stderr, "If this is a genuine Raspberry Pi then please report this\n") ; - fprintf (stderr, "at GitHub.com/wiringPi/wiringPi. If this is not a Raspberry Pi then you\n") ; - fprintf (stderr, "are on your own as wiringPi is designed to support the\n") ; - fprintf (stderr, "Raspberry Pi ONLY.\n") ; - exit (EXIT_FAILURE) ; + for (c = line; *c; ++c) + { + if (*c == ':') break; + } + ++c; // Skip colon + // Skip space + while ((*c == ' ') || (*c == '\t')) + { + ++c; + } + if (wiringPiDebug) + { + printf ("piGpioLayout: Hardware: %s", c); + } } -#endif - -// Actually... That has caused me more than 10,000 emails so-far. Mosty by -// people who think they know better by creating a statically linked -// version that will not run with a new 4.9 kernel. I utterly hate and -// despise those people. -// -// I also get bleats from people running other than Raspbian with another -// distros compiled kernel rather than a foundation compiled kernel, so -// this might actually help them. It might not - I only have the capacity -// to support Raspbian. -// -// However, I've decided to leave this check out and rely purely on the -// Revision: line for now. It will not work on a non-pi hardware or weird -// kernels that don't give you a suitable revision line. - -// So - we're Probably on a Raspberry Pi. Check the revision field for the real -// hardware type -// In-future, I ought to use the device tree as there are now Pi entries in -// /proc/device-tree/ ... -// but I'll leave that for the next revision. Or the next. -// Isolate the Revision line - - rewind (cpuFd) ; + // -------------------------------------------- + // Get the Revision line + rewind (cpuFd); while (fgets (line, 120, cpuFd) != NULL) if (strncmp (line, "Revision", 8) == 0) - break ; + break; - fclose (cpuFd) ; + fclose (cpuFd); if (strncmp (line, "Revision", 8) != 0) - piGpioLayoutOops ("No \"Revision\" line") ; - -// Chomp trailing CR/NL + piGpioLayoutOops ("No \"Revision\" line"); - for (c = &line [strlen (line) - 1] ; (*c == '\n') || (*c == '\r') ; --c) - *c = 0 ; + // Chomp CR and/or LF + for (c = line; *c; ++c) + { + if ((*c == '\n') || (*c == '\r')) + { + *c = 0; + } + } + // Scan to the first character of the revision number + for (c = line; *c; ++c) + { + if (*c == ':') break; + } + ++c; // Skip colon + // Skip space + while ((*c == ' ') || (*c == '\t')) + { + ++c; + } if (wiringPiDebug) - printf ("piGpioLayout: Revision string: %s\n", line) ; - -// Scan to the first character of the revision number - - for (c = line ; *c ; ++c) - if (*c == ':') - break ; - - if (*c != ':') - piGpioLayoutOops ("Bogus \"Revision\" line (no colon)") ; - -// Chomp spaces - - ++c ; - while (isspace (*c)) - ++c ; + { + printf ("piGpioLayout: Revision string: %s\n", c); + } if (!isxdigit (*c)) - piGpioLayoutOops ("Bogus \"Revision\" line (no hex digit at start of revision)") ; - -// Make sure its long enough + piGpioLayoutOops ("Bogus \"Revision\" line (no hex digit at start of revision)"); + // Make sure its long enough if (strlen (c) < 4) - piGpioLayoutOops ("Bogus revision line (too small)") ; - -// Isolate last 4 characters: (in-case of overvolting or new encoding scheme) - - c = c + strlen (c) - 4 ; + piGpioLayoutOops ("Bogus revision line (too small)"); + // Use last character for revision number + char *rev = c + strlen (c) - 1; + int revnum = atoi(rev); if (wiringPiDebug) - printf ("piGpioLayout: last4Chars are: \"%s\"\n", c) ; + { + printf ("piGpioLayout: Revision number: 1.%d\n", revnum); + } + // Isolate last 4 characters: (in-case of overvolting or new encoding scheme) + c = c + strlen (c) - 4; if ( (strcmp (c, "0002") == 0) || (strcmp (c, "0003") == 0)) gpioLayout = 1 ; else gpioLayout = 2 ; // Covers everything else from the B revision 2 to the B+, the Pi v2, v3, zero and CM's. if (wiringPiDebug) - printf ("piGpioLayoutOops: Returning revision: %d\n", gpioLayout) ; + printf ("piGpioLayout: Returning revision: %d\n", gpioLayout); - return gpioLayout ; -} - -/* - * piBoardRev: - * Deprecated, but does the same as piGpioLayout - ********************************************************************************* - */ + // -------------------------------------------- -int piBoardRev (void) -{ - return piGpioLayout () ; + return gpioLayout; } - /* * piBoardId: - * Return the real details of the board we have. - * - * This is undocumented and really only intended for the GPIO command. - * Use at your own risk! - * - * Seems there are some boards with 0000 in them (mistake in manufacture) - * So the distinction between boards that I can see is: - * - * 0000 - Error - * 0001 - Not used - * - * Original Pi boards: - * 0002 - Model B, Rev 1, 256MB, Egoman - * 0003 - Model B, Rev 1.1, 256MB, Egoman, Fuses/D14 removed. - * - * Newer Pi's with remapped GPIO: - * 0004 - Model B, Rev 1.2, 256MB, Sony - * 0005 - Model B, Rev 1.2, 256MB, Egoman - * 0006 - Model B, Rev 1.2, 256MB, Egoman + * Return the real details of the board we have. + * See: + * https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#new-style-revision-codes-in-use * - * 0007 - Model A, Rev 1.2, 256MB, Egoman - * 0008 - Model A, Rev 1.2, 256MB, Sony - * 0009 - Model A, Rev 1.2, 256MB, Egoman + * This is undocumented and really only intended for the GPIO command. + * Use at your own risk! * - * 000d - Model B, Rev 1.2, 512MB, Egoman (Red Pi, Blue Pi?) - * 000e - Model B, Rev 1.2, 512MB, Sony - * 000f - Model B, Rev 1.2, 512MB, Egoman + * Seems there are some boards with 0000 in them (mistake in manufacture) + * So the distinction between boards that I can see is: * - * 0010 - Model B+, Rev 1.2, 512MB, Sony - * 0013 - Model B+ Rev 1.2, 512MB, Embest - * 0016 - Model B+ Rev 1.2, 512MB, Sony - * 0019 - Model B+ Rev 1.2, 512MB, Egoman + * 0000 - Error + * 0001 - Not used * - * 0011 - Pi CM, Rev 1.1, 512MB, Sony - * 0014 - Pi CM, Rev 1.1, 512MB, Embest - * 0017 - Pi CM, Rev 1.1, 512MB, Sony - * 001a - Pi CM, Rev 1.1, 512MB, Egoman + * Old-style revision codes + * Original Pi boards: + * 0002 - Model B, Rev 1.0, 256MB, Egoman + * 0003 - Model B, Rev 1.0, 256MB, Egoman, Fuses/D14 removed. + * Newer Pi's with remapped GPIO: + * 0004 - Model B, Rev 2.0, 256MB, Sony + * 0005 - Model B, Rev 2.0, 256MB, Qisda + * 0006 - Model B, Rev 2.0, 256MB, Egoman + * 0007 - Model A, Rev 2.0, 256MB, Egoman + * 0008 - Model A, Rev 2.0, 256MB, Sony + * 0009 - Model A, Rev 2.0, 256MB, Qisda + * 000d - Model B, Rev 2.0, 512MB, Egoman + * 000e - Model B, Rev 2.0, 512MB, Sony + * 000f - Model B, Rev 2.0, 512MB, Egoman + * 0010 - Model B+, Rev 1.2, 512MB, Sony + * 0011 - Pi CM, Rev 1.0, 512MB, Sony + * 0012 - Model A+ Rev 1.1, 256MB, Sony + * 0013 - Model B+ Rev 1.2, 512MB, Embest + * 0014 - Pi CM1, Rev 1.0, 512MB, Embest + * 0015 - Model A+ Rev 1.1, 256MB/512MB, Embest * - * 0012 - Model A+ Rev 1.1, 256MB, Sony - * 0015 - Model A+ Rev 1.1, 512MB, Embest - * 0018 - Model A+ Rev 1.1, 256MB, Sony - * 001b - Model A+ Rev 1.1, 256MB, Egoman + * A small thorn is the olde style overvolting - that will add in + * 1000000 * - * A small thorn is the olde style overvolting - that will add in - * 1000000 - * - * The Pi compute module has an revision of 0011 or 0014 - since we only - * check the last digit, then it's 1, therefore it'll default to not 2 or - * 3 for a Rev 1, so will appear as a Rev 2. This is fine for the most part, but - * we'll properly detect the Compute Module later and adjust accordingly. + * The Pi compute module one has a revision of 0011 or 0014 - since we only + * check the last digit, then it's 1, therefore it'll default to not 2 or + * 3 for a Rev 1, so will appear as a Rev 2. This is fine for the most part, but + * we'll properly detect the Compute Module later and adjust accordingly. * * And then things changed with the introduction of the v2... * * For Pi v2 and subsequent models - e.g. the Zero: * - * [USER:8] [NEW:1] [MEMSIZE:3] [MANUFACTURER:4] [PROCESSOR:4] [TYPE:8] [REV:4] + * [USER:8][NEW:1][MEMSIZE:3][MANUFACTURER:4][PROCESSOR:4][TYPE:8][REV:4] * NEW 23: will be 1 for the new scheme, 0 for the old scheme * MEMSIZE 20: 0=256M 1=512M 2=1G * MANUFACTURER 16: 0=SONY 1=EGOMAN 2=EMBEST @@ -958,139 +878,133 @@ int piBoardRev (void) ********************************************************************************* */ -void piBoardId (int *model, int *rev, int *mem, int *maker, int *warranty) +void piBoardId (int *model, int *proc, int *rev, int *mem, int *maker, int *warranty) { - FILE *cpuFd ; - char line [120] ; - char *c ; - unsigned int revision ; - int bRev, bType, bProc, bMfg, bMem, bWarranty ; - -// Will deal with the properly later on - for now, lets just get it going... -// unsigned int modelNum ; + FILE *cpuFd; + char line[120]; + char *c; + unsigned int revision; + int bRev, bType, bProc, bMfg, bMem, bWarranty; - (void)piGpioLayout () ; // Call this first to make sure all's OK. Don't care about the result. + (void)piGpioLayout(); // Call this first to make sure all's OK. Don't care about the result. if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL) - piGpioLayoutOops ("Unable to open /proc/cpuinfo") ; + piGpioLayoutOops ("Unable to open /proc/cpuinfo"); while (fgets (line, 120, cpuFd) != NULL) if (strncmp (line, "Revision", 8) == 0) - break ; + break; - fclose (cpuFd) ; + fclose (cpuFd); if (strncmp (line, "Revision", 8) != 0) - piGpioLayoutOops ("No \"Revision\" line") ; + piGpioLayoutOops ("No \"Revision\" line"); -// Chomp trailing CR/NL - - for (c = &line [strlen (line) - 1] ; (*c == '\n') || (*c == '\r') ; --c) - *c = 0 ; + // Chomp trailing CR/NL + for (c = &line[strlen (line) - 1]; (*c == '\n') || (*c == '\r'); --c) + { + *c = 0; + } if (wiringPiDebug) - printf ("piBoardId: Revision string: %s\n", line) ; - -// Need to work out if it's using the new or old encoding scheme: - -// Scan to the first character of the revision number + printf ("piBoardId: Revision string: %s\n", line); - for (c = line ; *c ; ++c) + // Need to work out if it's using the new or old encoding scheme: + // Scan to the first character of the revision number + for (c = line; *c; ++c) if (*c == ':') - break ; + break; if (*c != ':') - piGpioLayoutOops ("Bogus \"Revision\" line (no colon)") ; + piGpioLayoutOops ("Bogus \"Revision\" line (no colon)"); -// Chomp spaces - - ++c ; + // Chomp spaces + ++c; while (isspace (*c)) - ++c ; + ++c; if (!isxdigit (*c)) - piGpioLayoutOops ("Bogus \"Revision\" line (no hex digit at start of revision)") ; - - revision = (unsigned int)strtol (c, NULL, 16) ; // Hex number with no leading 0x + piGpioLayoutOops ("Bogus \"Revision\" line (no hex digit at start of revision)"); -// Check for new way: + revision = (unsigned int)strtol (c, NULL, 16); // Hex number with no leading 0x + // 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) ; - - bRev = (revision & (0x0F << 0)) >> 0 ; - bType = (revision & (0xFF << 4)) >> 4 ; - bProc = (revision & (0x0F << 12)) >> 12 ; // Not used for now. - bMfg = (revision & (0x0F << 16)) >> 16 ; - bMem = (revision & (0x07 << 20)) >> 20 ; - bWarranty = (revision & (0x03 << 24)) != 0 ; - - *model = bType ; - *rev = bRev ; - *mem = bMem ; - *maker = bMfg ; - *warranty = bWarranty ; + printf ("piBoardId: New Way: revision is: %08X\n", revision); + + bRev = (revision & (0x0F << 0)) >> 0; + bType = (revision & (0xFF << 4)) >> 4; + bProc = (revision & (0x0F << 12)) >> 12; + bMfg = (revision & (0x0F << 16)) >> 16; + bMem = (revision & (0x07 << 20)) >> 20; + bWarranty = (revision & (0x03 << 24)) != 0; + + *model = bType; + *proc = bProc; + *rev = bRev; + *mem = bMem; + *maker = bMfg ; + *warranty = bWarranty; if (wiringPiDebug) printf ("piBoardId: rev: %d, type: %d, proc: %d, mfg: %d, mem: %d, warranty: %d\n", - bRev, bType, bProc, bMfg, bMem, bWarranty) ; + bRev, bType, bProc, bMfg, bMem, bWarranty); } - else // Old way + else // Old way { if (wiringPiDebug) - printf ("piBoardId: Old Way: revision is: %s\n", c) ; + printf ("piBoardId: Old Way: revision is: %s\n", c); if (!isdigit (*c)) - piGpioLayoutOops ("Bogus \"Revision\" line (no digit at start of revision)") ; - -// Make sure its long enough + piGpioLayoutOops ("Bogus \"Revision\" line (no digit at start of revision)"); + // Make sure its long enough if (strlen (c) < 4) - piGpioLayoutOops ("Bogus \"Revision\" line (not long enough)") ; - -// If longer than 4, we'll assume it's been overvolted + piGpioLayoutOops ("Bogus \"Revision\" line (not long enough)"); - *warranty = strlen (c) > 4 ; + // If longer than 4, we'll assume it's been overvolted + *warranty = strlen (c) > 4; -// Extract last 4 characters: + // Extract last 4 characters: + c = c + strlen (c) - 4; - c = c + strlen (c) - 4 ; + // Using the old way - the processor was always reported as BCM2835 + *proc = 0; -// Fill out the replys as appropriate + // Fill out the replys as appropriate + if (strcmp (c, "0002") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1 ; *mem = 0; *maker = PI_MAKER_EGOMAN ; } + else if (strcmp (c, "0003") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_1; *mem = 0; *maker = PI_MAKER_EGOMAN ; } - /**/ if (strcmp (c, "0002") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; } - else if (strcmp (c, "0003") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_1 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; } + else if (strcmp (c, "0004") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2; *mem = 0; *maker = PI_MAKER_SONY ; } + else if (strcmp (c, "0005") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2; *mem = 0; *maker = PI_MAKER_EGOMAN ; } + else if (strcmp (c, "0006") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2; *mem = 0; *maker = PI_MAKER_EGOMAN ; } - else if (strcmp (c, "0004") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "0005") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; } - else if (strcmp (c, "0006") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; } + else if (strcmp (c, "0007") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_1_2; *mem = 0; *maker = PI_MAKER_EGOMAN ; } + else if (strcmp (c, "0008") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_1_2; *mem = 0; *maker = PI_MAKER_SONY; ; } + else if (strcmp (c, "0009") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_1_2; *mem = 0; *maker = PI_MAKER_EGOMAN ; } - else if (strcmp (c, "0007") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; } - else if (strcmp (c, "0008") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_SONY ; ; } - else if (strcmp (c, "0009") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; } + else if (strcmp (c, "000d") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2; *mem = 1; *maker = PI_MAKER_EGOMAN ; } + else if (strcmp (c, "000e") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2; *mem = 1; *maker = PI_MAKER_SONY ; } + else if (strcmp (c, "000f") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2; *mem = 1; *maker = PI_MAKER_EGOMAN ; } - else if (strcmp (c, "000d") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_EGOMAN ; } - else if (strcmp (c, "000e") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "000f") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_EGOMAN ; } + else if (strcmp (c, "0010") == 0) { *model = PI_MODEL_BP; *rev = PI_VERSION_1_2; *mem = 1; *maker = PI_MAKER_SONY ; } + else if (strcmp (c, "0013") == 0) { *model = PI_MODEL_BP; *rev = PI_VERSION_1_2; *mem = 1; *maker = PI_MAKER_EMBEST ; } + else if (strcmp (c, "0016") == 0) { *model = PI_MODEL_BP; *rev = PI_VERSION_1_2; *mem = 1; *maker = PI_MAKER_SONY ; } + else if (strcmp (c, "0019") == 0) { *model = PI_MODEL_BP; *rev = PI_VERSION_1_2; *mem = 1; *maker = PI_MAKER_EGOMAN ; } - else if (strcmp (c, "0010") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "0013") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_EMBEST ; } - else if (strcmp (c, "0016") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "0019") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_EGOMAN ; } + else if (strcmp (c, "0011") == 0) { *model = PI_MODEL_CM1; *rev = PI_VERSION_1_1; *mem = 1; *maker = PI_MAKER_SONY ; } + else if (strcmp (c, "0014") == 0) { *model = PI_MODEL_CM1; *rev = PI_VERSION_1_1; *mem = 1; *maker = PI_MAKER_EMBEST ; } + else if (strcmp (c, "0017") == 0) { *model = PI_MODEL_CM1; *rev = PI_VERSION_1_1; *mem = 1; *maker = PI_MAKER_SONY ; } + else if (strcmp (c, "001a") == 0) { *model = PI_MODEL_CM1; *rev = PI_VERSION_1_1; *mem = 1; *maker = PI_MAKER_EGOMAN ; } - else if (strcmp (c, "0011") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_1 ; *mem = 1 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "0014") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_1 ; *mem = 1 ; *maker = PI_MAKER_EMBEST ; } - else if (strcmp (c, "0017") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_1 ; *mem = 1 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "001a") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_1 ; *mem = 1 ; *maker = PI_MAKER_EGOMAN ; } + else if (strcmp (c, "0012") == 0) { *model = PI_MODEL_AP; *rev = PI_VERSION_1_1; *mem = 0; *maker = PI_MAKER_SONY ; } + else if (strcmp (c, "0015") == 0) { *model = PI_MODEL_AP; *rev = PI_VERSION_1_1; *mem = 1; *maker = PI_MAKER_EMBEST ; } + else if (strcmp (c, "0018") == 0) { *model = PI_MODEL_AP; *rev = PI_VERSION_1_1; *mem = 0; *maker = PI_MAKER_SONY ; } + else if (strcmp (c, "001b") == 0) { *model = PI_MODEL_AP; *rev = PI_VERSION_1_1; *mem = 0; *maker = PI_MAKER_EGOMAN ; } - else if (strcmp (c, "0012") == 0) { *model = PI_MODEL_AP ; *rev = PI_VERSION_1_1 ; *mem = 0 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "0015") == 0) { *model = PI_MODEL_AP ; *rev = PI_VERSION_1_1 ; *mem = 1 ; *maker = PI_MAKER_EMBEST ; } - else if (strcmp (c, "0018") == 0) { *model = PI_MODEL_AP ; *rev = PI_VERSION_1_1 ; *mem = 0 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "001b") == 0) { *model = PI_MODEL_AP ; *rev = PI_VERSION_1_1 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; } - - else { *model = 0 ; *rev = 0 ; *mem = 0 ; *maker = 0 ; } + else { *model = 0 ; *rev = 0 ; *mem = 0; *maker = 0; } } } @@ -1102,10 +1016,9 @@ void piBoardId (int *model, int *rev, int *mem, int *maker, int *warranty) * Provided for external support. ********************************************************************************* */ - int wpiPinToGpio (int wpiPin) { - return pinToGpio [wpiPin & 63] ; + return pinToGpio[wpiPin & 63]; } @@ -1115,10 +1028,9 @@ int wpiPinToGpio (int wpiPin) * Provided for external support. ********************************************************************************* */ - int physPinToGpio (int physPin) { - return physToGpio [physPin & 63] ; + return physToGpio[physPin & 63]; } @@ -1127,23 +1039,22 @@ int physPinToGpio (int physPin) * Set the PAD driver value ********************************************************************************* */ - void setPadDrive (int group, int value) { - uint32_t wrVal ; + uint32_t wrVal; if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) { if ((group < 0) || (group > 2)) - return ; + return; - wrVal = BCM_PASSWORD | 0x18 | (value & 7) ; - *(pads + group + 11) = wrVal ; + wrVal = BCM_PASSWORD | 0x18 | (value & 7); + *(pads + group + 11) = wrVal; if (wiringPiDebug) { - printf ("setPadDrive: Group: %d, value: %d (%08X)\n", group, value, wrVal) ; - printf ("Read : %08X\n", *(pads + group + 11)) ; + printf ("setPadDrive: Group: %d, value: %d (%08X)\n", group, value, wrVal); + printf ("Read : %08X\n", *(pads + group + 11)); } } } @@ -1155,26 +1066,25 @@ void setPadDrive (int group, int value) * for the gpio readall command (I think) ********************************************************************************* */ - int getAlt (int pin) { - int fSel, shift, alt ; + int fSel, shift, alt; - pin &= 63 ; + pin &= 63; - /**/ if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; + if (wiringPiMode == WPI_MODE_PINS) + pin = pinToGpio[pin]; else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; + pin = physToGpio[pin]; else if (wiringPiMode != WPI_MODE_GPIO) - return 0 ; + return 0; - fSel = gpioToGPFSEL [pin] ; - shift = gpioToShift [pin] ; + fSel = gpioToGPFSEL[pin]; + shift = gpioToShift [pin]; - alt = (*(gpio + fSel) >> shift) & 7 ; + alt = (*(gpio + fSel) >> shift) & 7; - return alt ; + return alt; } @@ -1183,15 +1093,14 @@ int getAlt (int pin) * Select the native "balanced" mode, or standard mark:space mode ********************************************************************************* */ - void pwmSetMode (int mode) { if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) { if (mode == PWM_MODE_MS) - *(pwm + PWM_CONTROL) = PWM0_ENABLE | PWM1_ENABLE | PWM0_MS_MODE | PWM1_MS_MODE ; + *(pwm + PWM_CONTROL) = PWM0_ENABLE | PWM1_ENABLE | PWM0_MS_MODE | PWM1_MS_MODE; else - *(pwm + PWM_CONTROL) = PWM0_ENABLE | PWM1_ENABLE ; + *(pwm + PWM_CONTROL) = PWM0_ENABLE | PWM1_ENABLE; } } @@ -1202,66 +1111,60 @@ void pwmSetMode (int mode) * value. If you want different in your own code, then write your own. ********************************************************************************* */ - void pwmSetRange (unsigned int range) { if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) { - *(pwm + PWM0_RANGE) = range ; delayMicroseconds (10) ; - *(pwm + PWM1_RANGE) = range ; delayMicroseconds (10) ; + *(pwm + PWM0_RANGE) = range; delayMicroseconds (10); + *(pwm + PWM1_RANGE) = range; delayMicroseconds (10); } } /* * pwmSetClock: - * Set/Change the PWM clock. Originally my code, but changed - * (for the better!) by Chris Hall, - * after further study of the manual and testing with a 'scope + * Set/Change the PWM clock. ********************************************************************************* */ - void pwmSetClock (int divisor) { - uint32_t pwm_control ; + uint32_t pwm_control; if (piGpioBase == GPIO_PERI_BASE_2711) { divisor = 540*divisor/192; } - divisor &= 4095 ; + divisor &= 4095; if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) { if (wiringPiDebug) - printf ("Setting to: %d. Current: 0x%08X\n", divisor, *(clk + PWMCLK_DIV)) ; + printf ("Setting to: %d. Current: 0x%08X\n", divisor, *(clk + PWMCLK_DIV)); - pwm_control = *(pwm + PWM_CONTROL) ; // preserve PWM_CONTROL + pwm_control = *(pwm + PWM_CONTROL); // preserve PWM_CONTROL -// We need to stop PWM prior to stopping PWM clock in MS mode otherwise BUSY -// stays high. + // We need to stop PWM prior to stopping PWM clock in MS mode otherwise BUSY stays high. + *(pwm + PWM_CONTROL) = 0; // Stop PWM - *(pwm + PWM_CONTROL) = 0 ; // Stop PWM + // Stop PWM clock before changing divisor. The delay after this does need to + // this big (95uS occasionally fails, 100uS OK), it's almost as though the BUSY + // flag is not working properly in balanced mode. Without the delay when DIV is + // adjusted the clock sometimes switches to very slow, once slow further DIV + // adjustments do nothing and it's difficult to get out of this mode. -// Stop PWM clock before changing divisor. The delay after this does need to -// this big (95uS occasionally fails, 100uS OK), it's almost as though the BUSY -// flag is not working properly in balanced mode. Without the delay when DIV is -// adjusted the clock sometimes switches to very slow, once slow further DIV -// adjustments do nothing and it's difficult to get out of this mode. - - *(clk + PWMCLK_CNTL) = BCM_PASSWORD | 0x01 ; // Stop PWM Clock - delayMicroseconds (110) ; // prevents clock going sloooow + *(clk + PWMCLK_CNTL) = BCM_PASSWORD | 0x01; // Stop PWM Clock + delayMicroseconds (110); // prevents clock going sloooow while ((*(clk + PWMCLK_CNTL) & 0x80) != 0) // Wait for clock to be !BUSY - delayMicroseconds (1) ; + delayMicroseconds (1); - *(clk + PWMCLK_DIV) = BCM_PASSWORD | (divisor << 12) ; + *(clk + PWMCLK_DIV) = BCM_PASSWORD | (divisor << 12); - *(clk + PWMCLK_CNTL) = BCM_PASSWORD | 0x11 ; // Start PWM clock - *(pwm + PWM_CONTROL) = pwm_control ; // restore PWM_CONTROL + *(clk + PWMCLK_CNTL) = BCM_PASSWORD | 0x11; // Start PWM clock + *(pwm + PWM_CONTROL) = pwm_control; // restore PWM_CONTROL if (wiringPiDebug) - printf ("Set to: %d. Now : 0x%08X\n", divisor, *(clk + PWMCLK_DIV)) ; + printf ("Set to: %d. Now : 0x%08X\n", divisor, *(clk + PWMCLK_DIV)); } } @@ -1271,33 +1174,32 @@ void pwmSetClock (int divisor) * Set the frequency on a GPIO clock pin ********************************************************************************* */ - void gpioClockSet (int pin, int freq) { - int divi, divr, divf ; + int divi, divr, divf; - pin &= 63 ; + pin &= 63; /**/ if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; + pin = pinToGpio[pin]; else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; + pin = physToGpio[pin]; else if (wiringPiMode != WPI_MODE_GPIO) - return ; + return; - divi = 19200000 / freq ; - divr = 19200000 % freq ; - divf = (int)((double)divr * 4096.0 / 19200000.0) ; + divi = 19200000 / freq; + divr = 19200000 % freq; + divf = (int)((double)divr * 4096.0 / 19200000.0); if (divi > 4095) - divi = 4095 ; + divi = 4095; - *(clk + gpioToClkCon [pin]) = BCM_PASSWORD | GPIO_CLOCK_SOURCE ; // Stop GPIO Clock - while ((*(clk + gpioToClkCon [pin]) & 0x80) != 0) // ... and wait - ; + *(clk + gpioToClkCon[pin]) = BCM_PASSWORD | GPIO_CLOCK_SOURCE; // Stop GPIO Clock + while ((*(clk + gpioToClkCon[pin]) & 0x80) != 0) // ... and wait + ; - *(clk + gpioToClkDiv [pin]) = BCM_PASSWORD | (divi << 12) | divf ; // Set dividers - *(clk + gpioToClkCon [pin]) = BCM_PASSWORD | 0x10 | GPIO_CLOCK_SOURCE ; // Start Clock + *(clk + gpioToClkDiv[pin]) = BCM_PASSWORD | (divi << 12) | divf; // Set dividers + *(clk + gpioToClkCon[pin]) = BCM_PASSWORD | 0x10 | GPIO_CLOCK_SOURCE; // Start Clock } @@ -1306,18 +1208,17 @@ void gpioClockSet (int pin, int freq) * Locate our device node ********************************************************************************* */ - struct wiringPiNodeStruct *wiringPiFindNode (int pin) { - struct wiringPiNodeStruct *node = wiringPiNodes ; + struct wiringPiNodeStruct *node = wiringPiNodes; while (node != NULL) if ((pin >= node->pinBase) && (pin <= node->pinMax)) - return node ; + return node; else - node = node->next ; + node = node->next; - return NULL ; + return NULL; } @@ -1326,71 +1227,48 @@ struct wiringPiNodeStruct *wiringPiFindNode (int pin) * Create a new GPIO node into the wiringPi handling system ********************************************************************************* */ - -static void pinModeDummy (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int mode) { return ; } -static void pullUpDnControlDummy (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int pud) { return ; } -//static unsigned int digitalRead8Dummy (UNU struct wiringPiNodeStruct *node, UNU int UNU pin) { return 0 ; } -//static void digitalWrite8Dummy (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int value) { return ; } -static int digitalReadDummy (UNU struct wiringPiNodeStruct *node, UNU int UNU pin) { return LOW ; } -static void digitalWriteDummy (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int value) { return ; } -static void pwmWriteDummy (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int value) { return ; } -static int analogReadDummy (UNU struct wiringPiNodeStruct *node, UNU int pin) { return 0 ; } -static void analogWriteDummy (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int value) { return ; } +static void pinModeDummy (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int mode) { return; } +static void pullUpDnControlDummy (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int pud) { return; } +static int digitalReadDummy (UNU struct wiringPiNodeStruct *node, UNU int UNU pin) { return LOW; } +static void digitalWriteDummy (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int value) { return; } +static void pwmWriteDummy (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int value) { return; } +static int analogReadDummy (UNU struct wiringPiNodeStruct *node, UNU int pin) { return 0; } +static void analogWriteDummy (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int value) { return; } struct wiringPiNodeStruct *wiringPiNewNode (int pinBase, int numPins) { - int pin ; - struct wiringPiNodeStruct *node ; - -// Minimum pin base is 64 + int pin; + struct wiringPiNodeStruct *node; + // Minimum pin base is 64 if (pinBase < 64) - (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: pinBase of %d is < 64\n", pinBase) ; - -// Check all pins in-case there is overlap: + (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: pinBase of %d is < 64\n", pinBase); - for (pin = pinBase ; pin < (pinBase + numPins) ; ++pin) + // Check all pins in-case there is overlap: + for (pin = pinBase; pin < (pinBase + numPins); ++pin) if (wiringPiFindNode (pin) != NULL) - (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: Pin %d overlaps with existing definition\n", pin) ; + (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: Pin %d overlaps with existing definition\n", pin); - node = (struct wiringPiNodeStruct *)calloc (sizeof (struct wiringPiNodeStruct), 1) ; // calloc zeros + node = (struct wiringPiNodeStruct *)calloc (sizeof (struct wiringPiNodeStruct), 1); // calloc zeros if (node == NULL) - (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: Unable to allocate memory: %s\n", strerror (errno)) ; - - node->pinBase = pinBase ; - node->pinMax = pinBase + numPins - 1 ; - node->pinMode = pinModeDummy ; - node->pullUpDnControl = pullUpDnControlDummy ; - node->digitalRead = digitalReadDummy ; -//node->digitalRead8 = digitalRead8Dummy ; - node->digitalWrite = digitalWriteDummy ; -//node->digitalWrite8 = digitalWrite8Dummy ; - node->pwmWrite = pwmWriteDummy ; - node->analogRead = analogReadDummy ; - node->analogWrite = analogWriteDummy ; - node->next = wiringPiNodes ; - wiringPiNodes = node ; - - return node ; + (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: Unable to allocate memory: %s\n", strerror (errno)); + + node->pinBase = pinBase; + node->pinMax = pinBase + numPins - 1; + node->pinMode = pinModeDummy; + node->pullUpDnControl = pullUpDnControlDummy; + node->digitalRead = digitalReadDummy; + node->digitalWrite = digitalWriteDummy; + node->pwmWrite = pwmWriteDummy; + node->analogRead = analogReadDummy; + node->analogWrite = analogWriteDummy; + node->next = wiringPiNodes; + wiringPiNodes = node; + + return node; } -#ifdef notYetReady -/* - * pinED01: - * pinED10: - * Enables edge-detect mode on a pin - from a 0 to a 1 or 1 to 0 - * Pin must already be in input mode with appropriate pull up/downs set. - ********************************************************************************* - */ - -void pinEnableED01Pi (int pin) -{ - pin = pinToGpio [pin & 63] ; -} -#endif - - /* ********************************************************************************* * Core Functions @@ -1405,23 +1283,23 @@ void pinEnableED01Pi (int pin) void pinModeAlt (int pin, int mode) { - int fSel, shift ; + int fSel, shift; - setupCheck ("pinModeAlt") ; + setupCheck ("pinModeAlt"); if ((pin & PI_GPIO_MASK) == 0) // On-board pin { - /**/ if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; + if (wiringPiMode == WPI_MODE_PINS) + pin = pinToGpio[pin]; else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; + pin = physToGpio[pin]; else if (wiringPiMode != WPI_MODE_GPIO) - return ; + return; - fSel = gpioToGPFSEL [pin] ; - shift = gpioToShift [pin] ; + fSel = gpioToGPFSEL[pin]; + shift = gpioToShift [pin]; - *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | ((mode & 0x7) << shift) ; + *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | ((mode & 0x7) << shift); } } @@ -1431,78 +1309,75 @@ void pinModeAlt (int pin, int mode) * Sets the mode of a pin to be input, output or PWM output ********************************************************************************* */ - void pinMode (int pin, int mode) { - int fSel, shift, alt ; - struct wiringPiNodeStruct *node = wiringPiNodes ; - int origPin = pin ; + int fSel, shift, alt; + struct wiringPiNodeStruct *node = wiringPiNodes; + int origPin = pin; - setupCheck ("pinMode") ; + setupCheck ("pinMode"); if ((pin & PI_GPIO_MASK) == 0) // On-board pin { - /**/ if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; + if (wiringPiMode == WPI_MODE_PINS) + pin = pinToGpio[pin]; else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; + pin = physToGpio[pin]; else if (wiringPiMode != WPI_MODE_GPIO) - return ; + return; - softPwmStop (origPin) ; - softToneStop (origPin) ; + softPwmStop (origPin); + softToneStop (origPin); - fSel = gpioToGPFSEL [pin] ; - shift = gpioToShift [pin] ; + fSel = gpioToGPFSEL[pin]; + shift = gpioToShift [pin]; - /**/ if (mode == INPUT) - *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) ; // Sets bits to zero = input + if (mode == INPUT) + *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)); // Sets bits to zero = input else if (mode == OUTPUT) - *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (1 << shift) ; + *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (1 << shift); else if (mode == SOFT_PWM_OUTPUT) - softPwmCreate (origPin, 0, 100) ; + softPwmCreate (origPin, 0, 100); else if (mode == SOFT_TONE_OUTPUT) - softToneCreate (origPin) ; + softToneCreate (origPin); else if (mode == PWM_TONE_OUTPUT) { - pinMode (origPin, PWM_OUTPUT) ; // Call myself to enable PWM mode - pwmSetMode (PWM_MODE_MS) ; + pinMode (origPin, PWM_OUTPUT); // Call myself to enable PWM mode + pwmSetMode (PWM_MODE_MS); } else if (mode == PWM_OUTPUT) { - if ((alt = gpioToPwmALT [pin]) == 0) // Not a hardware capable PWM pin - return ; - - usingGpioMemCheck ("pinMode PWM") ; + if ((alt = gpioToPwmALT[pin]) == 0) // Not a hardware capable PWM pin + return; -// Set pin to PWM mode + usingGpioMemCheck ("pinMode PWM"); - *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (alt << shift) ; - delayMicroseconds (110) ; // See comments in pwmSetClockWPi + // Set pin to PWM mode + *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (alt << shift); + delayMicroseconds (110); // See comments in pwmSetClockWPi - pwmSetMode (PWM_MODE_BAL) ; // Pi default mode - pwmSetRange (1024) ; // Default range of 1024 - pwmSetClock (32) ; // 19.2 / 32 = 600KHz - Also starts the PWM + pwmSetMode (PWM_MODE_BAL); // Pi default mode + pwmSetRange (1024); // Default range of 1024 + pwmSetClock (32); // 19.2 / 32 = 600KHz - Also starts the PWM } else if (mode == GPIO_CLOCK) { - if ((alt = gpioToGpClkALT0 [pin]) == 0) // Not a GPIO_CLOCK pin - return ; + if ((alt = gpioToGpClkALT0[pin]) == 0) // Not a GPIO_CLOCK pin + return; - usingGpioMemCheck ("pinMode CLOCK") ; + usingGpioMemCheck ("pinMode CLOCK"); -// Set pin to GPIO_CLOCK mode and set the clock frequency to 100KHz - - *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (alt << shift) ; - delayMicroseconds (110) ; - gpioClockSet (pin, 100000) ; + // Set pin to GPIO_CLOCK mode and set the clock frequency to 100KHz + *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (alt << shift); + delayMicroseconds (110); + gpioClockSet (pin, 100000); } } else { if ((node = wiringPiFindNode (pin)) != NULL) - node->pinMode (node, pin, mode) ; - return ; + node->pinMode (node, pin, mode); + return; } } @@ -1512,21 +1387,20 @@ void pinMode (int pin, int mode) * Control the internal pull-up/down resistors on a GPIO pin. ********************************************************************************* */ - void pullUpDnControl (int pin, int pud) { - struct wiringPiNodeStruct *node = wiringPiNodes ; + struct wiringPiNodeStruct *node = wiringPiNodes; - setupCheck ("pullUpDnControl") ; + setupCheck ("pullUpDnControl"); if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin { /**/ if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; + pin = pinToGpio[pin]; else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; + pin = physToGpio[pin]; else if (wiringPiMode != WPI_MODE_GPIO) - return ; + return; if (piGpioPupOffset == GPPUPPDN0) { @@ -1541,7 +1415,7 @@ void pullUpDnControl (int pin, int pud) case PUD_OFF: pull = 0; break; case PUD_UP: pull = 1; break; case PUD_DOWN: pull = 2; break; - default: return ; /* An illegal value */ + default: return; /* An illegal value */ } pullbits = *(gpio + pullreg); @@ -1552,18 +1426,18 @@ void pullUpDnControl (int pin, int pud) else { // legacy pull up/down method - *(gpio + GPPUD) = pud & 3 ; delayMicroseconds (5) ; - *(gpio + gpioToPUDCLK [pin]) = 1 << (pin & 31) ; delayMicroseconds (5) ; + *(gpio + GPPUD) = pud & 3; delayMicroseconds (5); + *(gpio + gpioToPUDCLK[pin]) = 1 << (pin & 31); delayMicroseconds (5); - *(gpio + GPPUD) = 0 ; delayMicroseconds (5) ; - *(gpio + gpioToPUDCLK [pin]) = 0 ; delayMicroseconds (5) ; + *(gpio + GPPUD) = 0; delayMicroseconds (5); + *(gpio + gpioToPUDCLK[pin]) = 0; delayMicroseconds (5); } } - else // Extension module + else // Extension module { if ((node = wiringPiFindNode (pin)) != NULL) - node->pullUpDnControl (node, pin, pud) ; - return ; + node->pullUpDnControl (node, pin, pud); + return; } } @@ -1573,125 +1447,82 @@ void pullUpDnControl (int pin, int pud) * Read the value of a given Pin, returning HIGH or LOW ********************************************************************************* */ - int digitalRead (int pin) { - char c ; - struct wiringPiNodeStruct *node = wiringPiNodes ; + char c; + struct wiringPiNodeStruct *node = wiringPiNodes; if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin { - /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode + if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode { - if (sysFds [pin] == -1) - return LOW ; + if (sysFds[pin] == -1) + return LOW; - lseek (sysFds [pin], 0L, SEEK_SET) ; - read (sysFds [pin], &c, 1) ; - return (c == '0') ? LOW : HIGH ; + lseek (sysFds[pin], 0L, SEEK_SET); + read (sysFds[pin], &c, 1); + return (c == '0') ? LOW : HIGH; } else if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; + pin = pinToGpio[pin]; else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; + pin = physToGpio[pin]; else if (wiringPiMode != WPI_MODE_GPIO) - return LOW ; + return LOW; - if ((*(gpio + gpioToGPLEV [pin]) & (1 << (pin & 31))) != 0) - return HIGH ; + if ((*(gpio + gpioToGPLEV[pin]) & (1 << (pin & 31))) != 0) + return HIGH; else - return LOW ; + return LOW; } else { if ((node = wiringPiFindNode (pin)) == NULL) - return LOW ; - return node->digitalRead (node, pin) ; + return LOW; + return node->digitalRead (node, pin); } } /* - * digitalRead8: - * Read 8-bits (a byte) from given start pin. - ********************************************************************************* - -unsigned int digitalRead8 (int pin) -{ - struct wiringPiNodeStruct *node = wiringPiNodes ; - - if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin - return 0 ; - else - { - if ((node = wiringPiFindNode (pin)) == NULL) - return LOW ; - return node->digitalRead8 (node, pin) ; - } -} - */ - - -/* * digitalWrite: * Set an output bit ********************************************************************************* */ - void digitalWrite (int pin, int value) { - struct wiringPiNodeStruct *node = wiringPiNodes ; + struct wiringPiNodeStruct *node = wiringPiNodes; if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin { - /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode + if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode { - if (sysFds [pin] != -1) + if (sysFds[pin] != -1) { - if (value == LOW) - write (sysFds [pin], "0\n", 2) ; - else - write (sysFds [pin], "1\n", 2) ; + if (value == LOW) + write (sysFds[pin], "0\n", 2); + else + write (sysFds[pin], "1\n", 2); } - return ; + return; } else if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; + pin = pinToGpio[pin]; else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; + pin = physToGpio[pin]; else if (wiringPiMode != WPI_MODE_GPIO) - return ; + return; if (value == LOW) - *(gpio + gpioToGPCLR [pin]) = 1 << (pin & 31) ; + *(gpio + gpioToGPCLR[pin]) = 1 << (pin & 31); else - *(gpio + gpioToGPSET [pin]) = 1 << (pin & 31) ; + *(gpio + gpioToGPSET[pin]) = 1 << (pin & 31); } else { if ((node = wiringPiFindNode (pin)) != NULL) - node->digitalWrite (node, pin, value) ; - } -} - - -/* - * digitalWrite8: - * Set an output 8-bit byte on the device from the given pin number - ********************************************************************************* - -void digitalWrite8 (int pin, int value) -{ - struct wiringPiNodeStruct *node = wiringPiNodes ; - - if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin - return ; - else - { - if ((node = wiringPiFindNode (pin)) != NULL) - node->digitalWrite8 (node, pin, value) ; + node->digitalWrite (node, pin, value); } } - */ /* @@ -1699,29 +1530,28 @@ void digitalWrite8 (int pin, int value) * Set an output PWM value ********************************************************************************* */ - void pwmWrite (int pin, int value) { - struct wiringPiNodeStruct *node = wiringPiNodes ; + struct wiringPiNodeStruct *node = wiringPiNodes; - setupCheck ("pwmWrite") ; + setupCheck ("pwmWrite"); if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin { - /**/ if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; + if (wiringPiMode == WPI_MODE_PINS) + pin = pinToGpio[pin]; else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; + pin = physToGpio[pin]; else if (wiringPiMode != WPI_MODE_GPIO) - return ; + return; - usingGpioMemCheck ("pwmWrite") ; - *(pwm + gpioToPwmPort [pin]) = value ; + usingGpioMemCheck ("pwmWrite"); + *(pwm + gpioToPwmPort[pin]) = value; } else { if ((node = wiringPiFindNode (pin)) != NULL) - node->pwmWrite (node, pin, value) ; + node->pwmWrite (node, pin, value); } } @@ -1733,15 +1563,14 @@ void pwmWrite (int pin, int value) * so this needs to go to a new node. ********************************************************************************* */ - int analogRead (int pin) { - struct wiringPiNodeStruct *node = wiringPiNodes ; + struct wiringPiNodeStruct *node = wiringPiNodes; if ((node = wiringPiFindNode (pin)) == NULL) - return 0 ; + return 0; else - return node->analogRead (node, pin) ; + return node->analogRead (node, pin); } @@ -1752,15 +1581,14 @@ int analogRead (int pin) * so this needs to go to a new node. ********************************************************************************* */ - void analogWrite (int pin, int value) { - struct wiringPiNodeStruct *node = wiringPiNodes ; + struct wiringPiNodeStruct *node = wiringPiNodes; if ((node = wiringPiFindNode (pin)) == NULL) - return ; + return; - node->analogWrite (node, pin, value) ; + node->analogWrite (node, pin, value); } @@ -1770,25 +1598,23 @@ void analogWrite (int pin, int value) * Output the given frequency on the Pi's PWM pin ********************************************************************************* */ - void pwmToneWrite (int pin, int freq) { - int range ; + int range; - setupCheck ("pwmToneWrite") ; + setupCheck ("pwmToneWrite"); if (freq == 0) - pwmWrite (pin, 0) ; // Off + pwmWrite (pin, 0); // Off else { - range = 600000 / freq ; - pwmSetRange (range) ; - pwmWrite (pin, freq / 2) ; + range = 600000 / freq; + pwmSetRange (range); + pwmWrite (pin, freq / 2); } } - /* * digitalWriteByte: * digitalReadByte: @@ -1807,61 +1633,61 @@ void pwmToneWrite (int pin, int freq) void digitalWriteByte (const int value) { - uint32_t pinSet = 0 ; - uint32_t pinClr = 0 ; - int mask = 1 ; - int pin ; + uint32_t pinSet = 0; + uint32_t pinClr = 0; + int mask = 1; + int pin; - /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) + if (wiringPiMode == WPI_MODE_GPIO_SYS) { - for (pin = 0 ; pin < 8 ; ++pin) + for (pin = 0; pin < 8; ++pin) { - digitalWrite (pinToGpio [pin], value & mask) ; - mask <<= 1 ; + digitalWrite (pinToGpio[pin], value & mask); + mask <<= 1; } - return ; + return; } else { - for (pin = 0 ; pin < 8 ; ++pin) + for (pin = 0; pin < 8; ++pin) { if ((value & mask) == 0) - pinClr |= (1 << pinToGpio [pin]) ; + pinClr |= (1 << pinToGpio[pin]); else - pinSet |= (1 << pinToGpio [pin]) ; + pinSet |= (1 << pinToGpio[pin]); - mask <<= 1 ; + mask <<= 1; } - *(gpio + gpioToGPCLR [0]) = pinClr ; - *(gpio + gpioToGPSET [0]) = pinSet ; + *(gpio + gpioToGPCLR[0]) = pinClr; + *(gpio + gpioToGPSET[0]) = pinSet; } } unsigned int digitalReadByte (void) { - int pin, x ; - uint32_t raw ; - uint32_t data = 0 ; + int pin, x; + uint32_t raw; + uint32_t data = 0; - /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) + if (wiringPiMode == WPI_MODE_GPIO_SYS) { - for (pin = 0 ; pin < 8 ; ++pin) + for (pin = 0; pin < 8; ++pin) { - x = digitalRead (pinToGpio [pin]) ; - data = (data << 1) | x ; + x = digitalRead (pinToGpio[pin]); + data = (data << 1) | x; } } else { - raw = *(gpio + gpioToGPLEV [0]) ; // First bank for these pins - for (pin = 0 ; pin < 8 ; ++pin) + raw = *(gpio + gpioToGPLEV[0]); // First bank for these pins + for (pin = 0; pin < 8; ++pin) { - x = pinToGpio [pin] ; - data = (data << 1) | (((raw & (1 << x)) == 0) ? 0 : 1) ; + x = pinToGpio[pin]; + data = (data << 1) | (((raw & (1 << x)) == 0) ? 0 : 1); } } - return data ; + return data; } @@ -1874,45 +1700,44 @@ unsigned int digitalReadByte (void) * However they overlap with the original read/write bytes. ********************************************************************************* */ - void digitalWriteByte2 (const int value) { - register int mask = 1 ; - register int pin ; + register int mask = 1; + register int pin; - /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) + if (wiringPiMode == WPI_MODE_GPIO_SYS) { - for (pin = 20 ; pin < 28 ; ++pin) + for (pin = 20; pin < 28; ++pin) { - digitalWrite (pin, value & mask) ; - mask <<= 1 ; + digitalWrite (pin, value & mask); + mask <<= 1; } - return ; + return; } else { - *(gpio + gpioToGPCLR [0]) = (~value & 0xFF) << 20 ; // 0x0FF00000; ILJ > CHANGE: Old causes glitch - *(gpio + gpioToGPSET [0]) = ( value & 0xFF) << 20 ; + *(gpio + gpioToGPCLR[0]) = (~value & 0xFF) << 20; // 0x0FF00000; ILJ > CHANGE: Old causes glitch + *(gpio + gpioToGPSET[0]) = ( value & 0xFF) << 20; } } unsigned int digitalReadByte2 (void) { - int pin, x ; - uint32_t data = 0 ; + int pin, x; + uint32_t data = 0; - /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) + if (wiringPiMode == WPI_MODE_GPIO_SYS) { - for (pin = 20 ; pin < 28 ; ++pin) + for (pin = 20; pin < 28; ++pin) { - x = digitalRead (pin) ; - data = (data << 1) | x ; + x = digitalRead (pin); + data = (data << 1) | x; } } else - data = ((*(gpio + gpioToGPLEV [0])) >> 20) & 0xFF ; // First bank for these pins + data = ((*(gpio + gpioToGPLEV[0])) >> 20) & 0xFF; // First bank for these pins - return data ; + return data; } @@ -1925,40 +1750,36 @@ unsigned int digitalReadByte2 (void) * way for a bit more efficiency. ********************************************************************************* */ - int waitForInterrupt (int pin, int mS) { - int fd, x ; - uint8_t c ; - struct pollfd polls ; + int fd, x; + uint8_t c; + struct pollfd polls; - /**/ if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; + if (wiringPiMode == WPI_MODE_PINS) + pin = pinToGpio[pin]; else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; + pin = physToGpio[pin]; - if ((fd = sysFds [pin]) == -1) - return -2 ; + if ((fd = sysFds[pin]) == -1) + return -2; -// Setup poll structure + // Setup poll structure + polls.fd = fd; + polls.events = POLLPRI | POLLERR; - polls.fd = fd ; - polls.events = POLLPRI | POLLERR ; - -// Wait for it ... - - x = poll (&polls, 1, mS) ; - -// If no error, do a dummy read to clear the interrupt -// A one character read appars to be enough. + // Wait for it ... + x = poll (&polls, 1, mS); + // If no error, do a dummy read to clear the interrupt + // A one character read appars to be enough. if (x > 0) { - lseek (fd, 0, SEEK_SET) ; // Rewind - (void)read (fd, &c, 1) ; // Read & clear + lseek (fd, 0, SEEK_SET); // Rewind + (void)read (fd, &c, 1); // Read & clear } - return x ; + return x; } @@ -1969,21 +1790,20 @@ int waitForInterrupt (int pin, int mS) * fires. ********************************************************************************* */ - static void *interruptHandler (UNU void *arg) { - int myPin ; + int myPin; - (void)piHiPri (55) ; // Only effective if we run as root + (void)piHiPri (55); // Only effective if we run as root - myPin = pinPass ; - pinPass = -1 ; + myPin = pinPass; + pinPass = -1; for (;;) if (waitForInterrupt (myPin, -1) > 0) - isrFunctions [myPin] () ; + isrFunctions[myPin] (); - return NULL ; + return NULL; } @@ -1994,95 +1814,91 @@ static void *interruptHandler (UNU void *arg) * back to the user supplied function. ********************************************************************************* */ - int wiringPiISR (int pin, int mode, void (*function)(void)) { - pthread_t threadId ; - const char *modeS ; - char fName [64] ; - char pinS [8] ; - pid_t pid ; - int count, i ; - char c ; - int bcmGpioPin ; + pthread_t threadId; + const char *modeS; + char fName [64]; + char pinS[8]; + pid_t pid; + int count, i; + char c; + int bcmGpioPin; if ((pin < 0) || (pin > 63)) - return wiringPiFailure (WPI_FATAL, "wiringPiISR: pin must be 0-63 (%d)\n", pin) ; + return wiringPiFailure (WPI_FATAL, "wiringPiISR: pin must be 0-63 (%d)\n", pin); - /**/ if (wiringPiMode == WPI_MODE_UNINITIALISED) - return wiringPiFailure (WPI_FATAL, "wiringPiISR: wiringPi has not been initialised. Unable to continue.\n") ; + if (wiringPiMode == WPI_MODE_UNINITIALISED) + return wiringPiFailure (WPI_FATAL, "wiringPiISR: wiringPi has not been initialised. Unable to continue.\n"); else if (wiringPiMode == WPI_MODE_PINS) - bcmGpioPin = pinToGpio [pin] ; + bcmGpioPin = pinToGpio[pin]; else if (wiringPiMode == WPI_MODE_PHYS) - bcmGpioPin = physToGpio [pin] ; + bcmGpioPin = physToGpio[pin]; else - bcmGpioPin = pin ; - -// Now export the pin and set the right edge -// We're going to use the gpio program to do this, so it assumes -// a full installation of wiringPi. It's a bit 'clunky', but it -// is a way that will work when we're running in "Sys" mode, as -// a non-root user. (without sudo) + bcmGpioPin = pin; + // Now export the pin and set the right edge + // We're going to use the gpio program to do this, so it assumes + // a full installation of wiringPi. It's a bit 'clunky', but it + // is a way that will work when we're running in "Sys" mode, as + // a non-root user. (without sudo) if (mode != INT_EDGE_SETUP) { - /**/ if (mode == INT_EDGE_FALLING) - modeS = "falling" ; + if (mode == INT_EDGE_FALLING) + modeS = "falling"; else if (mode == INT_EDGE_RISING) - modeS = "rising" ; + modeS = "rising"; else - modeS = "both" ; + modeS = "both"; - sprintf (pinS, "%d", bcmGpioPin) ; + sprintf (pinS, "%d", bcmGpioPin); if ((pid = fork ()) < 0) // Fail - return wiringPiFailure (WPI_FATAL, "wiringPiISR: fork failed: %s\n", strerror (errno)) ; + return wiringPiFailure (WPI_FATAL, "wiringPiISR: fork failed: %s\n", strerror (errno)); if (pid == 0) // Child, exec { - /**/ if (access ("/usr/local/bin/gpio", X_OK) == 0) + if (access ("/usr/local/bin/gpio", X_OK) == 0) { - execl ("/usr/local/bin/gpio", "gpio", "edge", pinS, modeS, (char *)NULL) ; - return wiringPiFailure (WPI_FATAL, "wiringPiISR: execl failed: %s\n", strerror (errno)) ; + execl ("/usr/local/bin/gpio", "gpio", "edge", pinS, modeS, (char *)NULL); + return wiringPiFailure (WPI_FATAL, "wiringPiISR: execl failed: %s\n", strerror (errno)); } else if (access ("/usr/bin/gpio", X_OK) == 0) { - execl ("/usr/bin/gpio", "gpio", "edge", pinS, modeS, (char *)NULL) ; - return wiringPiFailure (WPI_FATAL, "wiringPiISR: execl failed: %s\n", strerror (errno)) ; + execl ("/usr/bin/gpio", "gpio", "edge", pinS, modeS, (char *)NULL); + return wiringPiFailure (WPI_FATAL, "wiringPiISR: execl failed: %s\n", strerror (errno)); } else - return wiringPiFailure (WPI_FATAL, "wiringPiISR: Can't find gpio program\n") ; + return wiringPiFailure (WPI_FATAL, "wiringPiISR: Can't find gpio program\n"); } else // Parent, wait - waitpid (pid, NULL, 0) ; + waitpid (pid, NULL, 0); } -// Now pre-open the /sys/class node - but it may already be open if -// we are in Sys mode... - - if (sysFds [bcmGpioPin] == -1) + // Now pre-open the /sys/class node - but it may already be open if + // we are in Sys mode... + if (sysFds[bcmGpioPin] == -1) { - sprintf (fName, "/sys/class/gpio/gpio%d/value", bcmGpioPin) ; - if ((sysFds [bcmGpioPin] = open (fName, O_RDWR)) < 0) - return wiringPiFailure (WPI_FATAL, "wiringPiISR: unable to open %s: %s\n", fName, strerror (errno)) ; + sprintf (fName, "/sys/class/gpio/gpio%d/value", bcmGpioPin); + if ((sysFds[bcmGpioPin] = open (fName, O_RDWR)) < 0) + return wiringPiFailure (WPI_FATAL, "wiringPiISR: unable to open %s: %s\n", fName, strerror (errno)); } -// Clear any initial pending interrupt - - ioctl (sysFds [bcmGpioPin], FIONREAD, &count) ; - for (i = 0 ; i < count ; ++i) - read (sysFds [bcmGpioPin], &c, 1) ; + // Clear any initial pending interrupt + ioctl (sysFds[bcmGpioPin], FIONREAD, &count); + for (i = 0; i < count; ++i) + read (sysFds[bcmGpioPin], &c, 1); - isrFunctions [pin] = function ; + isrFunctions[pin] = function; - pthread_mutex_lock (&pinMutex) ; - pinPass = pin ; - pthread_create (&threadId, NULL, interruptHandler, NULL) ; + pthread_mutex_lock (&pinMutex); + pinPass = pin; + pthread_create (&threadId, NULL, interruptHandler, NULL); while (pinPass != -1) - delay (1) ; - pthread_mutex_unlock (&pinMutex) ; + delay (1); + pthread_mutex_unlock (&pinMutex); - return 0 ; + return 0; } @@ -2092,21 +1908,20 @@ int wiringPiISR (int pin, int mode, void (*function)(void)) * time in milliseconds and microseconds. ********************************************************************************* */ - static void initialiseEpoch (void) { #ifdef OLD_WAY - struct timeval tv ; + struct timeval tv; - gettimeofday (&tv, NULL) ; - epochMilli = (uint64_t)tv.tv_sec * (uint64_t)1000 + (uint64_t)(tv.tv_usec / 1000) ; - epochMicro = (uint64_t)tv.tv_sec * (uint64_t)1000000 + (uint64_t)(tv.tv_usec) ; + gettimeofday (&tv, NULL); + epochMilli = (uint64_t)tv.tv_sec * (uint64_t)1000 + (uint64_t)(tv.tv_usec / 1000); + epochMicro = (uint64_t)tv.tv_sec * (uint64_t)1000000 + (uint64_t)(tv.tv_usec); #else - struct timespec ts ; + struct timespec ts; - clock_gettime (CLOCK_MONOTONIC_RAW, &ts) ; - epochMilli = (uint64_t)ts.tv_sec * (uint64_t)1000 + (uint64_t)(ts.tv_nsec / 1000000L) ; - epochMicro = (uint64_t)ts.tv_sec * (uint64_t)1000000 + (uint64_t)(ts.tv_nsec / 1000L) ; + clock_gettime (CLOCK_MONOTONIC_RAW, &ts); + epochMilli = (uint64_t)ts.tv_sec * (uint64_t)1000 + (uint64_t)(ts.tv_nsec / 1000000L); + epochMicro = (uint64_t)ts.tv_sec * (uint64_t)1000000 + (uint64_t)(ts.tv_nsec / 1000L); #endif } @@ -2116,15 +1931,14 @@ static void initialiseEpoch (void) * Wait for some number of milliseconds ********************************************************************************* */ - void delay (unsigned int howLong) { - struct timespec sleeper, dummy ; + struct timespec sleeper, dummy; - sleeper.tv_sec = (time_t)(howLong / 1000) ; - sleeper.tv_nsec = (long)(howLong % 1000) * 1000000 ; + sleeper.tv_sec = (time_t)(howLong / 1000); + sleeper.tv_nsec = (long)(howLong % 1000) * 1000000; - nanosleep (&sleeper, &dummy) ; + nanosleep (&sleeper, &dummy); } @@ -2145,35 +1959,34 @@ void delay (unsigned int howLong) * to use gettimeofday () and poll on that instead... ********************************************************************************* */ - void delayMicrosecondsHard (unsigned int howLong) { - struct timeval tNow, tLong, tEnd ; + struct timeval tNow, tLong, tEnd; - gettimeofday (&tNow, NULL) ; - tLong.tv_sec = howLong / 1000000 ; - tLong.tv_usec = howLong % 1000000 ; - timeradd (&tNow, &tLong, &tEnd) ; + gettimeofday (&tNow, NULL); + tLong.tv_sec = howLong / 1000000; + tLong.tv_usec = howLong % 1000000; + timeradd (&tNow, &tLong, &tEnd); while (timercmp (&tNow, &tEnd, <)) - gettimeofday (&tNow, NULL) ; + gettimeofday (&tNow, NULL); } void delayMicroseconds (unsigned int howLong) { - struct timespec sleeper ; - unsigned int uSecs = howLong % 1000000 ; - unsigned int wSecs = howLong / 1000000 ; + struct timespec sleeper; + unsigned int uSecs = howLong % 1000000; + unsigned int wSecs = howLong / 1000000; - /**/ if (howLong == 0) - return ; + if (howLong == 0) + return; else if (howLong < 100) - delayMicrosecondsHard (howLong) ; + delayMicrosecondsHard (howLong); else { - sleeper.tv_sec = wSecs ; - sleeper.tv_nsec = (long)(uSecs * 1000L) ; - nanosleep (&sleeper, NULL) ; + sleeper.tv_sec = wSecs; + sleeper.tv_nsec = (long)(uSecs * 1000L); + nanosleep (&sleeper, NULL); } } @@ -2184,25 +1997,24 @@ void delayMicroseconds (unsigned int howLong) * Wraps at 49 days. ********************************************************************************* */ - unsigned int millis (void) { - uint64_t now ; + uint64_t now; #ifdef OLD_WAY - struct timeval tv ; + struct timeval tv; - gettimeofday (&tv, NULL) ; - now = (uint64_t)tv.tv_sec * (uint64_t)1000 + (uint64_t)(tv.tv_usec / 1000) ; + gettimeofday (&tv, NULL); + now = (uint64_t)tv.tv_sec * (uint64_t)1000 + (uint64_t)(tv.tv_usec / 1000); #else - struct timespec ts ; + struct timespec ts; - clock_gettime (CLOCK_MONOTONIC_RAW, &ts) ; - now = (uint64_t)ts.tv_sec * (uint64_t)1000 + (uint64_t)(ts.tv_nsec / 1000000L) ; + clock_gettime (CLOCK_MONOTONIC_RAW, &ts); + now = (uint64_t)ts.tv_sec * (uint64_t)1000 + (uint64_t)(ts.tv_nsec / 1000000L); #endif - return (uint32_t)(now - epochMilli) ; + return (uint32_t)(now - epochMilli); } @@ -2212,24 +2024,22 @@ unsigned int millis (void) * Wraps after 71 minutes. ********************************************************************************* */ - unsigned int micros (void) { - uint64_t now ; + uint64_t now; #ifdef OLD_WAY - struct timeval tv ; + struct timeval tv; - gettimeofday (&tv, NULL) ; - now = (uint64_t)tv.tv_sec * (uint64_t)1000000 + (uint64_t)tv.tv_usec ; + gettimeofday (&tv, NULL); + now = (uint64_t)tv.tv_sec * (uint64_t)1000000 + (uint64_t)tv.tv_usec; #else - struct timespec ts ; + struct timespec ts; - clock_gettime (CLOCK_MONOTONIC_RAW, &ts) ; - now = (uint64_t)ts.tv_sec * (uint64_t)1000000 + (uint64_t)(ts.tv_nsec / 1000) ; + clock_gettime (CLOCK_MONOTONIC_RAW, &ts); + now = (uint64_t)ts.tv_sec * (uint64_t)1000000 + (uint64_t)(ts.tv_nsec / 1000); #endif - - return (uint32_t)(now - epochMicro) ; + return (uint32_t)(now - epochMicro); } /* @@ -2237,11 +2047,10 @@ unsigned int micros (void) * Return our current version number ********************************************************************************* */ - void wiringPiVersion (int *major, int *minor) { - *major = VERSION_MAJOR ; - *minor = VERSION_MINOR ; + *major = VERSION_MAJOR; + *minor = VERSION_MINOR; } @@ -2255,155 +2064,145 @@ void wiringPiVersion (int *major, int *minor) * Changed now to revert to "gpio" mode if we're running on a Compute Module. ********************************************************************************* */ - int wiringPiSetup (void) { - int fd ; - int model, rev, mem, maker, overVolted ; + int fd; + int model, proc, rev, mem, maker, overVolted; if (wiringPiSetuped) - return 0 ; + return 0; - wiringPiSetuped = TRUE ; + wiringPiSetuped = TRUE; if (getenv (ENV_DEBUG) != NULL) - wiringPiDebug = TRUE ; + wiringPiDebug = TRUE; if (getenv (ENV_CODES) != NULL) - wiringPiReturnCodes = TRUE ; + wiringPiReturnCodes = TRUE; if (wiringPiDebug) - printf ("wiringPi: wiringPiSetup called\n") ; - -// Get the board ID information. We're not really using the information here, -// but it will give us information like the GPIO layout scheme (2 variants -// on the older 26-pin Pi's) and the GPIO peripheral base address. -// and if we're running on a compute module, then wiringPi pin numbers -// don't really many anything, so force native BCM mode anyway. + printf ("wiringPi: wiringPiSetup called\n"); - piBoardId (&model, &rev, &mem, &maker, &overVolted) ; + // Get the board ID information. We're not really using the information here, + // but it will give us information like the GPIO layout scheme (2 variants + // on the older 26-pin Pi's) and the GPIO peripheral base address. + // and if we're running on a compute module, then wiringPi pin numbers + // don't really many anything, so force native BCM mode anyway. + piBoardId (&model, &proc, &rev, &mem, &maker, &overVolted); - if ((model == PI_MODEL_CM) || + if ((model == PI_MODEL_CM1) || (model == PI_MODEL_CM3) || (model == PI_MODEL_CM3P)) - wiringPiMode = WPI_MODE_GPIO ; + wiringPiMode = WPI_MODE_GPIO; else - wiringPiMode = WPI_MODE_PINS ; + wiringPiMode = WPI_MODE_PINS; - /**/ if (piGpioLayout () == 1) // A, B, Rev 1, 1.1 + if (piGpioLayout() == 1) // A, B, Rev 1, 1.1 { - pinToGpio = pinToGpioR1 ; - physToGpio = physToGpioR1 ; + pinToGpio = pinToGpioR1; + physToGpio = physToGpioR1; } - else // A2, B2, A+, B+, CM, Pi2, Pi3, Zero, Zero W, Zero 2 W + else // A2, B2, A+, B+, CM, Pi2, Pi3, Zero, Zero W, Zero 2 W { - pinToGpio = pinToGpioR2 ; - physToGpio = physToGpioR2 ; + pinToGpio = pinToGpioR2; + physToGpio = physToGpioR2; } -// ... + // ... switch (model) { - case PI_MODEL_A: case PI_MODEL_B: - case PI_MODEL_AP: case PI_MODEL_BP: - case PI_ALPHA: case PI_MODEL_CM: - case PI_MODEL_ZERO: case PI_MODEL_ZERO_W: - piGpioBase = GPIO_PERI_BASE_OLD ; - piGpioPupOffset = GPPUD ; - break ; + case PI_MODEL_A: case PI_MODEL_B: + case PI_MODEL_AP: case PI_MODEL_BP: + case PI_ALPHA: case PI_MODEL_CM1: + case PI_MODEL_ZERO: case PI_MODEL_ZERO_W: + piGpioBase = GPIO_PERI_BASE_OLD; + piGpioPupOffset = GPPUD; + break; case PI_MODEL_4B: case PI_MODEL_400: case PI_MODEL_CM4: - piGpioBase = GPIO_PERI_BASE_2711 ; - piGpioPupOffset = GPPUPPDN0 ; - break ; + piGpioBase = GPIO_PERI_BASE_2711; + piGpioPupOffset = GPPUPPDN0; + break; default: - piGpioBase = GPIO_PERI_BASE_2835 ; - piGpioPupOffset = GPPUD ; - break ; + piGpioBase = GPIO_PERI_BASE_2835; + piGpioPupOffset = GPPUD; + break; } -// Open the master /dev/ memory control device -// Device strategy: December 2016: -// Try /dev/mem. If that fails, then -// try /dev/gpiomem. If that fails then game over. - + // Open the master /dev/ memory control device + // Device strategy: December 2016: + // Try /dev/mem. If that fails, then + // try /dev/gpiomem. If that fails then game over. if ((fd = open ("/dev/mem", O_RDWR | O_SYNC | O_CLOEXEC)) < 0) { if ((fd = open ("/dev/gpiomem", O_RDWR | O_SYNC | O_CLOEXEC) ) >= 0) // We're using gpiomem { - piGpioBase = 0 ; - usingGpioMem = TRUE ; + piGpioBase = 0; + usingGpioMem = TRUE; } else - return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: Unable to open /dev/mem or /dev/gpiomem: %s.\n" - " Aborting your program because if it can not access the GPIO\n" - " hardware then it most certianly won't work\n" - " Try running with sudo?\n", strerror (errno)) ; + return wiringPiFailure (WPI_ALMOST, + "wiringPiSetup: Unable to open /dev/mem or /dev/gpiomem: %s.\n" + " Aborting your program because if it can not access the GPIO\n" + " hardware then it most certianly won't work\n" + " Try running with sudo?\n", strerror (errno)); } -// Set the offsets into the memory interface. - - GPIO_PADS = piGpioBase + 0x00100000 ; - GPIO_CLOCK_BASE = piGpioBase + 0x00101000 ; - GPIO_BASE = piGpioBase + 0x00200000 ; - GPIO_TIMER = piGpioBase + 0x0000B000 ; - GPIO_PWM = piGpioBase + 0x0020C000 ; + // Set the offsets into the memory interface. + GPIO_PADS = piGpioBase + 0x00100000; + GPIO_CLOCK_BASE = piGpioBase + 0x00101000; + GPIO_BASE = piGpioBase + 0x00200000; + GPIO_TIMER = piGpioBase + 0x0000B000; + GPIO_PWM = piGpioBase + 0x0020C000; -// Map the individual hardware components + // Map the individual hardware components -// GPIO: - - gpio = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_BASE) ; + // GPIO: + gpio = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_BASE); if (gpio == MAP_FAILED) - return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (GPIO) failed: %s\n", strerror (errno)) ; - -// PWM + return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (GPIO) failed: %s\n", strerror (errno)); - pwm = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_PWM) ; + // PWM + pwm = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_PWM); if (pwm == MAP_FAILED) - return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (PWM) failed: %s\n", strerror (errno)) ; - -// Clock control (needed for PWM) + return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (PWM) failed: %s\n", strerror (errno)); - clk = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_CLOCK_BASE) ; + // Clock control (needed for PWM) + clk = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_CLOCK_BASE); if (clk == MAP_FAILED) - return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (CLOCK) failed: %s\n", strerror (errno)) ; + return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (CLOCK) failed: %s\n", strerror (errno)); -// The drive pads - - pads = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_PADS) ; + // The drive pads + pads = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_PADS); if (pads == MAP_FAILED) - return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (PADS) failed: %s\n", strerror (errno)) ; - -// The system timer + return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (PADS) failed: %s\n", strerror (errno)); - timer = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_TIMER) ; + // The system timer + timer = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_TIMER); if (timer == MAP_FAILED) - return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (TIMER) failed: %s\n", strerror (errno)) ; - -// Set the timer to free-running, 1MHz. -// 0xF9 is 249, the timer divide is base clock / (divide+1) -// so base clock is 250MHz / 250 = 1MHz. - - *(timer + TIMER_CONTROL) = 0x0000280 ; - *(timer + TIMER_PRE_DIV) = 0x00000F9 ; - timerIrqRaw = timer + TIMER_IRQ_RAW ; + return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (TIMER) failed: %s\n", strerror (errno)); -// Export the base addresses for any external software that might need them + // Set the timer to free-running, 1MHz. + // 0xF9 is 249, the timer divide is base clock / (divide+1) + // so base clock is 250MHz / 250 = 1MHz. + *(timer + TIMER_CONTROL) = 0x0000280; + *(timer + TIMER_PRE_DIV) = 0x00000F9; + timerIrqRaw = timer + TIMER_IRQ_RAW; - _wiringPiGpio = gpio ; - _wiringPiPwm = pwm ; - _wiringPiClk = clk ; - _wiringPiPads = pads ; - _wiringPiTimer = timer ; + // Export the base addresses for any external software that might need them + _wiringPiGpio = gpio; + _wiringPiPwm = pwm; + _wiringPiClk = clk; + _wiringPiPads = pads; + _wiringPiTimer = timer; - initialiseEpoch () ; + initialiseEpoch (); - return 0 ; + return 0; } @@ -2418,14 +2217,14 @@ int wiringPiSetup (void) int wiringPiSetupGpio (void) { - (void)wiringPiSetup () ; + (void)wiringPiSetup (); if (wiringPiDebug) - printf ("wiringPi: wiringPiSetupGpio called\n") ; + printf ("wiringPi: wiringPiSetupGpio called\n"); - wiringPiMode = WPI_MODE_GPIO ; + wiringPiMode = WPI_MODE_GPIO; - return 0 ; + return 0; } @@ -2437,17 +2236,16 @@ int wiringPiSetupGpio (void) * memory mapped hardware directly. ********************************************************************************* */ - int wiringPiSetupPhys (void) { - (void)wiringPiSetup () ; + (void)wiringPiSetup (); if (wiringPiDebug) - printf ("wiringPi: wiringPiSetupPhys called\n") ; + printf ("wiringPi: wiringPiSetupPhys called\n"); - wiringPiMode = WPI_MODE_PHYS ; + wiringPiMode = WPI_MODE_PHYS; - return 0 ; + return 0; } @@ -2459,49 +2257,47 @@ int wiringPiSetupPhys (void) * interface to the GPIO systems - slightly slower, but always usable as * a non-root user, assuming the devices are already exported and setup correctly. */ - int wiringPiSetupSys (void) { - int pin ; - char fName [128] ; + int pin; + char fName[128]; if (wiringPiSetuped) - return 0 ; + return 0; - wiringPiSetuped = TRUE ; + wiringPiSetuped = TRUE; if (getenv (ENV_DEBUG) != NULL) - wiringPiDebug = TRUE ; + wiringPiDebug = TRUE; if (getenv (ENV_CODES) != NULL) - wiringPiReturnCodes = TRUE ; + wiringPiReturnCodes = TRUE; if (wiringPiDebug) - printf ("wiringPi: wiringPiSetupSys called\n") ; + printf ("wiringPi: wiringPiSetupSys called\n"); if (piGpioLayout () == 1) { - pinToGpio = pinToGpioR1 ; - physToGpio = physToGpioR1 ; + pinToGpio = pinToGpioR1; + physToGpio = physToGpioR1; } else { - pinToGpio = pinToGpioR2 ; - physToGpio = physToGpioR2 ; + pinToGpio = pinToGpioR2; + physToGpio = physToGpioR2; } -// Open and scan the directory, looking for exported GPIOs, and pre-open -// the 'value' interface to speed things up for later - - for (pin = 0 ; pin < 64 ; ++pin) + // Open and scan the directory, looking for exported GPIOs, and pre-open + // the 'value' interface to speed things up for later + for (pin = 0; pin < 64; ++pin) { - sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ; - sysFds [pin] = open (fName, O_RDWR) ; + sprintf (fName, "/sys/class/gpio/gpio%d/value", pin); + sysFds[pin] = open (fName, O_RDWR); } - initialiseEpoch () ; + initialiseEpoch (); - wiringPiMode = WPI_MODE_GPIO_SYS ; + wiringPiMode = WPI_MODE_GPIO_SYS; - return 0 ; + return 0; } diff --git a/wiringPi/wiringPi.h b/wiringPi/wiringPi.h old mode 100755 new mode 100644 index dd60cff..8f5a5ed --- a/wiringPi/wiringPi.h +++ b/wiringPi/wiringPi.h @@ -1,191 +1,201 @@ /* * wiringPi.h: - * Arduino like Wiring library for the Raspberry Pi. - * Copyright (c) 2012-2017 Gordon Henderson + * Arduino like Wiring library for the Raspberry Pi. + * Copyright (c) 2012-2017 Gordon Henderson *********************************************************************** * This file is part of wiringPi: - * https://github.com/WiringPi/WiringPi/ + * https://github.com/WiringPi/WiringPi/ * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * wiringPi is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see . *********************************************************************** */ -#ifndef __WIRING_PI_H__ -#define __WIRING_PI_H__ +#ifndef __WIRING_PI_H__ +#define __WIRING_PI_H__ -// C doesn't have true/false by default and I can never remember which -// way round they are, so ... -// (and yes, I know about stdbool.h but I like capitals for these and I'm old) - -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (!TRUE) +#include +#ifndef TRUE +# define TRUE true +# define FALSE false #endif -// GCC warning suppressor - -#define UNU __attribute__((unused)) +// GCC warning suppressor - don't warn about unused parameters (-Wunused-parameter) +// @TODO Remove this and fix instances where parameters are unused. +#define UNU __attribute__((unused)) // Mask for the bottom 64 pins which belong to the Raspberry Pi -// The others are available for the other devices +// The others are available for the other devices +// @TODO Replace these checks with a check for (pin < 64) +#define PI_GPIO_MASK (0xFFFFFFC0) -#define PI_GPIO_MASK (0xFFFFFFC0) - -// Handy defines // wiringPi modes - -#define WPI_MODE_PINS 0 -#define WPI_MODE_GPIO 1 -#define WPI_MODE_GPIO_SYS 2 -#define WPI_MODE_PHYS 3 -#define WPI_MODE_PIFACE 4 -#define WPI_MODE_UNINITIALISED -1 +#define WPI_MODE_PINS 0 // Virtual pin numbers 0 through 16 +#define WPI_MODE_GPIO 1 // Broadcom GPIO pin numbers +#define WPI_MODE_GPIO_SYS 2 // Broadcom GPIO pin numbers, but uses /sys/class/gpio (slower) +#define WPI_MODE_PHYS 3 // Raspberry Pi pysical pins +#define WPI_MODE_PIFACE 4 // UNUSED +#define WPI_MODE_UNINITIALISED -1 // Pin modes - -#define INPUT 0 -#define OUTPUT 1 -#define PWM_OUTPUT 2 -#define GPIO_CLOCK 3 -#define SOFT_PWM_OUTPUT 4 -#define SOFT_TONE_OUTPUT 5 -#define PWM_TONE_OUTPUT 6 - -#define LOW 0 -#define HIGH 1 +#define INPUT 0 +#define OUTPUT 1 +#define PWM_OUTPUT 2 +#define GPIO_CLOCK 3 +#define SOFT_PWM_OUTPUT 4 +#define SOFT_TONE_OUTPUT 5 +#define PWM_TONE_OUTPUT 6 + +// Pin levels +#define LOW 0 +#define HIGH 1 // Pull up/down/none - -#define PUD_OFF 0 -#define PUD_DOWN 1 -#define PUD_UP 2 +#define PUD_OFF 0 +#define PUD_DOWN 1 +#define PUD_UP 2 // PWM - -#define PWM_MODE_MS 0 -#define PWM_MODE_BAL 1 +#define PWM_MODE_MS 0 +#define PWM_MODE_BAL 1 // Interrupt levels - -#define INT_EDGE_SETUP 0 -#define INT_EDGE_FALLING 1 -#define INT_EDGE_RISING 2 -#define INT_EDGE_BOTH 3 +#define INT_EDGE_SETUP 0 +#define INT_EDGE_FALLING 1 +#define INT_EDGE_RISING 2 +#define INT_EDGE_BOTH 3 // Pi model types and version numbers -// Intended for the GPIO program Use at your own risk. +// Intended for the GPIO program +// Use at your own risk // https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#new-style-revision-codes - -#define PI_MODEL_A 0 -#define PI_MODEL_B 1 -#define PI_MODEL_AP 2 -#define PI_MODEL_BP 3 -#define PI_MODEL_2 4 -#define PI_ALPHA 5 -#define PI_MODEL_CM 6 -#define PI_MODEL_07 7 -#define PI_MODEL_3B 8 -#define PI_MODEL_ZERO 9 -#define PI_MODEL_CM3 10 -#define PI_MODEL_ZERO_W 12 -#define PI_MODEL_3BP 13 -#define PI_MODEL_3AP 14 -#define PI_MODEL_CM3P 16 -#define PI_MODEL_4B 17 -#define PI_MODEL_ZERO_2W 18 -#define PI_MODEL_400 19 -#define PI_MODEL_CM4 20 - -#define PI_VERSION_1 0 -#define PI_VERSION_1_1 1 -#define PI_VERSION_1_2 2 -#define PI_VERSION_2 3 - -#define PI_MAKER_SONY 0 -#define PI_MAKER_EGOMAN 1 -#define PI_MAKER_EMBEST 2 -#define PI_MAKER_SONYJAPAN 3 -#define PI_MAKER_EMBEST4 4 -#define PI_MAKER_STADIUM 5 - -extern const char *piModelNames [21] ; -extern const char *piRevisionNames [21] ; -extern const char *piMakerNames [16] ; -extern const int piMemorySize [ 8] ; - - -// Intended for the GPIO program Use at your own risk. +// Format (bits): FMMM'CCCC'PPPP'TTTTTTTT'RRRR + +// F bit (New flag) +#define PI_FLAG_OLD 0 // old-style revision +#define PI_FLAG_NEW 1 // new-style revision + +// MMM bits (Memory size) +#define PI_MEM_256M 0 +#define PI_MEM_512M 1 +#define PI_MEM_1G 2 +#define PI_MEM_2G 3 +#define PI_MEM_4G 4 +#define PI_MEM_8G 5 + +// CCCC bits (Manufacturer) +#define PI_MAKER_SONY 0 // Sony UK +#define PI_MAKER_EGOMAN 1 +#define PI_MAKER_EMBEST 2 +#define PI_MAKER_SONYJAPAN 3 +#define PI_MAKER_EMBEST4 4 +#define PI_MAKER_STADIUM 5 + +// PPPP bits (Processor) +#define PI_PROC_BCM2835 0 +#define PI_PROC_BCM2836 1 +#define PI_PROC_BCM2837 2 +#define PI_PROC_BCM2711 3 + +// TTTTTTTT bits (Type) +#define PI_MODEL_A 0x00 +#define PI_MODEL_B 0x01 +#define PI_MODEL_AP 0x02 +#define PI_MODEL_BP 0x03 +#define PI_MODEL_2B 0x04 +#define PI_ALPHA 0x05 +#define PI_MODEL_CM1 0x06 +// 0x07 +#define PI_MODEL_3B 0x08 +#define PI_MODEL_ZERO 0x09 +#define PI_MODEL_CM3 0x0A +// 0x0B +#define PI_MODEL_ZERO_W 0x0C +#define PI_MODEL_3BP 0x0D +#define PI_MODEL_3AP 0x0E +// 0x0F +#define PI_MODEL_CM3P 0x10 +#define PI_MODEL_4B 0x11 +#define PI_MODEL_ZERO_2W 0x12 +#define PI_MODEL_400 0x13 +#define PI_MODEL_CM4 0x14 + +// RRRR bits (Revision) +#define PI_VERSION_1 0 +#define PI_VERSION_1_1 1 +#define PI_VERSION_1_2 2 +#define PI_VERSION_2 3 +#define PI_VERSION_1_4 4 + + +extern const char *piModelNames [21]; +extern const char *piRevisionNames [ 5]; +extern const char *piMakerNames [16]; +extern const char *piProcessorNames[ 5]; +extern const int piMemorySize [ 8]; + + +// Intended for the GPIO program +// Use at your own risk. // Threads - -#define PI_THREAD(X) void *X (UNU void *dummy) +#define PI_THREAD(X) void *X (UNU void *dummy) // Failure modes - -#define WPI_FATAL (1==1) -#define WPI_ALMOST (1==2) +#define WPI_FATAL true +#define WPI_ALMOST false // wiringPiNodeStruct: -// This describes additional device nodes in the extended wiringPi -// 2.0 scheme of things. -// It's a simple linked list for now, but will hopefully migrate to -// a binary tree for efficiency reasons - but then again, the chances -// of more than 1 or 2 devices being added are fairly slim, so who -// knows.... - +// This describes additional device nodes in the extended wiringPi +// 2.0 scheme of things. It's a simple linked list. struct wiringPiNodeStruct { - int pinBase ; - int pinMax ; - - int fd ; // Node specific - unsigned int data0 ; // ditto - unsigned int data1 ; // ditto - unsigned int data2 ; // ditto - unsigned int data3 ; // ditto - - void (*pinMode) (struct wiringPiNodeStruct *node, int pin, int mode) ; - void (*pullUpDnControl) (struct wiringPiNodeStruct *node, int pin, int mode) ; - int (*digitalRead) (struct wiringPiNodeStruct *node, int pin) ; -//unsigned int (*digitalRead8) (struct wiringPiNodeStruct *node, int pin) ; - void (*digitalWrite) (struct wiringPiNodeStruct *node, int pin, int value) ; -// void (*digitalWrite8) (struct wiringPiNodeStruct *node, int pin, int value) ; - void (*pwmWrite) (struct wiringPiNodeStruct *node, int pin, int value) ; - int (*analogRead) (struct wiringPiNodeStruct *node, int pin) ; - void (*analogWrite) (struct wiringPiNodeStruct *node, int pin, int value) ; - - struct wiringPiNodeStruct *next ; -} ; - -extern struct wiringPiNodeStruct *wiringPiNodes ; + int pinBase; + int pinMax; -// Export variables for the hardware pointers + int fd; // Node specific + unsigned int data0; // ditto + unsigned int data1; // ditto + unsigned int data2; // ditto + unsigned int data3; // ditto -extern volatile unsigned int *_wiringPiGpio ; -extern volatile unsigned int *_wiringPiPwm ; -extern volatile unsigned int *_wiringPiClk ; -extern volatile unsigned int *_wiringPiPads ; -extern volatile unsigned int *_wiringPiTimer ; -extern volatile unsigned int *_wiringPiTimerIrqRaw ; + void (*pinMode) (struct wiringPiNodeStruct *node, int pin, int mode); + void (*pullUpDnControl) (struct wiringPiNodeStruct *node, int pin, int mode); + int (*digitalRead) (struct wiringPiNodeStruct *node, int pin); + void (*digitalWrite) (struct wiringPiNodeStruct *node, int pin, int value); + void (*pwmWrite) (struct wiringPiNodeStruct *node, int pin, int value); + int (*analogRead) (struct wiringPiNodeStruct *node, int pin); + void (*analogWrite) (struct wiringPiNodeStruct *node, int pin, int value); + struct wiringPiNodeStruct *next; +}; + +extern struct wiringPiNodeStruct *wiringPiNodes; + +// Export variables for the hardware pointers +extern volatile unsigned int *_wiringPiGpio; +extern volatile unsigned int *_wiringPiPwm; +extern volatile unsigned int *_wiringPiClk; +extern volatile unsigned int *_wiringPiPads; +extern volatile unsigned int *_wiringPiTimer; +extern volatile unsigned int *_wiringPiTimerIrqRaw; -// Function prototypes -// c++ wrappers thanks to a comment by Nick Lott -// (and others on the Raspberry Pi forums) +// Function prototypes +// c++ wrappers thanks to a comment by Nick Lott +// (and others on the Raspberry Pi forums) #ifdef __cplusplus extern "C" { #endif @@ -193,81 +203,72 @@ extern "C" { // Data // Internal - -extern int wiringPiFailure (int fatal, const char *message, ...) ; +extern int wiringPiFailure (int fatal, const char *message, ...); // Core wiringPi functions - -extern struct wiringPiNodeStruct *wiringPiFindNode (int pin) ; -extern struct wiringPiNodeStruct *wiringPiNewNode (int pinBase, int numPins) ; - -extern void wiringPiVersion (int *major, int *minor) ; -extern int wiringPiSetup (void) ; -extern int wiringPiSetupSys (void) ; -extern int wiringPiSetupGpio (void) ; -extern int wiringPiSetupPhys (void) ; - -extern void pinModeAlt (int pin, int mode) ; -extern void pinMode (int pin, int mode) ; -extern void pullUpDnControl (int pin, int pud) ; -extern int digitalRead (int pin) ; -extern void digitalWrite (int pin, int value) ; -extern unsigned int digitalRead8 (int pin) ; -extern void digitalWrite8 (int pin, int value) ; -extern void pwmWrite (int pin, int value) ; -extern int analogRead (int pin) ; -extern void analogWrite (int pin, int value) ; +extern struct wiringPiNodeStruct *wiringPiFindNode (int pin); +extern struct wiringPiNodeStruct *wiringPiNewNode (int pinBase, int numPins); + +extern void wiringPiVersion (int *major, int *minor); +extern int wiringPiSetup (void); +extern int wiringPiSetupSys (void); +extern int wiringPiSetupGpio (void); +extern int wiringPiSetupPhys (void); + +extern void pinModeAlt (int pin, int mode); +extern void pinMode (int pin, int mode); +extern void pullUpDnControl (int pin, int pud); +extern int digitalRead (int pin); +extern void digitalWrite (int pin, int value); +extern unsigned int digitalRead8 (int pin); +extern void digitalWrite8 (int pin, int value); +extern void pwmWrite (int pin, int value); +extern int analogRead (int pin); +extern void analogWrite (int pin, int value); // PiFace specifics -// (Deprecated) - -extern int wiringPiSetupPiFace (void) ; -extern int wiringPiSetupPiFaceForGpioProg (void) ; // Don't use this - for gpio program only +// (Deprecated) +extern int wiringPiSetupPiFace (void); +extern int wiringPiSetupPiFaceForGpioProg (void); // Don't use this - for gpio program only // On-Board Raspberry Pi hardware specific stuff - -extern int piGpioLayout (void) ; -extern int piBoardRev (void) ; // Deprecated -extern void piBoardId (int *model, 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) ; -extern int getAlt (int pin) ; -extern void pwmToneWrite (int pin, int freq) ; -extern void pwmSetMode (int mode) ; -extern void pwmSetRange (unsigned int range) ; -extern void pwmSetClock (int divisor) ; -extern void gpioClockSet (int pin, int freq) ; -extern unsigned int digitalReadByte (void) ; -extern unsigned int digitalReadByte2 (void) ; -extern void digitalWriteByte (int value) ; -extern void digitalWriteByte2 (int value) ; +extern int piGpioLayout (void); +extern void 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); +extern int getAlt (int pin); +extern void pwmToneWrite (int pin, int freq); +extern void pwmSetMode (int mode); +extern void pwmSetRange (unsigned int range); +extern void pwmSetClock (int divisor); +extern void gpioClockSet (int pin, int freq); +extern unsigned int digitalReadByte (void); +extern unsigned int digitalReadByte2 (void); +extern void digitalWriteByte (int value); +extern void digitalWriteByte2 (int value); // Interrupts -// (Also Pi hardware specific) - -extern int waitForInterrupt (int pin, int mS) ; -extern int wiringPiISR (int pin, int mode, void (*function)(void)) ; +// (Also Pi hardware specific) +extern int waitForInterrupt (int pin, int mS); +extern int wiringPiISR (int pin, int mode, void (*function)(void)); // Threads - -extern int piThreadCreate (void *(*fn)(void *)) ; -extern void piLock (int key) ; -extern void piUnlock (int key) ; +extern int piThreadCreate (void *(*fn)(void *)); +extern void piLock (int key); +extern void piUnlock (int key); // Schedulling priority - -extern int piHiPri (const int pri) ; +extern int piHiPri (const int pri); // Extras from arduino land - -extern void delay (unsigned int howLong) ; -extern void delayMicroseconds (unsigned int howLong) ; -extern unsigned int millis (void) ; -extern unsigned int micros (void) ; +extern void delay (unsigned int howLong); // milliseconds +extern void delayMicroseconds (unsigned int howLong); +extern unsigned int millis (void); +extern unsigned int micros (void); #ifdef __cplusplus } #endif -#endif +#endif // __WIRING_PI_H__ diff --git a/wiringPi/wiringPiSPI.c b/wiringPi/wiringPiSPI.c old mode 100755 new mode 100644