|
@@ -214,7 +214,7 @@ volatile unsigned int *_wiringPiTimerIrqRaw ;
|
|
|
// The base address of the GPIO memory mapped hardware IO
|
|
|
|
|
|
#define GPIO_PERI_BASE_OLD 0x20000000
|
|
|
-#define GPIO_PERI_BASE_2708 0x3F000000
|
|
|
+#define GPIO_PERI_BASE_2835 0x3F000000
|
|
|
#define GPIO_PERI_BASE_2711 0xFE000000
|
|
|
|
|
|
static volatile unsigned int piGpioBase = 0 ;
|
|
@@ -543,6 +543,14 @@ static uint8_t gpioToFEN [] =
|
|
|
|
|
|
#define GPPUD 37
|
|
|
|
|
|
+/* 2711 has a different mechanism for pin pull-up/down/enable */
|
|
|
+#define GPPUPPDN0 57 /* Pin pull-up/down for pins 15:0 */
|
|
|
+#define GPPUPPDN1 58 /* Pin pull-up/down for pins 31:16 */
|
|
|
+#define GPPUPPDN2 59 /* Pin pull-up/down for pins 47:32 */
|
|
|
+#define GPPUPPDN3 60 /* Pin pull-up/down for pins 57:48 */
|
|
|
+
|
|
|
+static volatile unsigned int piGpioPupOffset = 0 ;
|
|
|
+
|
|
|
// gpioToPUDCLK
|
|
|
// (Word) offset to the Pull Up Down Clock regsiter
|
|
|
|
|
@@ -1509,11 +1517,36 @@ void pullUpDnControl (int pin, int pud)
|
|
|
else if (wiringPiMode != WPI_MODE_GPIO)
|
|
|
return ;
|
|
|
|
|
|
- *(gpio + GPPUD) = pud & 3 ; delayMicroseconds (5) ;
|
|
|
- *(gpio + gpioToPUDCLK [pin]) = 1 << (pin & 31) ; delayMicroseconds (5) ;
|
|
|
+ if (piGpioPupOffset == GPPUPPDN0)
|
|
|
+ {
|
|
|
+ // Pi 4B pull up/down method
|
|
|
+ int pullreg = GPPUPPDN0 + (pin>>4);
|
|
|
+ int pullshift = (pin & 0xf) << 1;
|
|
|
+ unsigned int pullbits;
|
|
|
+ unsigned int pull;
|
|
|
+
|
|
|
+ switch (pud)
|
|
|
+ {
|
|
|
+ case PUD_OFF: pull = 0; break;
|
|
|
+ case PUD_UP: pull = 1; break;
|
|
|
+ case PUD_DOWN: pull = 2; break;
|
|
|
+ default: return ; /* An illegal value */
|
|
|
+ }
|
|
|
|
|
|
- *(gpio + GPPUD) = 0 ; delayMicroseconds (5) ;
|
|
|
- *(gpio + gpioToPUDCLK [pin]) = 0 ; delayMicroseconds (5) ;
|
|
|
+ pullbits = *(gpio + pullreg);
|
|
|
+ pullbits &= ~(3 << pullshift);
|
|
|
+ pullbits |= (pull << pullshift);
|
|
|
+ *(gpio + pullreg) = pullbits;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // legacy pull up/down method
|
|
|
+ *(gpio + GPPUD) = pud & 3 ; delayMicroseconds (5) ;
|
|
|
+ *(gpio + gpioToPUDCLK [pin]) = 1 << (pin & 31) ; delayMicroseconds (5) ;
|
|
|
+
|
|
|
+ *(gpio + GPPUD) = 0 ; delayMicroseconds (5) ;
|
|
|
+ *(gpio + gpioToPUDCLK [pin]) = 0 ; delayMicroseconds (5) ;
|
|
|
+ }
|
|
|
}
|
|
|
else // Extension module
|
|
|
{
|
|
@@ -2270,14 +2303,17 @@ int wiringPiSetup (void)
|
|
|
case PI_ALPHA: case PI_MODEL_CM:
|
|
|
case PI_MODEL_ZERO: case PI_MODEL_ZERO_W:
|
|
|
piGpioBase = GPIO_PERI_BASE_OLD ;
|
|
|
+ piGpioPupOffset = GPPUD ;
|
|
|
break ;
|
|
|
|
|
|
case PI_MODEL_4B:
|
|
|
piGpioBase = GPIO_PERI_BASE_2711 ;
|
|
|
+ piGpioPupOffset = GPPUPPDN0 ;
|
|
|
break ;
|
|
|
|
|
|
default:
|
|
|
- piGpioBase = GPIO_PERI_BASE_2708 ;
|
|
|
+ piGpioBase = GPIO_PERI_BASE_2835 ;
|
|
|
+ piGpioPupOffset = GPPUD ;
|
|
|
break ;
|
|
|
}
|
|
|
|