chiark / gitweb /
Merge branch 'master' of git.drogon.net:projects/wiringPi
authorGordon Henderson <gordon@drogon.net>
Sun, 19 Aug 2012 14:33:26 +0000 (15:33 +0100)
committerGordon Henderson <gordon@drogon.net>
Sun, 19 Aug 2012 14:33:26 +0000 (15:33 +0100)
Conflicts:
gpio/gpio.c

1  2 
gpio/gpio.c

diff --combined gpio/gpio.c
index 2b6295335297405e2bebc3578b4c39daa03ec8fe,1d12aabf8ad782aa549a0b7ab3111840ee2e3907..5a97aabfaf8f8573c8d8a32e6b49131da4ab812e
  static 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 drive <group> <value>\n"
+             "       gpio pwm-bal/pwm-ms \n"
+             "       gpio pwmr <range> \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)
    {
      exit (1) ;
    }
  
 -  pin = atoi (argv [2]) ;
 -
 +  pin  = atoi (argv [2]) ;
    mode = argv [3] ;
  
  // Export the pin and set direction to input
      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 ;
  
   *********************************************************************************
   */
  
--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 <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) ;
+ }
  /*
   * 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) ;
  
  // 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
  
    {
      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) ;
      }
  
    {
      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 ;