From 5e956749ddd5feff5c867bef53dd7b5ee818c966 Mon Sep 17 00:00:00 2001 From: Yatao Li Date: Tue, 11 Apr 2023 04:28:49 +0800 Subject: [PATCH 1/4] wiringpi: A06: add PU/PD/Hi-Z control --- .../devterm_wiringpi_cpi/wiringPi/wiringCPi.c | 321 ++++++++++++++---- .../devterm_wiringpi_cpi/wiringPi/wiringCPi.h | 27 +- Code/devterm_wiringpi_cpi/wiringPi/wiringPi.c | 11 + 3 files changed, 280 insertions(+), 79 deletions(-) diff --git a/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c b/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c index fc1313e..3c38b62 100755 --- a/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c +++ b/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c @@ -22,6 +22,45 @@ #include "softPwm.h" #include "softTone.h" +/* + * A06: always write 0xffff0180 to CRU control. + * - For PMUCRU (bank 0 & 1), operates on PMUCRU_CLKGATE_CON1: + * 0 1 8 0 + * pclk_pmu_en=0 ENABLE + * pclk_pmugrf_en=0 ENABLE + * pclk_intmem1_en=0 ENABLE + * pclk_gpio0_en=0 ENABLE + * pclk_gpio1_en=0 ENABLE + * pclk_sgrf_en=0 ENABLE + * pclk_noc_pmu_en=0 ENABLE + * pclk_i2c0_en=1 DISABLE + * pclk_i2c4_en=1 DISABLE + * pclk_i2c8_en=0 ENABLE + * pclk_rkpwm_pmu_en=0 ENABLE + * pclk_spi3_en=0 ENABLE + * pclk_timer_pmu_en=0 ENABLE + * pclk_mailbox_pmu_en=0 ENABLE + * pclk_uartm0_en=0 ENABLE + * pclk_wdt_m0_pmu_en=0 ENABLE + * - For CRU (bank 2, 3 & 4), operates on CRU_CLKGATE_CON31: + * 0 1 8 0 + * pclk_grf_en=0 ENABLE + * pclk_intr_arb_en=0 ENABLE + * pclk_gpio2_en=0 ENABLE + * pclk_gpio3_en=0 ENABLE + * pclk_gpio4_en=0 ENABLE + * pclk_timer0_en=0 ENABLE + * pclk_timer1_en=0 ENABLE + * pclk_i2c0_en=1 DISABLE (!! i2c0 disabled) + * pclk_hsicphy_en=1 DISABLE + * pclk_pmu_intr_arb_en=0 ENABLE + * pclk_sgrf_en=0 ENABLE + * - - + * - - + * - - + * - - + * - - + */ static int wpimode = -1 ; #define WPI_MODE_BCM 0 @@ -110,17 +149,17 @@ int bcmToGpioCPi[64] = 64, 65, //44,45 -1, -1, //46,47 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,// ... 63 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,// ... 63 }; - int CPI_PIN_MASK[5][32] = //[BANK] [INDEX] - { - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//GPIO0 - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//GPIO1 - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//GPIO2 - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//GPIO3 - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//GPIO4 - }; +int CPI_PIN_MASK[5][32] = //[BANK] [INDEX] +{ + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//GPIO0 + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//GPIO1 + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//GPIO2 + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//GPIO3 + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//GPIO4 +}; volatile uint32_t *cru_base; volatile uint32_t *grf_base; @@ -141,24 +180,37 @@ static unsigned int readR(unsigned int addr) unsigned int mmap_base = (addr & ~MAP_MASK); unsigned int mmap_seek = (addr - mmap_base); - if(mmap_base == CRU_BASE) - val = *((unsigned int *)((unsigned char *)cru_base + mmap_seek)); - else if(mmap_base == GRF_BASE) - val = *((unsigned int *)((unsigned char *)grf_base + mmap_seek)); - else if(mmap_base == PMUCRU_BASE) - val = *((unsigned int *)((unsigned char *)pmucru_base + mmap_seek)); - else if(mmap_base == PMUGRF_BASE) - val = *((unsigned int *)((unsigned char *)pmugrf_base + mmap_seek)); - else if(mmap_base == GPIO0_BASE) - val = *((unsigned int *)((unsigned char *)gpio0_base + mmap_seek)); - else if(mmap_base == GPIO1_BASE) - val = *((unsigned int *)((unsigned char *)gpio1_base + mmap_seek)); - else if(mmap_base == GPIO2_BASE) - val = *((unsigned int *)((unsigned char *)gpio2_base + mmap_seek)); - else if(mmap_base == GPIO3_BASE) - val = *((unsigned int *)((unsigned char *)gpio3_base + mmap_seek)); - else if(mmap_base == GPIO4_BASE) - val = *((unsigned int *)((unsigned char *)gpio4_base + mmap_seek)); + switch(mmap_base) { + case CRU_BASE: + val = *((unsigned int *)((unsigned char *)cru_base + mmap_seek)); + break; + case GRF_BASE: + val = *((unsigned int *)((unsigned char *)grf_base + mmap_seek)); + break; + case PMUCRU_BASE: + val = *((unsigned int *)((unsigned char *)pmucru_base + mmap_seek)); + break; + case PMUGRF_BASE: + val = *((unsigned int *)((unsigned char *)pmugrf_base + mmap_seek)); + break; + case GPIO0_BASE: + val = *((unsigned int *)((unsigned char *)gpio0_base + mmap_seek)); + break; + case GPIO1_BASE: + val = *((unsigned int *)((unsigned char *)gpio1_base + mmap_seek)); + break; + case GPIO2_BASE: + val = *((unsigned int *)((unsigned char *)gpio2_base + mmap_seek)); + break; + case GPIO3_BASE: + val = *((unsigned int *)((unsigned char *)gpio3_base + mmap_seek)); + break; + case GPIO4_BASE: + val = *((unsigned int *)((unsigned char *)gpio4_base + mmap_seek)); + break; + default: + break; + } return val; @@ -184,24 +236,38 @@ static void writeR(unsigned int val, unsigned int addr) unsigned int mmap_base = (addr & ~MAP_MASK); unsigned int mmap_seek = (addr - mmap_base); - if(mmap_base == CRU_BASE) - *((unsigned int *)((unsigned char *)cru_base + mmap_seek)) = val; - else if(mmap_base == GRF_BASE) - *((unsigned int *)((unsigned char *)grf_base + mmap_seek)) = val; - else if(mmap_base == PMUCRU_BASE) - *((unsigned int *)((unsigned char *)pmucru_base + mmap_seek)) = val; - else if(mmap_base == PMUGRF_BASE) - *((unsigned int *)((unsigned char *)pmugrf_base + mmap_seek)) = val; - else if(mmap_base == GPIO0_BASE) - *((unsigned int *)((unsigned char *)gpio0_base + mmap_seek)) = val; - else if(mmap_base == GPIO1_BASE) - *((unsigned int *)((unsigned char *)gpio1_base + mmap_seek)) = val; - else if(mmap_base == GPIO2_BASE) - *((unsigned int *)((unsigned char *)gpio2_base + mmap_seek)) = val; - else if(mmap_base == GPIO3_BASE) - *((unsigned int *)((unsigned char *)gpio3_base + mmap_seek)) = val; - else if(mmap_base == GPIO4_BASE) - *((unsigned int *)((unsigned char *)gpio4_base + mmap_seek)) = val; + switch(mmap_base) { + case CRU_BASE: + *((unsigned int *)((unsigned char *)cru_base + mmap_seek)) = val; + break; + case GRF_BASE: + *((unsigned int *)((unsigned char *)grf_base + mmap_seek)) = val; + break; + case PMUCRU_BASE: + *((unsigned int *)((unsigned char *)pmucru_base + mmap_seek)) = val; + break; + case PMUGRF_BASE: + *((unsigned int *)((unsigned char *)pmugrf_base + mmap_seek)) = val; + break; + case GPIO0_BASE: + *((unsigned int *)((unsigned char *)gpio0_base + mmap_seek)) = val; + break; + case GPIO1_BASE: + *((unsigned int *)((unsigned char *)gpio1_base + mmap_seek)) = val; + break; + case GPIO2_BASE: + *((unsigned int *)((unsigned char *)gpio2_base + mmap_seek)) = val; + break; + case GPIO3_BASE: + *((unsigned int *)((unsigned char *)gpio3_base + mmap_seek)) = val; + break; + case GPIO4_BASE: + *((unsigned int *)((unsigned char *)gpio4_base + mmap_seek)) = val; + break; + default: + break; + } + #elif (defined CONFIG_CLOCKWORKPI_A04) @@ -216,7 +282,7 @@ static void writeR(unsigned int val, unsigned int addr) #endif } -int CPi_get_gpio_mode(int pin) +static int __CPi_get_gpio_mode(int pin) { unsigned int regval = 0; unsigned int bank = pin >> 5; @@ -226,7 +292,7 @@ int CPi_get_gpio_mode(int pin) if (CPI_PIN_MASK[bank][index] < 0) return -1; - + #ifdef CONFIG_CLOCKWORKPI_A06 unsigned int grf_phyaddr = 0, ddr_phyaddr = 0; @@ -239,7 +305,7 @@ int CPi_get_gpio_mode(int pin) else if(bank == 1){ grf_phyaddr = PMUGRF_BASE + ((index >> 3) << 2) + 0x10; ddr_phyaddr = GPIO1_BASE + GPIO_SWPORTA_DDR_OFFSET; - } + } else if(bank == 2){ grf_phyaddr = GRF_BASE + ((index >> 3) << 2); ddr_phyaddr = GPIO2_BASE + GPIO_SWPORTA_DDR_OFFSET; @@ -285,12 +351,12 @@ int CPi_get_gpio_mode(int pin) /* * Set GPIO Mode */ -int CPi_set_gpio_mode(int pin, int mode) +static void __CPi_set_gpio_mode(int pin, int mode) { - unsigned int regval = 0; - unsigned int bank = pin >> 5; - unsigned int index = pin - (bank << 5); - unsigned int phyaddr = 0; + unsigned int regval = 0; + unsigned int bank = pin >> 5; + unsigned int index = pin - (bank << 5); + unsigned int phyaddr = 0; #ifdef CONFIG_CLOCKWORKPI_A04 @@ -344,7 +410,7 @@ int CPi_set_gpio_mode(int pin, int mode) printf("Before read reg val: 0x%x offset:%d\n",regval,offset); #endif if (wiringPiDebug) - printf("Register[%#x]: %#x index:%d\n", phyaddr, regval, index); + printf("Register[%#x]: %#x index:%d\n", phyaddr, regval, index); if (INPUT == mode) { #ifdef CONFIG_CLOCKWORKPI_A06 @@ -391,13 +457,13 @@ int CPi_set_gpio_mode(int pin, int mode) if (wiringPiDebug) printf("Out mode get value: 0x%x\n",regval); #endif - } else + } else printf("Unknow mode\n"); } else printf("unused pin\n"); } -int CPi_set_gpio_alt(int pin, int mode) +static int CPi_set_gpio_alt(int pin, int mode) { #ifdef CONFIG_CLOCKWORKPI_A04 unsigned int regval = 0; @@ -428,9 +494,9 @@ int CPi_set_gpio_alt(int pin, int mode) } /* - * CPi Digital write + * CPi Digital write */ -void CPi_digitalWrite(int pin, int value) +static void __CPi_digitalWrite(int pin, int value) { unsigned int bank = pin >> 5; unsigned int index = pin - (bank << 5); @@ -438,7 +504,7 @@ void CPi_digitalWrite(int pin, int value) unsigned int regval = 0; #ifdef CONFIG_CLOCKWORKPI_A04 - + if (bank >= 6) { phyaddr = GPIOL_BASE + (bank -6) * 0x24 + 0x10; } else { @@ -460,7 +526,7 @@ void CPi_digitalWrite(int pin, int value) cru_phyaddr = PMUCRU_BASE + PMUCRU_CLKGATE_CON1_OFFSET; } else if(bank == 2){ - phyaddr = GPIO2_BASE + GPIO_SWPORTA_DR_OFFSET; + phyaddr = GPIO2_BASE + GPIO_SWPORTA_DR_OFFSET; cru_phyaddr = CRU_BASE + CRU_CLKGATE_CON31_OFFSET; } else if(bank == 3){ @@ -468,7 +534,7 @@ void CPi_digitalWrite(int pin, int value) cru_phyaddr = CRU_BASE + CRU_CLKGATE_CON31_OFFSET; } else if(bank == 4){ - phyaddr = GPIO4_BASE + GPIO_SWPORTA_DR_OFFSET; + phyaddr = GPIO4_BASE + GPIO_SWPORTA_DR_OFFSET; cru_phyaddr = CRU_BASE + CRU_CLKGATE_CON31_OFFSET; } @@ -500,13 +566,13 @@ void CPi_digitalWrite(int pin, int value) printf("HIGH val set over reg val: 0x%x\n", regval); } - } + } } /* * CPi Digital Read */ -int CPi_digitalRead(int pin) +static int __CPi_digitalRead(int pin) { int bank = pin >> 5; int index = pin - (bank << 5); @@ -549,6 +615,95 @@ int CPi_digitalRead(int pin) return 0; } +static void __CPi_pudctl(int _pin, int pud) +{ + unsigned int regval = 0; + // every bank has 4 ports (A-D) x 8 pins (0-7) + unsigned int bank = _pin >> 5; + unsigned int index = _pin & 0x1f; + unsigned int port = index >> 3; + unsigned int pin = index & 7; + unsigned int phyaddr = 0; + + if (CPI_PIN_MASK[bank][index] < 0) { + printf("unused pin\n"); + return; + } + +#if defined(CONFIG_CLOCKWORKPI_A04) + // TODO +#elif defined(CONFIG_CLOCKWORKPI_A06) + // cru_vaddr: see comment at the top of this file + // iomux_vaddr: pointing to GRF IOMUX control register + // pud_vaddr: pointing to GRF PU/PD control register + // gpio_vaddr: pointing to GPIO control register + unsigned int cru_vaddr, iomux_vaddr, pud_vaddr, ddr_vaddr; + + switch(bank) { + case 0: + cru_vaddr = PMUCRU_BASE + PMUCRU_CLKGATE_CON1_OFFSET; + iomux_vaddr = PMUGRF_IOMUX_0 + port*4; + pud_vaddr = PMUGRF_PUD_0 + port*4; + ddr_vaddr = GPIO0_BASE + GPIO_SWPORTA_DDR_OFFSET; + break; + case 1: + cru_vaddr = PMUCRU_BASE + PMUCRU_CLKGATE_CON1_OFFSET; + iomux_vaddr = PMUGRF_IOMUX_1 + port*4; + pud_vaddr = PMUGRF_PUD_1 + port*4; + ddr_vaddr = GPIO1_BASE + GPIO_SWPORTA_DDR_OFFSET; + break; + case 2: + cru_vaddr = CRU_BASE + CRU_CLKGATE_CON31_OFFSET; + iomux_vaddr = GRF_IOMUX_2 + port*4; + pud_vaddr = GRF_PUD_2 + port*4; + ddr_vaddr = GPIO2_BASE + GPIO_SWPORTA_DDR_OFFSET; + break; + case 3: + cru_vaddr = CRU_BASE + CRU_CLKGATE_CON31_OFFSET; + iomux_vaddr = GRF_IOMUX_3 + port*4; + pud_vaddr = GRF_PUD_3 + port*4; + ddr_vaddr = GPIO3_BASE + GPIO_SWPORTA_DDR_OFFSET; + break; + case 4: + cru_vaddr = CRU_BASE + CRU_CLKGATE_CON31_OFFSET; + iomux_vaddr = GRF_IOMUX_4 + port*4; + pud_vaddr = GRF_PUD_4 + port*4; + ddr_vaddr = GPIO4_BASE + GPIO_SWPORTA_DDR_OFFSET; + break; + default: + printf("%s: invalid pin.\n", __PRETTY_FUNCTION__); + return; + } + + // some necessary ceremony + writeR(0xffff0180, cru_vaddr); + regval = (readR(iomux_vaddr) >> (pin*2)) & 0x3; + if (regval != 0) { + printf("pin is not gpio\n"); + return; + } + regval = (readR(ddr_vaddr) >> index) & 1; + if (regval != 0) { + printf("pin is not input\n"); + return; + } + // assemble update val + regval = + (pud == PUD_OFF) ? 0: + (pud == PUD_UP) ? 1: + (pud == PUD_DOWN) ? 2: + 0; + + regval = regval << (pin*2); + regval = regval | (0x30000 << (pin*2)); + writeR(regval, pud_vaddr); + + if (wiringPiDebug){ + regval = readR(pud_vaddr); + printf("PU/PD mode set over reg val: %#x\n",regval); + } +#endif +} int CPiSetup(int fd) { @@ -594,6 +749,7 @@ int CPiSetup(int fd) #endif wpimode = WPI_MODE_BCM; + return 0; } void CPiSetupRaw(void) @@ -619,7 +775,7 @@ void CPiPinMode(int pin, int mode) pin = bcmToGpioCPi[pin]; } - CPi_set_gpio_mode(pin, mode); + __CPi_set_gpio_mode(pin, mode); } void CPiDigitalWrite(int pin, int value) @@ -640,7 +796,7 @@ void CPiDigitalWrite(int pin, int value) pin = bcmToGpioCPi[pin]; } - CPi_digitalWrite(pin, value); + __CPi_digitalWrite(pin, value); } int CPiDigitalRead(int pin) @@ -660,7 +816,7 @@ int CPiDigitalRead(int pin) pin = bcmToGpioCPi[pin]; } - value = CPi_digitalRead(pin); + value = __CPi_digitalRead(pin); if (wiringPiDebug) printf("CPiDigitalRead: pin:%d,value:%d\n", pin, value); @@ -668,22 +824,39 @@ int CPiDigitalRead(int pin) return value; } -void pinModeAltCP(int pin, int mode) -{ -} - void CPiBoardId (int *model, int *rev, int *mem, int *maker, int *warranty) { #ifdef CONFIG_CLOCKWORKPI_A04 - *model = CPI_MODEL_A04; - *rev = PI_VERSION_1; + *model = CPI_MODEL_A04; + *rev = PI_VERSION_1; *mem = 3; *maker = 3; #elif defined(CONFIG_CLOCKWORKPI_A06) - *model = CPI_MODEL_A06; - *rev = PI_VERSION_1; + *model = CPI_MODEL_A06; + *rev = PI_VERSION_1; *mem = 4; *maker = 3; #endif } +void CPiPullUpDnControl(int pin, int pud) +{ + if (wiringPiDebug) + printf("%s: pin:%d,pud:%d\n", __PRETTY_FUNCTION__, pin, pud); + + if (pin >= GPIO_NUM) { + printf("%s: invaild pin:%d\n", __PRETTY_FUNCTION__, pin); + return; + } + + if (wpimode == WPI_MODE_BCM) { + if(pin >= sizeof(bcmToGpioCPi)/sizeof(bcmToGpioCPi[0])) { + printf("%s: invaild pin:%d\n", __PRETTY_FUNCTION__, pin); + return; + } + pin = bcmToGpioCPi[pin]; + } + + __CPi_pudctl(pin, pud); +} + diff --git a/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.h b/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.h index 9cde29c..5c15707 100755 --- a/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.h +++ b/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.h @@ -25,16 +25,33 @@ #define CRU_CLKGATE_CON31_OFFSET 0x037c #define PMUCRU_CLKGATE_CON1_OFFSET 0x0104 #define GPIO_NUM (160) + +#define PMUGRF_IOMUX_0 (PMUGRF_BASE+0x00) +#define PMUGRF_IOMUX_1 (PMUGRF_BASE+0x10) +#define PMUGRF_PUD_0 (PMUGRF_BASE+0x40) +#define PMUGRF_PUD_1 (PMUGRF_BASE+0x50) + +#define GRF_IOMUX_2 (GRF_BASE+0x00) +#define GRF_IOMUX_3 (GRF_BASE+0x10) +#define GRF_IOMUX_4 (GRF_BASE+0x20) +#define GRF_PUD_2 (GRF_BASE+0x40) +#define GRF_PUD_3 (GRF_BASE+0x50) +#define GRF_PUD_4 (GRF_BASE+0x60) + #endif #define MAP_SIZE (4*1024) #define MAP_MASK (MAP_SIZE - 1) -extern int CPi_set_gpio_mode(int pin, int mode); -extern int CPi_set_gpio_alt(int pin, int mode); -extern int CPi_get_gpio_mode(int pin); -extern void CPi_digitalWrite(int pin, int value); -extern int CPi_digitalRead(int pin); +extern int wiringPiDebug; +extern int wiringPiReturnCodes; + +extern void CPiPinMode(int pin, int mode); +extern void CPiDigitalWrite(int pin, int value); +extern int CPiDigitalRead(int pin); extern void CPiSetupRaw(void); +extern int CPiSetup(int fd); +extern void CPiBoardId (int *model, int *rev, int *mem, int *maker, int *warranty); +extern void CPiPullUpDnControl(int pin, int pud); #endif diff --git a/Code/devterm_wiringpi_cpi/wiringPi/wiringPi.c b/Code/devterm_wiringpi_cpi/wiringPi/wiringPi.c index 6c42106..77943ae 100644 --- a/Code/devterm_wiringpi_cpi/wiringPi/wiringPi.c +++ b/Code/devterm_wiringpi_cpi/wiringPi/wiringPi.c @@ -1536,6 +1536,17 @@ void pullUpDnControl (int pin, int pud) setupCheck ("pullUpDnControl") ; +#ifdef CONFIG_CLOCKWORKPI + if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin + { + CPiPullUpDnControl(pin, pud); + } else { + if ((node = wiringPiFindNode (pin)) != NULL) + node->pullUpDnControl (node, pin, pud) ; + } + return ; +#endif + if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin { /**/ if (wiringPiMode == WPI_MODE_PINS) From 8ec59ef304786f5940ba4327c2455e3d1d10a68c Mon Sep 17 00:00:00 2001 From: Yatao Li Date: Tue, 25 Apr 2023 09:12:14 +0800 Subject: [PATCH 2/4] wiringpi: update gpio.c routines to go through public interfaces with proper range checks --- Code/devterm_wiringpi_cpi/gpio/CPi.h | 4 ++-- Code/devterm_wiringpi_cpi/gpio/CPi_readall.c | 8 ++++---- Code/devterm_wiringpi_cpi/gpio/gpio.c | 6 +++--- Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c | 2 +- Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.h | 1 + Code/devterm_wiringpi_cpi/wiringPi/wiringPi.c | 2 +- 6 files changed, 12 insertions(+), 11 deletions(-) diff --git a/Code/devterm_wiringpi_cpi/gpio/CPi.h b/Code/devterm_wiringpi_cpi/gpio/CPi.h index 5b8a141..9681498 100644 --- a/Code/devterm_wiringpi_cpi/gpio/CPi.h +++ b/Code/devterm_wiringpi_cpi/gpio/CPi.h @@ -4,8 +4,8 @@ extern int wiringPiSetupRaw (void); extern void CPiBoardId (int *model, int *rev, int *mem, int *maker, int *warranty); extern int CPi_get_gpio_mode(int pin); -extern int CPi_digitalRead(int pin); -extern void CPi_digitalWrite(int pin, int value); +extern int CPiDigitalRead(int pin); +extern void CPiDigitalWrite(int pin, int value); extern void CPiReadAll(void); extern void CPiReadAllRaw(void); diff --git a/Code/devterm_wiringpi_cpi/gpio/CPi_readall.c b/Code/devterm_wiringpi_cpi/gpio/CPi_readall.c index 86bc0b2..c10245a 100755 --- a/Code/devterm_wiringpi_cpi/gpio/CPi_readall.c +++ b/Code/devterm_wiringpi_cpi/gpio/CPi_readall.c @@ -122,13 +122,13 @@ void CPiReadAll(void) printf (" | %4d", bcmToGpioCPi[pin]); printf (" | %-4s", get_pin_name(bcmToGpioCPi[pin])); printf (" | %4s", alts [CPi_get_gpio_mode(bcmToGpioCPi[pin])]); - printf (" | %d", CPi_digitalRead(bcmToGpioCPi[pin])) ; + printf (" | %d", CPiDigitalRead(bcmToGpioCPi[pin])) ; pin2 = pin + 23; printf (" | %3d", pin2); printf (" | %4d", bcmToGpioCPi[pin2]); printf (" | %-4s", get_pin_name(bcmToGpioCPi[pin2])); printf (" | %4s", alts [CPi_get_gpio_mode(bcmToGpioCPi[pin2])]); - printf (" | %d", CPi_digitalRead(bcmToGpioCPi[pin2])) ; + printf (" | %d", CPiDigitalRead(bcmToGpioCPi[pin2])) ; printf (" |\n") ; } @@ -158,7 +158,7 @@ void CPiReadAllRaw(void) printf (" | %4d", pin2) ; printf (" | %-4s", get_pin_name(pin2)); printf (" | %4s", alts [CPi_get_gpio_mode(pin2)]) ; - printf (" | %d", CPi_digitalRead(pin2)) ; + printf (" | %d", CPiDigitalRead(pin2)) ; } else { printf (" | ") ; printf (" | ") ; @@ -186,7 +186,7 @@ void CPiReadAllRaw(void) for(i = 0; i < 5; i++) { printf (" | %4d", pin2) ; printf (" | %4s", alts [CPi_get_gpio_mode(pin2)]) ; - printf (" | %d", CPi_digitalRead(pin2)) ; + printf (" | %d", CPiDigitalRead(pin2)) ; pin2 += 32; } printf (" |\n") ; diff --git a/Code/devterm_wiringpi_cpi/gpio/gpio.c b/Code/devterm_wiringpi_cpi/gpio/gpio.c index 1a12a41..4832a32 100644 --- a/Code/devterm_wiringpi_cpi/gpio/gpio.c +++ b/Code/devterm_wiringpi_cpi/gpio/gpio.c @@ -1326,7 +1326,7 @@ static void doReadRaw (int argc, char *argv []) } pin = atoi (argv [2]) ; - val = CPi_digitalRead(pin); + val = CPiDigitalRead(pin); printf ("%s\n", val == 0 ? "0" : "1") ; #endif @@ -1352,9 +1352,9 @@ static void doWriteRaw (int argc, char *argv []) val = atoi (argv [3]) ; if (val == 0) - CPi_digitalWrite (pin, LOW) ; + CPiDigitalWrite (pin, LOW) ; else - CPi_digitalWrite (pin, HIGH) ; + CPiDigitalWrite (pin, HIGH) ; #endif } diff --git a/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c b/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c index 3c38b62..95c6bfb 100755 --- a/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c +++ b/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c @@ -282,7 +282,7 @@ static void writeR(unsigned int val, unsigned int addr) #endif } -static int __CPi_get_gpio_mode(int pin) +int CPi_get_gpio_mode(int pin) { unsigned int regval = 0; unsigned int bank = pin >> 5; diff --git a/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.h b/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.h index 5c15707..90160b7 100755 --- a/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.h +++ b/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.h @@ -47,6 +47,7 @@ extern int wiringPiDebug; extern int wiringPiReturnCodes; extern void CPiPinMode(int pin, int mode); +extern int CPi_get_gpio_mode(int pin); extern void CPiDigitalWrite(int pin, int value); extern int CPiDigitalRead(int pin); extern void CPiSetupRaw(void); diff --git a/Code/devterm_wiringpi_cpi/wiringPi/wiringPi.c b/Code/devterm_wiringpi_cpi/wiringPi/wiringPi.c index 77943ae..6f61d7d 100644 --- a/Code/devterm_wiringpi_cpi/wiringPi/wiringPi.c +++ b/Code/devterm_wiringpi_cpi/wiringPi/wiringPi.c @@ -975,7 +975,7 @@ void piBoardId (int *model, int *rev, int *mem, int *maker, int *warranty) // unsigned int modelNum ; #ifdef CONFIG_CLOCKWORKPI - CPiBoardId(model, rev, mem, maker); + CPiBoardId(model, rev, mem, maker, warranty); return; #endif From 1fec4c227a8f9fbc52603e90d285f30a5c9b6ff7 Mon Sep 17 00:00:00 2001 From: Yatao Li Date: Wed, 26 Apr 2023 17:44:23 +0800 Subject: [PATCH 3/4] wiringcpi: fix warnings --- .../devterm_wiringpi_cpi/wiringPi/wiringCPi.c | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c b/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c index 95c6bfb..a2b4a57 100755 --- a/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c +++ b/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c @@ -67,6 +67,10 @@ static int wpimode = -1 ; #define WPI_MODE_RAW 1 #define BLOCK_SIZE (4*1024) +#if(!defined(CONFIG_CLOCKWORKPI_A06) && !defined(CONFIG_CLOCKWORKPI_A04)) +#error("Unsupported board!") +#endif + #ifdef CONFIG_CLOCKWORKPI_A04 int bcmToGpioCPi[64] = @@ -287,7 +291,6 @@ int CPi_get_gpio_mode(int pin) unsigned int regval = 0; unsigned int bank = pin >> 5; unsigned int index = pin - (bank << 5); - unsigned int phyaddr = 0; unsigned char mode = -1; if (CPI_PIN_MASK[bank][index] < 0) @@ -330,6 +333,7 @@ int CPi_get_gpio_mode(int pin) return mode + 1; #elif (defined CONFIG_CLOCKWORKPI_A04) + unsigned int phyaddr = 0; int offset = ((index - ((index >> 3) << 3)) << 2); @@ -373,7 +377,7 @@ static void __CPi_set_gpio_mode(int pin, int mode) #ifdef CONFIG_CLOCKWORKPI_A06 int offset = ((index - ((index >> 3) << 3))); - unsigned int cru_phyaddr, grf_phyaddr, gpio_phyaddr; + unsigned int cru_phyaddr = 0, grf_phyaddr = 0, gpio_phyaddr = 0; if(bank == 0){ cru_phyaddr = PMUCRU_BASE + PMUCRU_CLKGATE_CON1_OFFSET; @@ -577,7 +581,7 @@ static int __CPi_digitalRead(int pin) int bank = pin >> 5; int index = pin - (bank << 5); int val; - unsigned int phyaddr; + unsigned int phyaddr = 0; #ifdef CONFIG_CLOCKWORKPI_A04 @@ -623,7 +627,6 @@ static void __CPi_pudctl(int _pin, int pud) unsigned int index = _pin & 0x1f; unsigned int port = index >> 3; unsigned int pin = index & 7; - unsigned int phyaddr = 0; if (CPI_PIN_MASK[bank][index] < 0) { printf("unused pin\n"); @@ -631,6 +634,7 @@ static void __CPi_pudctl(int _pin, int pud) } #if defined(CONFIG_CLOCKWORKPI_A04) + unsigned int phyaddr = 0; // TODO #elif defined(CONFIG_CLOCKWORKPI_A06) // cru_vaddr: see comment at the top of this file @@ -757,8 +761,9 @@ void CPiSetupRaw(void) wpimode = WPI_MODE_RAW; } -void CPiPinMode(int pin, int mode) +void CPiPinMode(int _pin, int mode) { + unsigned int pin = _pin; if (wiringPiDebug) printf("CPiPinMode: pin:%d,mode:%d\n", pin, mode); @@ -778,8 +783,9 @@ void CPiPinMode(int pin, int mode) __CPi_set_gpio_mode(pin, mode); } -void CPiDigitalWrite(int pin, int value) +void CPiDigitalWrite(int _pin, int value) { + unsigned int pin = _pin; if (wiringPiDebug) printf("CPiDigitalWrite: pin:%d,value:%d\n", pin, value); @@ -799,9 +805,10 @@ void CPiDigitalWrite(int pin, int value) __CPi_digitalWrite(pin, value); } -int CPiDigitalRead(int pin) +int CPiDigitalRead(int _pin) { int value; + unsigned int pin = _pin; if (pin >= GPIO_NUM) { printf("CPiDigitalRead: invaild pin:%d\n", pin); @@ -826,6 +833,7 @@ int CPiDigitalRead(int pin) void CPiBoardId (int *model, int *rev, int *mem, int *maker, int *warranty) { + (void)warranty; #ifdef CONFIG_CLOCKWORKPI_A04 *model = CPI_MODEL_A04; *rev = PI_VERSION_1; @@ -839,8 +847,9 @@ void CPiBoardId (int *model, int *rev, int *mem, int *maker, int *warranty) #endif } -void CPiPullUpDnControl(int pin, int pud) +void CPiPullUpDnControl(int _pin, int pud) { + unsigned int pin = _pin; if (wiringPiDebug) printf("%s: pin:%d,pud:%d\n", __PRETTY_FUNCTION__, pin, pud); From 5b78d54d467a7d7e170f8b1795c615550a9ce92b Mon Sep 17 00:00:00 2001 From: Yatao Li Date: Wed, 26 Apr 2023 18:21:28 +0800 Subject: [PATCH 4/4] gpio: should go through private interfaces... --- Code/devterm_wiringpi_cpi/gpio/CPi.h | 4 ++-- Code/devterm_wiringpi_cpi/gpio/CPi_readall.c | 8 ++++---- Code/devterm_wiringpi_cpi/gpio/gpio.c | 6 +++--- Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c | 6 ++++-- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Code/devterm_wiringpi_cpi/gpio/CPi.h b/Code/devterm_wiringpi_cpi/gpio/CPi.h index 9681498..4acebb7 100644 --- a/Code/devterm_wiringpi_cpi/gpio/CPi.h +++ b/Code/devterm_wiringpi_cpi/gpio/CPi.h @@ -4,8 +4,8 @@ extern int wiringPiSetupRaw (void); extern void CPiBoardId (int *model, int *rev, int *mem, int *maker, int *warranty); extern int CPi_get_gpio_mode(int pin); -extern int CPiDigitalRead(int pin); -extern void CPiDigitalWrite(int pin, int value); +extern int __CPi_digitalRead(int pin); +extern void __CPi_digitalWrite(int pin, int value); extern void CPiReadAll(void); extern void CPiReadAllRaw(void); diff --git a/Code/devterm_wiringpi_cpi/gpio/CPi_readall.c b/Code/devterm_wiringpi_cpi/gpio/CPi_readall.c index c10245a..0e17dda 100755 --- a/Code/devterm_wiringpi_cpi/gpio/CPi_readall.c +++ b/Code/devterm_wiringpi_cpi/gpio/CPi_readall.c @@ -122,13 +122,13 @@ void CPiReadAll(void) printf (" | %4d", bcmToGpioCPi[pin]); printf (" | %-4s", get_pin_name(bcmToGpioCPi[pin])); printf (" | %4s", alts [CPi_get_gpio_mode(bcmToGpioCPi[pin])]); - printf (" | %d", CPiDigitalRead(bcmToGpioCPi[pin])) ; + printf (" | %d", __CPi_digitalRead(bcmToGpioCPi[pin])) ; pin2 = pin + 23; printf (" | %3d", pin2); printf (" | %4d", bcmToGpioCPi[pin2]); printf (" | %-4s", get_pin_name(bcmToGpioCPi[pin2])); printf (" | %4s", alts [CPi_get_gpio_mode(bcmToGpioCPi[pin2])]); - printf (" | %d", CPiDigitalRead(bcmToGpioCPi[pin2])) ; + printf (" | %d", __CPi_digitalRead(bcmToGpioCPi[pin2])) ; printf (" |\n") ; } @@ -158,7 +158,7 @@ void CPiReadAllRaw(void) printf (" | %4d", pin2) ; printf (" | %-4s", get_pin_name(pin2)); printf (" | %4s", alts [CPi_get_gpio_mode(pin2)]) ; - printf (" | %d", CPiDigitalRead(pin2)) ; + printf (" | %d", __CPi_digitalRead(pin2)) ; } else { printf (" | ") ; printf (" | ") ; @@ -186,7 +186,7 @@ void CPiReadAllRaw(void) for(i = 0; i < 5; i++) { printf (" | %4d", pin2) ; printf (" | %4s", alts [CPi_get_gpio_mode(pin2)]) ; - printf (" | %d", CPiDigitalRead(pin2)) ; + printf (" | %d", __CPi_digitalRead(pin2)) ; pin2 += 32; } printf (" |\n") ; diff --git a/Code/devterm_wiringpi_cpi/gpio/gpio.c b/Code/devterm_wiringpi_cpi/gpio/gpio.c index 4832a32..846973a 100644 --- a/Code/devterm_wiringpi_cpi/gpio/gpio.c +++ b/Code/devterm_wiringpi_cpi/gpio/gpio.c @@ -1326,7 +1326,7 @@ static void doReadRaw (int argc, char *argv []) } pin = atoi (argv [2]) ; - val = CPiDigitalRead(pin); + val = __CPi_digitalRead(pin); printf ("%s\n", val == 0 ? "0" : "1") ; #endif @@ -1352,9 +1352,9 @@ static void doWriteRaw (int argc, char *argv []) val = atoi (argv [3]) ; if (val == 0) - CPiDigitalWrite (pin, LOW) ; + __CPi_digitalWrite (pin, LOW) ; else - CPiDigitalWrite (pin, HIGH) ; + __CPi_digitalWrite (pin, HIGH) ; #endif } diff --git a/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c b/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c index a2b4a57..adeca5e 100755 --- a/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c +++ b/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c @@ -500,7 +500,8 @@ static int CPi_set_gpio_alt(int pin, int mode) /* * CPi Digital write */ -static void __CPi_digitalWrite(int pin, int value) +__attribute__ ((visibility ("default"))) +void __CPi_digitalWrite(int pin, int value) { unsigned int bank = pin >> 5; unsigned int index = pin - (bank << 5); @@ -576,7 +577,8 @@ static void __CPi_digitalWrite(int pin, int value) /* * CPi Digital Read */ -static int __CPi_digitalRead(int pin) +__attribute__ ((visibility ("default"))) +int __CPi_digitalRead(int pin) { int bank = pin >> 5; int index = pin - (bank << 5);