X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=wiringPi%2FwiringPi.c;h=2a5c5331bcf4164089112d6e4d6072c504b2465d;hb=728cdc4c236eecb9d484b84df9d505d90b38157c;hp=39c34da75b76519e9ebb88bc68995d1fbaae75e8;hpb=99095e3fa0c9e028c2c00d020392b1e22210379a;p=wiringPi.git diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c index 39c34da..2a5c533 100644 --- a/wiringPi/wiringPi.c +++ b/wiringPi/wiringPi.c @@ -56,6 +56,8 @@ #include #include +#include +#include #include #include #include @@ -169,6 +171,14 @@ static volatile uint32_t *timer ; static volatile uint32_t *timerIrqRaw ; +// Raspberry Pi board revision + +static int boardRevision = -1 ; + +// Debugging + +static int wiringPiDebug = FALSE ; + // The BCM2835 has 54 GPIO pins. // BCM2835 data sheet, Page 90 onwards. // There are 6 control registers, each control the functions of a block @@ -198,8 +208,11 @@ static int sysFds [64] ; // pinToGpio: // Take a Wiring pin (0 through X) and re-map it to the BCM_GPIO pin +// Cope for 2 different board revieions here + +static int *pinToGpio ; -static int pinToGpio [64] = +static int pinToGpioR1 [64] = { 17, 18, 21, 22, 23, 24, 25, 4, // From the Original Wiki - GPIO 0 through 7 0, 1, // I2C - SDA0, SCL0 @@ -209,7 +222,23 @@ static int pinToGpio [64] = // 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, // ... 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 pinToGpioR2 [64] = +{ + 17, 18, 27, 22, 23, 24, 25, 4, // From the Original Wiki - GPIO 0 through 7 + 2, 3, // I2C - SDA0, SCL0 + 8, 7, // SPI - CE1, CE0 + 10, 9, 11, // SPI - MOSI, MISO, SCLK + 14, 15, // UART - Tx, Rx + 28, 29, 30, 31, // New GPIOs 8 though 11 + +// Padding: + + -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 } ; @@ -800,9 +829,19 @@ unsigned int millis (void) int wiringPiSetup (void) { int fd ; + FILE *cpuFd ; + char line [80] ; + char *c ; + int revision = -1 ; uint8_t *gpioMem, *pwmMem, *clkMem, *padsMem, *timerMem ; struct timeval tv ; + if (getenv ("WIRINGPI_DEBUG") != NULL) + wiringPiDebug = TRUE ; + + if (wiringPiDebug) + printf ("wiringPiSetup called\n") ; + pinMode = pinModeWPi ; pullUpDnControl = pullUpDnControlWPi ; digitalWrite = digitalWriteWPi ; @@ -814,6 +853,52 @@ int wiringPiSetup (void) pwmSetMode = pwmSetModeWPi ; pwmSetRange = pwmSetRangeWPi ; +// Find board revision + + if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL) + { + fprintf (stderr, "wiringPiSetup: Unable to open /proc/cpuinfo: %s\n", strerror (errno)) ; + return -1 ; + } + + while (fgets (line, 80, cpuFd) != NULL) + if (strncmp (line, "Revision", 8) == 0) + for (c = line ; *c ; ++c) + { + if (!isdigit (*c)) + continue ; + revision = atoi (c) ; + break ; + } + + fclose (cpuFd) ; + if (revision == -1) + { + fprintf (stderr, "wiringPiSetup: Unable to determine board revision\n") ; + errno = 0 ; + return -1 ; + } + + /**/ if ((revision == 2) || (revision == 3)) + boardRevision = 1 ; + else if ((revision == 4) || (revision == 5) || (revision == 6)) + boardRevision = 2 ; + else + { + fprintf (stderr, "wiringPiSetup: Unable to determine board revision: %d\n", revision) ; + errno = 0 ; + return -1 ; + } + + + if (boardRevision == 1) + pinToGpio = pinToGpioR1 ; + else + pinToGpio = pinToGpioR2 ; + + if (wiringPiDebug) + printf ("Revision: %d, board revision: %d\n", revision, boardRevision) ; + // Open the master /dev/memory device if ((fd = open ("/dev/mem", O_RDWR | O_SYNC) ) < 0) @@ -954,9 +1039,12 @@ int wiringPiSetup (void) int wiringPiSetupGpio (void) { - int x = wiringPiSetup () ; + int x ; - if (x != 0) + if (wiringPiDebug) + printf ("wiringPiSetupGpio called\n") ; + + if ((x = wiringPiSetup ()) < 0) return x ; pinMode = pinModeGpio ; @@ -989,6 +1077,9 @@ int wiringPiSetupSys (void) struct timeval tv ; char fName [128] ; + if (wiringPiDebug) + printf ("wiringPiSetupSys called\n") ; + pinMode = pinModeSys ; pullUpDnControl = pullUpDnControlSys ; digitalWrite = digitalWriteSys ;