/*
* gpio.c:
- * Set-UID command-line interface to the Raspberry Pi's GPIO
- * Copyright (c) 2012 Gordon Henderson
+ * Swiss-Army-Knife, Set-UID command-line interface to the Raspberry
+ * Pi's GPIO.
+ * Copyright (c) 2012-2013 Gordon Henderson
***********************************************************************
* This file is part of wiringPi:
* https://projects.drogon.net/raspberry-pi/wiringpi/
***********************************************************************
*/
-#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
+#include <ctype.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
-#include <sys/types.h>
#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <wiringPi.h>
+
+#include <gertboard.h>
+#include <piFace.h>
+
+#include "extensions.h"
+
+extern int wiringPiDebug ;
+
+extern void doReadall (void) ;
+extern void doReadallOld (void) ;
#ifndef TRUE
# define TRUE (1==1)
# define FALSE (1==2)
#endif
-#define VERSION "1.1"
+#define VERSION "2.09"
+#define I2CDETECT "/usr/sbin/i2cdetect"
-static int wpMode ;
+int wpMode ;
char *usage = "Usage: gpio -v\n"
" gpio -h\n"
- " gpio [-g] <read/write/pwm/mode> ...\n"
- " gpio [-p] <read/write/mode> ...\n"
- " gpio export/edge/unexport/unexportall/exports ...\n"
+ " gpio [-g|-1] [-x extension:params] ...\n"
+ " gpio [-p] <read/write/wb> ...\n"
+ " gpio <read/write/aread/awritewb/pwm/clock/mode> ...\n"
+ " gpio readall/reset\n"
+ " gpio unexportall/exports\n"
+ " gpio export/edge/unexport ...\n"
+ " gpio wfi <pin> <mode>\n"
" gpio drive <group> <value>\n"
- " gpio load spi/i2c" ;
+ " gpio pwm-bal/pwm-ms \n"
+ " gpio pwmr <range> \n"
+ " gpio pwmc <divider> \n"
+ " gpio load spi/i2c\n"
+ " gpio i2cd/i2cdetect\n"
+ " gpio gbr <channel>\n"
+ " gpio gbw <channel> <value>" ; // No trailing newline needed here.
/*
static void _doLoadUsage (char *argv [])
{
- fprintf (stderr, "Usage: %s load <spi/i2c>\n", argv [0]) ;
+ fprintf (stderr, "Usage: %s load <spi/i2c> [SPI bufferSize in KB | I2C baudrate in Kb/sec]\n", argv [0]) ;
exit (1) ;
}
static void doLoad (int argc, char *argv [])
{
- char *module ;
+ char *module1, *module2 ;
char cmd [80] ;
char *file1, *file2 ;
+ char args1 [32], args2 [32] ;
- if (argc != 3)
+ if (argc < 3)
_doLoadUsage (argv) ;
+ args1 [0] = args2 [0] = 0 ;
+
/**/ if (strcasecmp (argv [2], "spi") == 0)
{
- module = "spi_bcm2708" ;
+ module1 = "spidev" ;
+ module2 = "spi_bcm2708" ;
file1 = "/dev/spidev0.0" ;
file2 = "/dev/spidev0.1" ;
+ if (argc == 4)
+ sprintf (args1, " bufsiz=%d", atoi (argv [3]) * 1024) ;
+ else if (argc > 4)
+ _doLoadUsage (argv) ;
}
else if (strcasecmp (argv [2], "i2c") == 0)
{
- module = "i2c_bcm2708" ;
+ module1 = "i2c_dev" ;
+ module2 = "i2c_bcm2708" ;
file1 = "/dev/i2c-0" ;
file2 = "/dev/i2c-1" ;
+ if (argc == 4)
+ sprintf (args2, " baudrate=%d", atoi (argv [3]) * 1000) ;
+ else if (argc > 4)
+ _doLoadUsage (argv) ;
}
else
_doLoadUsage (argv) ;
- if (!moduleLoaded (module))
+ if (!moduleLoaded (module1))
+ {
+ sprintf (cmd, "modprobe %s%s", module1, args1) ;
+ system (cmd) ;
+ }
+
+ if (!moduleLoaded (module2))
{
- sprintf (cmd, "modprobe %s", module) ;
+ sprintf (cmd, "modprobe %s%s", module2, args2) ;
system (cmd) ;
}
- if (!moduleLoaded (module))
+ if (!moduleLoaded (module2))
{
- fprintf (stderr, "%s: Unable to load %s\n", argv [0], module) ;
+ fprintf (stderr, "%s: Unable to load %s\n", argv [0], module2) ;
exit (1) ;
}
}
+/*
+ * doI2Cdetect:
+ * Run the i2cdetect command with the right runes for this Pi revision
+ *********************************************************************************
+ */
+
+static void doI2Cdetect (int argc, char *argv [])
+{
+ int port = piBoardRev () == 1 ? 0 : 1 ;
+ char command [128] ;
+ struct stat statBuf ;
+
+ if (stat (I2CDETECT, &statBuf) < 0)
+ {
+ fprintf (stderr, "%s: Unable to find i2cdetect command: %s\n", argv [0], strerror (errno)) ;
+ return ;
+ }
+
+ if (!moduleLoaded ("i2c_dev"))
+ {
+ fprintf (stderr, "%s: The I2C kernel module(s) are not loaded.\n", argv [0]) ;
+ return ;
+ }
+
+ sprintf (command, "%s -y %d", I2CDETECT, port) ;
+ if (system (command) < 0)
+ fprintf (stderr, "%s: Unable to run i2cdetect: %s\n", argv [0], strerror (errno)) ;
+
+}
+
/*
* doExports:
char fName [128] ;
char buf [16] ;
-// Rather crude, but who knows what others are up to...
-
- for (first = 0, i = 0 ; i < 64 ; ++i)
+ for (first = 0, i = 0 ; i < 64 ; ++i) // Crude, but effective
{
// Try to read the direction
}
+/*
+ * doWfi:
+ * gpio wfi pin mode
+ * Wait for Interrupt on a given pin.
+ * Slight cheat here - it's easier to actually use ISR now (which calls
+ * gpio to set the pin modes!) then we simply sleep, and expect the thread
+ * to exit the program. Crude but effective.
+ *********************************************************************************
+ */
+
+static void wfi (void)
+ { exit (0) ; }
+
+void doWfi (int argc, char *argv [])
+{
+ int pin, mode ;
+
+ if (argc != 4)
+ {
+ fprintf (stderr, "Usage: %s wfi pin mode\n", argv [0]) ;
+ exit (1) ;
+ }
+
+ pin = atoi (argv [2]) ;
+
+ /**/ if (strcasecmp (argv [3], "rising") == 0) mode = INT_EDGE_RISING ;
+ else if (strcasecmp (argv [3], "falling") == 0) mode = INT_EDGE_FALLING ;
+ else if (strcasecmp (argv [3], "both") == 0) mode = INT_EDGE_BOTH ;
+ else
+ {
+ fprintf (stderr, "%s: wfi: Invalid mode: %s. Should be rising, falling or both\n", argv [1], argv [3]) ;
+ exit (1) ;
+ }
+
+ if (wiringPiISR (pin, mode, &wfi) < 0)
+ {
+ fprintf (stderr, "%s: wfi: Unable to setup ISR: %s\n", argv [1], strerror (errno)) ;
+ exit (1) ;
+ }
+
+ for (;;)
+ delay (9999) ;
+}
+
+
+
/*
* doEdge:
* gpio edge pin mode
*********************************************************************************
*/
-void doUnexportall (int argc, char *argv [])
+void doUnexportall (char *progName)
{
FILE *fd ;
int pin ;
{
if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL)
{
- fprintf (stderr, "%s: Unable to open GPIO export interface\n", argv [0]) ;
+ fprintf (stderr, "%s: Unable to open GPIO export interface\n", progName) ;
exit (1) ;
}
fprintf (fd, "%d\n", pin) ;
}
+/*
+ * doResetExternal:
+ * Load readallExternal, we try to do this with an external device.
+ *********************************************************************************
+ */
+
+static void doResetExternal (void)
+{
+ int pin ;
+
+ for (pin = wiringPiNodes->pinBase ; pin <= wiringPiNodes->pinMax ; ++pin)
+ {
+ pinMode (pin, INPUT) ;
+ pullUpDnControl (pin, PUD_OFF) ;
+ }
+}
+
+
+/*
+ * doReset:
+ * Reset the GPIO pins - as much as we can do
+ *********************************************************************************
+ */
+
+static void doReset (char *progName)
+{
+ int pin ;
+
+ if (wiringPiNodes != NULL) // External reset
+ doResetExternal () ;
+ else
+ {
+ doUnexportall (progName) ;
+
+ for (pin = 0 ; pin < 64 ; ++pin)
+ {
+ if (wpiPinToGpio (pin) == -1)
+ continue ;
+
+ digitalWrite (pin, LOW) ;
+ pinMode (pin, INPUT) ;
+ pullUpDnControl (pin, PUD_OFF) ;
+ }
+ }
+}
+
+
/*
* doMode:
* gpio mode pin mode ...
pin = atoi (argv [2]) ;
- if ((wpMode == WPI_MODE_PINS) && ((pin < 0) || (pin >= NUM_PINS)))
- return ;
-
mode = argv [3] ;
- /**/ if (strcasecmp (mode, "in") == 0) pinMode (pin, INPUT) ;
- else if (strcasecmp (mode, "out") == 0) pinMode (pin, OUTPUT) ;
- else if (strcasecmp (mode, "pwm") == 0) pinMode (pin, PWM_OUTPUT) ;
- else if (strcasecmp (mode, "up") == 0) pullUpDnControl (pin, PUD_UP) ;
- else if (strcasecmp (mode, "down") == 0) pullUpDnControl (pin, PUD_DOWN) ;
- else if (strcasecmp (mode, "tri") == 0) pullUpDnControl (pin, PUD_OFF) ;
+ /**/ if (strcasecmp (mode, "in") == 0) pinMode (pin, INPUT) ;
+ else if (strcasecmp (mode, "input") == 0) pinMode (pin, INPUT) ;
+ else if (strcasecmp (mode, "out") == 0) pinMode (pin, OUTPUT) ;
+ else if (strcasecmp (mode, "output") == 0) pinMode (pin, OUTPUT) ;
+ else if (strcasecmp (mode, "pwm") == 0) pinMode (pin, PWM_OUTPUT) ;
+ else if (strcasecmp (mode, "clock") == 0) pinMode (pin, GPIO_CLOCK) ;
+ else if (strcasecmp (mode, "up") == 0) pullUpDnControl (pin, PUD_UP) ;
+ else if (strcasecmp (mode, "down") == 0) pullUpDnControl (pin, PUD_DOWN) ;
+ else if (strcasecmp (mode, "tri") == 0) pullUpDnControl (pin, PUD_OFF) ;
+ else if (strcasecmp (mode, "off") == 0) pullUpDnControl (pin, PUD_OFF) ;
else
{
- fprintf (stderr, "%s: Invalid mode: %s. Should be in/out/pwm/up/down/tri\n", argv [1], mode) ;
+ fprintf (stderr, "%s: Invalid mode: %s. Should be in/out/pwm/clock/up/down/tri\n", argv [1], mode) ;
exit (1) ;
}
}
*********************************************************************************
*/
-void doPadDrive (int argc, char *argv [])
+static void doPadDrive (int argc, char *argv [])
{
int group, val ;
}
+/*
+ * doGbw:
+ * gpio gbw channel value
+ * Gertboard Write - To the Analog output
+ *********************************************************************************
+ */
+
+static void doGbw (int argc, char *argv [])
+{
+ int channel, value ;
+
+ if (argc != 4)
+ {
+ fprintf (stderr, "Usage: %s gbw <channel> <value>\n", argv [0]) ;
+ exit (1) ;
+ }
+
+ channel = atoi (argv [2]) ;
+ value = atoi (argv [3]) ;
+
+ if ((channel < 0) || (channel > 1))
+ {
+ fprintf (stderr, "%s: gbw: Channel number must be 0 or 1\n", argv [0]) ;
+ exit (1) ;
+ }
+
+ if ((value < 0) || (value > 1023))
+ {
+ fprintf (stderr, "%s: gbw: Value must be from 0 to 255\n", argv [0]) ;
+ exit (1) ;
+ }
+
+ if (gertboardAnalogSetup (64) < 0)
+ {
+ fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ;
+ exit (1) ;
+ }
+
+ analogWrite (64 + channel, value) ;
+}
+
+
+/*
+ * doGbr:
+ * gpio gbr channel
+ * From the analog input
+ *********************************************************************************
+ */
+
+static void doGbr (int argc, char *argv [])
+{
+ int channel ;
+
+ if (argc != 3)
+ {
+ fprintf (stderr, "Usage: %s gbr <channel>\n", argv [0]) ;
+ exit (1) ;
+ }
+
+ channel = atoi (argv [2]) ;
+
+ if ((channel < 0) || (channel > 1))
+ {
+ fprintf (stderr, "%s: gbr: Channel number must be 0 or 1\n", argv [0]) ;
+ exit (1) ;
+ }
+
+ if (gertboardAnalogSetup (64) < 0)
+ {
+ fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ;
+ exit (1) ;
+ }
+
+ printf ("%d\n", analogRead (64 + channel)) ;
+}
+
+
/*
* doWrite:
* gpio write pin value
*********************************************************************************
*/
-void doWrite (int argc, char *argv [])
+static void doWrite (int argc, char *argv [])
{
int pin, val ;
pin = atoi (argv [2]) ;
- if ((wpMode == WPI_MODE_PINS) && ((pin < 0) || (pin >= NUM_PINS)))
- return ;
-
- val = atoi (argv [3]) ;
+ /**/ if ((strcasecmp (argv [3], "up") == 0) || (strcasecmp (argv [3], "on") == 0))
+ val = 1 ;
+ else if ((strcasecmp (argv [3], "down") == 0) || (strcasecmp (argv [3], "off") == 0))
+ val = 0 ;
+ else
+ val = atoi (argv [3]) ;
/**/ if (val == 0)
digitalWrite (pin, LOW) ;
}
+/*
+ * doAwriterite:
+ * gpio awrite pin value
+ *********************************************************************************
+ */
+
+static void doAwrite (int argc, char *argv [])
+{
+ int pin, val ;
+
+ if (argc != 4)
+ {
+ fprintf (stderr, "Usage: %s awrite pin value\n", argv [0]) ;
+ exit (1) ;
+ }
+
+ pin = atoi (argv [2]) ;
+
+ val = atoi (argv [3]) ;
+
+ analogWrite (pin, val) ;
+}
+
+
+/*
+ * doWriteByte:
+ * gpio write value
+ *********************************************************************************
+ */
+
+static void doWriteByte (int argc, char *argv [])
+{
+ int val ;
+
+ if (argc != 3)
+ {
+ fprintf (stderr, "Usage: %s wb value\n", argv [0]) ;
+ exit (1) ;
+ }
+
+ val = (int)strtol (argv [2], NULL, 0) ;
+
+ digitalWriteByte (val) ;
+}
+
+
/*
* doRead:
* Read a pin and return the value
}
pin = atoi (argv [2]) ;
+ val = digitalRead (pin) ;
+
+ printf ("%s\n", val == 0 ? "0" : "1") ;
+}
+
- if ((wpMode == WPI_MODE_PINS) && ((pin < 0) || (pin >= NUM_PINS)))
+/*
+ * doAread:
+ * Read an analog pin and return the value
+ *********************************************************************************
+ */
+
+void doAread (int argc, char *argv [])
+{
+ if (argc != 3)
{
- printf ("0\n") ;
- return ;
+ fprintf (stderr, "Usage: %s aread pin\n", argv [0]) ;
+ exit (1) ;
}
- val = digitalRead (pin) ;
+ printf ("%d\n", analogRead (atoi (argv [2]))) ;
+}
- printf ("%s\n", val == 0 ? "0" : "1") ;
+
+/*
+ * doToggle:
+ * Toggle an IO pin
+ *********************************************************************************
+ */
+
+void doToggle (int argc, char *argv [])
+{
+ int pin ;
+
+ if (argc != 3)
+ {
+ fprintf (stderr, "Usage: %s toggle pin\n", argv [0]) ;
+ exit (1) ;
+ }
+
+ pin = atoi (argv [2]) ;
+
+ digitalWrite (pin, !digitalRead (pin)) ;
+}
+
+/*
+ * doClock:
+ * Output a clock on a pin
+ *********************************************************************************
+ */
+
+void doClock (int argc, char *argv [])
+{
+ int pin, freq ;
+
+ if (argc != 4)
+ {
+ fprintf (stderr, "Usage: %s clock <pin> <freq>\n", argv [0]) ;
+ exit (1) ;
+ }
+
+ pin = atoi (argv [2]) ;
+
+ freq = atoi (argv [3]) ;
+
+ gpioClockSet (pin, freq) ;
}
pin = atoi (argv [2]) ;
- if ((wpMode == WPI_MODE_PINS) && ((pin < 0) || (pin >= NUM_PINS)))
- return ;
-
val = atoi (argv [3]) ;
pwmWrite (pin, val) ;
}
+/*
+ * doPwmMode: doPwmRange: doPwmClock:
+ * Change the PWM mode, range and clock divider values
+ *********************************************************************************
+ */
+
+static void doPwmMode (int mode)
+{
+ pwmSetMode (mode) ;
+}
+
+static void doPwmRange (int argc, char *argv [])
+{
+ unsigned int range ;
+
+ if (argc != 3)
+ {
+ fprintf (stderr, "Usage: %s pwmr <range>\n", argv [0]) ;
+ exit (1) ;
+ }
+
+ range = (unsigned int)strtoul (argv [2], NULL, 10) ;
+
+ if (range == 0)
+ {
+ fprintf (stderr, "%s: range must be > 0\n", argv [0]) ;
+ exit (1) ;
+ }
+
+ pwmSetRange (range) ;
+}
+
+static void doPwmClock (int argc, char *argv [])
+{
+ unsigned int clock ;
+
+ if (argc != 3)
+ {
+ fprintf (stderr, "Usage: %s pwmc <clock>\n", argv [0]) ;
+ exit (1) ;
+ }
+
+ clock = (unsigned int)strtoul (argv [2], NULL, 10) ;
+
+ if ((clock < 1) || (clock > 4095))
+ {
+ fprintf (stderr, "%s: clock must be between 0 and 4096\n", argv [0]) ;
+ exit (1) ;
+ }
+
+ pwmSetClock (clock) ;
+}
+
+
/*
* main:
* Start here
{
int i ;
+ if (getenv ("WIRINGPI_DEBUG") != NULL)
+ {
+ printf ("gpio: wiringPi debug mode enabled\n") ;
+ wiringPiDebug = TRUE ;
+ }
+
if (argc == 1)
{
- fprintf (stderr, "%s: %s\n", argv [0], usage) ;
+ fprintf (stderr, "%s\n", usage) ;
return 1 ;
}
+// Help
+
if (strcasecmp (argv [1], "-h") == 0)
{
printf ("%s: %s\n", argv [0], usage) ;
return 0 ;
}
- if (strcasecmp (argv [1], "-v") == 0)
+// Sort of a special:
+
+ if (strcmp (argv [1], "-R") == 0)
+ {
+ printf ("%d\n", piBoardRev ()) ;
+ return 0 ;
+ }
+
+// Version & Warranty
+
+ if (strcmp (argv [1], "-V") == 0)
+ {
+ printf ("%d\n", piBoardRev ()) ;
+ return 0 ;
+ }
+
+ if (strcmp (argv [1], "-v") == 0)
{
printf ("gpio version: %s\n", VERSION) ;
- printf ("Copyright (c) 2012 Gordon Henderson\n") ;
+ printf ("Copyright (c) 2012-2013 Gordon Henderson\n") ;
printf ("This is free software with ABSOLUTELY NO WARRANTY.\n") ;
printf ("For details type: %s -warranty\n", argv [0]) ;
+ printf ("\n") ;
+ printf ("This Raspberry Pi is a revision %d board.\n", piBoardRev ()) ;
return 0 ;
}
if (strcasecmp (argv [1], "-warranty") == 0)
{
printf ("gpio version: %s\n", VERSION) ;
- printf ("Copyright (c) 2012 Gordon Henderson\n") ;
+ printf ("Copyright (c) 2012-2013 Gordon Henderson\n") ;
printf ("\n") ;
printf (" This program is free software; you can redistribute it and/or modify\n") ;
printf (" it under the terms of the GNU Leser General Public License as published\n") ;
/**/ if (strcasecmp (argv [1], "exports" ) == 0) { doExports (argc, argv) ; return 0 ; }
else if (strcasecmp (argv [1], "export" ) == 0) { doExport (argc, argv) ; return 0 ; }
else if (strcasecmp (argv [1], "edge" ) == 0) { doEdge (argc, argv) ; return 0 ; }
- else if (strcasecmp (argv [1], "unexportall") == 0) { doUnexportall (argc, argv) ; return 0 ; }
else if (strcasecmp (argv [1], "unexport" ) == 0) { doUnexport (argc, argv) ; return 0 ; }
+ else if (strcasecmp (argv [1], "unexportall") == 0) { doUnexportall (argv [0]) ; return 0 ; }
-// Check for drive or load commands:
+// Check for load command:
- if (strcasecmp (argv [1], "drive") == 0) { doPadDrive (argc, argv) ; return 0 ; }
if (strcasecmp (argv [1], "load" ) == 0) { doLoad (argc, argv) ; return 0 ; }
+// Gertboard commands
+
+ if (strcasecmp (argv [1], "gbr" ) == 0) { doGbr (argc, argv) ; return 0 ; }
+ if (strcasecmp (argv [1], "gbw" ) == 0) { doGbw (argc, argv) ; return 0 ; }
+
// Check for -g argument
- if (strcasecmp (argv [1], "-g") == 0)
+ /**/ if (strcasecmp (argv [1], "-g") == 0)
{
- if (wiringPiSetupGpio () == -1)
- {
- fprintf (stderr, "%s: Unable to initialise GPIO mode.\n", argv [0]) ;
- exit (1) ;
- }
+ wiringPiSetupGpio () ;
for (i = 2 ; i < argc ; ++i)
argv [i - 1] = argv [i] ;
wpMode = WPI_MODE_GPIO ;
}
+// Check for -1 argument
+
+ else if (strcasecmp (argv [1], "-1") == 0)
+ {
+ wiringPiSetupPhys () ;
+
+ for (i = 2 ; i < argc ; ++i)
+ argv [i - 1] = argv [i] ;
+ --argc ;
+ wpMode = WPI_MODE_PHYS ;
+ }
+
// Check for -p argument for PiFace
else if (strcasecmp (argv [1], "-p") == 0)
{
- if (wiringPiSetupPiFaceForGpioProg () == -1)
- {
- fprintf (stderr, "%s: Unable to initialise PiFace.\n", argv [0]) ;
- exit (1) ;
- }
+ piFaceSetup (200) ;
for (i = 2 ; i < argc ; ++i)
argv [i - 1] = argv [i] ;
else
{
- if (wiringPiSetup () == -1)
+ wiringPiSetup () ;
+ wpMode = WPI_MODE_PINS ;
+ }
+
+// Check for -x argument to load in a new extension
+
+ if (strcasecmp (argv [1], "-x") == 0)
+ {
+ if (argc < 3)
{
- fprintf (stderr, "%s: Unable to initialise wiringPi mode\n", argv [0]) ;
- exit (1) ;
+ fprintf (stderr, "%s: -x missing extension specification.\n", argv [0]) ;
+ exit (EXIT_FAILURE) ;
}
- wpMode = WPI_MODE_PINS ;
+
+ if (!doExtension (argv [0], argv [2])) // Prints its own error messages
+ exit (EXIT_FAILURE) ;
+
+ for (i = 3 ; i < argc ; ++i)
+ argv [i - 2] = argv [i] ;
+ argc -= 2 ;
}
-// Check for wiring commands
+ if (argc <= 1)
+ {
+ fprintf (stderr, "%s: no command given\n", argv [0]) ;
+ exit (EXIT_FAILURE) ;
+ }
- /**/ if (strcasecmp (argv [1], "read" ) == 0) doRead (argc, argv) ;
- else if (strcasecmp (argv [1], "write") == 0) doWrite (argc, argv) ;
- else if (strcasecmp (argv [1], "pwm" ) == 0) doPwm (argc, argv) ;
- else if (strcasecmp (argv [1], "mode" ) == 0) doMode (argc, argv) ;
+// Core wiringPi functions
+
+ /**/ if (strcasecmp (argv [1], "mode" ) == 0) doMode (argc, argv) ;
+ else if (strcasecmp (argv [1], "read" ) == 0) doRead (argc, argv) ;
+ else if (strcasecmp (argv [1], "write" ) == 0) doWrite (argc, argv) ;
+ else if (strcasecmp (argv [1], "pwm" ) == 0) doPwm (argc, argv) ;
+ else if (strcasecmp (argv [1], "awrite" ) == 0) doAwrite (argc, argv) ;
+ else if (strcasecmp (argv [1], "aread" ) == 0) doAread (argc, argv) ;
+
+// GPIO Nicies
+
+ else if (strcasecmp (argv [1], "toggle" ) == 0) doToggle (argc, argv) ;
+
+// Pi Specifics
+
+ else if (strcasecmp (argv [1], "pwm-bal" ) == 0) doPwmMode (PWM_MODE_BAL) ;
+ else if (strcasecmp (argv [1], "pwm-ms" ) == 0) doPwmMode (PWM_MODE_MS) ;
+ else if (strcasecmp (argv [1], "pwmr" ) == 0) doPwmRange (argc, argv) ;
+ else if (strcasecmp (argv [1], "pwmc" ) == 0) doPwmClock (argc, argv) ;
+ else if (strcasecmp (argv [1], "drive" ) == 0) doPadDrive (argc, argv) ;
+ else if (strcasecmp (argv [1], "readall" ) == 0) doReadallOld () ;
+ else if (strcasecmp (argv [1], "nreadall" ) == 0) doReadall () ;
+ else if (strcasecmp (argv [1], "i2cdetect") == 0) doI2Cdetect (argc, argv) ;
+ else if (strcasecmp (argv [1], "i2cd" ) == 0) doI2Cdetect (argc, argv) ;
+ else if (strcasecmp (argv [1], "reset" ) == 0) doReset (argv [0]) ;
+ else if (strcasecmp (argv [1], "wb" ) == 0) doWriteByte (argc, argv) ;
+ else if (strcasecmp (argv [1], "clock" ) == 0) doClock (argc, argv) ;
+ else if (strcasecmp (argv [1], "wfi" ) == 0) doWfi (argc, argv) ;
else
{
fprintf (stderr, "%s: Unknown command: %s.\n", argv [0], argv [1]) ;
- exit (1) ;
+ exit (EXIT_FAILURE) ;
}
return 0 ;
}