From: Gordon Henderson Date: Sun, 19 Aug 2012 14:33:26 +0000 (+0100) Subject: Merge branch 'master' of git.drogon.net:projects/wiringPi X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=1bb4989e11145c3a369058850cea77cb9ca5c3ec;hp=-c;p=wiringPi.git Merge branch 'master' of git.drogon.net:projects/wiringPi Conflicts: gpio/gpio.c --- 1bb4989e11145c3a369058850cea77cb9ca5c3ec diff --combined gpio/gpio.c index 2b62953,1d12aab..5a97aab --- a/gpio/gpio.c +++ b/gpio/gpio.c @@@ -42,14 -42,16 +42,16 @@@ static int wpMode ; char *usage = "Usage: gpio -v\n" + " gpio -h\n" " gpio [-g] ...\n" " gpio [-p] ...\n" " gpio export/edge/unexport/unexportall/exports ...\n" " gpio drive \n" + " gpio pwm-bal/pwm-ms \n" + " gpio pwmr \n" " gpio load spi/i2c" ; - /* * changeOwner: * Change the ownership of the file to the real userId of the calling @@@ -171,7 -173,7 +173,7 @@@ static void doLoad (int argc, char *arg ********************************************************************************* */ -void doExports (void) +static void doExports (int argc, char *argv []) { int fd ; int i, l, first ; @@@ -326,6 -328,8 +328,6 @@@ void doEdge (int argc, char *argv [] int pin ; char *mode ; char fName [128] ; - uid_t uid ; - gid_t gid ; if (argc != 4) { @@@ -333,7 -337,8 +335,7 @@@ exit (1) ; } - pin = atoi (argv [2]) ; - + pin = atoi (argv [2]) ; mode = argv [3] ; // Export the pin and set direction to input @@@ -364,23 -369,40 +366,23 @@@ exit (1) ; } - /**/ if (strcasecmp (mode, "none") == 0) - fprintf (fd, "none\n") ; - else if (strcasecmp (mode, "rising") == 0) - fprintf (fd, "rising\n") ; - else if (strcasecmp (mode, "falling") == 0) - fprintf (fd, "falling\n") ; - else if (strcasecmp (mode, "both") == 0) - fprintf (fd, "both\n") ; + /**/ if (strcasecmp (mode, "none") == 0) fprintf (fd, "none\n") ; + else if (strcasecmp (mode, "rising") == 0) fprintf (fd, "rising\n") ; + else if (strcasecmp (mode, "falling") == 0) fprintf (fd, "falling\n") ; + else if (strcasecmp (mode, "both") == 0) fprintf (fd, "both\n") ; else { fprintf (stderr, "%s: Invalid mode: %s. Should be none, rising, falling or both\n", argv [1], mode) ; exit (1) ; } -// Change ownership so the current user can actually use it! - - uid = getuid () ; - gid = getgid () ; +// Change ownership of the value and edge files, so the current user can actually use it! sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ; - if (chown (fName, uid, gid) != 0) - { - fprintf (stderr, "%s: Unable to change ownership of the value file: %s\n", argv [1], strerror (errno)) ; - exit (1) ; - } - -// Also change ownership of the edge file + changeOwner (argv [0], fName) ; sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ; - if (chown (fName, uid, gid) != 0) - { - fprintf (stderr, "%s: Unable to change ownership of the value file: %s\n", argv [1], strerror (errno)) ; - exit (1) ; - } + changeOwner (argv [0], fName) ; fclose (fd) ; } @@@ -487,7 -509,7 +489,7 @@@ void doMode (int argc, char *argv [] ********************************************************************************* */ --void doPadDrive (int argc, char *argv []) ++static void doPadDrive (int argc, char *argv []) { int group, val ; @@@ -522,7 -544,7 +524,7 @@@ ********************************************************************************* */ --void doWrite (int argc, char *argv []) ++static void doWrite (int argc, char *argv []) { int pin, val ; @@@ -603,6 -625,39 +605,39 @@@ void doPwm (int argc, char *argv [] } + /* + * doPwmMode: doPwmRange: + * Change the PWM mode and Range 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 \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) ; + } + + /* * main: * Start here @@@ -619,12 -674,6 +654,12 @@@ int main (int argc, char *argv [] return 1 ; } + if (strcasecmp (argv [1], "-h") == 0) + { + printf ("%s: %s\n", argv [0], usage) ; + return 0 ; + } + if (strcasecmp (argv [1], "-v") == 0) { printf ("gpio version: %s\n", VERSION) ; @@@ -663,16 -712,12 +698,16 @@@ // Initial test for /sys/class/gpio operations: - /**/ if (strcasecmp (argv [1], "exports" ) == 0) { doExports () ; 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 ; } + /**/ 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], "load" ) == 0) { doLoad (argc, argv) ; return 0 ; } + else if (strcasecmp (argv [1], "unexport" ) == 0) { doUnexport (argc, argv) ; return 0 ; } + +// Check for drive or load commands: + + if (strcasecmp (argv [1], "drive") == 0) { doPadDrive (argc, argv) ; return 0 ; } + if (strcasecmp (argv [1], "load" ) == 0) { doLoad (argc, argv) ; return 0 ; } // Check for -g argument @@@ -680,7 -725,7 +715,7 @@@ { if (wiringPiSetupGpio () == -1) { - fprintf (stderr, "%s: Unable to initialise GPIO in GPIO mode.\n", argv [0]) ; + fprintf (stderr, "%s: Unable to initialise GPIO mode.\n", argv [0]) ; exit (1) ; } @@@ -712,21 -757,31 +747,30 @@@ { if (wiringPiSetup () == -1) { - fprintf (stderr, "%s: Unable to initialise GPIO in wiringPi mode\n", argv [0]) ; + fprintf (stderr, "%s: Unable to initialise wiringPi mode\n", argv [0]) ; exit (1) ; } wpMode = WPI_MODE_PINS ; } + // Check for PWM operations + + if (wpMode != WPI_MODE_PIFACE) + { + if (strcasecmp (argv [1], "pwm-bal") == 0) { doPwmMode (PWM_MODE_BAL) ; return 0 ; } + if (strcasecmp (argv [1], "pwm-ms") == 0) { doPwmMode (PWM_MODE_MS) ; return 0 ; } + if (strcasecmp (argv [1], "pwmr") == 0) { doPwmRange (argc, argv) ; return 0 ; } + } + // Check for wiring commands - /**/ if (strcasecmp (argv [1], "write" ) == 0) doWrite (argc, argv) ; - else if (strcasecmp (argv [1], "read" ) == 0) doRead (argc, argv) ; - else if (strcasecmp (argv [1], "mode" ) == 0) doMode (argc, argv) ; - else if (strcasecmp (argv [1], "pwm" ) == 0) doPwm (argc, argv) ; - else if (strcasecmp (argv [1], "drive" ) == 0) doPadDrive (argc, argv) ; + /**/ 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) ; else { - fprintf (stderr, "%s: Unknown command: %s. (read/write/pwm/mode/drive expected)\n", argv [0], argv [1]) ; + fprintf (stderr, "%s: Unknown command: %s.\n", argv [0], argv [1]) ; exit (1) ; } return 0 ;