From 9796fa7fb172d2f6dfaf288a30fe5d42fefde422 Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Fri, 16 Feb 2024 18:29:26 +0100 Subject: [PATCH] #17 setPadDrive --- gpio/gpio.c | 4 +-- wiringPi/wiringPi.c | 80 +++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 64 insertions(+), 20 deletions(-) diff --git a/gpio/gpio.c b/gpio/gpio.c index a4574a1..d029877 100644 --- a/gpio/gpio.c +++ b/gpio/gpio.c @@ -807,13 +807,13 @@ static void doPadDrive (int argc, char *argv []) group = atoi (argv [2]) ; val = atoi (argv [3]) ; - if ((group < 0) || (group > 2)) + if ((group < -1) || (group > 2)) //-1 hidden feature for read value of all { fprintf (stderr, "%s: drive group not 0, 1 or 2: %d\n", argv [0], group) ; exit (1) ; } - if ((val < 0) || (val > 7)) + if ((val < -1) || (val > 7)) { fprintf (stderr, "%s: drive value not 0-7: %d\n", argv [0], val) ; exit (1) ; diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c index 82d5392..a30d453 100644 --- a/wiringPi/wiringPi.c +++ b/wiringPi/wiringPi.c @@ -152,6 +152,8 @@ const unsigned int RP1_DEBOUNCE_DEFAULT_VALUE = 4; const unsigned int RP1_DEBOUNCE_MASK = 0x7f; const unsigned int RP1_DEBOUNCE_DEFAULT = (RP1_DEBOUNCE_DEFAULT_VALUE << 5); const unsigned int RP1_PAD_DEFAULT = 0x5a; +const unsigned int RP1_PAD_DRIVE_MASK = 0x00000030; +const unsigned int RP1_INV_PAD_DRIVE_MASK = ~(RP1_PAD_DRIVE_MASK); //RP1 chip (@Pi5) address const unsigned long long RP1_BASE_Addr = 0x1f000d0000; @@ -1249,21 +1251,57 @@ int physPinToGpio (int physPin) void setPadDrive (int group, int value) { - uint32_t wrVal ; + uint32_t wrVal, rdVal; - RETURN_ON_MODEL5 if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) { - if ((group < 0) || (group > 2)) - return ; + value = value & 7; // 0-7 supported + if (PI_MODEL_5 == RaspberryPiModel) { + if (-1==group) { + printf ("Pad register:\n"); + for (int pin=0, maxpin=GetMaxPin(); pin<=maxpin; ++pin) { + unsigned int drive = (pads[1+pin] & RP1_PAD_DRIVE_MASK)>>4; + printf (" Pin %2d: 0x%08X drive: 0x%d = %2dmA\n", pin, pads[1+pin], drive, 0==drive ? 2 : drive*4) ; + } + } + if (group !=0) { // only GPIO range @RP1 + return ; + } + switch(value) { + default: + /* bcm*/ // RP1 + case 0: /* 2mA*/ value=0; break; // 2mA + case 1: /* 4mA*/ + case 2: /* 6mA*/ value=1; break; // 4mA + case 3: /* 8mA*/ + case 4: /*10mA*/ value=2; break; // 8mA + case 5: /*12mA*/ + case 6: /*14mA*/ + case 7: /*16mA*/ value=3; break; //12mA + } + wrVal = (value << 4); //Drive strength 0-3 + //set for all pins even when it's avaiable for each pin separately + for (int pin=0, maxpin=GetMaxPin(); pin<=maxpin; ++pin) { + pads[1+pin] = (pads[1+pin] & RP1_INV_PAD_DRIVE_MASK) | wrVal; + } + rdVal = pads[1+17]; // only pin 17 readback, for logging + } else { + if (-1==group) { + printf ("Pad register: Group 0: 0x%08X, Group 1: 0x%08X, Group 2: 0x%08X\n", *(pads + 0 + 11), *(pads + 1 + 11), *(pads + 2 + 11)) ; + } - wrVal = BCM_PASSWORD | 0x18 | (value & 7) ; - *(pads + group + 11) = wrVal ; + if ((group < 0) || (group > 2)) + return ; + + wrVal = BCM_PASSWORD | 0x18 | value; //Drive strength 0-7 + *(pads + group + 11) = wrVal ; + rdVal = *(pads + group + 11); + } if (wiringPiDebug) { printf ("setPadDrive: Group: %d, value: %d (%08X)\n", group, value, wrVal) ; - printf ("Read : %08X\n", *(pads + group + 11)) ; + printf ("Read : %08X\n", rdVal) ; } } } @@ -1292,15 +1330,21 @@ int getAlt (int pin) if (PI_MODEL_5 == RaspberryPiModel) { alt = (gpio[2*pin+1] & RP1_FSEL_NONE_HW); //0-4 function - /* BCM definiton - 000 = GPIO Pin 9 is an input - 001 = GPIO Pin 9 is an output - 100 = GPIO Pin 9 takes alternate function 0 - 101 = GPIO Pin 9 takes alternate function 1 - 110 = GPIO Pin 9 takes alternate function 2 - 111 = GPIO Pin 9 takes alternate function 3 - 011 = GPIO Pin 9 takes alternate function 4 - 010 = GPIO Pin 9 takes alternate function 5 + /* + BCM: + 000b = GPIO Pin 9 is an input + 001b = GPIO Pin 9 is an output + 100b = GPIO Pin 9 takes alternate function 0 + 101b = GPIO Pin 9 takes alternate function 1 + 110b = GPIO Pin 9 takes alternate function 2 + 111b = GPIO Pin 9 takes alternate function 3 + 011b = GPIO Pin 9 takes alternate function 4 + 010b = GPIO Pin 9 takes alternate function 5 + RP1: + 8 = alternate function 6 + 9 = alternate function 7 + 10 = alternate function 8 + 11 = alternate function 9 */ switch(alt) { case 0: return 4; @@ -1728,8 +1772,8 @@ void pullUpDnControl (int pin, int pud) if (PI_MODEL_5 == RaspberryPiModel) { unsigned int pullbits = pads[1+pin] & RP1_INV_PUD_MASK; // remove bits switch (pud){ - case PUD_OFF: break; - case PUD_UP: pads[1+pin] = pullbits | RP1_PUD_UP; break; //set bit + case PUD_OFF: pads[1+pin] = pullbits; break; + case PUD_UP: pads[1+pin] = pullbits | RP1_PUD_UP; break; case PUD_DOWN: pads[1+pin] = pullbits | RP1_PUD_DOWN; break; default: return ; /* An illegal value */ }