From 57f53284230c2f17418fc00731156f2f098fc925 Mon Sep 17 00:00:00 2001 From: cuu Date: Thu, 24 Feb 2022 14:54:25 +0800 Subject: [PATCH] add wiringPi a04 code --- Code/devterm_wiringpi_cpi/gpio/CPi_readall.c | 128 +++++-- .../devterm_wiringpi_cpi/wiringPi/wiringCPi.c | 325 ++++++++++-------- .../devterm_wiringpi_cpi/wiringPi/wiringCPi.h | 48 ++- .../wiringPi/wiringPiSPI.c | 2 +- .../wiringPiD/drcNetCmd.h | 2 +- 5 files changed, 310 insertions(+), 195 deletions(-) diff --git a/Code/devterm_wiringpi_cpi/gpio/CPi_readall.c b/Code/devterm_wiringpi_cpi/gpio/CPi_readall.c index 30cadc2..86bc0b2 100755 --- a/Code/devterm_wiringpi_cpi/gpio/CPi_readall.c +++ b/Code/devterm_wiringpi_cpi/gpio/CPi_readall.c @@ -8,35 +8,35 @@ int bcmToGpioCPi[64] = { - 106, 107, // 0, 1 - 104, 10, // 2, 3 - 3, 9, // 4 5 - 4, 90, // 6, 7 - 92, 158, // 8, 9 - 156, 105, //10,11 - 146, 150, //12,13 - 81, 80, //14,15 + 58, 57, // 0, 1 + 167, 0, // 2, 3 + 1, 2, // 4 5 + 3, 4, // 6, 7 + 5, 6, // 8, 9 + 7, 8, //10,11 + 15, 54, //12,13 + 134, 135, //14,15 - 82, 83, //16,17 - 131, 132, //18,19 - 134, 135, //20,21 - 89, 88, //22,23 - 84, 85, //24,25 - 86, 87, //26,27 - 112, 113, //28,29 - 109, 157, //30,31 + 137, 136, //16,17 + 139, 138, //18,19 + 141, 140, //20,21 + 128, 129, //22,23 + 130, 131, //24,25 + 132, 133, //26,27 + 9, 201, //28,29 + 196, 199, //30,31 - 148, 147, //32,33 - 100, 101, //34,35 - 102, 103, //36,37 - 97, 98, //38,39 - 99, 96, //40,41 - 110, 111, //42,43 - 64, 65, //44,45 - -1, -1, //46,47 + 161, 160, //32,33 + 227, 198, //34,35 + 163, 166, //36,37 + 165, 164, //38,39 + 228, 224, //40,41 + 225, 226, //42,43 + 56, 55, //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 +}; #endif @@ -71,7 +71,7 @@ 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 }; #endif @@ -81,32 +81,60 @@ static char *alts [] = "IN", "OUT", "ALT2", "ALT3", "ALT4", "ALT5", "ALT6", "OFF" } ; +static char* get_pin_name(int pin) +{ + static char name[10]; + char c; + int b, d; + + b = pin/32; + d = pin % 32; + +#ifdef CONFIG_CLOCKWORKPI_A04 + + if(b < 6) + c = b + 'C'; + else + c = b - 6 + 'L'; + sprintf(name, "P%c%d", c, d); + +#elif defined(CONFIG_CLOCKWORKPI_A06) + + c = d/8 + 'A'; + sprintf(name, "%d%c%d", b, c, d % 8); + +#endif + return name; +} + void CPiReadAll(void) { int pin, pin2; int tmp = wiringPiDebug; wiringPiDebug = FALSE; - printf (" +-----+------+------+---+-----+------+------+---+\n"); - printf (" | BCM | GPIO | Mode | V | BCM | GPIO | Mode | V |\n"); - printf (" +-----+------+------+---+-----+------+------+---+\n"); + printf (" +-----+------+------+------+---+-----+------+------+------+---+\n"); + printf (" | BCM | GPIO | Name | Mode | V | BCM | GPIO | Name | Mode | V |\n"); + printf (" +-----+------+------+------+---+-----+------+------+------+---+\n"); for (pin = 0 ; pin < 23; pin ++) { printf (" | %3d", pin); 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])) ; 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 (" |\n") ; } - printf (" +-----+------+------+---+-----+------+------+---+\n"); - printf (" | BCM | GPIO | Mode | V | BCM | GPIO | Mode | V |\n"); - printf (" +-----+------+------+---+-----+------+------+---+\n"); + printf (" +-----+------+------+------+---+-----+------+------+------+---+\n"); + printf (" | BCM | GPIO | Name | Mode | V | BCM | GPIO | Name | Mode | V |\n"); + printf (" +-----+------+------+------+---+-----+------+------+------+---+\n"); wiringPiDebug = tmp; } @@ -117,6 +145,38 @@ void CPiReadAllRaw(void) int tmp = wiringPiDebug; wiringPiDebug = FALSE; +#ifdef CONFIG_CLOCKWORKPI_A04 + + printf (" +------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+\n"); + printf (" | GPIO | Name | Mode | V | GPIO | Name | Mode | V | GPIO | Name | Mode | V | GPIO | Name | Mode | V | GPIO | Name | Mode | V | GPIO | Name | Mode | V |\n"); + printf (" +------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+\n"); + + for (pin = 0 ; pin < 27; pin++) { + pin2 = pin; + for(i = 0; i < 6; i++) { + if(CPi_get_gpio_mode(pin2) >= 0) { + printf (" | %4d", pin2) ; + printf (" | %-4s", get_pin_name(pin2)); + printf (" | %4s", alts [CPi_get_gpio_mode(pin2)]) ; + printf (" | %d", CPi_digitalRead(pin2)) ; + } else { + printf (" | ") ; + printf (" | ") ; + printf (" | ") ; + printf (" | ") ; + } + pin2 += 32; + if(i == 1) pin2 += 64; + } + printf (" |\n") ; + } + + printf (" +------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+\n"); + printf (" | GPIO | Name | Mode | V | GPIO | Name | Mode | V | GPIO | Name | Mode | V | GPIO | Name | Mode | V | GPIO | Name | Mode | V | GPIO | Name | Mode | V |\n"); + printf (" +------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+\n"); + +#elif defined(CONFIG_CLOCKWORKPI_A06) + printf (" +------+------+---+------+------+---+------+------+---+------+------+---+------+------+---+\n"); printf (" | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V |\n"); printf (" +------+------+---+------+------+---+------+------+---+------+------+---+------+------+---+\n"); @@ -136,6 +196,8 @@ void CPiReadAllRaw(void) printf (" | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V |\n"); printf (" +------+------+---+------+------+---+------+------+---+------+------+---+------+------+---+\n"); +#endif + wiringPiDebug = tmp; } diff --git a/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c b/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c index 9abef8d..fc1313e 100755 --- a/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c +++ b/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.c @@ -30,22 +30,53 @@ static int wpimode = -1 ; #ifdef CONFIG_CLOCKWORKPI_A04 -int CPI_PIN_MASK[12][32] = //[BANK] [INDEX] +int bcmToGpioCPi[64] = { - {-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,},//PA - {-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,},//PB - {-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,},//PC - {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,15,16,-1,18,-1,-1,21,22,23,24,25,26,-1,-1,-1,-1,-1,},//PD - {-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,},//PE - {-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,},//PF - {-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,},//PG - {-1,-1,-1, 3, 4, 5, 6,-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,},//PH - {-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,},//PI - {-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,},//PJ - {-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,},//PK - {-1,-1, 2, 3,-1,-1,-1,-1, 8,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PL + 58, 57, // 0, 1 + 167, 0, // 2, 3 + 1, 2, // 4 5 + 3, 4, // 6, 7 + 5, 6, // 8, 9 + 7, 8, //10,11 + 15, 54, //12,13 + 134, 135, //14,15 + + 137, 136, //16,17 + 139, 138, //18,19 + 141, 140, //20,21 + 128, 129, //22,23 + 130, 131, //24,25 + 132, 133, //26,27 + 9, 201, //28,29 + 196, 199, //30,31 + + 161, 160, //32,33 + 227, 198, //34,35 + 163, 166, //36,37 + 165, 164, //38,39 + 228, 224, //40,41 + 225, 226, //42,43 + 56, 55, //44,45 + -1, -1, //46,47 + + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,// ... 63 }; +int CPI_PIN_MASK[8][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,},//PC 0 + { 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,},//PD 32 + {-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,},//PE 64 + {-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,},//PF 96 + { 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,},//PG 128 + { 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,},//PH 160 + { 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,},//PL 192 + { 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,},//PM 224 +}; + +volatile uint32_t *gpio_base; +volatile uint32_t *gpioL_base; + #endif #ifdef CONFIG_CLOCKWORKPI_A06 @@ -84,11 +115,11 @@ int bcmToGpioCPi[64] = 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,},//PA - { 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,},//PB - { 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,},//PC - { 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,},//PD - { 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,},//PD + { 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; @@ -132,8 +163,17 @@ static unsigned int readR(unsigned int addr) return val; #elif (defined CONFIG_CLOCKWORKPI_A04) + uint32_t val = 0; + uint32_t mmap_base = (addr & ~MAP_MASK); + uint32_t mmap_seek = ((addr - mmap_base) >> 2); + + if (addr >= GPIOL_BASE) + val = *(gpioL_base + mmap_seek); + else + val = *(gpio_base + mmap_seek); return val; + #endif } @@ -165,6 +205,14 @@ static void writeR(unsigned int val, unsigned int addr) #elif (defined CONFIG_CLOCKWORKPI_A04) + unsigned int mmap_base = (addr & ~MAP_MASK); + unsigned int mmap_seek = ((addr - mmap_base) >> 2); + + if (addr >= GPIOL_BASE) + *(gpioL_base + mmap_seek) = val; + else + *(gpio_base + mmap_seek) = val; + #endif } @@ -175,6 +223,9 @@ int CPi_get_gpio_mode(int pin) 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 @@ -202,31 +253,29 @@ int CPi_get_gpio_mode(int pin) ddr_phyaddr = GPIO4_BASE + GPIO_SWPORTA_DDR_OFFSET; } - if (CPI_PIN_MASK[bank][index] != -1) { - regval = readR(grf_phyaddr); - mode = (regval >> (offset << 1)) & 0x3; - if(mode == 0){ - regval = readR(ddr_phyaddr); - return (regval >> index) & 1; - } - return mode + 1; + regval = readR(grf_phyaddr); + mode = (regval >> (offset << 1)) & 0x3; + + if(mode == 0){ + regval = readR(ddr_phyaddr); + return (regval >> index) & 1; } + return mode + 1; + #elif (defined CONFIG_CLOCKWORKPI_A04) int offset = ((index - ((index >> 3) << 3)) << 2); - if (bank == 11) { - phyaddr = GPIOL_BASE + ((index >> 3) << 2); + if (bank >= 6) { + phyaddr = GPIOL_BASE + (bank -6) * 0x24 + ((index >> 3) << 2); + } + else { + phyaddr = GPIO_BASE_MAP + (bank * 0x24) + ((index >> 3) << 2); } - else - phyaddr = GPIO_BASE_MAP + (bank * 36) + ((index >> 3) << 2); - /* Ignore unused gpio */ - if (CPI_PIN_MASK[bank][index] != -1) { - regval = readR(phyaddr); - mode = (regval >> offset) & 7; - } + regval = readR(phyaddr); + mode = (regval >> offset) & 7; return mode; @@ -243,21 +292,23 @@ int CPi_set_gpio_mode(int pin, int mode) unsigned int index = pin - (bank << 5); unsigned int phyaddr = 0; -#ifdef CONFIG_CLOCKWORKPI_A06 - int offset = ((index - ((index >> 3) << 3))); - unsigned int cru_phyaddr, grf_phyaddr, gpio_phyaddr; -#elif (defined CONFIG_CLOCKWORKPI_A04) +#ifdef CONFIG_CLOCKWORKPI_A04 + int offset = ((index - ((index >> 3) << 3)) << 2); - if (bank == 11) { - phyaddr = GPIOL_BASE + ((index >> 3) << 2); + if (bank >= 6) { + phyaddr = GPIOL_BASE + (bank -6) * 0x24 + ((index >> 3) << 2); } else { - phyaddr = GPIO_BASE_MAP + (bank * 36) + ((index >> 3) << 2); + phyaddr = GPIO_BASE_MAP + (bank * 0x24) + ((index >> 3) << 2); } + #endif #ifdef CONFIG_CLOCKWORKPI_A06 + int offset = ((index - ((index >> 3) << 3))); + unsigned int cru_phyaddr, grf_phyaddr, gpio_phyaddr; + if(bank == 0){ cru_phyaddr = PMUCRU_BASE + PMUCRU_CLKGATE_CON1_OFFSET; grf_phyaddr = PMUGRF_BASE + ((index >> 3) << 2); @@ -286,38 +337,37 @@ int CPi_set_gpio_mode(int pin, int mode) #endif - if (CPI_PIN_MASK[bank][index] != -1) { + if (CPI_PIN_MASK[bank][index] != -1) { #ifdef CONFIG_CLOCKWORKPI_A04 regval = readR(phyaddr); - if (wiringPiDebug) - printf("Before read reg val: 0x%x offset:%d\n",regval,offset); + if (wiringPiDebug) + 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); + if (wiringPiDebug) + printf("Register[%#x]: %#x index:%d\n", phyaddr, regval, index); - /* Set Input */ - if (INPUT == mode) { + if (INPUT == mode) { #ifdef CONFIG_CLOCKWORKPI_A06 - writeR(0xffff0180, cru_phyaddr); - regval = readR(grf_phyaddr); - regval |= 0x3 << ((offset << 1) | 0x10); - regval &= ~(0x3 << (offset << 1)); - writeR(regval, grf_phyaddr); - regval = readR(gpio_phyaddr); - regval &= ~(1 << index); - writeR(regval, gpio_phyaddr); - if (wiringPiDebug){ + writeR(0xffff0180, cru_phyaddr); + regval = readR(grf_phyaddr); + regval |= 0x3 << ((offset << 1) | 0x10); + regval &= ~(0x3 << (offset << 1)); + writeR(regval, grf_phyaddr); regval = readR(gpio_phyaddr); - printf("Input mode set over reg val: %#x\n",regval); - } + regval &= ~(1 << index); + writeR(regval, gpio_phyaddr); + if (wiringPiDebug){ + regval = readR(gpio_phyaddr); + printf("Input mode set over reg val: %#x\n",regval); + } #else - regval &= ~(7 << offset); - writeR(regval, phyaddr); - regval = readR(phyaddr); - if (wiringPiDebug) - printf("Input mode set over reg val: %#x\n",regval); + regval &= ~(7 << offset); + writeR(regval, phyaddr); + regval = readR(phyaddr); + if (wiringPiDebug) + printf("Input mode set over reg val: %#x\n",regval); #endif - } else if (OUTPUT == mode) { /* Set Output */ + } else if (OUTPUT == mode) { #ifdef CONFIG_CLOCKWORKPI_A06 writeR(0xffff0180, cru_phyaddr); regval = readR(grf_phyaddr); @@ -332,19 +382,19 @@ int CPi_set_gpio_mode(int pin, int mode) printf("Out mode get value: 0x%x\n",regval); } #else - regval &= ~(7 << offset); - regval |= (1 << offset); - if (wiringPiDebug) - printf("Out mode ready set val: 0x%x\n",regval); - writeR(regval, phyaddr); - regval = readR(phyaddr); - if (wiringPiDebug) - printf("Out mode get value: 0x%x\n",regval); + regval &= ~(7 << offset); + regval |= (1 << offset); + if (wiringPiDebug) + printf("Out mode ready set val: 0x%x\n",regval); + writeR(regval, phyaddr); + regval = readR(phyaddr); + if (wiringPiDebug) + printf("Out mode get value: 0x%x\n",regval); #endif - }else - printf("Unknow mode\n"); - } else - printf("unused pin\n"); + } else + printf("Unknow mode\n"); + } else + printf("unused pin\n"); } int CPi_set_gpio_alt(int pin, int mode) @@ -356,10 +406,10 @@ int CPi_set_gpio_alt(int pin, int mode) unsigned int phyaddr = 0; int offset = ((index - ((index >> 3) << 3)) << 2); - if (bank == 11) { + if (bank >= 6) { phyaddr = GPIOL_BASE + ((index >> 3) << 2); }else - phyaddr = GPIO_BASE_MAP + (bank * 36) + ((index >> 3) << 2); + phyaddr = GPIO_BASE_MAP + (bank * 0x24) + ((index >> 3) << 2); /* Ignore unused gpio */ if (CPI_PIN_MASK[bank][index] != -1) { @@ -382,56 +432,56 @@ int CPi_set_gpio_alt(int pin, int mode) */ void CPi_digitalWrite(int pin, int value) { - unsigned int bank = pin >> 5; - unsigned int index = pin - (bank << 5); - unsigned int phyaddr = 0; -#ifdef CONFIG_CLOCKWORKPI_A06 + unsigned int bank = pin >> 5; + unsigned int index = pin - (bank << 5); + unsigned int phyaddr = 0; unsigned int regval = 0; + +#ifdef CONFIG_CLOCKWORKPI_A04 + + if (bank >= 6) { + phyaddr = GPIOL_BASE + (bank -6) * 0x24 + 0x10; + } else { + phyaddr = GPIO_BASE_MAP + (bank * 0x24) + 0x10; + } + +#endif + +#ifdef CONFIG_CLOCKWORKPI_A06 + unsigned int cru_phyaddr = 0; -#else - unsigned int regval = 0; - - if (bank == 11) { - phyaddr = GPIOL_BASE + 0x10; + if(bank == 0){ + phyaddr = GPIO0_BASE + GPIO_SWPORTA_DR_OFFSET; + cru_phyaddr = PMUCRU_BASE + PMUCRU_CLKGATE_CON1_OFFSET; } - else - phyaddr = GPIO_BASE_MAP + (bank * 36) + 0x10; + else if(bank == 1){ + phyaddr = GPIO1_BASE + GPIO_SWPORTA_DR_OFFSET; + cru_phyaddr = PMUCRU_BASE + PMUCRU_CLKGATE_CON1_OFFSET; + } + else if(bank == 2){ + phyaddr = GPIO2_BASE + GPIO_SWPORTA_DR_OFFSET; + cru_phyaddr = CRU_BASE + CRU_CLKGATE_CON31_OFFSET; + } + else if(bank == 3){ + phyaddr = GPIO3_BASE + GPIO_SWPORTA_DR_OFFSET; + cru_phyaddr = CRU_BASE + CRU_CLKGATE_CON31_OFFSET; + } + else if(bank == 4){ + phyaddr = GPIO4_BASE + GPIO_SWPORTA_DR_OFFSET; + cru_phyaddr = CRU_BASE + CRU_CLKGATE_CON31_OFFSET; + } + #endif + if (CPI_PIN_MASK[bank][index] != -1) { + #ifdef CONFIG_CLOCKWORKPI_A06 - - if(bank == 0){ - phyaddr = GPIO0_BASE + GPIO_SWPORTA_DR_OFFSET; - cru_phyaddr = PMUCRU_BASE + PMUCRU_CLKGATE_CON1_OFFSET; - } - else if(bank == 1){ - phyaddr = GPIO1_BASE + GPIO_SWPORTA_DR_OFFSET; - cru_phyaddr = PMUCRU_BASE + PMUCRU_CLKGATE_CON1_OFFSET; - } - else if(bank == 2){ - phyaddr = GPIO2_BASE + GPIO_SWPORTA_DR_OFFSET; - cru_phyaddr = CRU_BASE + CRU_CLKGATE_CON31_OFFSET; - } - else if(bank == 3){ - phyaddr = GPIO3_BASE + GPIO_SWPORTA_DR_OFFSET; - cru_phyaddr = CRU_BASE + CRU_CLKGATE_CON31_OFFSET; - } - else if(bank == 4){ - phyaddr = GPIO4_BASE + GPIO_SWPORTA_DR_OFFSET; - cru_phyaddr = CRU_BASE + CRU_CLKGATE_CON31_OFFSET; - } - + writeR(0xffff0180, cru_phyaddr); #endif - if (CPI_PIN_MASK[bank][index] != -1) { - - #ifdef CONFIG_CLOCKWORKPI_A06 - writeR(0xffff0180, cru_phyaddr); - #endif - - if (wiringPiDebug) - printf("pin: %d, bank: %d, index: %d, phyaddr: 0x%x\n", pin, bank, index, phyaddr); + if (wiringPiDebug) + printf("pin: %d, bank: %d, index: %d, phyaddr: 0x%x\n", pin, bank, index, phyaddr); regval = readR(phyaddr); if (wiringPiDebug) @@ -450,9 +500,7 @@ void CPi_digitalWrite(int pin, int value) printf("HIGH val set over reg val: 0x%x\n", regval); } - } else - printf("unused pin\n"); - + } } /* @@ -463,19 +511,20 @@ int CPi_digitalRead(int pin) int bank = pin >> 5; int index = pin - (bank << 5); int val; + unsigned int phyaddr; + #ifdef CONFIG_CLOCKWORKPI_A04 - unsigned int phyaddr; - - if (bank == 11) { - phyaddr = GPIOL_BASE + 0x10; + if (bank >= 6) { + phyaddr = GPIOL_BASE + (bank -6) * 0x24 + 0x10; } else { - phyaddr = GPIO_BASE_MAP + (bank * 36) + 0x10; + phyaddr = GPIO_BASE_MAP + (bank * 0x24) + 0x10; } + #endif #ifdef CONFIG_CLOCKWORKPI_A06 - unsigned int phyaddr; + if(bank == 0) phyaddr = GPIO0_BASE + GPIO_EXT_PORTA_OFFSET; else if(bank == 1) @@ -486,6 +535,7 @@ int CPi_digitalRead(int pin) phyaddr = GPIO3_BASE + GPIO_EXT_PORTA_OFFSET; else if(bank == 4) phyaddr = GPIO4_BASE + GPIO_EXT_PORTA_OFFSET; + #endif if (CPI_PIN_MASK[bank][index] != -1) { @@ -493,7 +543,7 @@ int CPi_digitalRead(int pin) val = val >> index; val &= 1; if (wiringPiDebug) - printf("Read reg val: 0x%#x, bank:%d, index:%d\n", val, bank, index); + printf("Read reg val: 0x%#x, bank:%d, index:%d phyaddr: 0x%x\n", val, bank, index, phyaddr); return val; } return 0; @@ -504,9 +554,15 @@ int CPiSetup(int fd) { #ifdef CONFIG_CLOCKWORKPI_A04 - + gpio_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIOA_BASE); + if ((int32_t)(unsigned long)gpio_base == -1) + return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (GPIO) failed: %s\n", strerror(errno)); + gpioL_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIOL_BASE); + if ((int32_t)(unsigned long)gpioL_base == -1) + return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (GPIO) failed: %s\n", strerror(errno)); #elif defined(CONFIG_CLOCKWORKPI_A06) + gpio0_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO0_BASE); if ((int32_t)(unsigned long)gpio0_base == -1) return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (GPIO0_BASE) failed: %s\n", strerror(errno)); @@ -535,6 +591,7 @@ int CPiSetup(int fd) pmugrf_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, PMUGRF_BASE); if ((int32_t)(unsigned long)pmugrf_base == -1) return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (PMUGRF_BASE) failed: %s\n", strerror(errno)); + #endif wpimode = WPI_MODE_BCM; } @@ -620,12 +677,12 @@ void CPiBoardId (int *model, int *rev, int *mem, int *maker, int *warranty) #ifdef CONFIG_CLOCKWORKPI_A04 *model = CPI_MODEL_A04; *rev = PI_VERSION_1; - *mem = 3; + *mem = 3; *maker = 3; #elif defined(CONFIG_CLOCKWORKPI_A06) *model = CPI_MODEL_A06; *rev = PI_VERSION_1; - *mem = 4; + *mem = 4; *maker = 3; #endif } diff --git a/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.h b/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.h index a4786d3..9cde29c 100755 --- a/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.h +++ b/Code/devterm_wiringpi_cpi/wiringPi/wiringCPi.h @@ -2,37 +2,33 @@ #define _WIRING_CPI_H #ifdef CONFIG_CLOCKWORKPI_A04 -#define GPIOA_BASE (0x0300B000) -#define GPIO_NUM (0x40) -#define GPIO_BASE_MAP (0x0300B000) -#define MEM_INFO (1024) -#define GPIOL_BASE (0x07022000) -#define GPIOL_BASE_MAP (0x07022000) -#define MAP_SIZE_L (4096 * 1) -#define GPIO_PWM_OP (0x0300A000) +#define GPIOA_BASE 0x0300B000 +#define GPIO_BASE_MAP (GPIOA_BASE + 0x24 * 2) +#define GPIOL_BASE (0x07022000) +#define GPIO_PWM_OP (0x0300A000) +#define GPIO_NUM (256) #endif #ifdef CONFIG_CLOCKWORKPI_A06 -#define GPIO0_BASE 0xff720000 -#define GPIO1_BASE 0xff730000 -#define GPIO2_BASE 0xff780000 -#define GPIO3_BASE 0xff788000 -#define GPIO4_BASE 0xff790000 -#define GPIO_NUM (160) -#define GPIO_SWPORTA_DR_OFFSET 0x00 -#define GPIO_SWPORTA_DDR_OFFSET 0x04 -#define GPIO_EXT_PORTA_OFFSET 0x50 -#define PMUGRF_BASE 0xff320000 -#define GRF_BASE 0xff77e000 -#define CRU_BASE 0xff760000 -#define PMUCRU_BASE 0xff750000 -#define CRU_CLKGATE_CON31_OFFSET 0x037c //bit 3 4 5 -#define PMUCRU_CLKGATE_CON1_OFFSET 0x0104 +#define GPIO0_BASE 0xff720000 +#define GPIO1_BASE 0xff730000 +#define GPIO2_BASE 0xff780000 +#define GPIO3_BASE 0xff788000 +#define GPIO4_BASE 0xff790000 +#define GPIO_SWPORTA_DR_OFFSET 0x00 +#define GPIO_SWPORTA_DDR_OFFSET 0x04 +#define GPIO_EXT_PORTA_OFFSET 0x50 +#define PMUGRF_BASE 0xff320000 +#define GRF_BASE 0xff77e000 +#define CRU_BASE 0xff760000 +#define PMUCRU_BASE 0xff750000 +#define CRU_CLKGATE_CON31_OFFSET 0x037c +#define PMUCRU_CLKGATE_CON1_OFFSET 0x0104 +#define GPIO_NUM (160) #endif -#define MAP_SIZE_L (4*1024) -#define MAP_SIZE MAP_SIZE_L -#define MAP_MASK (MAP_SIZE - 1) +#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); diff --git a/Code/devterm_wiringpi_cpi/wiringPi/wiringPiSPI.c b/Code/devterm_wiringpi_cpi/wiringPi/wiringPiSPI.c index d21ebc4..7cb1241 100644 --- a/Code/devterm_wiringpi_cpi/wiringPi/wiringPiSPI.c +++ b/Code/devterm_wiringpi_cpi/wiringPi/wiringPiSPI.c @@ -109,7 +109,7 @@ int wiringPiSPISetupMode (int channel, int speed, int mode) // Channel can be anything - lets hope for the best // channel &= 1 ; // Channel is 0 or 1 -#ifdef CONFIG_CLOCKWORKPI +#ifdef CONFIG_CLOCKWORKPI_A06 snprintf (spiDev, 31, "/dev/spidev2.%d", channel) ; #else snprintf (spiDev, 31, "/dev/spidev0.%d", channel) ; diff --git a/Code/devterm_wiringpi_cpi/wiringPiD/drcNetCmd.h b/Code/devterm_wiringpi_cpi/wiringPiD/drcNetCmd.h index 23f7dc1..4300396 100644 --- a/Code/devterm_wiringpi_cpi/wiringPiD/drcNetCmd.h +++ b/Code/devterm_wiringpi_cpi/wiringPiD/drcNetCmd.h @@ -35,7 +35,7 @@ #define DRCN_ANALOG_READ 9 -struct drcNetComStruct +typedef struct drcNetComStruct { uint32_t pin ; uint32_t cmd ;