From e8e3f78574cba210afe3876452efa83f1284ed92 Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Sun, 4 Feb 2024 16:26:31 +0100 Subject: [PATCH] #16 --- VERSION | 2 +- debian-template/wiringPi/DEBIAN/control | 2 +- gpio/gpio.c | 70 +++++++++++++++++++++------------ version.h | 4 +- wiringPi/wiringPi.c | 63 ++++++++++++++++++++++++----- wiringPi/wiringPi.h | 2 + 6 files changed, 105 insertions(+), 38 deletions(-) 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/gpio/gpio.c b/gpio/gpio.c index 46b36df..a4574a1 100644 --- a/gpio/gpio.c +++ b/gpio/gpio.c @@ -88,6 +88,15 @@ char *usage = "Usage: gpio -v\n" " gpio gbw " ; // No trailing newline needed here. +int GPIOToSysFS_ExitonFail (const int pin, const char* name) { + int pinFS = GPIOToSysFS(pin); + if (pinFS<0) { + fprintf (stderr, "%s: invalid sysfs pin of bcm pin %d\n", name, pin) ; + exit (1) ; + } + return pinFS; +} + #ifdef NOT_FOR_NOW /* * decodePin: @@ -391,16 +400,19 @@ static void doI2Cdetect (UNU int argc, char *argv []) static void doExports (UNU int argc, UNU char *argv []) { int fd ; - int i, l, first ; + int pin, l, first ; char fName [128] ; char buf [16] ; - for (first = 0, i = 0 ; i < 64 ; ++i) // Crude, but effective + for (first = 0, pin = 0 ; pin < 64 ; ++pin) // Crude, but effective { // Try to read the direction - - sprintf (fName, "/sys/class/gpio/gpio%d/direction", i) ; + int pinFS = GPIOToSysFS(pin); + if (pinFS<0) { + continue; + } + sprintf (fName, "/sys/class/gpio/gpio%d/direction", pinFS) ; if ((fd = open (fName, O_RDONLY)) == -1) continue ; @@ -410,7 +422,11 @@ static void doExports (UNU int argc, UNU char *argv []) printf ("GPIO Pins exported:\n") ; } - printf ("%4d: ", i) ; + if(pinFS==pin) { + printf ("%4d: ", pin) ; + } else { + printf ("%4d (%4d): ", pin, pinFS) ; + } if ((l = read (fd, buf, 16)) == 0) sprintf (buf, "%s", "?") ; @@ -425,7 +441,7 @@ static void doExports (UNU int argc, UNU char *argv []) // Try to Read the value - sprintf (fName, "/sys/class/gpio/gpio%d/value", i) ; + sprintf (fName, "/sys/class/gpio/gpio%d/value", pinFS) ; if ((fd = open (fName, O_RDONLY)) == -1) { printf ("No Value file (huh?)\n") ; @@ -443,7 +459,7 @@ static void doExports (UNU int argc, UNU char *argv []) // Read any edge trigger file - sprintf (fName, "/sys/class/gpio/gpio%d/edge", i) ; + sprintf (fName, "/sys/class/gpio/gpio%d/edge", pinFS) ; if ((fd = open (fName, O_RDONLY)) == -1) { printf ("\n") ; @@ -485,7 +501,7 @@ void doExport (int argc, char *argv []) } pin = atoi (argv [2]) ; - + int pinFS = GPIOToSysFS_ExitonFail(pin, argv [0]); mode = argv [3] ; if ((fd = fopen ("/sys/class/gpio/export", "w")) == NULL) @@ -494,10 +510,9 @@ void doExport (int argc, char *argv []) exit (1) ; } - fprintf (fd, "%d\n", pin) ; + fprintf (fd, "%d\n", pinFS) ; fclose (fd) ; - - sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ; + sprintf (fName, "/sys/class/gpio/gpio%d/direction", pinFS) ; 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)) ; @@ -522,10 +537,10 @@ void doExport (int argc, char *argv []) // Change ownership so the current user can actually use it - sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ; + sprintf (fName, "/sys/class/gpio/gpio%d/value", pinFS) ; changeOwner (argv [0], fName) ; - sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ; + sprintf (fName, "/sys/class/gpio/gpio%d/edge", pinFS) ; changeOwner (argv [0], fName) ; } @@ -599,6 +614,7 @@ void doEdge (int argc, char *argv []) } pin = atoi (argv [2]) ; + int pinFS = GPIOToSysFS_ExitonFail(pin, argv [0]); mode = argv [3] ; // Export the pin and set direction to input @@ -609,10 +625,10 @@ void doEdge (int argc, char *argv []) exit (1) ; } - fprintf (fd, "%d\n", pin) ; + fprintf (fd, "%d\n", pinFS) ; fclose (fd) ; - sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ; + sprintf (fName, "/sys/class/gpio/gpio%d/direction", pinFS) ; 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)) ; @@ -622,7 +638,7 @@ void doEdge (int argc, char *argv []) fprintf (fd, "in\n") ; fclose (fd) ; - sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ; + sprintf (fName, "/sys/class/gpio/gpio%d/edge", pinFS) ; 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)) ; @@ -641,10 +657,10 @@ void doEdge (int argc, char *argv []) // 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) ; + sprintf (fName, "/sys/class/gpio/gpio%d/value", pinFS) ; changeOwner (argv [0], fName) ; - sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ; + sprintf (fName, "/sys/class/gpio/gpio%d/edge", pinFS) ; changeOwner (argv [0], fName) ; fclose (fd) ; @@ -670,6 +686,7 @@ void doUnexport (int argc, char *argv []) } pin = atoi (argv [2]) ; + int pinFS = GPIOToSysFS_ExitonFail(pin, argv [0]); if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL) { @@ -677,7 +694,7 @@ void doUnexport (int argc, char *argv []) exit (1) ; } - fprintf (fd, "%d\n", pin) ; + fprintf (fd, "%d\n", pinFS) ; fclose (fd) ; } @@ -697,13 +714,16 @@ void doUnexportall (char *progName) 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) ; + int pinFS = GPIOToSysFS(pin); + if (pinFS>=0) { + if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL) + { + fprintf (stderr, "%s: Unable to open GPIO export interface\n", progName) ; + exit (1) ; + } + fprintf (fd, "%d\n", pinFS) ; + fclose (fd) ; } - fprintf (fd, "%d\n", pin) ; - fclose (fd) ; } } 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/wiringPi.c b/wiringPi/wiringPi.c index 7e59b0d..5fec7c2 100644 --- a/wiringPi/wiringPi.c +++ b/wiringPi/wiringPi.c @@ -464,7 +464,53 @@ static int physToGpioR2 [64] = -1, -1, } ; +const int _5v=-1; +const int _0v=-1; +const int _3v=-1; + + +static int physToSysGPIOPi5 [41] = +{ + -1, // 0 + _3v, _5v, // 1, 2 + 401, _5v, + 402, _0v, + 403, 413, + _0v, 414, + 416, 417, + 426, _0v, + 421, 422, + _3v, 423, + 409, _0v, + 408, 424, + 410, 407, + _0v, 406, + 399, 400, + 404, _0v, + 405, 411, + 412, _0v, + 418, 415, + 425, 419, + _0v, 420, //39, 40 +} ; + +int GPIOToSysFS(const int pin) { + int sysfspin = pin; + if (RaspberryPiModel<0) { //need to detect pi model + int model, rev, mem, maker, overVolted ; + piBoardId (&model, &rev, &mem, &maker, &overVolted) ; + } + if (PI_MODEL_5 == RaspberryPiModel) { + sysfspin = pin + 399; + if (sysfspin<399 || sysfspin>426) { // only 399-426 supported, 40-pin GPIO header + sysfspin = -1; + } + } + if (wiringPiDebug) + printf ("GPIOToSysFS: translate bcm gpio %d to sysfs gpio %d\n", pin, sysfspin) ; + return sysfspin; +} // gpioToGPFSEL: // Map a BCM_GPIO pin to it's Function Selection @@ -2075,8 +2121,9 @@ int wiringPiISR (int pin, int mode, void (*function)(void)) if (sysFds [bcmGpioPin] == -1) { - sprintf (fName, "/sys/class/gpio/gpio%d/value", bcmGpioPin) ; - if ((sysFds [bcmGpioPin] = open (fName, O_RDWR)) < 0) + int pinFS = GPIOToSysFS(bcmGpioPin); + sprintf (fName, "/sys/class/gpio/gpio%d/value", pinFS) ; + if (pinFS>=0 && (sysFds [bcmGpioPin] = open (fName, O_RDWR)) < 0) return wiringPiFailure (WPI_FATAL, "wiringPiISR: unable to open %s: %s\n", fName, strerror (errno)) ; } @@ -2525,18 +2572,16 @@ int wiringPiSetupSys (void) physToGpio = physToGpioR2 ; } - if (PI_MODEL_5 == model) { - return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: Raspberry Pi 5 not supported.\n" - " Unable to continue. Keep an eye of new version at https://github.com/GrazerComputerClub/WiringPi\n") ; - } - // 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) ; + int pinFS = GPIOToSysFS(pin); + if (pinFS>=0) { + sprintf (fName, "/sys/class/gpio/gpio%d/value", pinFS) ; + sysFds [pin] = open (fName, O_RDWR) ; + } } initialiseEpoch () ; diff --git a/wiringPi/wiringPi.h b/wiringPi/wiringPi.h index ff088ca..0f5cd1c 100644 --- a/wiringPi/wiringPi.h +++ b/wiringPi/wiringPi.h @@ -203,6 +203,8 @@ extern int wiringPiFailure (int fatal, const char *message, ...) ; extern struct wiringPiNodeStruct *wiringPiFindNode (int pin) ; extern struct wiringPiNodeStruct *wiringPiNewNode (int pinBase, int numPins) ; +extern int GPIOToSysFS(const int pin) ; + extern void wiringPiVersion (int *major, int *minor) ; extern int wiringPiSetup (void) ; extern int wiringPiSetupSys (void) ;