Gordons Projects

--> Projects Top-Level GIT

Fixing a few issues - makefile goofs.
[wiringPi] / wiringPi / wiringPi.c
index 7c899ea..32e5100 100644 (file)
@@ -84,6 +84,7 @@
 
 #define        ENV_DEBUG       "WIRINGPI_DEBUG"
 #define        ENV_CODES       "WIRINGPI_CODES"
 
 #define        ENV_DEBUG       "WIRINGPI_DEBUG"
 #define        ENV_CODES       "WIRINGPI_CODES"
+#define        ENV_GPIOMEM     "WIRINGPI_GPIOMEM"
 
 
 // Mask for the bottom 64 pins which belong to the Raspberry Pi
 
 
 // Mask for the bottom 64 pins which belong to the Raspberry Pi
@@ -253,6 +254,10 @@ static pthread_mutex_t pinMutex ;
 int wiringPiDebug       = FALSE ;
 int wiringPiReturnCodes = FALSE ;
 
 int wiringPiDebug       = FALSE ;
 int wiringPiReturnCodes = FALSE ;
 
+// Use /dev/gpiomem ?
+
+int wiringPiTryGpioMem  = FALSE ;
+
 // sysFds:
 //     Map a file descriptor from the /sys/class/gpio/gpioX/value
 
 // sysFds:
 //     Map a file descriptor from the /sys/class/gpio/gpioX/value
 
@@ -913,6 +918,9 @@ void setPadDrive (int group, int value)
 
   if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO))
   {
 
   if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO))
   {
+    if (RASPBERRY_PI_PERI_BASE == 0)   // Ignore for now
+      return ;
+
     if ((group < 0) || (group > 2))
       return ;
 
     if ((group < 0) || (group > 2))
       return ;
 
@@ -986,6 +994,9 @@ void pwmSetRange (unsigned int range)
 {
   if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO))
   {
 {
   if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO))
   {
+    if (RASPBERRY_PI_PERI_BASE == 0)   // Ignore for now
+      return ;
+
     *(pwm + PWM0_RANGE) = range ; delayMicroseconds (10) ;
     *(pwm + PWM1_RANGE) = range ; delayMicroseconds (10) ;
   }
     *(pwm + PWM0_RANGE) = range ; delayMicroseconds (10) ;
     *(pwm + PWM1_RANGE) = range ; delayMicroseconds (10) ;
   }
@@ -1007,6 +1018,9 @@ void pwmSetClock (int divisor)
 
   if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO))
   {
 
   if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO))
   {
+    if (RASPBERRY_PI_PERI_BASE == 0)   // Ignore for now
+      return ;
+
     if (wiringPiDebug)
       printf ("Setting to: %d. Current: 0x%08X\n", divisor, *(clk + PWMCLK_DIV)) ;
 
     if (wiringPiDebug)
       printf ("Setting to: %d. Current: 0x%08X\n", divisor, *(clk + PWMCLK_DIV)) ;
 
@@ -1059,6 +1073,9 @@ void gpioClockSet (int pin, int freq)
   else if (wiringPiMode != WPI_MODE_GPIO)
     return ;
   
   else if (wiringPiMode != WPI_MODE_GPIO)
     return ;
   
+  if (RASPBERRY_PI_PERI_BASE == 0)     // Ignore for now
+    return ;
+
   divi = 19200000 / freq ;
   divr = 19200000 % freq ;
   divf = (int)((double)divr * 4096.0 / 19200000.0) ;
   divi = 19200000 / freq ;
   divr = 19200000 % freq ;
   divf = (int)((double)divr * 4096.0 / 19200000.0) ;
@@ -1231,11 +1248,17 @@ void pinMode (int pin, int mode)
       softToneCreate (origPin) ;
     else if (mode == PWM_TONE_OUTPUT)
     {
       softToneCreate (origPin) ;
     else if (mode == PWM_TONE_OUTPUT)
     {
+      if (RASPBERRY_PI_PERI_BASE == 0) // Ignore for now
+       return ;
+
       pinMode (origPin, PWM_OUTPUT) ;  // Call myself to enable PWM mode
       pwmSetMode (PWM_MODE_MS) ;
     }
     else if (mode == PWM_OUTPUT)
     {
       pinMode (origPin, PWM_OUTPUT) ;  // Call myself to enable PWM mode
       pwmSetMode (PWM_MODE_MS) ;
     }
     else if (mode == PWM_OUTPUT)
     {
+      if (RASPBERRY_PI_PERI_BASE == 0) // Ignore for now
+       return ;
+
       if ((alt = gpioToPwmALT [pin]) == 0)     // Not a hardware capable PWM pin
        return ;
 
       if ((alt = gpioToPwmALT [pin]) == 0)     // Not a hardware capable PWM pin
        return ;
 
@@ -1250,6 +1273,9 @@ void pinMode (int pin, int mode)
     }
     else if (mode == GPIO_CLOCK)
     {
     }
     else if (mode == GPIO_CLOCK)
     {
+      if (RASPBERRY_PI_PERI_BASE == 0) // Ignore for now
+       return ;
+
       if ((alt = gpioToGpClkALT0 [pin]) == 0)  // Not a GPIO_CLOCK pin
        return ;
 
       if ((alt = gpioToGpClkALT0 [pin]) == 0)  // Not a GPIO_CLOCK pin
        return ;
 
@@ -1404,6 +1430,9 @@ void pwmWrite (int pin, int value)
 
   if ((pin & PI_GPIO_MASK) == 0)               // On-Board Pin
   {
 
   if ((pin & PI_GPIO_MASK) == 0)               // On-Board Pin
   {
+    if (RASPBERRY_PI_PERI_BASE == 0)   // Ignore for now
+      return ;
+
     /**/ if (wiringPiMode == WPI_MODE_PINS)
       pin = pinToGpio [pin] ;
     else if (wiringPiMode == WPI_MODE_PHYS)
     /**/ if (wiringPiMode == WPI_MODE_PINS)
       pin = pinToGpio [pin] ;
     else if (wiringPiMode == WPI_MODE_PHYS)
@@ -1470,6 +1499,9 @@ void pwmToneWrite (int pin, int freq)
 {
   int range ;
 
 {
   int range ;
 
+  if (RASPBERRY_PI_PERI_BASE == 0)     // Ignore for now
+    return ;
+
   if (freq == 0)
     pwmWrite (pin, 0) ;             // Off
   else
   if (freq == 0)
     pwmWrite (pin, 0) ;             // Off
   else
@@ -1838,8 +1870,15 @@ int wiringPiSetup (void)
   if (getenv (ENV_CODES) != NULL)
     wiringPiReturnCodes = TRUE ;
 
   if (getenv (ENV_CODES) != NULL)
     wiringPiReturnCodes = TRUE ;
 
+  if (getenv (ENV_GPIOMEM) != NULL)
+    wiringPiTryGpioMem = TRUE ;
+
   if (wiringPiDebug)
   if (wiringPiDebug)
+  {
     printf ("wiringPi: wiringPiSetup called\n") ;
     printf ("wiringPi: wiringPiSetup called\n") ;
+    if (wiringPiTryGpioMem)
+      printf ("wiringPi: Using /dev/gpiomem\n") ;
+  }
 
   boardRev = piBoardRev () ;
 
 
   boardRev = piBoardRev () ;
 
@@ -1863,8 +1902,12 @@ int wiringPiSetup (void)
 
 //     See if /dev/gpiomem exists and we can open it...
 
 
 //     See if /dev/gpiomem exists and we can open it...
 
-  if ((fd = open ("/dev/gpiomem", O_RDWR | O_SYNC | O_CLOEXEC) ) >= 0)
+  if (wiringPiTryGpioMem)
+  {
+    if ((fd = open ("/dev/gpiomem", O_RDWR | O_SYNC | O_CLOEXEC) ) < 0)
+      return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: Unable to open /dev/gpiomem: %s\n", strerror (errno)) ;
     RASPBERRY_PI_PERI_BASE = 0 ;
     RASPBERRY_PI_PERI_BASE = 0 ;
+  }
 
 //     ... otherwise fall back to the original /dev/mem which requires root level access
 
 
 //     ... otherwise fall back to the original /dev/mem which requires root level access