3 * Swiss-Army-Knife, Set-UID command-line interface to the Raspberry
5 * Copyright (c) 2012-2013 Gordon Henderson
6 ***********************************************************************
7 * This file is part of wiringPi:
8 * https://projects.drogon.net/raspberry-pi/wiringpi/
10 * wiringPi is free software: you can redistribute it and/or modify
11 * it under the terms of the GNU Lesser General Public License as published by
12 * the Free Software Foundation, either version 3 of the License, or
13 * (at your option) any later version.
15 * wiringPi is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public License
21 * along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
22 ***********************************************************************
34 #include <sys/types.h>
39 #include <gertboard.h>
42 #include "extensions.h"
44 extern int wiringPiDebug ;
51 #define VERSION "2.02"
52 #define I2CDETECT "/usr/sbin/i2cdetect"
56 char *usage = "Usage: gpio -v\n"
58 " gpio [-g|-1] [-x extension:params] ...\n"
59 " gpio [-p] <read/write/wb> ...\n"
60 " gpio <read/write/aread/awritewb/pwm/clock/mode> ...\n"
61 " gpio readall/reset\n"
62 " gpio unexportall/exports\n"
63 " gpio export/edge/unexport ...\n"
64 " gpio wfi <pin> <mode>\n"
65 " gpio drive <group> <value>\n"
66 " gpio pwm-bal/pwm-ms \n"
67 " gpio pwmr <range> \n"
68 " gpio pwmc <divider> \n"
69 " gpio load spi/i2c\n"
70 " gpio i2cd/i2cdetect\n"
71 " gpio gbr <channel>\n"
72 " gpio gbw <channel> <value>" ; // No trailing newline needed here.
77 * Change the ownership of the file to the real userId of the calling
78 * program so we can access it.
79 *********************************************************************************
82 static void changeOwner (char *cmd, char *file)
84 uid_t uid = getuid () ;
85 uid_t gid = getgid () ;
87 if (chown (file, uid, gid) != 0)
89 if (errno == ENOENT) // Warn that it's not there
90 fprintf (stderr, "%s: Warning: File not present: %s\n", cmd, file) ;
93 fprintf (stderr, "%s: Unable to change ownership of %s: %s\n", cmd, file, strerror (errno)) ;
102 * Return true/false if the supplied module is loaded
103 *********************************************************************************
106 static int moduleLoaded (char *modName)
108 int len = strlen (modName) ;
110 FILE *fd = fopen ("/proc/modules", "r") ;
115 fprintf (stderr, "gpio: Unable to check modules: %s\n", strerror (errno)) ;
119 while (fgets (line, 80, fd) != NULL)
121 if (strncmp (line, modName, len) != 0)
136 * Load either the spi or i2c modules and change device ownerships, etc.
137 *********************************************************************************
140 static void _doLoadUsage (char *argv [])
142 fprintf (stderr, "Usage: %s load <spi/i2c> [SPI bufferSize in KB | I2C baudrate in Kb/sec]\n", argv [0]) ;
146 static void doLoad (int argc, char *argv [])
148 char *module1, *module2 ;
150 char *file1, *file2 ;
151 char args1 [32], args2 [32] ;
154 _doLoadUsage (argv) ;
156 args1 [0] = args2 [0] = 0 ;
158 /**/ if (strcasecmp (argv [2], "spi") == 0)
161 module2 = "spi_bcm2708" ;
162 file1 = "/dev/spidev0.0" ;
163 file2 = "/dev/spidev0.1" ;
165 sprintf (args1, " bufsiz=%d", atoi (argv [3]) * 1024) ;
167 _doLoadUsage (argv) ;
169 else if (strcasecmp (argv [2], "i2c") == 0)
171 module1 = "i2c_dev" ;
172 module2 = "i2c_bcm2708" ;
173 file1 = "/dev/i2c-0" ;
174 file2 = "/dev/i2c-1" ;
176 sprintf (args2, " baudrate=%d", atoi (argv [3]) * 1000) ;
178 _doLoadUsage (argv) ;
181 _doLoadUsage (argv) ;
183 if (!moduleLoaded (module1))
185 sprintf (cmd, "modprobe %s%s", module1, args1) ;
189 if (!moduleLoaded (module2))
191 sprintf (cmd, "modprobe %s%s", module2, args2) ;
195 if (!moduleLoaded (module2))
197 fprintf (stderr, "%s: Unable to load %s\n", argv [0], module2) ;
201 sleep (1) ; // To let things get settled
203 changeOwner (argv [0], file1) ;
204 changeOwner (argv [0], file2) ;
210 * Run the i2cdetect command with the right runes for this Pi revision
211 *********************************************************************************
214 static void doI2Cdetect (int argc, char *argv [])
216 int port = piBoardRev () == 1 ? 0 : 1 ;
218 struct stat statBuf ;
220 if (stat (I2CDETECT, &statBuf) < 0)
222 fprintf (stderr, "%s: Unable to find i2cdetect command: %s\n", argv [0], strerror (errno)) ;
226 if (!moduleLoaded ("i2c_dev"))
228 fprintf (stderr, "%s: The I2C kernel module(s) are not loaded.\n", argv [0]) ;
232 sprintf (command, "%s -y %d", I2CDETECT, port) ;
233 if (system (command) < 0)
234 fprintf (stderr, "%s: Unable to run i2cdetect: %s\n", argv [0], strerror (errno)) ;
241 * Read all the GPIO pins
242 *********************************************************************************
245 static char *pinNames [] =
247 "GPIO 0", "GPIO 1", "GPIO 2", "GPIO 3", "GPIO 4", "GPIO 5", "GPIO 6", "GPIO 7",
249 "CE0 ", "CE1 ", "MOSI ", "MISO ", "SCLK ",
251 "GPIO 8", "GPIO 9", "GPIO10", "GPIO11",
254 static char *alts [] =
256 "IN ", "OUT ", "ALT5", "ALT4", "ALT0", "ALT1", "ALT2", "ALT3"
259 static int wpiToPhys [64] =
261 11, 12, 13, 15, 16, 18, 22, 7, // 0...7
263 24, 26, 19, 21, 23, // 10..14
265 3, 4, 5, 6, // 17..20
266 0,0,0,0,0,0,0,0,0,0,0, // 20..31
267 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 32..47
268 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 47..63
271 static void doReadall (void)
275 printf ("+----------+-Rev%d-+------+--------+------+-------+\n", piBoardRev ()) ;
276 printf ("| wiringPi | GPIO | Phys | Name | Mode | Value |\n") ;
277 printf ("+----------+------+------+--------+------+-------+\n") ;
279 for (pin = 0 ; pin < 64 ; ++pin) // Crude, but effective
281 if (wpiPinToGpio (pin) == -1)
284 printf ("| %6d | %3d | %3d | %s | %s | %s |\n",
285 pin, wpiPinToGpio (pin), wpiToPhys [pin],
288 digitalRead (pin) == HIGH ? "High" : "Low ") ;
291 printf ("+----------+------+------+--------+------+-------+\n") ;
297 * List all GPIO exports
298 *********************************************************************************
301 static void doExports (int argc, char *argv [])
308 for (first = 0, i = 0 ; i < 64 ; ++i) // Crude, but effective
311 // Try to read the direction
313 sprintf (fName, "/sys/class/gpio/gpio%d/direction", i) ;
314 if ((fd = open (fName, O_RDONLY)) == -1)
320 printf ("GPIO Pins exported:\n") ;
323 printf ("%4d: ", i) ;
325 if ((l = read (fd, buf, 16)) == 0)
326 sprintf (buf, "%s", "?") ;
329 if ((buf [strlen (buf) - 1]) == '\n')
330 buf [strlen (buf) - 1] = 0 ;
332 printf ("%-3s", buf) ;
336 // Try to Read the value
338 sprintf (fName, "/sys/class/gpio/gpio%d/value", i) ;
339 if ((fd = open (fName, O_RDONLY)) == -1)
341 printf ("No Value file (huh?)\n") ;
345 if ((l = read (fd, buf, 16)) == 0)
346 sprintf (buf, "%s", "?") ;
349 if ((buf [strlen (buf) - 1]) == '\n')
350 buf [strlen (buf) - 1] = 0 ;
352 printf (" %s", buf) ;
354 // Read any edge trigger file
356 sprintf (fName, "/sys/class/gpio/gpio%d/edge", i) ;
357 if ((fd = open (fName, O_RDONLY)) == -1)
363 if ((l = read (fd, buf, 16)) == 0)
364 sprintf (buf, "%s", "?") ;
367 if ((buf [strlen (buf) - 1]) == '\n')
368 buf [strlen (buf) - 1] = 0 ;
370 printf (" %-8s\n", buf) ;
379 * gpio export pin mode
380 * This uses the /sys/class/gpio device interface.
381 *********************************************************************************
384 void doExport (int argc, char *argv [])
393 fprintf (stderr, "Usage: %s export pin mode\n", argv [0]) ;
397 pin = atoi (argv [2]) ;
401 if ((fd = fopen ("/sys/class/gpio/export", "w")) == NULL)
403 fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv [0], strerror (errno)) ;
407 fprintf (fd, "%d\n", pin) ;
410 sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ;
411 if ((fd = fopen (fName, "w")) == NULL)
413 fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ;
417 /**/ if ((strcasecmp (mode, "in") == 0) || (strcasecmp (mode, "input") == 0))
418 fprintf (fd, "in\n") ;
419 else if ((strcasecmp (mode, "out") == 0) || (strcasecmp (mode, "output") == 0))
420 fprintf (fd, "out\n") ;
423 fprintf (stderr, "%s: Invalid mode: %s. Should be in or out\n", argv [1], mode) ;
429 // Change ownership so the current user can actually use it!
431 sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ;
432 changeOwner (argv [0], fName) ;
434 sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ;
435 changeOwner (argv [0], fName) ;
443 * Wait for Interrupt on a given pin.
444 * Slight cheat here - it's easier to actually use ISR now (which calls
445 * gpio to set the pin modes!) then we simply sleep, and expect the thread
446 * to exit the program. Crude but effective.
447 *********************************************************************************
450 static void wfi (void)
453 void doWfi (int argc, char *argv [])
459 fprintf (stderr, "Usage: %s wfi pin mode\n", argv [0]) ;
463 pin = atoi (argv [2]) ;
465 /**/ if (strcasecmp (argv [3], "rising") == 0) mode = INT_EDGE_RISING ;
466 else if (strcasecmp (argv [3], "falling") == 0) mode = INT_EDGE_FALLING ;
467 else if (strcasecmp (argv [3], "both") == 0) mode = INT_EDGE_BOTH ;
470 fprintf (stderr, "%s: wfi: Invalid mode: %s. Should be rising, falling or both\n", argv [1], argv [3]) ;
474 if (wiringPiISR (pin, mode, &wfi) < 0)
476 fprintf (stderr, "%s: wfi: Unable to setup ISR: %s\n", argv [1], strerror (errno)) ;
489 * Easy access to changing the edge trigger on a GPIO pin
490 * This uses the /sys/class/gpio device interface.
491 *********************************************************************************
494 void doEdge (int argc, char *argv [])
503 fprintf (stderr, "Usage: %s edge pin mode\n", argv [0]) ;
507 pin = atoi (argv [2]) ;
510 // Export the pin and set direction to input
512 if ((fd = fopen ("/sys/class/gpio/export", "w")) == NULL)
514 fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv [0], strerror (errno)) ;
518 fprintf (fd, "%d\n", pin) ;
521 sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ;
522 if ((fd = fopen (fName, "w")) == NULL)
524 fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ;
528 fprintf (fd, "in\n") ;
531 sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ;
532 if ((fd = fopen (fName, "w")) == NULL)
534 fprintf (stderr, "%s: Unable to open GPIO edge interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ;
538 /**/ if (strcasecmp (mode, "none") == 0) fprintf (fd, "none\n") ;
539 else if (strcasecmp (mode, "rising") == 0) fprintf (fd, "rising\n") ;
540 else if (strcasecmp (mode, "falling") == 0) fprintf (fd, "falling\n") ;
541 else if (strcasecmp (mode, "both") == 0) fprintf (fd, "both\n") ;
544 fprintf (stderr, "%s: Invalid mode: %s. Should be none, rising, falling or both\n", argv [1], mode) ;
548 // Change ownership of the value and edge files, so the current user can actually use it!
550 sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ;
551 changeOwner (argv [0], fName) ;
553 sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ;
554 changeOwner (argv [0], fName) ;
563 * This uses the /sys/class/gpio device interface.
564 *********************************************************************************
567 void doUnexport (int argc, char *argv [])
574 fprintf (stderr, "Usage: %s unexport pin\n", argv [0]) ;
578 pin = atoi (argv [2]) ;
580 if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL)
582 fprintf (stderr, "%s: Unable to open GPIO export interface\n", argv [0]) ;
586 fprintf (fd, "%d\n", pin) ;
594 * Un-Export all the GPIO pins.
595 * This uses the /sys/class/gpio device interface.
596 *********************************************************************************
599 void doUnexportall (char *progName)
604 for (pin = 0 ; pin < 63 ; ++pin)
606 if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL)
608 fprintf (stderr, "%s: Unable to open GPIO export interface\n", progName) ;
611 fprintf (fd, "%d\n", pin) ;
619 * Reset the GPIO pins - as much as we can do
620 *********************************************************************************
623 static void doReset (char *progName)
627 doUnexportall (progName) ;
629 for (pin = 0 ; pin < 64 ; ++pin)
631 if (wpiPinToGpio (pin) == -1)
634 digitalWrite (pin, LOW) ;
635 pinMode (pin, INPUT) ;
636 pullUpDnControl (pin, PUD_OFF) ;
643 * gpio mode pin mode ...
644 *********************************************************************************
647 void doMode (int argc, char *argv [])
654 fprintf (stderr, "Usage: %s mode pin mode\n", argv [0]) ;
658 pin = atoi (argv [2]) ;
662 /**/ if (strcasecmp (mode, "in") == 0) pinMode (pin, INPUT) ;
663 else if (strcasecmp (mode, "out") == 0) pinMode (pin, OUTPUT) ;
664 else if (strcasecmp (mode, "pwm") == 0) pinMode (pin, PWM_OUTPUT) ;
665 else if (strcasecmp (mode, "clock") == 0) pinMode (pin, GPIO_CLOCK) ;
666 else if (strcasecmp (mode, "up") == 0) pullUpDnControl (pin, PUD_UP) ;
667 else if (strcasecmp (mode, "down") == 0) pullUpDnControl (pin, PUD_DOWN) ;
668 else if (strcasecmp (mode, "tri") == 0) pullUpDnControl (pin, PUD_OFF) ;
671 fprintf (stderr, "%s: Invalid mode: %s. Should be in/out/pwm/clock/up/down/tri\n", argv [1], mode) ;
679 * gpio drive group value
680 *********************************************************************************
683 static void doPadDrive (int argc, char *argv [])
689 fprintf (stderr, "Usage: %s drive group value\n", argv [0]) ;
693 group = atoi (argv [2]) ;
694 val = atoi (argv [3]) ;
696 if ((group < 0) || (group > 2))
698 fprintf (stderr, "%s: drive group not 0, 1 or 2: %d\n", argv [0], group) ;
702 if ((val < 0) || (val > 7))
704 fprintf (stderr, "%s: drive value not 0-7: %d\n", argv [0], val) ;
708 setPadDrive (group, val) ;
714 * gpio gbw channel value
715 * Gertboard Write - To the Analog output
716 *********************************************************************************
719 static void doGbw (int argc, char *argv [])
725 fprintf (stderr, "Usage: %s gbw <channel> <value>\n", argv [0]) ;
729 channel = atoi (argv [2]) ;
730 value = atoi (argv [3]) ;
732 if ((channel < 0) || (channel > 1))
734 fprintf (stderr, "%s: gbw: Channel number must be 0 or 1\n", argv [0]) ;
738 if ((value < 0) || (value > 1023))
740 fprintf (stderr, "%s: gbw: Value must be from 0 to 255\n", argv [0]) ;
744 if (gertboardAnalogSetup (64) < 0)
746 fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ;
750 analogWrite (64 + channel, value) ;
757 * From the analog input
758 *********************************************************************************
761 static void doGbr (int argc, char *argv [])
767 fprintf (stderr, "Usage: %s gbr <channel>\n", argv [0]) ;
771 channel = atoi (argv [2]) ;
773 if ((channel < 0) || (channel > 1))
775 fprintf (stderr, "%s: gbr: Channel number must be 0 or 1\n", argv [0]) ;
779 if (gertboardAnalogSetup (64) < 0)
781 fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ;
785 printf ("%d\n", analogRead (64 + channel)) ;
791 * gpio write pin value
792 *********************************************************************************
795 static void doWrite (int argc, char *argv [])
801 fprintf (stderr, "Usage: %s write pin value\n", argv [0]) ;
805 pin = atoi (argv [2]) ;
807 /**/ if ((strcasecmp (argv [3], "up") == 0) || (strcasecmp (argv [3], "on") == 0))
809 else if ((strcasecmp (argv [3], "down") == 0) || (strcasecmp (argv [3], "off") == 0))
812 val = atoi (argv [3]) ;
815 digitalWrite (pin, LOW) ;
817 digitalWrite (pin, HIGH) ;
823 * gpio awrite pin value
824 *********************************************************************************
827 static void doAwrite (int argc, char *argv [])
833 fprintf (stderr, "Usage: %s awrite pin value\n", argv [0]) ;
837 pin = atoi (argv [2]) ;
839 val = atoi (argv [3]) ;
841 analogWrite (pin, val) ;
848 *********************************************************************************
851 static void doWriteByte (int argc, char *argv [])
857 fprintf (stderr, "Usage: %s wb value\n", argv [0]) ;
861 val = (int)strtol (argv [2], NULL, 0) ;
863 digitalWriteByte (val) ;
869 * Read a pin and return the value
870 *********************************************************************************
873 void doRead (int argc, char *argv [])
879 fprintf (stderr, "Usage: %s read pin\n", argv [0]) ;
883 pin = atoi (argv [2]) ;
884 val = digitalRead (pin) ;
886 printf ("%s\n", val == 0 ? "0" : "1") ;
892 * Read an analog pin and return the value
893 *********************************************************************************
896 void doAread (int argc, char *argv [])
902 fprintf (stderr, "Usage: %s aread pin\n", argv [0]) ;
906 pin = atoi (argv [2]) ;
908 val = analogRead (pin) ;
910 printf ("%s\n", val == 0 ? "0" : "1") ;
917 *********************************************************************************
920 void doToggle (int argc, char *argv [])
926 fprintf (stderr, "Usage: %s toggle pin\n", argv [0]) ;
930 pin = atoi (argv [2]) ;
932 digitalWrite (pin, !digitalRead (pin)) ;
937 * Output a clock on a pin
938 *********************************************************************************
941 void doClock (int argc, char *argv [])
947 fprintf (stderr, "Usage: %s clock <pin> <freq>\n", argv [0]) ;
951 pin = atoi (argv [2]) ;
953 freq = atoi (argv [3]) ;
955 gpioClockSet (pin, freq) ;
961 * Output a PWM value on a pin
962 *********************************************************************************
965 void doPwm (int argc, char *argv [])
971 fprintf (stderr, "Usage: %s pwm <pin> <value>\n", argv [0]) ;
975 pin = atoi (argv [2]) ;
977 val = atoi (argv [3]) ;
979 pwmWrite (pin, val) ;
984 * doPwmMode: doPwmRange: doPwmClock:
985 * Change the PWM mode, range and clock divider values
986 *********************************************************************************
989 static void doPwmMode (int mode)
994 static void doPwmRange (int argc, char *argv [])
1000 fprintf (stderr, "Usage: %s pwmr <range>\n", argv [0]) ;
1004 range = (unsigned int)strtoul (argv [2], NULL, 10) ;
1008 fprintf (stderr, "%s: range must be > 0\n", argv [0]) ;
1012 pwmSetRange (range) ;
1015 static void doPwmClock (int argc, char *argv [])
1017 unsigned int clock ;
1021 fprintf (stderr, "Usage: %s pwmc <clock>\n", argv [0]) ;
1025 clock = (unsigned int)strtoul (argv [2], NULL, 10) ;
1027 if ((clock < 1) || (clock > 4095))
1029 fprintf (stderr, "%s: clock must be between 0 and 4096\n", argv [0]) ;
1033 pwmSetClock (clock) ;
1040 *********************************************************************************
1043 int main (int argc, char *argv [])
1047 if (getenv ("WIRINGPI_DEBUG") != NULL)
1049 printf ("gpio: wiringPi debug mode enabled\n") ;
1050 wiringPiDebug = TRUE ;
1055 fprintf (stderr, "%s\n", usage) ;
1061 if (strcasecmp (argv [1], "-h") == 0)
1063 printf ("%s: %s\n", argv [0], usage) ;
1067 // Sort of a special:
1069 if (strcmp (argv [1], "-R") == 0)
1071 printf ("%d\n", piBoardRev ()) ;
1075 // Version & Warranty
1077 if (strcmp (argv [1], "-V") == 0)
1079 printf ("%d\n", piBoardRev ()) ;
1083 if (strcmp (argv [1], "-v") == 0)
1085 printf ("gpio version: %s\n", VERSION) ;
1086 printf ("Copyright (c) 2012-2013 Gordon Henderson\n") ;
1087 printf ("This is free software with ABSOLUTELY NO WARRANTY.\n") ;
1088 printf ("For details type: %s -warranty\n", argv [0]) ;
1090 printf ("This Raspberry Pi is a revision %d board.\n", piBoardRev ()) ;
1094 if (strcasecmp (argv [1], "-warranty") == 0)
1096 printf ("gpio version: %s\n", VERSION) ;
1097 printf ("Copyright (c) 2012-2013 Gordon Henderson\n") ;
1099 printf (" This program is free software; you can redistribute it and/or modify\n") ;
1100 printf (" it under the terms of the GNU Leser General Public License as published\n") ;
1101 printf (" by the Free Software Foundation, either version 3 of the License, or\n") ;
1102 printf (" (at your option) any later version.\n") ;
1104 printf (" This program is distributed in the hope that it will be useful,\n") ;
1105 printf (" but WITHOUT ANY WARRANTY; without even the implied warranty of\n") ;
1106 printf (" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n") ;
1107 printf (" GNU Lesser General Public License for more details.\n") ;
1109 printf (" You should have received a copy of the GNU Lesser General Public License\n") ;
1110 printf (" along with this program. If not, see <http://www.gnu.org/licenses/>.\n") ;
1115 if (geteuid () != 0)
1117 fprintf (stderr, "%s: Must be root to run. Program should be suid root. This is an error.\n", argv [0]) ;
1121 // Initial test for /sys/class/gpio operations:
1123 /**/ if (strcasecmp (argv [1], "exports" ) == 0) { doExports (argc, argv) ; return 0 ; }
1124 else if (strcasecmp (argv [1], "export" ) == 0) { doExport (argc, argv) ; return 0 ; }
1125 else if (strcasecmp (argv [1], "edge" ) == 0) { doEdge (argc, argv) ; return 0 ; }
1126 else if (strcasecmp (argv [1], "unexport" ) == 0) { doUnexport (argc, argv) ; return 0 ; }
1127 else if (strcasecmp (argv [1], "unexportall") == 0) { doUnexportall (argv [0]) ; return 0 ; }
1129 // Check for load command:
1131 if (strcasecmp (argv [1], "load" ) == 0) { doLoad (argc, argv) ; return 0 ; }
1133 // Gertboard commands
1135 if (strcasecmp (argv [1], "gbr" ) == 0) { doGbr (argc, argv) ; return 0 ; }
1136 if (strcasecmp (argv [1], "gbw" ) == 0) { doGbw (argc, argv) ; return 0 ; }
1138 // Check for -g argument
1140 /**/ if (strcasecmp (argv [1], "-g") == 0)
1142 wiringPiSetupGpio () ;
1144 for (i = 2 ; i < argc ; ++i)
1145 argv [i - 1] = argv [i] ;
1147 wpMode = WPI_MODE_GPIO ;
1150 // Check for -1 argument
1152 else if (strcasecmp (argv [1], "-1") == 0)
1154 wiringPiSetupPhys () ;
1156 for (i = 2 ; i < argc ; ++i)
1157 argv [i - 1] = argv [i] ;
1159 wpMode = WPI_MODE_PHYS ;
1162 // Check for -p argument for PiFace
1164 else if (strcasecmp (argv [1], "-p") == 0)
1168 for (i = 2 ; i < argc ; ++i)
1169 argv [i - 1] = argv [i] ;
1171 wpMode = WPI_MODE_PIFACE ;
1174 // Default to wiringPi mode
1179 wpMode = WPI_MODE_PINS ;
1182 // Check for -x argument to load in a new extension
1184 if (strcasecmp (argv [1], "-x") == 0)
1188 fprintf (stderr, "%s: -x missing extension specification.\n", argv [0]) ;
1189 exit (EXIT_FAILURE) ;
1192 if (!doExtension (argv [0], argv [2])) // Prints its own error messages
1193 exit (EXIT_FAILURE) ;
1195 for (i = 3 ; i < argc ; ++i)
1196 argv [i - 2] = argv [i] ;
1202 fprintf (stderr, "%s: no command given\n", argv [0]) ;
1203 exit (EXIT_FAILURE) ;
1206 // Core wiringPi functions
1208 /**/ if (strcasecmp (argv [1], "mode" ) == 0) doMode (argc, argv) ;
1209 else if (strcasecmp (argv [1], "read" ) == 0) doRead (argc, argv) ;
1210 else if (strcasecmp (argv [1], "write" ) == 0) doWrite (argc, argv) ;
1211 else if (strcasecmp (argv [1], "pwm" ) == 0) doPwm (argc, argv) ;
1212 else if (strcasecmp (argv [1], "awrite" ) == 0) doAwrite (argc, argv) ;
1213 else if (strcasecmp (argv [1], "aread" ) == 0) doAread (argc, argv) ;
1217 else if (strcasecmp (argv [1], "toggle" ) == 0) doToggle (argc, argv) ;
1221 else if (strcasecmp (argv [1], "pwm-bal" ) == 0) doPwmMode (PWM_MODE_BAL) ;
1222 else if (strcasecmp (argv [1], "pwm-ms" ) == 0) doPwmMode (PWM_MODE_MS) ;
1223 else if (strcasecmp (argv [1], "pwmr" ) == 0) doPwmRange (argc, argv) ;
1224 else if (strcasecmp (argv [1], "pwmc" ) == 0) doPwmClock (argc, argv) ;
1225 else if (strcasecmp (argv [1], "drive" ) == 0) doPadDrive (argc, argv) ;
1226 else if (strcasecmp (argv [1], "readall" ) == 0) doReadall () ;
1227 else if (strcasecmp (argv [1], "i2cdetect") == 0) doI2Cdetect (argc, argv) ;
1228 else if (strcasecmp (argv [1], "i2cd" ) == 0) doI2Cdetect (argc, argv) ;
1229 else if (strcasecmp (argv [1], "reset" ) == 0) doReset (argv [0]) ;
1230 else if (strcasecmp (argv [1], "wb" ) == 0) doWriteByte (argc, argv) ;
1231 else if (strcasecmp (argv [1], "clock" ) == 0) doClock (argc, argv) ;
1232 else if (strcasecmp (argv [1], "wfi" ) == 0) doWfi (argc, argv) ;
1235 fprintf (stderr, "%s: Unknown command: %s.\n", argv [0], argv [1]) ;
1236 exit (EXIT_FAILURE) ;