3 * Arduino look-a-like Wiring library for the Raspberry Pi
4 * Copyright (c) 2012-2015 Gordon Henderson
5 * Additional code for pwmSetClock by Chris Hall <chris@kchall.plus.com>
7 * Thanks to code samples from Gert Jan van Loo and the
8 * BCM2835 ARM Peripherals manual, however it's missing
9 * the clock section /grr/mutter/
10 ***********************************************************************
11 * This file is part of wiringPi:
12 * https://projects.drogon.net/raspberry-pi/wiringpi/
14 * wiringPi is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License as
16 * published by the Free Software Foundation, either version 3 of the
17 * License, or (at your option) any later version.
19 * wiringPi is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU Lesser General Public License for more details.
24 * You should have received a copy of the GNU Lesser General Public
25 * License along with wiringPi.
26 * If not, see <http://www.gnu.org/licenses/>.
27 ***********************************************************************
33 // Added an abstraction layer to the main routines to save a tiny
34 // bit of run-time and make the clode a little cleaner (if a little
36 // Added waitForInterrupt code
40 // Added in support to use the /sys/class/gpio interface.
42 // Fixed a few more bugs to do with range-checking when in GPIO mode.
45 // Added c++ support for the .h file
46 // Added a new function to allow for using my "pin" numbers, or native
48 // Removed my busy-loop delay and replaced it with a call to delayMicroseconds
51 // Added in the 2 UART pins
52 // Change maxPins to numPins to more accurately reflect purpose
71 #include <sys/ioctl.h>
83 // Environment Variables
85 #define ENV_DEBUG "WIRINGPI_DEBUG"
86 #define ENV_CODES "WIRINGPI_CODES"
89 // Mask for the bottom 64 pins which belong to the Raspberry Pi
90 // The others are available for the other devices
92 #define PI_GPIO_MASK (0xFFFFFFC0)
94 struct wiringPiNodeStruct *wiringPiNodes = NULL ;
98 #define BCM_PASSWORD 0x5A000000
101 // The BCM2835 has 54 GPIO pins.
102 // BCM2835 data sheet, Page 90 onwards.
103 // There are 6 control registers, each control the functions of a block
105 // Each control register has 10 sets of 3 bits per GPIO pin - the ALT values
107 // 000 = GPIO Pin X is an input
108 // 001 = GPIO Pin X is an output
109 // 100 = GPIO Pin X takes alternate function 0
110 // 101 = GPIO Pin X takes alternate function 1
111 // 110 = GPIO Pin X takes alternate function 2
112 // 111 = GPIO Pin X takes alternate function 3
113 // 011 = GPIO Pin X takes alternate function 4
114 // 010 = GPIO Pin X takes alternate function 5
116 // So the 3 bits for port X are:
117 // X / 10 + ((X % 10) * 3)
119 // Port function select bits
121 #define FSEL_INPT 0b000
122 #define FSEL_OUTP 0b001
123 #define FSEL_ALT0 0b100
124 #define FSEL_ALT1 0b101
125 #define FSEL_ALT2 0b110
126 #define FSEL_ALT3 0b111
127 #define FSEL_ALT4 0b011
128 #define FSEL_ALT5 0b010
130 // Access from ARM Running Linux
131 // Taken from Gert/Doms code. Some of this is not in the manual
132 // that I can find )-:
134 static volatile unsigned int BCM2708_PERI_BASE = 0x20000000 ; // Variable for Pi2
135 #define GPIO_PADS (BCM2708_PERI_BASE + 0x00100000)
136 #define CLOCK_BASE (BCM2708_PERI_BASE + 0x00101000)
137 #define GPIO_BASE (BCM2708_PERI_BASE + 0x00200000)
138 #define GPIO_TIMER (BCM2708_PERI_BASE + 0x0000B000)
139 #define GPIO_PWM (BCM2708_PERI_BASE + 0x0020C000)
141 #define PAGE_SIZE (4*1024)
142 #define BLOCK_SIZE (4*1024)
145 // Word offsets into the PWM control region
147 #define PWM_CONTROL 0
154 // Clock regsiter offsets
156 #define PWMCLK_CNTL 40
157 #define PWMCLK_DIV 41
159 #define PWM0_MS_MODE 0x0080 // Run in MS mode
160 #define PWM0_USEFIFO 0x0020 // Data from FIFO
161 #define PWM0_REVPOLAR 0x0010 // Reverse polarity
162 #define PWM0_OFFSTATE 0x0008 // Ouput Off state
163 #define PWM0_REPEATFF 0x0004 // Repeat last value if FIFO empty
164 #define PWM0_SERIAL 0x0002 // Run in serial mode
165 #define PWM0_ENABLE 0x0001 // Channel Enable
167 #define PWM1_MS_MODE 0x8000 // Run in MS mode
168 #define PWM1_USEFIFO 0x2000 // Data from FIFO
169 #define PWM1_REVPOLAR 0x1000 // Reverse polarity
170 #define PWM1_OFFSTATE 0x0800 // Ouput Off state
171 #define PWM1_REPEATFF 0x0400 // Repeat last value if FIFO empty
172 #define PWM1_SERIAL 0x0200 // Run in serial mode
173 #define PWM1_ENABLE 0x0100 // Channel Enable
178 #define TIMER_LOAD (0x400 >> 2)
179 #define TIMER_VALUE (0x404 >> 2)
180 #define TIMER_CONTROL (0x408 >> 2)
181 #define TIMER_IRQ_CLR (0x40C >> 2)
182 #define TIMER_IRQ_RAW (0x410 >> 2)
183 #define TIMER_IRQ_MASK (0x414 >> 2)
184 #define TIMER_RELOAD (0x418 >> 2)
185 #define TIMER_PRE_DIV (0x41C >> 2)
186 #define TIMER_COUNTER (0x420 >> 2)
188 // Locals to hold pointers to the hardware
190 static volatile uint32_t *gpio ;
191 static volatile uint32_t *pwm ;
192 static volatile uint32_t *clk ;
193 static volatile uint32_t *pads ;
196 static volatile uint32_t *timer ;
197 static volatile uint32_t *timerIrqRaw ;
201 // Data for use with the boardId functions.
202 // The order of entries here to correspond with the PI_MODEL_X
203 // and PI_VERSION_X defines in wiringPi.h
204 // Only intended for the gpio command - use at your own risk!
206 static int piModel2 = FALSE ;
208 const char *piModelNames [7] =
216 "Model 2", // Quad Core
219 const char *piRevisionNames [5] =
228 const char *piMakerNames [5] =
238 // Time for easy calculations
240 static uint64_t epochMilli, epochMicro ;
244 static int wiringPiMode = WPI_MODE_UNINITIALISED ;
245 static volatile int pinPass = -1 ;
246 static pthread_mutex_t pinMutex ;
248 // Debugging & Return codes
250 int wiringPiDebug = FALSE ;
251 int wiringPiReturnCodes = FALSE ;
254 // Map a file descriptor from the /sys/class/gpio/gpioX/value
256 static int sysFds [64] =
258 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
259 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
260 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
261 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
266 static void (*isrFunctions [64])(void) ;
269 // Doing it the Arduino way with lookup tables...
270 // Yes, it's probably more innefficient than all the bit-twidling, but it
271 // does tend to make it all a bit clearer. At least to me!
274 // Take a Wiring pin (0 through X) and re-map it to the BCM_GPIO pin
275 // Cope for 3 different board revisions here.
277 static int *pinToGpio ;
281 static int pinToGpioR1 [64] =
283 17, 18, 21, 22, 23, 24, 25, 4, // From the Original Wiki - GPIO 0 through 7: wpi 0 - 7
284 0, 1, // I2C - SDA1, SCL1 wpi 8 - 9
285 8, 7, // SPI - CE1, CE0 wpi 10 - 11
286 10, 9, 11, // SPI - MOSI, MISO, SCLK wpi 12 - 14
287 14, 15, // UART - Tx, Rx wpi 15 - 16
291 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 31
292 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47
293 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63
298 static int pinToGpioR2 [64] =
300 17, 18, 27, 22, 23, 24, 25, 4, // From the Original Wiki - GPIO 0 through 7: wpi 0 - 7
301 2, 3, // I2C - SDA0, SCL0 wpi 8 - 9
302 8, 7, // SPI - CE1, CE0 wpi 10 - 11
303 10, 9, 11, // SPI - MOSI, MISO, SCLK wpi 12 - 14
304 14, 15, // UART - Tx, Rx wpi 15 - 16
305 28, 29, 30, 31, // Rev 2: New GPIOs 8 though 11 wpi 17 - 20
306 5, 6, 13, 19, 26, // B+ wpi 21, 22, 23, 24, 25
307 12, 16, 20, 21, // B+ wpi 26, 27, 28, 29
308 0, 1, // B+ wpi 30, 31
312 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47
313 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63
318 // Take a physical pin (1 through 26) and re-map it to the BCM_GPIO pin
319 // Cope for 2 different board revisions here.
320 // Also add in the P5 connector, so the P5 pins are 3,4,5,6, so 53,54,55,56
322 static int *physToGpio ;
324 static int physToGpioR1 [64] =
341 -1, -1, -1, -1, -1, // ... 31
342 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47
343 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63
346 static int physToGpioR2 [64] =
373 // the P5 connector on the Rev 2 boards:
389 // Map a BCM_GPIO pin to it's Function Selection
390 // control port. (GPFSEL 0-5)
391 // Groups of 10 - 3 bits per Function - 30 bits per port
393 static uint8_t gpioToGPFSEL [] =
395 0,0,0,0,0,0,0,0,0,0,
396 1,1,1,1,1,1,1,1,1,1,
397 2,2,2,2,2,2,2,2,2,2,
398 3,3,3,3,3,3,3,3,3,3,
399 4,4,4,4,4,4,4,4,4,4,
400 5,5,5,5,5,5,5,5,5,5,
405 // Define the shift up for the 3 bits per pin in each GPFSEL port
407 static uint8_t gpioToShift [] =
409 0,3,6,9,12,15,18,21,24,27,
410 0,3,6,9,12,15,18,21,24,27,
411 0,3,6,9,12,15,18,21,24,27,
412 0,3,6,9,12,15,18,21,24,27,
413 0,3,6,9,12,15,18,21,24,27,
418 // (Word) offset to the GPIO Set registers for each GPIO pin
420 static uint8_t gpioToGPSET [] =
422 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,
423 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,
427 // (Word) offset to the GPIO Clear registers for each GPIO pin
429 static uint8_t gpioToGPCLR [] =
431 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,
432 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,
437 // (Word) offset to the GPIO Input level registers for each GPIO pin
439 static uint8_t gpioToGPLEV [] =
441 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,
442 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,
448 // (Word) offset to the Event Detect Status
450 static uint8_t gpioToEDS [] =
452 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,
453 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,
457 // (Word) offset to the Rising edge ENable register
459 static uint8_t gpioToREN [] =
461 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,
462 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,
466 // (Word) offset to the Falling edgde ENable register
468 static uint8_t gpioToFEN [] =
470 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,
471 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,
477 // GPIO Pin pull up/down register
482 // (Word) offset to the Pull Up Down Clock regsiter
484 static uint8_t gpioToPUDCLK [] =
486 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,
487 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,
492 // the ALT value to put a GPIO pin into PWM mode
494 static uint8_t gpioToPwmALT [] =
496 0, 0, 0, 0, 0, 0, 0, 0, // 0 -> 7
497 0, 0, 0, 0, FSEL_ALT0, FSEL_ALT0, 0, 0, // 8 -> 15
498 0, 0, FSEL_ALT5, FSEL_ALT5, 0, 0, 0, 0, // 16 -> 23
499 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31
500 0, 0, 0, 0, 0, 0, 0, 0, // 32 -> 39
501 FSEL_ALT0, FSEL_ALT0, 0, 0, 0, FSEL_ALT0, 0, 0, // 40 -> 47
502 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55
503 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63
508 // The port value to put a GPIO pin into PWM mode
510 static uint8_t gpioToPwmPort [] =
512 0, 0, 0, 0, 0, 0, 0, 0, // 0 -> 7
513 0, 0, 0, 0, PWM0_DATA, PWM1_DATA, 0, 0, // 8 -> 15
514 0, 0, PWM0_DATA, PWM1_DATA, 0, 0, 0, 0, // 16 -> 23
515 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31
516 0, 0, 0, 0, 0, 0, 0, 0, // 32 -> 39
517 PWM0_DATA, PWM1_DATA, 0, 0, 0, PWM1_DATA, 0, 0, // 40 -> 47
518 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55
519 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63
524 // ALT value to put a GPIO pin into GP Clock mode.
525 // On the Pi we can really only use BCM_GPIO_4 and BCM_GPIO_21
526 // for clocks 0 and 1 respectively, however I'll include the full
527 // list for completeness - maybe one day...
529 #define GPIO_CLOCK_SOURCE 1
533 static uint8_t gpioToGpClkALT0 [] =
535 0, 0, 0, 0, FSEL_ALT0, FSEL_ALT0, FSEL_ALT0, 0, // 0 -> 7
536 0, 0, 0, 0, 0, 0, 0, 0, // 8 -> 15
537 0, 0, 0, 0, FSEL_ALT5, FSEL_ALT5, 0, 0, // 16 -> 23
538 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31
539 FSEL_ALT0, 0, FSEL_ALT0, 0, 0, 0, 0, 0, // 32 -> 39
540 0, 0, FSEL_ALT0, FSEL_ALT0, FSEL_ALT0, 0, 0, 0, // 40 -> 47
541 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55
542 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63
546 // (word) Offsets to the clock Control and Divisor register
548 static uint8_t gpioToClkCon [] =
550 -1, -1, -1, -1, 28, 30, 32, -1, // 0 -> 7
551 -1, -1, -1, -1, -1, -1, -1, -1, // 8 -> 15
552 -1, -1, -1, -1, 28, 30, -1, -1, // 16 -> 23
553 -1, -1, -1, -1, -1, -1, -1, -1, // 24 -> 31
554 28, -1, 28, -1, -1, -1, -1, -1, // 32 -> 39
555 -1, -1, 28, 30, 28, -1, -1, -1, // 40 -> 47
556 -1, -1, -1, -1, -1, -1, -1, -1, // 48 -> 55
557 -1, -1, -1, -1, -1, -1, -1, -1, // 56 -> 63
560 static uint8_t gpioToClkDiv [] =
562 -1, -1, -1, -1, 29, 31, 33, -1, // 0 -> 7
563 -1, -1, -1, -1, -1, -1, -1, -1, // 8 -> 15
564 -1, -1, -1, -1, 29, 31, -1, -1, // 16 -> 23
565 -1, -1, -1, -1, -1, -1, -1, -1, // 24 -> 31
566 29, -1, 29, -1, -1, -1, -1, -1, // 32 -> 39
567 -1, -1, 29, 31, 29, -1, -1, -1, // 40 -> 47
568 -1, -1, -1, -1, -1, -1, -1, -1, // 48 -> 55
569 -1, -1, -1, -1, -1, -1, -1, -1, // 56 -> 63
575 *********************************************************************************
582 *********************************************************************************
585 int wiringPiFailure (int fatal, const char *message, ...)
590 if (!fatal && wiringPiReturnCodes)
593 va_start (argp, message) ;
594 vsnprintf (buffer, 1023, message, argp) ;
597 fprintf (stderr, "%s", buffer) ;
598 exit (EXIT_FAILURE) ;
606 * Return a number representing the hardware revision of the board.
608 * Revision 1 really means the early Model B's.
609 * Revision 2 is everything else - it covers the B, B+ and CM.
610 * ... and the Pi 2 - which is a B+ ++ ...
612 * Seems there are some boards with 0000 in them (mistake in manufacture)
613 * So the distinction between boards that I can see is:
616 * 0002 - Model B, Rev 1, 256MB, Egoman
617 * 0003 - Model B, Rev 1.1, 256MB, Egoman, Fuses/D14 removed.
618 * 0004 - Model B, Rev 2, 256MB, Sony
619 * 0005 - Model B, Rev 2, 256MB, Qisda
620 * 0006 - Model B, Rev 2, 256MB, Egoman
621 * 0007 - Model A, Rev 2, 256MB, Egoman
622 * 0008 - Model A, Rev 2, 256MB, Sony
623 * 0009 - Model A, Rev 2, 256MB, Qisda
624 * 000d - Model B, Rev 2, 512MB, Egoman
625 * 000e - Model B, Rev 2, 512MB, Sony
626 * 000f - Model B, Rev 2, 512MB, Qisda
627 * 0010 - Model B+, Rev 1.2, 512MB, Sony
628 * 0011 - Pi CM, Rev 1.2, 512MB, Sony
629 * 0012 - Model A+ Rev 1.2, 256MB, Sony
632 * 0010 - Model 2, Rev 1.1, Quad Core, 1GB, Sony
634 * A small thorn is the olde style overvolting - that will add in
637 * The Pi compute module has an revision of 0011 - since we only check the
638 * last digit, then it's 1, therefore it'll default to not 2 or 3 for a
639 * Rev 1, so will appear as a Rev 2. This is fine for the most part, but
640 * we'll properly detect the Compute Module later and adjust accordingly.
642 *********************************************************************************
645 static void piBoardRevOops (const char *why)
647 fprintf (stderr, "piBoardRev: Unable to determine board revision from /proc/cpuinfo\n") ;
648 fprintf (stderr, " -> %s\n", why) ;
649 fprintf (stderr, " -> You may want to check:\n") ;
650 fprintf (stderr, " -> http://www.raspberrypi.org/phpBB3/viewtopic.php?p=184410#p184410\n") ;
651 exit (EXIT_FAILURE) ;
654 int piBoardRev (void)
659 static int boardRev = -1 ;
661 if (boardRev != -1) // No point checking twice
664 if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL)
665 piBoardRevOops ("Unable to open /proc/cpuinfo") ;
667 // Start by looking for the Architecture, then we can look for a B2 revision....
669 while (fgets (line, 120, cpuFd) != NULL)
670 if (strncmp (line, "model name", 10) == 0)
673 if (strncmp (line, "model name", 10) != 0)
674 piBoardRevOops ("No \"model name\" line") ;
677 printf ("piboardRev: Model name: %s\n", line) ;
681 if (strstr (line, "ARMv7") != NULL)
684 // Now do the rest of it as before
688 while (fgets (line, 120, cpuFd) != NULL)
689 if (strncmp (line, "Revision", 8) == 0)
694 if (strncmp (line, "Revision", 8) != 0)
695 piBoardRevOops ("No \"Revision\" line") ;
697 // Chomp trailing CR/NL
699 for (c = &line [strlen (line) - 1] ; (*c == '\n') || (*c == '\r') ; --c)
703 printf ("piboardRev: Revision string: %s\n", line) ;
705 // Scan to first digit
707 for (c = line ; *c ; ++c)
712 piBoardRevOops ("No numeric revision string") ;
714 // Make sure its long enough
717 piBoardRevOops ("Bogus \"Revision\" line (too small)") ;
719 // If you have overvolted the Pi, then it appears that the revision
720 // has 100000 added to it!
721 // The actual condition for it being set is:
722 // (force_turbo || current_limit_override || temp_limit>85) && over_voltage>0
726 printf ("piboardRev: This Pi has/is (force_turbo || current_limit_override || temp_limit>85) && over_voltage>0\n") ;
728 // Isolate last 4 characters:
730 c = c + strlen (c) - 4 ;
733 printf ("piboardRev: last4Chars are: \"%s\"\n", c) ;
735 if ( (strcmp (c, "0002") == 0) || (strcmp (c, "0003") == 0))
741 printf ("piBoardRev: Returning revision: %d\n", boardRev) ;
749 * Do more digging into the board revision string as above, but return
750 * as much details as we can.
751 * This is undocumented and really only intended for the GPIO command.
752 * Use at your own risk!
753 *********************************************************************************
756 void piBoardId (int *model, int *rev, int *mem, int *maker, int *overVolted)
762 (void)piBoardRev () ; // Call this first to make sure all's OK. Don't care about the result.
764 if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL)
765 piBoardRevOops ("Unable to open /proc/cpuinfo") ;
767 while (fgets (line, 120, cpuFd) != NULL)
768 if (strncmp (line, "Revision", 8) == 0)
773 if (strncmp (line, "Revision", 8) != 0)
774 piBoardRevOops ("No \"Revision\" line") ;
776 // Chomp trailing CR/NL
778 for (c = &line [strlen (line) - 1] ; (*c == '\n') || (*c == '\r') ; --c)
782 printf ("piboardId: Revision string: %s\n", line) ;
784 // Scan to first digit
786 for (c = line ; *c ; ++c)
790 // Make sure its long enough
793 piBoardRevOops ("Bogus \"Revision\" line") ;
795 // If longer than 4, we'll assume it's been overvolted
797 *overVolted = strlen (c) > 4 ;
799 // Extract last 4 characters:
801 c = c + strlen (c) - 4 ;
803 // Fill out the replys as appropriate
807 /**/ if (strcmp (c, "0010") == 0) { *model = PI_MODEL_2 ; *rev = PI_VERSION_1_1 ; *mem = 1024 ; *maker = PI_MAKER_SONY ; }
808 else { *model = 0 ; *rev = 0 ; *mem = 0 ; *maker = 0 ; }
812 /**/ if (strcmp (c, "0002") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1 ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; }
813 else if (strcmp (c, "0003") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_1 ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; }
814 else if (strcmp (c, "0004") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_SONY ; }
815 else if (strcmp (c, "0005") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_QISDA ; }
816 else if (strcmp (c, "0006") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; }
817 else if (strcmp (c, "0007") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; }
818 else if (strcmp (c, "0008") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_SONY ; ; }
819 else if (strcmp (c, "0009") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_QISDA ; }
820 else if (strcmp (c, "000d") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 512 ; *maker = PI_MAKER_EGOMAN ; }
821 else if (strcmp (c, "000e") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 512 ; *maker = PI_MAKER_SONY ; }
822 else if (strcmp (c, "000f") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 512 ; *maker = PI_MAKER_EGOMAN ; }
823 else if (strcmp (c, "0010") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 512 ; *maker = PI_MAKER_SONY ; }
824 else if (strcmp (c, "0011") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_2 ; *mem = 512 ; *maker = PI_MAKER_SONY ; }
825 else if (strcmp (c, "0012") == 0) { *model = PI_MODEL_AP ; *rev = PI_VERSION_1_2 ; *mem = 256 ; *maker = PI_MAKER_SONY ; }
826 else if (strcmp (c, "0013") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 512 ; *maker = PI_MAKER_MBEST ; }
827 else { *model = 0 ; *rev = 0 ; *mem = 0 ; *maker = 0 ; }
835 * Translate a wiringPi Pin number to native GPIO pin number.
836 * Provided for external support.
837 *********************************************************************************
840 int wpiPinToGpio (int wpiPin)
842 return pinToGpio [wpiPin & 63] ;
848 * Translate a physical Pin number to native GPIO pin number.
849 * Provided for external support.
850 *********************************************************************************
853 int physPinToGpio (int physPin)
855 return physToGpio [physPin & 63] ;
861 * Set the PAD driver value
862 *********************************************************************************
865 void setPadDrive (int group, int value)
869 if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO))
871 if ((group < 0) || (group > 2))
874 wrVal = BCM_PASSWORD | 0x18 | (value & 7) ;
875 *(pads + group + 11) = wrVal ;
879 printf ("setPadDrive: Group: %d, value: %d (%08X)\n", group, value, wrVal) ;
880 printf ("Read : %08X\n", *(pads + group + 11)) ;
888 * Returns the ALT bits for a given port. Only really of-use
889 * for the gpio readall command (I think)
890 *********************************************************************************
895 int fSel, shift, alt ;
899 /**/ if (wiringPiMode == WPI_MODE_PINS)
900 pin = pinToGpio [pin] ;
901 else if (wiringPiMode == WPI_MODE_PHYS)
902 pin = physToGpio [pin] ;
903 else if (wiringPiMode != WPI_MODE_GPIO)
906 fSel = gpioToGPFSEL [pin] ;
907 shift = gpioToShift [pin] ;
909 alt = (*(gpio + fSel) >> shift) & 7 ;
917 * Select the native "balanced" mode, or standard mark:space mode
918 *********************************************************************************
921 void pwmSetMode (int mode)
923 if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO))
925 if (mode == PWM_MODE_MS)
926 *(pwm + PWM_CONTROL) = PWM0_ENABLE | PWM1_ENABLE | PWM0_MS_MODE | PWM1_MS_MODE ;
928 *(pwm + PWM_CONTROL) = PWM0_ENABLE | PWM1_ENABLE ;
935 * Set the PWM range register. We set both range registers to the same
936 * value. If you want different in your own code, then write your own.
937 *********************************************************************************
940 void pwmSetRange (unsigned int range)
942 if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO))
944 *(pwm + PWM0_RANGE) = range ; delayMicroseconds (10) ;
945 *(pwm + PWM1_RANGE) = range ; delayMicroseconds (10) ;
952 * Set/Change the PWM clock. Originally my code, but changed
953 * (for the better!) by Chris Hall, <chris@kchall.plus.com>
954 * after further study of the manual and testing with a 'scope
955 *********************************************************************************
958 void pwmSetClock (int divisor)
960 uint32_t pwm_control ;
963 if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO))
966 printf ("Setting to: %d. Current: 0x%08X\n", divisor, *(clk + PWMCLK_DIV)) ;
968 pwm_control = *(pwm + PWM_CONTROL) ; // preserve PWM_CONTROL
970 // We need to stop PWM prior to stopping PWM clock in MS mode otherwise BUSY
973 *(pwm + PWM_CONTROL) = 0 ; // Stop PWM
975 // Stop PWM clock before changing divisor. The delay after this does need to
976 // this big (95uS occasionally fails, 100uS OK), it's almost as though the BUSY
977 // flag is not working properly in balanced mode. Without the delay when DIV is
978 // adjusted the clock sometimes switches to very slow, once slow further DIV
979 // adjustments do nothing and it's difficult to get out of this mode.
981 *(clk + PWMCLK_CNTL) = BCM_PASSWORD | 0x01 ; // Stop PWM Clock
982 delayMicroseconds (110) ; // prevents clock going sloooow
984 while ((*(clk + PWMCLK_CNTL) & 0x80) != 0) // Wait for clock to be !BUSY
985 delayMicroseconds (1) ;
987 *(clk + PWMCLK_DIV) = BCM_PASSWORD | (divisor << 12) ;
989 *(clk + PWMCLK_CNTL) = BCM_PASSWORD | 0x11 ; // Start PWM clock
990 *(pwm + PWM_CONTROL) = pwm_control ; // restore PWM_CONTROL
993 printf ("Set to: %d. Now : 0x%08X\n", divisor, *(clk + PWMCLK_DIV)) ;
1000 * Set the freuency on a GPIO clock pin
1001 *********************************************************************************
1004 void gpioClockSet (int pin, int freq)
1006 int divi, divr, divf ;
1010 /**/ if (wiringPiMode == WPI_MODE_PINS)
1011 pin = pinToGpio [pin] ;
1012 else if (wiringPiMode == WPI_MODE_PHYS)
1013 pin = physToGpio [pin] ;
1014 else if (wiringPiMode != WPI_MODE_GPIO)
1017 divi = 19200000 / freq ;
1018 divr = 19200000 % freq ;
1019 divf = (int)((double)divr * 4096.0 / 19200000.0) ;
1024 *(clk + gpioToClkCon [pin]) = BCM_PASSWORD | GPIO_CLOCK_SOURCE ; // Stop GPIO Clock
1025 while ((*(clk + gpioToClkCon [pin]) & 0x80) != 0) // ... and wait
1028 *(clk + gpioToClkDiv [pin]) = BCM_PASSWORD | (divi << 12) | divf ; // Set dividers
1029 *(clk + gpioToClkCon [pin]) = BCM_PASSWORD | 0x10 | GPIO_CLOCK_SOURCE ; // Start Clock
1035 * Locate our device node
1036 *********************************************************************************
1039 struct wiringPiNodeStruct *wiringPiFindNode (int pin)
1041 struct wiringPiNodeStruct *node = wiringPiNodes ;
1043 while (node != NULL)
1044 if ((pin >= node->pinBase) && (pin <= node->pinMax))
1055 * Create a new GPIO node into the wiringPi handling system
1056 *********************************************************************************
1059 static void pinModeDummy (struct wiringPiNodeStruct *node, int pin, int mode) { return ; }
1060 static void pullUpDnControlDummy (struct wiringPiNodeStruct *node, int pin, int pud) { return ; }
1061 static int digitalReadDummy (struct wiringPiNodeStruct *node, int pin) { return LOW ; }
1062 static void digitalWriteDummy (struct wiringPiNodeStruct *node, int pin, int value) { return ; }
1063 static void pwmWriteDummy (struct wiringPiNodeStruct *node, int pin, int value) { return ; }
1064 static int analogReadDummy (struct wiringPiNodeStruct *node, int pin) { return 0 ; }
1065 static void analogWriteDummy (struct wiringPiNodeStruct *node, int pin, int value) { return ; }
1067 struct wiringPiNodeStruct *wiringPiNewNode (int pinBase, int numPins)
1070 struct wiringPiNodeStruct *node ;
1072 // Minimum pin base is 64
1075 (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: pinBase of %d is < 64\n", pinBase) ;
1077 // Check all pins in-case there is overlap:
1079 for (pin = pinBase ; pin < (pinBase + numPins) ; ++pin)
1080 if (wiringPiFindNode (pin) != NULL)
1081 (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: Pin %d overlaps with existing definition\n", pin) ;
1083 node = (struct wiringPiNodeStruct *)calloc (sizeof (struct wiringPiNodeStruct), 1) ; // calloc zeros
1085 (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: Unable to allocate memory: %s\n", strerror (errno)) ;
1087 node->pinBase = pinBase ;
1088 node->pinMax = pinBase + numPins - 1 ;
1089 node->pinMode = pinModeDummy ;
1090 node->pullUpDnControl = pullUpDnControlDummy ;
1091 node->digitalRead = digitalReadDummy ;
1092 node->digitalWrite = digitalWriteDummy ;
1093 node->pwmWrite = pwmWriteDummy ;
1094 node->analogRead = analogReadDummy ;
1095 node->analogWrite = analogWriteDummy ;
1096 node->next = wiringPiNodes ;
1097 wiringPiNodes = node ;
1107 * Enables edge-detect mode on a pin - from a 0 to a 1 or 1 to 0
1108 * Pin must already be in input mode with appropriate pull up/downs set.
1109 *********************************************************************************
1112 void pinEnableED01Pi (int pin)
1114 pin = pinToGpio [pin & 63] ;
1120 *********************************************************************************
1122 *********************************************************************************
1127 * This is an un-documented special to let you set any pin to any mode
1128 *********************************************************************************
1131 void pinModeAlt (int pin, int mode)
1135 if ((pin & PI_GPIO_MASK) == 0) // On-board pin
1137 /**/ if (wiringPiMode == WPI_MODE_PINS)
1138 pin = pinToGpio [pin] ;
1139 else if (wiringPiMode == WPI_MODE_PHYS)
1140 pin = physToGpio [pin] ;
1141 else if (wiringPiMode != WPI_MODE_GPIO)
1144 fSel = gpioToGPFSEL [pin] ;
1145 shift = gpioToShift [pin] ;
1147 *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | ((mode & 0x7) << shift) ;
1154 * Sets the mode of a pin to be input, output or PWM output
1155 *********************************************************************************
1158 void pinMode (int pin, int mode)
1160 int fSel, shift, alt ;
1161 struct wiringPiNodeStruct *node = wiringPiNodes ;
1164 if ((pin & PI_GPIO_MASK) == 0) // On-board pin
1166 /**/ if (wiringPiMode == WPI_MODE_PINS)
1167 pin = pinToGpio [pin] ;
1168 else if (wiringPiMode == WPI_MODE_PHYS)
1169 pin = physToGpio [pin] ;
1170 else if (wiringPiMode != WPI_MODE_GPIO)
1173 softPwmStop (origPin) ;
1174 softToneStop (origPin) ;
1176 fSel = gpioToGPFSEL [pin] ;
1177 shift = gpioToShift [pin] ;
1179 /**/ if (mode == INPUT)
1180 *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) ; // Sets bits to zero = input
1181 else if (mode == OUTPUT)
1182 *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (1 << shift) ;
1183 else if (mode == SOFT_PWM_OUTPUT)
1184 softPwmCreate (origPin, 0, 100) ;
1185 else if (mode == SOFT_TONE_OUTPUT)
1186 softToneCreate (origPin) ;
1187 else if (mode == PWM_TONE_OUTPUT)
1189 pinMode (origPin, PWM_OUTPUT) ; // Call myself to enable PWM mode
1190 pwmSetMode (PWM_MODE_MS) ;
1192 else if (mode == PWM_OUTPUT)
1194 if ((alt = gpioToPwmALT [pin]) == 0) // Not a hardware capable PWM pin
1197 // Set pin to PWM mode
1199 *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (alt << shift) ;
1200 delayMicroseconds (110) ; // See comments in pwmSetClockWPi
1202 pwmSetMode (PWM_MODE_BAL) ; // Pi default mode
1203 pwmSetRange (1024) ; // Default range of 1024
1204 pwmSetClock (32) ; // 19.2 / 32 = 600KHz - Also starts the PWM
1206 else if (mode == GPIO_CLOCK)
1208 if ((alt = gpioToGpClkALT0 [pin]) == 0) // Not a GPIO_CLOCK pin
1211 // Set pin to GPIO_CLOCK mode and set the clock frequency to 100KHz
1213 *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (alt << shift) ;
1214 delayMicroseconds (110) ;
1215 gpioClockSet (pin, 100000) ;
1220 if ((node = wiringPiFindNode (pin)) != NULL)
1221 node->pinMode (node, pin, mode) ;
1229 * Control the internal pull-up/down resistors on a GPIO pin
1230 * The Arduino only has pull-ups and these are enabled by writing 1
1231 * to a port when in input mode - this paradigm doesn't quite apply
1233 *********************************************************************************
1236 void pullUpDnControl (int pin, int pud)
1238 struct wiringPiNodeStruct *node = wiringPiNodes ;
1240 if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin
1242 /**/ if (wiringPiMode == WPI_MODE_PINS)
1243 pin = pinToGpio [pin] ;
1244 else if (wiringPiMode == WPI_MODE_PHYS)
1245 pin = physToGpio [pin] ;
1246 else if (wiringPiMode != WPI_MODE_GPIO)
1249 *(gpio + GPPUD) = pud & 3 ; delayMicroseconds (5) ;
1250 *(gpio + gpioToPUDCLK [pin]) = 1 << (pin & 31) ; delayMicroseconds (5) ;
1252 *(gpio + GPPUD) = 0 ; delayMicroseconds (5) ;
1253 *(gpio + gpioToPUDCLK [pin]) = 0 ; delayMicroseconds (5) ;
1255 else // Extension module
1257 if ((node = wiringPiFindNode (pin)) != NULL)
1258 node->pullUpDnControl (node, pin, pud) ;
1266 * Read the value of a given Pin, returning HIGH or LOW
1267 *********************************************************************************
1270 int digitalRead (int pin)
1273 struct wiringPiNodeStruct *node = wiringPiNodes ;
1275 if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin
1277 /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode
1279 if (sysFds [pin] == -1)
1282 lseek (sysFds [pin], 0L, SEEK_SET) ;
1283 read (sysFds [pin], &c, 1) ;
1284 return (c == '0') ? LOW : HIGH ;
1286 else if (wiringPiMode == WPI_MODE_PINS)
1287 pin = pinToGpio [pin] ;
1288 else if (wiringPiMode == WPI_MODE_PHYS)
1289 pin = physToGpio [pin] ;
1290 else if (wiringPiMode != WPI_MODE_GPIO)
1293 if ((*(gpio + gpioToGPLEV [pin]) & (1 << (pin & 31))) != 0)
1300 if ((node = wiringPiFindNode (pin)) == NULL)
1302 return node->digitalRead (node, pin) ;
1310 *********************************************************************************
1313 void digitalWrite (int pin, int value)
1315 struct wiringPiNodeStruct *node = wiringPiNodes ;
1317 if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin
1319 /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode
1321 if (sysFds [pin] != -1)
1324 write (sysFds [pin], "0\n", 2) ;
1326 write (sysFds [pin], "1\n", 2) ;
1330 else if (wiringPiMode == WPI_MODE_PINS)
1331 pin = pinToGpio [pin] ;
1332 else if (wiringPiMode == WPI_MODE_PHYS)
1333 pin = physToGpio [pin] ;
1334 else if (wiringPiMode != WPI_MODE_GPIO)
1338 *(gpio + gpioToGPCLR [pin]) = 1 << (pin & 31) ;
1340 *(gpio + gpioToGPSET [pin]) = 1 << (pin & 31) ;
1344 if ((node = wiringPiFindNode (pin)) != NULL)
1345 node->digitalWrite (node, pin, value) ;
1352 * Set an output PWM value
1353 *********************************************************************************
1356 void pwmWrite (int pin, int value)
1358 struct wiringPiNodeStruct *node = wiringPiNodes ;
1360 if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin
1362 /**/ if (wiringPiMode == WPI_MODE_PINS)
1363 pin = pinToGpio [pin] ;
1364 else if (wiringPiMode == WPI_MODE_PHYS)
1365 pin = physToGpio [pin] ;
1366 else if (wiringPiMode != WPI_MODE_GPIO)
1369 *(pwm + gpioToPwmPort [pin]) = value ;
1373 if ((node = wiringPiFindNode (pin)) != NULL)
1374 node->pwmWrite (node, pin, value) ;
1381 * Read the analog value of a given Pin.
1382 * There is no on-board Pi analog hardware,
1383 * so this needs to go to a new node.
1384 *********************************************************************************
1387 int analogRead (int pin)
1389 struct wiringPiNodeStruct *node = wiringPiNodes ;
1391 if ((node = wiringPiFindNode (pin)) == NULL)
1394 return node->analogRead (node, pin) ;
1400 * Write the analog value to the given Pin.
1401 * There is no on-board Pi analog hardware,
1402 * so this needs to go to a new node.
1403 *********************************************************************************
1406 void analogWrite (int pin, int value)
1408 struct wiringPiNodeStruct *node = wiringPiNodes ;
1410 if ((node = wiringPiFindNode (pin)) == NULL)
1413 node->analogWrite (node, pin, value) ;
1420 * Output the given frequency on the Pi's PWM pin
1421 *********************************************************************************
1424 void pwmToneWrite (int pin, int freq)
1429 pwmWrite (pin, 0) ; // Off
1432 range = 600000 / freq ;
1433 pwmSetRange (range) ;
1434 pwmWrite (pin, freq / 2) ;
1443 * Write an 8-bit byte to the first 8 GPIO pins - try to do it as
1445 * However it still needs 2 operations to set the bits, so any external
1446 * hardware must not rely on seeing a change as there will be a change
1447 * to set the outputs bits to zero, then another change to set the 1's
1448 *********************************************************************************
1451 void digitalWriteByte (int value)
1453 uint32_t pinSet = 0 ;
1454 uint32_t pinClr = 0 ;
1458 /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS)
1460 for (pin = 0 ; pin < 8 ; ++pin)
1462 digitalWrite (pin, value & mask) ;
1469 for (pin = 0 ; pin < 8 ; ++pin)
1471 if ((value & mask) == 0)
1472 pinClr |= (1 << pinToGpio [pin]) ;
1474 pinSet |= (1 << pinToGpio [pin]) ;
1479 *(gpio + gpioToGPCLR [0]) = pinClr ;
1480 *(gpio + gpioToGPSET [0]) = pinSet ;
1488 * Wait for Interrupt on a GPIO pin.
1489 * This is actually done via the /sys/class/gpio interface regardless of
1490 * the wiringPi access mode in-use. Maybe sometime it might get a better
1491 * way for a bit more efficiency.
1492 *********************************************************************************
1495 int waitForInterrupt (int pin, int mS)
1499 struct pollfd polls ;
1501 /**/ if (wiringPiMode == WPI_MODE_PINS)
1502 pin = pinToGpio [pin] ;
1503 else if (wiringPiMode == WPI_MODE_PHYS)
1504 pin = physToGpio [pin] ;
1506 if ((fd = sysFds [pin]) == -1)
1509 // Setup poll structure
1512 polls.events = POLLPRI ; // Urgent data!
1516 x = poll (&polls, 1, mS) ;
1518 // Do a dummy read to clear the interrupt
1519 // A one character read appars to be enough.
1520 // Followed by a seek to reset it.
1522 (void)read (fd, &c, 1) ;
1523 lseek (fd, 0, SEEK_SET) ;
1531 * This is a thread and gets started to wait for the interrupt we're
1532 * hoping to catch. It will call the user-function when the interrupt
1534 *********************************************************************************
1537 static void *interruptHandler (void *arg)
1541 (void)piHiPri (55) ; // Only effective if we run as root
1547 if (waitForInterrupt (myPin, -1) > 0)
1548 isrFunctions [myPin] () ;
1557 * Take the details and create an interrupt handler that will do a call-
1558 * back to the user supplied function.
1559 *********************************************************************************
1562 int wiringPiISR (int pin, int mode, void (*function)(void))
1564 pthread_t threadId ;
1573 if ((pin < 0) || (pin > 63))
1574 return wiringPiFailure (WPI_FATAL, "wiringPiISR: pin must be 0-63 (%d)\n", pin) ;
1576 /**/ if (wiringPiMode == WPI_MODE_UNINITIALISED)
1577 return wiringPiFailure (WPI_FATAL, "wiringPiISR: wiringPi has not been initialised. Unable to continue.\n") ;
1578 else if (wiringPiMode == WPI_MODE_PINS)
1579 bcmGpioPin = pinToGpio [pin] ;
1580 else if (wiringPiMode == WPI_MODE_PHYS)
1581 bcmGpioPin = physToGpio [pin] ;
1585 // Now export the pin and set the right edge
1586 // We're going to use the gpio program to do this, so it assumes
1587 // a full installation of wiringPi. It's a bit 'clunky', but it
1588 // is a way that will work when we're running in "Sys" mode, as
1589 // a non-root user. (without sudo)
1591 if (mode != INT_EDGE_SETUP)
1593 /**/ if (mode == INT_EDGE_FALLING)
1595 else if (mode == INT_EDGE_RISING)
1600 sprintf (pinS, "%d", bcmGpioPin) ;
1602 if ((pid = fork ()) < 0) // Fail
1603 return wiringPiFailure (WPI_FATAL, "wiringPiISR: fork failed: %s\n", strerror (errno)) ;
1605 if (pid == 0) // Child, exec
1607 /**/ if (access ("/usr/local/bin/gpio", X_OK) == 0)
1609 execl ("/usr/local/bin/gpio", "gpio", "edge", pinS, modeS, (char *)NULL) ;
1610 return wiringPiFailure (WPI_FATAL, "wiringPiISR: execl failed: %s\n", strerror (errno)) ;
1612 else if (access ("/usr/bin/gpio", X_OK) == 0)
1614 execl ("/usr/bin/gpio", "gpio", "edge", pinS, modeS, (char *)NULL) ;
1615 return wiringPiFailure (WPI_FATAL, "wiringPiISR: execl failed: %s\n", strerror (errno)) ;
1618 return wiringPiFailure (WPI_FATAL, "wiringPiISR: Can't find gpio program\n") ;
1620 else // Parent, wait
1624 // Now pre-open the /sys/class node - but it may already be open if
1625 // we are in Sys mode...
1627 if (sysFds [bcmGpioPin] == -1)
1629 sprintf (fName, "/sys/class/gpio/gpio%d/value", bcmGpioPin) ;
1630 if ((sysFds [bcmGpioPin] = open (fName, O_RDWR)) < 0)
1631 return wiringPiFailure (WPI_FATAL, "wiringPiISR: unable to open %s: %s\n", fName, strerror (errno)) ;
1634 // Clear any initial pending interrupt
1636 ioctl (sysFds [bcmGpioPin], FIONREAD, &count) ;
1637 for (i = 0 ; i < count ; ++i)
1638 read (sysFds [bcmGpioPin], &c, 1) ;
1640 isrFunctions [pin] = function ;
1642 pthread_mutex_lock (&pinMutex) ;
1644 pthread_create (&threadId, NULL, interruptHandler, NULL) ;
1645 while (pinPass != -1)
1647 pthread_mutex_unlock (&pinMutex) ;
1655 * Initialise our start-of-time variable to be the current unix
1656 * time in milliseconds and microseconds.
1657 *********************************************************************************
1660 static void initialiseEpoch (void)
1664 gettimeofday (&tv, NULL) ;
1665 epochMilli = (uint64_t)tv.tv_sec * (uint64_t)1000 + (uint64_t)(tv.tv_usec / 1000) ;
1666 epochMicro = (uint64_t)tv.tv_sec * (uint64_t)1000000 + (uint64_t)(tv.tv_usec) ;
1672 * Wait for some number of milliseconds
1673 *********************************************************************************
1676 void delay (unsigned int howLong)
1678 struct timespec sleeper, dummy ;
1680 sleeper.tv_sec = (time_t)(howLong / 1000) ;
1681 sleeper.tv_nsec = (long)(howLong % 1000) * 1000000 ;
1683 nanosleep (&sleeper, &dummy) ;
1688 * delayMicroseconds:
1689 * This is somewhat intersting. It seems that on the Pi, a single call
1690 * to nanosleep takes some 80 to 130 microseconds anyway, so while
1691 * obeying the standards (may take longer), it's not always what we
1694 * So what I'll do now is if the delay is less than 100uS we'll do it
1695 * in a hard loop, watching a built-in counter on the ARM chip. This is
1696 * somewhat sub-optimal in that it uses 100% CPU, something not an issue
1697 * in a microcontroller, but under a multi-tasking, multi-user OS, it's
1698 * wastefull, however we've no real choice )-:
1700 * Plan B: It seems all might not be well with that plan, so changing it
1701 * to use gettimeofday () and poll on that instead...
1702 *********************************************************************************
1705 void delayMicrosecondsHard (unsigned int howLong)
1707 struct timeval tNow, tLong, tEnd ;
1709 gettimeofday (&tNow, NULL) ;
1710 tLong.tv_sec = howLong / 1000000 ;
1711 tLong.tv_usec = howLong % 1000000 ;
1712 timeradd (&tNow, &tLong, &tEnd) ;
1714 while (timercmp (&tNow, &tEnd, <))
1715 gettimeofday (&tNow, NULL) ;
1718 void delayMicroseconds (unsigned int howLong)
1720 struct timespec sleeper ;
1721 unsigned int uSecs = howLong % 1000000 ;
1722 unsigned int wSecs = howLong / 1000000 ;
1724 /**/ if (howLong == 0)
1726 else if (howLong < 100)
1727 delayMicrosecondsHard (howLong) ;
1730 sleeper.tv_sec = wSecs ;
1731 sleeper.tv_nsec = (long)(uSecs * 1000L) ;
1732 nanosleep (&sleeper, NULL) ;
1739 * Return a number of milliseconds as an unsigned int.
1740 *********************************************************************************
1743 unsigned int millis (void)
1748 gettimeofday (&tv, NULL) ;
1749 now = (uint64_t)tv.tv_sec * (uint64_t)1000 + (uint64_t)(tv.tv_usec / 1000) ;
1751 return (uint32_t)(now - epochMilli) ;
1757 * Return a number of microseconds as an unsigned int.
1758 *********************************************************************************
1761 unsigned int micros (void)
1766 gettimeofday (&tv, NULL) ;
1767 now = (uint64_t)tv.tv_sec * (uint64_t)1000000 + (uint64_t)tv.tv_usec ;
1769 return (uint32_t)(now - epochMicro) ;
1775 * Must be called once at the start of your program execution.
1777 * Default setup: Initialises the system into wiringPi Pin mode and uses the
1778 * memory mapped hardware directly.
1780 * Changed now to revert to "gpio" mode if we're running on a Compute Module.
1781 *********************************************************************************
1784 int wiringPiSetup (void)
1788 int model, rev, mem, maker, overVolted ;
1790 if (getenv (ENV_DEBUG) != NULL)
1791 wiringPiDebug = TRUE ;
1793 if (getenv (ENV_CODES) != NULL)
1794 wiringPiReturnCodes = TRUE ;
1796 if (geteuid () != 0)
1797 (void)wiringPiFailure (WPI_FATAL, "wiringPiSetup: Must be root. (Did you forget sudo?)\n") ;
1800 printf ("wiringPi: wiringPiSetup called\n") ;
1802 boardRev = piBoardRev () ;
1804 /**/ if (boardRev == 1) // A, B, Rev 1, 1.1
1806 pinToGpio = pinToGpioR1 ;
1807 physToGpio = physToGpioR1 ;
1809 else // A, B, Rev 2, B+, CM, Pi2
1812 BCM2708_PERI_BASE = 0x3F000000 ;
1813 pinToGpio = pinToGpioR2 ;
1814 physToGpio = physToGpioR2 ;
1817 // Open the master /dev/memory device
1819 if ((fd = open ("/dev/mem", O_RDWR | O_SYNC | O_CLOEXEC) ) < 0)
1820 return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: Unable to open /dev/mem: %s\n", strerror (errno)) ;
1824 gpio = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_BASE) ;
1825 if ((int32_t)gpio == -1)
1826 return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (GPIO) failed: %s\n", strerror (errno)) ;
1830 pwm = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_PWM) ;
1831 if ((int32_t)pwm == -1)
1832 return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (PWM) failed: %s\n", strerror (errno)) ;
1834 // Clock control (needed for PWM)
1836 clk = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, CLOCK_BASE) ;
1837 if ((int32_t)clk == -1)
1838 return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (CLOCK) failed: %s\n", strerror (errno)) ;
1842 pads = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_PADS) ;
1843 if ((int32_t)pads == -1)
1844 return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (PADS) failed: %s\n", strerror (errno)) ;
1849 timer = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_TIMER) ;
1850 if ((int32_t)timer == -1)
1851 return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (TIMER) failed: %s\n", strerror (errno)) ;
1853 // Set the timer to free-running, 1MHz.
1854 // 0xF9 is 249, the timer divide is base clock / (divide+1)
1855 // so base clock is 250MHz / 250 = 1MHz.
1857 *(timer + TIMER_CONTROL) = 0x0000280 ;
1858 *(timer + TIMER_PRE_DIV) = 0x00000F9 ;
1859 timerIrqRaw = timer + TIMER_IRQ_RAW ;
1862 initialiseEpoch () ;
1864 // If we're running on a compute module, then wiringPi pin numbers don't really many anything...
1866 piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
1867 if (model == PI_MODEL_CM)
1868 wiringPiMode = WPI_MODE_GPIO ;
1870 wiringPiMode = WPI_MODE_PINS ;
1877 * wiringPiSetupGpio:
1878 * Must be called once at the start of your program execution.
1880 * GPIO setup: Initialises the system into GPIO Pin mode and uses the
1881 * memory mapped hardware directly.
1882 *********************************************************************************
1885 int wiringPiSetupGpio (void)
1887 (void)wiringPiSetup () ;
1890 printf ("wiringPi: wiringPiSetupGpio called\n") ;
1892 wiringPiMode = WPI_MODE_GPIO ;
1899 * wiringPiSetupPhys:
1900 * Must be called once at the start of your program execution.
1902 * Phys setup: Initialises the system into Physical Pin mode and uses the
1903 * memory mapped hardware directly.
1904 *********************************************************************************
1907 int wiringPiSetupPhys (void)
1909 (void)wiringPiSetup () ;
1912 printf ("wiringPi: wiringPiSetupPhys called\n") ;
1914 wiringPiMode = WPI_MODE_PHYS ;
1922 * Must be called once at the start of your program execution.
1924 * Initialisation (again), however this time we are using the /sys/class/gpio
1925 * interface to the GPIO systems - slightly slower, but always usable as
1926 * a non-root user, assuming the devices are already exported and setup correctly.
1929 int wiringPiSetupSys (void)
1935 if (getenv (ENV_DEBUG) != NULL)
1936 wiringPiDebug = TRUE ;
1938 if (getenv (ENV_CODES) != NULL)
1939 wiringPiReturnCodes = TRUE ;
1942 printf ("wiringPi: wiringPiSetupSys called\n") ;
1944 boardRev = piBoardRev () ;
1948 pinToGpio = pinToGpioR1 ;
1949 physToGpio = physToGpioR1 ;
1953 pinToGpio = pinToGpioR2 ;
1954 physToGpio = physToGpioR2 ;
1957 // Open and scan the directory, looking for exported GPIOs, and pre-open
1958 // the 'value' interface to speed things up for later
1960 for (pin = 0 ; pin < 64 ; ++pin)
1962 sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ;
1963 sysFds [pin] = open (fName, O_RDWR) ;
1966 initialiseEpoch () ;
1968 wiringPiMode = WPI_MODE_GPIO_SYS ;