diff --git a/Code/devterm_wiringpi_cpi/gpio/CPi.h b/Code/devterm_wiringpi_cpi/gpio/CPi.h index 5b8a141..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 CPi_digitalRead(int pin); -extern void CPi_digitalWrite(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 86bc0b2..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", CPi_digitalRead(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", CPi_digitalRead(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", CPi_digitalRead(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", CPi_digitalRead(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 1a12a41..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 = CPi_digitalRead(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) - CPi_digitalWrite (pin, LOW) ; + __CPi_digitalWrite (pin, LOW) ; else - CPi_digitalWrite (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 fc1313e..adeca5e 100755 --- a/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c +++ b/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c @@ -22,12 +22,55 @@ #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 #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] = @@ -110,17 +153,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 +184,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 +240,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) @@ -221,12 +291,11 @@ 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) return -1; - + #ifdef CONFIG_CLOCKWORKPI_A06 unsigned int grf_phyaddr = 0, ddr_phyaddr = 0; @@ -239,7 +308,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; @@ -264,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); @@ -285,12 +355,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 @@ -307,7 +377,7 @@ int 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; @@ -344,7 +414,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 +461,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 +498,10 @@ int CPi_set_gpio_alt(int pin, int mode) } /* - * CPi Digital write + * CPi Digital write */ -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); @@ -438,7 +509,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 +531,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 +539,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,18 +571,19 @@ 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) +__attribute__ ((visibility ("default"))) +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 @@ -549,6 +621,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; + + if (CPI_PIN_MASK[bank][index] < 0) { + printf("unused pin\n"); + return; + } + +#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 + // 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 +755,7 @@ int CPiSetup(int fd) #endif wpimode = WPI_MODE_BCM; + return 0; } void CPiSetupRaw(void) @@ -601,8 +763,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); @@ -619,11 +782,12 @@ 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) +void CPiDigitalWrite(int _pin, int value) { + unsigned int pin = _pin; if (wiringPiDebug) printf("CPiDigitalWrite: pin:%d,value:%d\n", pin, value); @@ -640,12 +804,13 @@ void CPiDigitalWrite(int pin, int value) pin = bcmToGpioCPi[pin]; } - CPi_digitalWrite(pin, 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); @@ -660,7 +825,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 +833,41 @@ int CPiDigitalRead(int pin) return value; } -void pinModeAltCP(int pin, int mode) -{ -} - 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; + *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) +{ + unsigned int pin = _pin; + 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..90160b7 100755 --- a/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.h +++ b/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.h @@ -25,16 +25,34 @@ #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 wiringPiDebug; +extern int wiringPiReturnCodes; + +extern void CPiPinMode(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 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..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 @@ -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)