3 * Arduino compatable (ish) Wiring library for the Raspberry Pi
4 * Copyright (c) 2012 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 #define BCM2708_PERI_BASE 0x20000000
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 const char *piModelNames [5] =
215 const char *piRevisionNames [5] =
224 const char *piMakerNames [4] =
233 // Time for easy calculations
235 static uint64_t epochMilli, epochMicro ;
239 static int wiringPiMode = WPI_MODE_UNINITIALISED ;
240 static volatile int pinPass = -1 ;
241 static pthread_mutex_t pinMutex ;
243 // Debugging & Return codes
245 int wiringPiDebug = FALSE ;
246 int wiringPiReturnCodes = FALSE ;
249 // Map a file descriptor from the /sys/class/gpio/gpioX/value
251 static int sysFds [64] =
253 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
254 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
255 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
256 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
261 static void (*isrFunctions [64])(void) ;
264 // Doing it the Arduino way with lookup tables...
265 // Yes, it's probably more innefficient than all the bit-twidling, but it
266 // does tend to make it all a bit clearer. At least to me!
269 // Take a Wiring pin (0 through X) and re-map it to the BCM_GPIO pin
270 // Cope for 3 different board revisions here.
272 static int *pinToGpio ;
276 static int pinToGpioR1 [64] =
278 17, 18, 21, 22, 23, 24, 25, 4, // From the Original Wiki - GPIO 0 through 7: wpi 0 - 7
279 0, 1, // I2C - SDA1, SCL1 wpi 8 - 9
280 8, 7, // SPI - CE1, CE0 wpi 10 - 11
281 10, 9, 11, // SPI - MOSI, MISO, SCLK wpi 12 - 14
282 14, 15, // UART - Tx, Rx wpi 15 - 16
286 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 31
287 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47
288 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63
293 static int pinToGpioR2 [64] =
295 17, 18, 27, 22, 23, 24, 25, 4, // From the Original Wiki - GPIO 0 through 7: wpi 0 - 7
296 2, 3, // I2C - SDA0, SCL0 wpi 8 - 9
297 8, 7, // SPI - CE1, CE0 wpi 10 - 11
298 10, 9, 11, // SPI - MOSI, MISO, SCLK wpi 12 - 14
299 14, 15, // UART - Tx, Rx wpi 15 - 16
300 28, 29, 30, 31, // Rev 2: New GPIOs 8 though 11 wpi 17 - 20
301 5, 6, 13, 19, 26, // B+ wpi 21, 22, 23, 24, 25
302 12, 16, 20, 21, // B+ wpi 26, 27, 28, 29
303 0, 1, // B+ wpi 30, 31
307 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47
308 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63
313 // Take a physical pin (1 through 26) and re-map it to the BCM_GPIO pin
314 // Cope for 2 different board revisions here.
315 // Also add in the P5 connector, so the P5 pins are 3,4,5,6, so 53,54,55,56
317 static int *physToGpio ;
319 static int physToGpioR1 [64] =
336 -1, -1, -1, -1, -1, // ... 31
337 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47
338 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63
341 static int physToGpioR2 [64] =
368 // the P5 connector on the Rev 2 boards:
384 // Map a BCM_GPIO pin to it's Function Selection
385 // control port. (GPFSEL 0-5)
386 // Groups of 10 - 3 bits per Function - 30 bits per port
388 static uint8_t gpioToGPFSEL [] =
390 0,0,0,0,0,0,0,0,0,0,
391 1,1,1,1,1,1,1,1,1,1,
392 2,2,2,2,2,2,2,2,2,2,
393 3,3,3,3,3,3,3,3,3,3,
394 4,4,4,4,4,4,4,4,4,4,
395 5,5,5,5,5,5,5,5,5,5,
400 // Define the shift up for the 3 bits per pin in each GPFSEL port
402 static uint8_t gpioToShift [] =
404 0,3,6,9,12,15,18,21,24,27,
405 0,3,6,9,12,15,18,21,24,27,
406 0,3,6,9,12,15,18,21,24,27,
407 0,3,6,9,12,15,18,21,24,27,
408 0,3,6,9,12,15,18,21,24,27,
413 // (Word) offset to the GPIO Set registers for each GPIO pin
415 static uint8_t gpioToGPSET [] =
417 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,
418 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,
422 // (Word) offset to the GPIO Clear registers for each GPIO pin
424 static uint8_t gpioToGPCLR [] =
426 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,
427 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,
432 // (Word) offset to the GPIO Input level registers for each GPIO pin
434 static uint8_t gpioToGPLEV [] =
436 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,
437 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,
443 // (Word) offset to the Event Detect Status
445 static uint8_t gpioToEDS [] =
447 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,
448 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,
452 // (Word) offset to the Rising edge ENable register
454 static uint8_t gpioToREN [] =
456 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,
457 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,
461 // (Word) offset to the Falling edgde ENable register
463 static uint8_t gpioToFEN [] =
465 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,
466 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,
472 // GPIO Pin pull up/down register
477 // (Word) offset to the Pull Up Down Clock regsiter
479 static uint8_t gpioToPUDCLK [] =
481 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,
482 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,
487 // the ALT value to put a GPIO pin into PWM mode
489 static uint8_t gpioToPwmALT [] =
491 0, 0, 0, 0, 0, 0, 0, 0, // 0 -> 7
492 0, 0, 0, 0, FSEL_ALT0, FSEL_ALT0, 0, 0, // 8 -> 15
493 0, 0, FSEL_ALT5, FSEL_ALT5, 0, 0, 0, 0, // 16 -> 23
494 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31
495 0, 0, 0, 0, 0, 0, 0, 0, // 32 -> 39
496 FSEL_ALT0, FSEL_ALT0, 0, 0, 0, FSEL_ALT0, 0, 0, // 40 -> 47
497 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55
498 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63
503 // The port value to put a GPIO pin into PWM mode
505 static uint8_t gpioToPwmPort [] =
507 0, 0, 0, 0, 0, 0, 0, 0, // 0 -> 7
508 0, 0, 0, 0, PWM0_DATA, PWM1_DATA, 0, 0, // 8 -> 15
509 0, 0, PWM0_DATA, PWM1_DATA, 0, 0, 0, 0, // 16 -> 23
510 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31
511 0, 0, 0, 0, 0, 0, 0, 0, // 32 -> 39
512 PWM0_DATA, PWM1_DATA, 0, 0, 0, PWM1_DATA, 0, 0, // 40 -> 47
513 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55
514 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63
519 // ALT value to put a GPIO pin into GP Clock mode.
520 // On the Pi we can really only use BCM_GPIO_4 and BCM_GPIO_21
521 // for clocks 0 and 1 respectively, however I'll include the full
522 // list for completeness - maybe one day...
524 #define GPIO_CLOCK_SOURCE 1
528 static uint8_t gpioToGpClkALT0 [] =
530 0, 0, 0, 0, FSEL_ALT0, FSEL_ALT0, FSEL_ALT0, 0, // 0 -> 7
531 0, 0, 0, 0, 0, 0, 0, 0, // 8 -> 15
532 0, 0, 0, 0, FSEL_ALT5, FSEL_ALT5, 0, 0, // 16 -> 23
533 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31
534 FSEL_ALT0, 0, FSEL_ALT0, 0, 0, 0, 0, 0, // 32 -> 39
535 0, 0, FSEL_ALT0, FSEL_ALT0, FSEL_ALT0, 0, 0, 0, // 40 -> 47
536 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55
537 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63
541 // (word) Offsets to the clock Control and Divisor register
543 static uint8_t gpioToClkCon [] =
545 -1, -1, -1, -1, 28, 30, 32, -1, // 0 -> 7
546 -1, -1, -1, -1, -1, -1, -1, -1, // 8 -> 15
547 -1, -1, -1, -1, 28, 30, -1, -1, // 16 -> 23
548 -1, -1, -1, -1, -1, -1, -1, -1, // 24 -> 31
549 28, -1, 28, -1, -1, -1, -1, -1, // 32 -> 39
550 -1, -1, 28, 30, 28, -1, -1, -1, // 40 -> 47
551 -1, -1, -1, -1, -1, -1, -1, -1, // 48 -> 55
552 -1, -1, -1, -1, -1, -1, -1, -1, // 56 -> 63
555 static uint8_t gpioToClkDiv [] =
557 -1, -1, -1, -1, 29, 31, 33, -1, // 0 -> 7
558 -1, -1, -1, -1, -1, -1, -1, -1, // 8 -> 15
559 -1, -1, -1, -1, 29, 31, -1, -1, // 16 -> 23
560 -1, -1, -1, -1, -1, -1, -1, -1, // 24 -> 31
561 29, -1, 29, -1, -1, -1, -1, -1, // 32 -> 39
562 -1, -1, 29, 31, 29, -1, -1, -1, // 40 -> 47
563 -1, -1, -1, -1, -1, -1, -1, -1, // 48 -> 55
564 -1, -1, -1, -1, -1, -1, -1, -1, // 56 -> 63
570 *********************************************************************************
577 *********************************************************************************
580 int wiringPiFailure (int fatal, const char *message, ...)
585 if (!fatal && wiringPiReturnCodes)
588 va_start (argp, message) ;
589 vsnprintf (buffer, 1023, message, argp) ;
592 fprintf (stderr, "%s", buffer) ;
593 exit (EXIT_FAILURE) ;
601 * Return a number representing the hardware revision of the board.
603 * Revision 1 really means the early Model B's.
604 * Revision 2 is everything else - it covers the B, B+ and CM.
606 * Seems there are some boards with 0000 in them (mistake in manufacture)
607 * So the distinction between boards that I can see is:
610 * 0002 - Model B, Rev 1, 256MB, Egoman
611 * 0003 - Model B, Rev 1.1, 256MB, Egoman, Fuses/D14 removed.
612 * 0004 - Model B, Rev 2, 256MB, Sony
613 * 0005 - Model B, Rev 2, 256MB, Qisda
614 * 0006 - Model B, Rev 2, 256MB, Egoman
615 * 0007 - Model A, Rev 2, 256MB, Egoman
616 * 0008 - Model A, Rev 2, 256MB, Sony
617 * 0009 - Model A, Rev 2, 256MB, Qisda
618 * 000d - Model B, Rev 2, 512MB, Egoman
619 * 000e - Model B, Rev 2, 512MB, Sony
620 * 000f - Model B, Rev 2, 512MB, Qisda
621 * 0010 - Model B+, Rev 1.2, 512MB, Sony
622 * 0011 - Pi CM, Rev 1.2, 512MB, Sony
624 * A small thorn is the olde style overvolting - that will add in
627 * The Pi compute module has an revision of 0011 - since we only check the
628 * last digit, then it's 1, therefore it'll default to not 2 or 3 for a
629 * Rev 1, so will appear as a Rev 2. This is fine for the most part, but
630 * we'll properly detect the Compute Module later and adjust accordingly.
632 *********************************************************************************
635 static void piBoardRevOops (const char *why)
637 fprintf (stderr, "piBoardRev: Unable to determine board revision from /proc/cpuinfo\n") ;
638 fprintf (stderr, " -> %s\n", why) ;
639 fprintf (stderr, " -> You may want to check:\n") ;
640 fprintf (stderr, " -> http://www.raspberrypi.org/phpBB3/viewtopic.php?p=184410#p184410\n") ;
641 exit (EXIT_FAILURE) ;
644 int piBoardRev (void)
649 static int boardRev = -1 ;
651 if (boardRev != -1) // No point checking twice
654 if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL)
655 piBoardRevOops ("Unable to open /proc/cpuinfo") ;
657 while (fgets (line, 120, cpuFd) != NULL)
658 if (strncmp (line, "Revision", 8) == 0)
663 if (strncmp (line, "Revision", 8) != 0)
664 piBoardRevOops ("No \"Revision\" line") ;
666 // Chomp trailing CR/NL
668 for (c = &line [strlen (line) - 1] ; (*c == '\n') || (*c == '\r') ; --c)
672 printf ("piboardRev: Revision string: %s\n", line) ;
674 // Scan to first digit
676 for (c = line ; *c ; ++c)
681 piBoardRevOops ("No numeric revision string") ;
683 // Make sure its long enough
686 piBoardRevOops ("Bogus \"Revision\" line (too small)") ;
688 // If you have overvolted the Pi, then it appears that the revision
689 // has 100000 added to it!
693 printf ("piboardRev: This Pi has/is overvolted!\n") ;
695 // Isolate last 4 characters:
697 c = c + strlen (c) - 4 ;
700 printf ("piboardRev: last4Chars are: \"%s\"\n", c) ;
702 if ( (strcmp (c, "0002") == 0) || (strcmp (c, "0003") == 0))
708 printf ("piBoardRev: Returning revision: %d\n", boardRev) ;
716 * Do more digging into the board revision string as above, but return
717 * as much details as we can.
718 * This is undocumented and really only intended for the GPIO command.
719 * Use at your own risk!
720 *********************************************************************************
723 void piBoardId (int *model, int *rev, int *mem, int *maker, int *overVolted)
729 (void)piBoardRev () ; // Call this first to make sure all's OK. Don't care about the result.
731 if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL)
732 piBoardRevOops ("Unable to open /proc/cpuinfo") ;
734 while (fgets (line, 120, cpuFd) != NULL)
735 if (strncmp (line, "Revision", 8) == 0)
740 if (strncmp (line, "Revision", 8) != 0)
741 piBoardRevOops ("No \"Revision\" line") ;
743 // Chomp trailing CR/NL
745 for (c = &line [strlen (line) - 1] ; (*c == '\n') || (*c == '\r') ; --c)
749 printf ("piboardId: Revision string: %s\n", line) ;
751 // Scan to first digit
753 for (c = line ; *c ; ++c)
757 // Make sure its long enough
760 piBoardRevOops ("Bogus \"Revision\" line") ;
762 // If longer than 4, we'll assume it's been overvolted
764 *overVolted = strlen (c) > 4 ;
766 // Extract last 4 characters:
768 c = c + strlen (c) - 4 ;
770 // Fill out the replys as appropriate
772 /**/ if (strcmp (c, "0002") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1 ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; }
773 else if (strcmp (c, "0003") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_1 ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; }
774 else if (strcmp (c, "0004") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_SONY ; }
775 else if (strcmp (c, "0005") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_QISDA ; }
776 else if (strcmp (c, "0006") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; }
777 else if (strcmp (c, "0007") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; }
778 else if (strcmp (c, "0008") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_SONY ; ; }
779 else if (strcmp (c, "0009") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_QISDA ; }
780 else if (strcmp (c, "000d") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 512 ; *maker = PI_MAKER_EGOMAN ; }
781 else if (strcmp (c, "000e") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 512 ; *maker = PI_MAKER_SONY ; }
782 else if (strcmp (c, "000f") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 512 ; *maker = PI_MAKER_EGOMAN ; }
783 else if (strcmp (c, "0010") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 512 ; *maker = PI_MAKER_SONY ; }
784 else if (strcmp (c, "0011") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_2 ; *mem = 512 ; *maker = PI_MAKER_SONY ; }
785 else { *model = 0 ; *rev = 0 ; *mem = 0 ; *maker = 0 ; }
792 * Translate a wiringPi Pin number to native GPIO pin number.
793 * Provided for external support.
794 *********************************************************************************
797 int wpiPinToGpio (int wpiPin)
799 return pinToGpio [wpiPin & 63] ;
805 * Translate a physical Pin number to native GPIO pin number.
806 * Provided for external support.
807 *********************************************************************************
810 int physPinToGpio (int physPin)
812 return physToGpio [physPin & 63] ;
818 * Set the PAD driver value
819 *********************************************************************************
822 void setPadDrive (int group, int value)
826 if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO))
828 if ((group < 0) || (group > 2))
831 wrVal = BCM_PASSWORD | 0x18 | (value & 7) ;
832 *(pads + group + 11) = wrVal ;
836 printf ("setPadDrive: Group: %d, value: %d (%08X)\n", group, value, wrVal) ;
837 printf ("Read : %08X\n", *(pads + group + 11)) ;
845 * Returns the ALT bits for a given port. Only really of-use
846 * for the gpio readall command (I think)
847 *********************************************************************************
852 int fSel, shift, alt ;
856 /**/ if (wiringPiMode == WPI_MODE_PINS)
857 pin = pinToGpio [pin] ;
858 else if (wiringPiMode == WPI_MODE_PHYS)
859 pin = physToGpio [pin] ;
860 else if (wiringPiMode != WPI_MODE_GPIO)
863 fSel = gpioToGPFSEL [pin] ;
864 shift = gpioToShift [pin] ;
866 alt = (*(gpio + fSel) >> shift) & 7 ;
874 * Select the native "balanced" mode, or standard mark:space mode
875 *********************************************************************************
878 void pwmSetMode (int mode)
880 if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO))
882 if (mode == PWM_MODE_MS)
883 *(pwm + PWM_CONTROL) = PWM0_ENABLE | PWM1_ENABLE | PWM0_MS_MODE | PWM1_MS_MODE ;
885 *(pwm + PWM_CONTROL) = PWM0_ENABLE | PWM1_ENABLE ;
892 * Set the PWM range register. We set both range registers to the same
893 * value. If you want different in your own code, then write your own.
894 *********************************************************************************
897 void pwmSetRange (unsigned int range)
899 if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO))
901 *(pwm + PWM0_RANGE) = range ; delayMicroseconds (10) ;
902 *(pwm + PWM1_RANGE) = range ; delayMicroseconds (10) ;
909 * Set/Change the PWM clock. Originally my code, but changed
910 * (for the better!) by Chris Hall, <chris@kchall.plus.com>
911 * after further study of the manual and testing with a 'scope
912 *********************************************************************************
915 void pwmSetClock (int divisor)
917 uint32_t pwm_control ;
920 if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO))
923 printf ("Setting to: %d. Current: 0x%08X\n", divisor, *(clk + PWMCLK_DIV)) ;
925 pwm_control = *(pwm + PWM_CONTROL) ; // preserve PWM_CONTROL
927 // We need to stop PWM prior to stopping PWM clock in MS mode otherwise BUSY
930 *(pwm + PWM_CONTROL) = 0 ; // Stop PWM
932 // Stop PWM clock before changing divisor. The delay after this does need to
933 // this big (95uS occasionally fails, 100uS OK), it's almost as though the BUSY
934 // flag is not working properly in balanced mode. Without the delay when DIV is
935 // adjusted the clock sometimes switches to very slow, once slow further DIV
936 // adjustments do nothing and it's difficult to get out of this mode.
938 *(clk + PWMCLK_CNTL) = BCM_PASSWORD | 0x01 ; // Stop PWM Clock
939 delayMicroseconds (110) ; // prevents clock going sloooow
941 while ((*(clk + PWMCLK_CNTL) & 0x80) != 0) // Wait for clock to be !BUSY
942 delayMicroseconds (1) ;
944 *(clk + PWMCLK_DIV) = BCM_PASSWORD | (divisor << 12) ;
946 *(clk + PWMCLK_CNTL) = BCM_PASSWORD | 0x11 ; // Start PWM clock
947 *(pwm + PWM_CONTROL) = pwm_control ; // restore PWM_CONTROL
950 printf ("Set to: %d. Now : 0x%08X\n", divisor, *(clk + PWMCLK_DIV)) ;
957 * Set the freuency on a GPIO clock pin
958 *********************************************************************************
961 void gpioClockSet (int pin, int freq)
963 int divi, divr, divf ;
967 /**/ if (wiringPiMode == WPI_MODE_PINS)
968 pin = pinToGpio [pin] ;
969 else if (wiringPiMode == WPI_MODE_PHYS)
970 pin = physToGpio [pin] ;
971 else if (wiringPiMode != WPI_MODE_GPIO)
974 divi = 19200000 / freq ;
975 divr = 19200000 % freq ;
976 divf = (int)((double)divr * 4096.0 / 19200000.0) ;
981 *(clk + gpioToClkCon [pin]) = BCM_PASSWORD | GPIO_CLOCK_SOURCE ; // Stop GPIO Clock
982 while ((*(clk + gpioToClkCon [pin]) & 0x80) != 0) // ... and wait
985 *(clk + gpioToClkDiv [pin]) = BCM_PASSWORD | (divi << 12) | divf ; // Set dividers
986 *(clk + gpioToClkCon [pin]) = BCM_PASSWORD | 0x10 | GPIO_CLOCK_SOURCE ; // Start Clock
992 * Locate our device node
993 *********************************************************************************
996 struct wiringPiNodeStruct *wiringPiFindNode (int pin)
998 struct wiringPiNodeStruct *node = wiringPiNodes ;
1000 while (node != NULL)
1001 if ((pin >= node->pinBase) && (pin <= node->pinMax))
1012 * Create a new GPIO node into the wiringPi handling system
1013 *********************************************************************************
1016 static void pinModeDummy (struct wiringPiNodeStruct *node, int pin, int mode) { return ; }
1017 static void pullUpDnControlDummy (struct wiringPiNodeStruct *node, int pin, int pud) { return ; }
1018 static int digitalReadDummy (struct wiringPiNodeStruct *node, int pin) { return LOW ; }
1019 static void digitalWriteDummy (struct wiringPiNodeStruct *node, int pin, int value) { return ; }
1020 static void pwmWriteDummy (struct wiringPiNodeStruct *node, int pin, int value) { return ; }
1021 static int analogReadDummy (struct wiringPiNodeStruct *node, int pin) { return 0 ; }
1022 static void analogWriteDummy (struct wiringPiNodeStruct *node, int pin, int value) { return ; }
1024 struct wiringPiNodeStruct *wiringPiNewNode (int pinBase, int numPins)
1027 struct wiringPiNodeStruct *node ;
1029 // Minimum pin base is 64
1032 (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: pinBase of %d is < 64\n", pinBase) ;
1034 // Check all pins in-case there is overlap:
1036 for (pin = pinBase ; pin < (pinBase + numPins) ; ++pin)
1037 if (wiringPiFindNode (pin) != NULL)
1038 (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: Pin %d overlaps with existing definition\n", pin) ;
1040 node = (struct wiringPiNodeStruct *)calloc (sizeof (struct wiringPiNodeStruct), 1) ; // calloc zeros
1042 (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: Unable to allocate memory: %s\n", strerror (errno)) ;
1044 node->pinBase = pinBase ;
1045 node->pinMax = pinBase + numPins - 1 ;
1046 node->pinMode = pinModeDummy ;
1047 node->pullUpDnControl = pullUpDnControlDummy ;
1048 node->digitalRead = digitalReadDummy ;
1049 node->digitalWrite = digitalWriteDummy ;
1050 node->pwmWrite = pwmWriteDummy ;
1051 node->analogRead = analogReadDummy ;
1052 node->analogWrite = analogWriteDummy ;
1053 node->next = wiringPiNodes ;
1054 wiringPiNodes = node ;
1064 * Enables edge-detect mode on a pin - from a 0 to a 1 or 1 to 0
1065 * Pin must already be in input mode with appropriate pull up/downs set.
1066 *********************************************************************************
1069 void pinEnableED01Pi (int pin)
1071 pin = pinToGpio [pin & 63] ;
1077 *********************************************************************************
1079 *********************************************************************************
1084 * This is an un-documented special to let you set any pin to any mode
1085 *********************************************************************************
1088 void pinModeAlt (int pin, int mode)
1092 if ((pin & PI_GPIO_MASK) == 0) // On-board pin
1094 /**/ if (wiringPiMode == WPI_MODE_PINS)
1095 pin = pinToGpio [pin] ;
1096 else if (wiringPiMode == WPI_MODE_PHYS)
1097 pin = physToGpio [pin] ;
1098 else if (wiringPiMode != WPI_MODE_GPIO)
1101 fSel = gpioToGPFSEL [pin] ;
1102 shift = gpioToShift [pin] ;
1104 *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | ((mode & 0x7) << shift) ;
1111 * Sets the mode of a pin to be input, output or PWM output
1112 *********************************************************************************
1115 void pinMode (int pin, int mode)
1117 int fSel, shift, alt ;
1118 struct wiringPiNodeStruct *node = wiringPiNodes ;
1121 if ((pin & PI_GPIO_MASK) == 0) // On-board pin
1123 /**/ if (wiringPiMode == WPI_MODE_PINS)
1124 pin = pinToGpio [pin] ;
1125 else if (wiringPiMode == WPI_MODE_PHYS)
1126 pin = physToGpio [pin] ;
1127 else if (wiringPiMode != WPI_MODE_GPIO)
1130 softPwmStop (origPin) ;
1131 softToneStop (origPin) ;
1133 fSel = gpioToGPFSEL [pin] ;
1134 shift = gpioToShift [pin] ;
1136 /**/ if (mode == INPUT)
1137 *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) ; // Sets bits to zero = input
1138 else if (mode == OUTPUT)
1139 *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (1 << shift) ;
1140 else if (mode == SOFT_PWM_OUTPUT)
1141 softPwmCreate (origPin, 0, 100) ;
1142 else if (mode == SOFT_TONE_OUTPUT)
1143 softToneCreate (origPin) ;
1144 else if (mode == PWM_TONE_OUTPUT)
1146 pinMode (origPin, PWM_OUTPUT) ; // Call myself to enable PWM mode
1147 pwmSetMode (PWM_MODE_MS) ;
1149 else if (mode == PWM_OUTPUT)
1151 if ((alt = gpioToPwmALT [pin]) == 0) // Not a hardware capable PWM pin
1154 // Set pin to PWM mode
1156 *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (alt << shift) ;
1157 delayMicroseconds (110) ; // See comments in pwmSetClockWPi
1159 pwmSetMode (PWM_MODE_BAL) ; // Pi default mode
1160 pwmSetRange (1024) ; // Default range of 1024
1161 pwmSetClock (32) ; // 19.2 / 32 = 600KHz - Also starts the PWM
1163 else if (mode == GPIO_CLOCK)
1165 if ((alt = gpioToGpClkALT0 [pin]) == 0) // Not a GPIO_CLOCK pin
1168 // Set pin to GPIO_CLOCK mode and set the clock frequency to 100KHz
1170 *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (alt << shift) ;
1171 delayMicroseconds (110) ;
1172 gpioClockSet (pin, 100000) ;
1177 if ((node = wiringPiFindNode (pin)) != NULL)
1178 node->pinMode (node, pin, mode) ;
1186 * Control the internal pull-up/down resistors on a GPIO pin
1187 * The Arduino only has pull-ups and these are enabled by writing 1
1188 * to a port when in input mode - this paradigm doesn't quite apply
1190 *********************************************************************************
1193 void pullUpDnControl (int pin, int pud)
1195 struct wiringPiNodeStruct *node = wiringPiNodes ;
1197 if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin
1199 /**/ if (wiringPiMode == WPI_MODE_PINS)
1200 pin = pinToGpio [pin] ;
1201 else if (wiringPiMode == WPI_MODE_PHYS)
1202 pin = physToGpio [pin] ;
1203 else if (wiringPiMode != WPI_MODE_GPIO)
1206 *(gpio + GPPUD) = pud & 3 ; delayMicroseconds (5) ;
1207 *(gpio + gpioToPUDCLK [pin]) = 1 << (pin & 31) ; delayMicroseconds (5) ;
1209 *(gpio + GPPUD) = 0 ; delayMicroseconds (5) ;
1210 *(gpio + gpioToPUDCLK [pin]) = 0 ; delayMicroseconds (5) ;
1212 else // Extension module
1214 if ((node = wiringPiFindNode (pin)) != NULL)
1215 node->pullUpDnControl (node, pin, pud) ;
1223 * Read the value of a given Pin, returning HIGH or LOW
1224 *********************************************************************************
1227 int digitalRead (int pin)
1230 struct wiringPiNodeStruct *node = wiringPiNodes ;
1232 if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin
1234 /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode
1236 if (sysFds [pin] == -1)
1239 lseek (sysFds [pin], 0L, SEEK_SET) ;
1240 read (sysFds [pin], &c, 1) ;
1241 return (c == '0') ? LOW : HIGH ;
1243 else if (wiringPiMode == WPI_MODE_PINS)
1244 pin = pinToGpio [pin] ;
1245 else if (wiringPiMode == WPI_MODE_PHYS)
1246 pin = physToGpio [pin] ;
1247 else if (wiringPiMode != WPI_MODE_GPIO)
1250 if ((*(gpio + gpioToGPLEV [pin]) & (1 << (pin & 31))) != 0)
1257 if ((node = wiringPiFindNode (pin)) == NULL)
1259 return node->digitalRead (node, pin) ;
1267 *********************************************************************************
1270 void digitalWrite (int pin, int value)
1272 struct wiringPiNodeStruct *node = wiringPiNodes ;
1274 if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin
1276 /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode
1278 if (sysFds [pin] != -1)
1281 write (sysFds [pin], "0\n", 2) ;
1283 write (sysFds [pin], "1\n", 2) ;
1287 else if (wiringPiMode == WPI_MODE_PINS)
1288 pin = pinToGpio [pin] ;
1289 else if (wiringPiMode == WPI_MODE_PHYS)
1290 pin = physToGpio [pin] ;
1291 else if (wiringPiMode != WPI_MODE_GPIO)
1295 *(gpio + gpioToGPCLR [pin]) = 1 << (pin & 31) ;
1297 *(gpio + gpioToGPSET [pin]) = 1 << (pin & 31) ;
1301 if ((node = wiringPiFindNode (pin)) != NULL)
1302 node->digitalWrite (node, pin, value) ;
1309 * Set an output PWM value
1310 *********************************************************************************
1313 void pwmWrite (int pin, int value)
1315 struct wiringPiNodeStruct *node = wiringPiNodes ;
1317 if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin
1319 /**/ if (wiringPiMode == WPI_MODE_PINS)
1320 pin = pinToGpio [pin] ;
1321 else if (wiringPiMode == WPI_MODE_PHYS)
1322 pin = physToGpio [pin] ;
1323 else if (wiringPiMode != WPI_MODE_GPIO)
1326 *(pwm + gpioToPwmPort [pin]) = value ;
1330 if ((node = wiringPiFindNode (pin)) != NULL)
1331 node->pwmWrite (node, pin, value) ;
1338 * Read the analog value of a given Pin.
1339 * There is no on-board Pi analog hardware,
1340 * so this needs to go to a new node.
1341 *********************************************************************************
1344 int analogRead (int pin)
1346 struct wiringPiNodeStruct *node = wiringPiNodes ;
1348 if ((node = wiringPiFindNode (pin)) == NULL)
1351 return node->analogRead (node, pin) ;
1357 * Write the analog value to the given Pin.
1358 * There is no on-board Pi analog hardware,
1359 * so this needs to go to a new node.
1360 *********************************************************************************
1363 void analogWrite (int pin, int value)
1365 struct wiringPiNodeStruct *node = wiringPiNodes ;
1367 if ((node = wiringPiFindNode (pin)) == NULL)
1370 node->analogWrite (node, pin, value) ;
1377 * Output the given frequency on the Pi's PWM pin
1378 *********************************************************************************
1381 void pwmToneWrite (int pin, int freq)
1386 pwmWrite (pin, 0) ; // Off
1389 range = 600000 / freq ;
1390 pwmSetRange (range) ;
1391 pwmWrite (pin, freq / 2) ;
1400 * Write an 8-bit byte to the first 8 GPIO pins - try to do it as
1402 * However it still needs 2 operations to set the bits, so any external
1403 * hardware must not rely on seeing a change as there will be a change
1404 * to set the outputs bits to zero, then another change to set the 1's
1405 *********************************************************************************
1408 void digitalWriteByte (int value)
1410 uint32_t pinSet = 0 ;
1411 uint32_t pinClr = 0 ;
1415 /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS)
1417 for (pin = 0 ; pin < 8 ; ++pin)
1419 digitalWrite (pin, value & mask) ;
1426 for (pin = 0 ; pin < 8 ; ++pin)
1428 if ((value & mask) == 0)
1429 pinClr |= (1 << pinToGpio [pin]) ;
1431 pinSet |= (1 << pinToGpio [pin]) ;
1436 *(gpio + gpioToGPCLR [0]) = pinClr ;
1437 *(gpio + gpioToGPSET [0]) = pinSet ;
1445 * Wait for Interrupt on a GPIO pin.
1446 * This is actually done via the /sys/class/gpio interface regardless of
1447 * the wiringPi access mode in-use. Maybe sometime it might get a better
1448 * way for a bit more efficiency.
1449 *********************************************************************************
1452 int waitForInterrupt (int pin, int mS)
1456 struct pollfd polls ;
1458 /**/ if (wiringPiMode == WPI_MODE_PINS)
1459 pin = pinToGpio [pin] ;
1460 else if (wiringPiMode == WPI_MODE_PHYS)
1461 pin = physToGpio [pin] ;
1463 if ((fd = sysFds [pin]) == -1)
1466 // Setup poll structure
1469 polls.events = POLLPRI ; // Urgent data!
1473 x = poll (&polls, 1, mS) ;
1475 // Do a dummy read to clear the interrupt
1476 // A one character read appars to be enough.
1478 (void)read (fd, &c, 1) ;
1486 * This is a thread and gets started to wait for the interrupt we're
1487 * hoping to catch. It will call the user-function when the interrupt
1489 *********************************************************************************
1492 static void *interruptHandler (void *arg)
1496 (void)piHiPri (55) ; // Only effective if we run as root
1502 if (waitForInterrupt (myPin, -1) > 0)
1503 isrFunctions [myPin] () ;
1512 * Take the details and create an interrupt handler that will do a call-
1513 * back to the user supplied function.
1514 *********************************************************************************
1517 int wiringPiISR (int pin, int mode, void (*function)(void))
1519 pthread_t threadId ;
1528 if ((pin < 0) || (pin > 63))
1529 return wiringPiFailure (WPI_FATAL, "wiringPiISR: pin must be 0-63 (%d)\n", pin) ;
1531 /**/ if (wiringPiMode == WPI_MODE_UNINITIALISED)
1532 return wiringPiFailure (WPI_FATAL, "wiringPiISR: wiringPi has not been initialised. Unable to continue.\n") ;
1533 else if (wiringPiMode == WPI_MODE_PINS)
1534 bcmGpioPin = pinToGpio [pin] ;
1535 else if (wiringPiMode == WPI_MODE_PHYS)
1536 bcmGpioPin = physToGpio [pin] ;
1540 // Now export the pin and set the right edge
1541 // We're going to use the gpio program to do this, so it assumes
1542 // a full installation of wiringPi. It's a bit 'clunky', but it
1543 // is a way that will work when we're running in "Sys" mode, as
1544 // a non-root user. (without sudo)
1546 if (mode != INT_EDGE_SETUP)
1548 /**/ if (mode == INT_EDGE_FALLING)
1550 else if (mode == INT_EDGE_RISING)
1555 sprintf (pinS, "%d", bcmGpioPin) ;
1557 if ((pid = fork ()) < 0) // Fail
1558 return wiringPiFailure (WPI_FATAL, "wiringPiISR: fork failed: %s\n", strerror (errno)) ;
1560 if (pid == 0) // Child, exec
1562 /**/ if (access ("/usr/local/bin/gpio", X_OK) == 0)
1564 execl ("/usr/local/bin/gpio", "gpio", "edge", pinS, modeS, (char *)NULL) ;
1565 return wiringPiFailure (WPI_FATAL, "wiringPiISR: execl failed: %s\n", strerror (errno)) ;
1567 else if (access ("/usr/bin/gpio", X_OK) == 0)
1569 execl ("/usr/bin/gpio", "gpio", "edge", pinS, modeS, (char *)NULL) ;
1570 return wiringPiFailure (WPI_FATAL, "wiringPiISR: execl failed: %s\n", strerror (errno)) ;
1573 return wiringPiFailure (WPI_FATAL, "wiringPiISR: Can't find gpio program\n") ;
1575 else // Parent, wait
1579 // Now pre-open the /sys/class node - but it may already be open if
1580 // we are in Sys mode...
1582 if (sysFds [bcmGpioPin] == -1)
1584 sprintf (fName, "/sys/class/gpio/gpio%d/value", bcmGpioPin) ;
1585 if ((sysFds [bcmGpioPin] = open (fName, O_RDWR)) < 0)
1586 return wiringPiFailure (WPI_FATAL, "wiringPiISR: unable to open %s: %s\n", fName, strerror (errno)) ;
1589 // Clear any initial pending interrupt
1591 ioctl (sysFds [bcmGpioPin], FIONREAD, &count) ;
1592 for (i = 0 ; i < count ; ++i)
1593 read (sysFds [bcmGpioPin], &c, 1) ;
1595 isrFunctions [pin] = function ;
1597 pthread_mutex_lock (&pinMutex) ;
1599 pthread_create (&threadId, NULL, interruptHandler, NULL) ;
1600 while (pinPass != -1)
1602 pthread_mutex_unlock (&pinMutex) ;
1610 * Initialise our start-of-time variable to be the current unix
1611 * time in milliseconds and microseconds.
1612 *********************************************************************************
1615 static void initialiseEpoch (void)
1619 gettimeofday (&tv, NULL) ;
1620 epochMilli = (uint64_t)tv.tv_sec * (uint64_t)1000 + (uint64_t)(tv.tv_usec / 1000) ;
1621 epochMicro = (uint64_t)tv.tv_sec * (uint64_t)1000000 + (uint64_t)(tv.tv_usec) ;
1627 * Wait for some number of milliseconds
1628 *********************************************************************************
1631 void delay (unsigned int howLong)
1633 struct timespec sleeper, dummy ;
1635 sleeper.tv_sec = (time_t)(howLong / 1000) ;
1636 sleeper.tv_nsec = (long)(howLong % 1000) * 1000000 ;
1638 nanosleep (&sleeper, &dummy) ;
1643 * delayMicroseconds:
1644 * This is somewhat intersting. It seems that on the Pi, a single call
1645 * to nanosleep takes some 80 to 130 microseconds anyway, so while
1646 * obeying the standards (may take longer), it's not always what we
1649 * So what I'll do now is if the delay is less than 100uS we'll do it
1650 * in a hard loop, watching a built-in counter on the ARM chip. This is
1651 * somewhat sub-optimal in that it uses 100% CPU, something not an issue
1652 * in a microcontroller, but under a multi-tasking, multi-user OS, it's
1653 * wastefull, however we've no real choice )-:
1655 * Plan B: It seems all might not be well with that plan, so changing it
1656 * to use gettimeofday () and poll on that instead...
1657 *********************************************************************************
1660 void delayMicrosecondsHard (unsigned int howLong)
1662 struct timeval tNow, tLong, tEnd ;
1664 gettimeofday (&tNow, NULL) ;
1665 tLong.tv_sec = howLong / 1000000 ;
1666 tLong.tv_usec = howLong % 1000000 ;
1667 timeradd (&tNow, &tLong, &tEnd) ;
1669 while (timercmp (&tNow, &tEnd, <))
1670 gettimeofday (&tNow, NULL) ;
1673 void delayMicroseconds (unsigned int howLong)
1675 struct timespec sleeper ;
1676 unsigned int uSecs = howLong % 1000000 ;
1677 unsigned int wSecs = howLong / 1000000 ;
1679 /**/ if (howLong == 0)
1681 else if (howLong < 100)
1682 delayMicrosecondsHard (howLong) ;
1685 sleeper.tv_sec = wSecs ;
1686 sleeper.tv_nsec = (long)(uSecs * 1000L) ;
1687 nanosleep (&sleeper, NULL) ;
1694 * Return a number of milliseconds as an unsigned int.
1695 *********************************************************************************
1698 unsigned int millis (void)
1703 gettimeofday (&tv, NULL) ;
1704 now = (uint64_t)tv.tv_sec * (uint64_t)1000 + (uint64_t)(tv.tv_usec / 1000) ;
1706 return (uint32_t)(now - epochMilli) ;
1712 * Return a number of microseconds as an unsigned int.
1713 *********************************************************************************
1716 unsigned int micros (void)
1721 gettimeofday (&tv, NULL) ;
1722 now = (uint64_t)tv.tv_sec * (uint64_t)1000000 + (uint64_t)tv.tv_usec ;
1724 return (uint32_t)(now - epochMicro) ;
1730 * Must be called once at the start of your program execution.
1732 * Default setup: Initialises the system into wiringPi Pin mode and uses the
1733 * memory mapped hardware directly.
1735 * Changed now to revert to "gpio" mode if we're running on a Compute Module.
1736 *********************************************************************************
1739 int wiringPiSetup (void)
1743 int model, rev, mem, maker, overVolted ;
1745 if (getenv (ENV_DEBUG) != NULL)
1746 wiringPiDebug = TRUE ;
1748 if (getenv (ENV_CODES) != NULL)
1749 wiringPiReturnCodes = TRUE ;
1751 if (geteuid () != 0)
1752 (void)wiringPiFailure (WPI_FATAL, "wiringPiSetup: Must be root. (Did you forget sudo?)\n") ;
1755 printf ("wiringPi: wiringPiSetup called\n") ;
1757 boardRev = piBoardRev () ;
1759 /**/ if (boardRev == 1) // A, B, Rev 1, 1.1
1761 pinToGpio = pinToGpioR1 ;
1762 physToGpio = physToGpioR1 ;
1764 else // A, B, Rev 2, B+, CM
1766 pinToGpio = pinToGpioR2 ;
1767 physToGpio = physToGpioR2 ;
1770 // Open the master /dev/memory device
1772 if ((fd = open ("/dev/mem", O_RDWR | O_SYNC | O_CLOEXEC) ) < 0)
1773 return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: Unable to open /dev/mem: %s\n", strerror (errno)) ;
1777 gpio = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_BASE) ;
1778 if ((int32_t)gpio == -1)
1779 return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (GPIO) failed: %s\n", strerror (errno)) ;
1783 pwm = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_PWM) ;
1784 if ((int32_t)pwm == -1)
1785 return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (PWM) failed: %s\n", strerror (errno)) ;
1787 // Clock control (needed for PWM)
1789 clk = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, CLOCK_BASE) ;
1790 if ((int32_t)clk == -1)
1791 return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (CLOCK) failed: %s\n", strerror (errno)) ;
1795 pads = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_PADS) ;
1796 if ((int32_t)pads == -1)
1797 return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (PADS) failed: %s\n", strerror (errno)) ;
1802 timer = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_TIMER) ;
1803 if ((int32_t)timer == -1)
1804 return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (TIMER) failed: %s\n", strerror (errno)) ;
1806 // Set the timer to free-running, 1MHz.
1807 // 0xF9 is 249, the timer divide is base clock / (divide+1)
1808 // so base clock is 250MHz / 250 = 1MHz.
1810 *(timer + TIMER_CONTROL) = 0x0000280 ;
1811 *(timer + TIMER_PRE_DIV) = 0x00000F9 ;
1812 timerIrqRaw = timer + TIMER_IRQ_RAW ;
1815 initialiseEpoch () ;
1817 // If we're running on a compute module, then wiringPi pin numbers don't really many anything...
1819 piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
1820 if (model == PI_MODEL_CM)
1821 wiringPiMode = WPI_MODE_GPIO ;
1823 wiringPiMode = WPI_MODE_PINS ;
1830 * wiringPiSetupGpio:
1831 * Must be called once at the start of your program execution.
1833 * GPIO setup: Initialises the system into GPIO Pin mode and uses the
1834 * memory mapped hardware directly.
1835 *********************************************************************************
1838 int wiringPiSetupGpio (void)
1840 (void)wiringPiSetup () ;
1843 printf ("wiringPi: wiringPiSetupGpio called\n") ;
1845 wiringPiMode = WPI_MODE_GPIO ;
1852 * wiringPiSetupPhys:
1853 * Must be called once at the start of your program execution.
1855 * Phys setup: Initialises the system into Physical Pin mode and uses the
1856 * memory mapped hardware directly.
1857 *********************************************************************************
1860 int wiringPiSetupPhys (void)
1862 (void)wiringPiSetup () ;
1865 printf ("wiringPi: wiringPiSetupPhys called\n") ;
1867 wiringPiMode = WPI_MODE_PHYS ;
1875 * Must be called once at the start of your program execution.
1877 * Initialisation (again), however this time we are using the /sys/class/gpio
1878 * interface to the GPIO systems - slightly slower, but always usable as
1879 * a non-root user, assuming the devices are already exported and setup correctly.
1882 int wiringPiSetupSys (void)
1888 if (getenv (ENV_DEBUG) != NULL)
1889 wiringPiDebug = TRUE ;
1891 if (getenv (ENV_CODES) != NULL)
1892 wiringPiReturnCodes = TRUE ;
1895 printf ("wiringPi: wiringPiSetupSys called\n") ;
1897 boardRev = piBoardRev () ;
1901 pinToGpio = pinToGpioR1 ;
1902 physToGpio = physToGpioR1 ;
1906 pinToGpio = pinToGpioR2 ;
1907 physToGpio = physToGpioR2 ;
1910 // Open and scan the directory, looking for exported GPIOs, and pre-open
1911 // the 'value' interface to speed things up for later
1913 for (pin = 0 ; pin < 64 ; ++pin)
1915 sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ;
1916 sysFds [pin] = open (fName, O_RDWR) ;
1919 initialiseEpoch () ;
1921 wiringPiMode = WPI_MODE_GPIO_SYS ;