add wiringPi a04 code

This commit is contained in:
cuu 2022-02-24 14:54:25 +08:00
parent 9a21d046e0
commit 57f5328423
5 changed files with 310 additions and 195 deletions

View File

@ -8,35 +8,35 @@
int bcmToGpioCPi[64] = int bcmToGpioCPi[64] =
{ {
106, 107, // 0, 1 58, 57, // 0, 1
104, 10, // 2, 3 167, 0, // 2, 3
3, 9, // 4 5 1, 2, // 4 5
4, 90, // 6, 7 3, 4, // 6, 7
92, 158, // 8, 9 5, 6, // 8, 9
156, 105, //10,11 7, 8, //10,11
146, 150, //12,13 15, 54, //12,13
81, 80, //14,15 134, 135, //14,15
82, 83, //16,17 137, 136, //16,17
131, 132, //18,19 139, 138, //18,19
134, 135, //20,21 141, 140, //20,21
89, 88, //22,23 128, 129, //22,23
84, 85, //24,25 130, 131, //24,25
86, 87, //26,27 132, 133, //26,27
112, 113, //28,29 9, 201, //28,29
109, 157, //30,31 196, 199, //30,31
148, 147, //32,33 161, 160, //32,33
100, 101, //34,35 227, 198, //34,35
102, 103, //36,37 163, 166, //36,37
97, 98, //38,39 165, 164, //38,39
99, 96, //40,41 228, 224, //40,41
110, 111, //42,43 225, 226, //42,43
64, 65, //44,45 56, 55, //44,45
-1, -1, //46,47 -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 #endif
@ -81,32 +81,60 @@ static char *alts [] =
"IN", "OUT", "ALT2", "ALT3", "ALT4", "ALT5", "ALT6", "OFF" "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) void CPiReadAll(void)
{ {
int pin, pin2; int pin, pin2;
int tmp = wiringPiDebug; int tmp = wiringPiDebug;
wiringPiDebug = FALSE; wiringPiDebug = FALSE;
printf (" +-----+------+------+---+-----+------+------+---+\n"); printf (" +-----+------+------+------+---+-----+------+------+------+---+\n");
printf (" | BCM | GPIO | Mode | V | BCM | GPIO | Mode | V |\n"); printf (" | BCM | GPIO | Name | Mode | V | BCM | GPIO | Name | Mode | V |\n");
printf (" +-----+------+------+---+-----+------+------+---+\n"); printf (" +-----+------+------+------+---+-----+------+------+------+---+\n");
for (pin = 0 ; pin < 23; pin ++) { for (pin = 0 ; pin < 23; pin ++) {
printf (" | %3d", pin); printf (" | %3d", pin);
printf (" | %4d", bcmToGpioCPi[pin]); printf (" | %4d", bcmToGpioCPi[pin]);
printf (" | %-4s", get_pin_name(bcmToGpioCPi[pin]));
printf (" | %4s", alts [CPi_get_gpio_mode(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; pin2 = pin + 23;
printf (" | %3d", pin2); printf (" | %3d", pin2);
printf (" | %4d", bcmToGpioCPi[pin2]); printf (" | %4d", bcmToGpioCPi[pin2]);
printf (" | %-4s", get_pin_name(bcmToGpioCPi[pin2]));
printf (" | %4s", alts [CPi_get_gpio_mode(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") ; printf (" |\n") ;
} }
printf (" +-----+------+------+---+-----+------+------+---+\n"); printf (" +-----+------+------+------+---+-----+------+------+------+---+\n");
printf (" | BCM | GPIO | Mode | V | BCM | GPIO | Mode | V |\n"); printf (" | BCM | GPIO | Name | Mode | V | BCM | GPIO | Name | Mode | V |\n");
printf (" +-----+------+------+---+-----+------+------+---+\n"); printf (" +-----+------+------+------+---+-----+------+------+------+---+\n");
wiringPiDebug = tmp; wiringPiDebug = tmp;
} }
@ -117,6 +145,38 @@ void CPiReadAllRaw(void)
int tmp = wiringPiDebug; int tmp = wiringPiDebug;
wiringPiDebug = FALSE; 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 (" +------+------+---+------+------+---+------+------+---+------+------+---+------+------+---+\n");
printf (" | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V |\n"); printf (" | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V |\n");
printf (" +------+------+---+------+------+---+------+------+---+------+------+---+------+------+---+\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 (" | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V |\n");
printf (" +------+------+---+------+------+---+------+------+---+------+------+---+------+------+---+\n"); printf (" +------+------+---+------+------+---+------+------+---+------+------+---+------+------+---+\n");
#endif
wiringPiDebug = tmp; wiringPiDebug = tmp;
} }

View File

@ -30,22 +30,53 @@ static int wpimode = -1 ;
#ifdef CONFIG_CLOCKWORKPI_A04 #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 58, 57, // 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,-1,},//PB 167, 0, // 2, 3
{-1,-1,-1,-1,-1,-1,-1,-1,-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, 2, // 4 5
{-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 3, 4, // 6, 7
{-1,-1,-1,-1,-1,-1,-1,-1,-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 5, 6, // 8, 9
{-1,-1,-1,-1,-1,-1,-1,-1,-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 7, 8, //10,11
{-1,-1,-1,-1,-1,-1,-1,-1,-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 15, 54, //12,13
{-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 134, 135, //14,15
{-1,-1,-1,-1,-1,-1,-1,-1,-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 137, 136, //16,17
{-1,-1,-1,-1,-1,-1,-1,-1,-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 139, 138, //18,19
{-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 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 #endif
#ifdef CONFIG_CLOCKWORKPI_A06 #ifdef CONFIG_CLOCKWORKPI_A06
@ -84,11 +115,11 @@ int bcmToGpioCPi[64] =
int CPI_PIN_MASK[5][32] = //[BANK] [INDEX] 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,},//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,},//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,},//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,},//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,},//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,},//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,},//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,},//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,},//GPIO4
}; };
volatile uint32_t *cru_base; volatile uint32_t *cru_base;
@ -132,8 +163,17 @@ static unsigned int readR(unsigned int addr)
return val; return val;
#elif (defined CONFIG_CLOCKWORKPI_A04) #elif (defined CONFIG_CLOCKWORKPI_A04)
uint32_t val = 0; 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; return val;
#endif #endif
} }
@ -165,6 +205,14 @@ static void writeR(unsigned int val, unsigned int addr)
#elif (defined CONFIG_CLOCKWORKPI_A04) #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 #endif
} }
@ -176,6 +224,9 @@ int CPi_get_gpio_mode(int pin)
unsigned int phyaddr = 0; unsigned int phyaddr = 0;
unsigned char mode = -1; unsigned char mode = -1;
if (CPI_PIN_MASK[bank][index] < 0)
return -1;
#ifdef CONFIG_CLOCKWORKPI_A06 #ifdef CONFIG_CLOCKWORKPI_A06
unsigned int grf_phyaddr = 0, ddr_phyaddr = 0; unsigned int grf_phyaddr = 0, ddr_phyaddr = 0;
@ -202,31 +253,29 @@ int CPi_get_gpio_mode(int pin)
ddr_phyaddr = GPIO4_BASE + GPIO_SWPORTA_DDR_OFFSET; ddr_phyaddr = GPIO4_BASE + GPIO_SWPORTA_DDR_OFFSET;
} }
if (CPI_PIN_MASK[bank][index] != -1) {
regval = readR(grf_phyaddr); regval = readR(grf_phyaddr);
mode = (regval >> (offset << 1)) & 0x3; mode = (regval >> (offset << 1)) & 0x3;
if(mode == 0){ if(mode == 0){
regval = readR(ddr_phyaddr); regval = readR(ddr_phyaddr);
return (regval >> index) & 1; return (regval >> index) & 1;
} }
return mode + 1; return mode + 1;
}
#elif (defined CONFIG_CLOCKWORKPI_A04) #elif (defined CONFIG_CLOCKWORKPI_A04)
int offset = ((index - ((index >> 3) << 3)) << 2); int offset = ((index - ((index >> 3) << 3)) << 2);
if (bank == 11) { if (bank >= 6) {
phyaddr = GPIOL_BASE + ((index >> 3) << 2); 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); regval = readR(phyaddr);
mode = (regval >> offset) & 7; mode = (regval >> offset) & 7;
}
return mode; return mode;
@ -243,21 +292,23 @@ int CPi_set_gpio_mode(int pin, int mode)
unsigned int index = pin - (bank << 5); unsigned int index = pin - (bank << 5);
unsigned int phyaddr = 0; unsigned int phyaddr = 0;
#ifdef CONFIG_CLOCKWORKPI_A06 #ifdef CONFIG_CLOCKWORKPI_A04
int offset = ((index - ((index >> 3) << 3)));
unsigned int cru_phyaddr, grf_phyaddr, gpio_phyaddr;
#elif (defined CONFIG_CLOCKWORKPI_A04)
int offset = ((index - ((index >> 3) << 3)) << 2); int offset = ((index - ((index >> 3) << 3)) << 2);
if (bank == 11) { if (bank >= 6) {
phyaddr = GPIOL_BASE + ((index >> 3) << 2); phyaddr = GPIOL_BASE + (bank -6) * 0x24 + ((index >> 3) << 2);
} else { } else {
phyaddr = GPIO_BASE_MAP + (bank * 36) + ((index >> 3) << 2); phyaddr = GPIO_BASE_MAP + (bank * 0x24) + ((index >> 3) << 2);
} }
#endif #endif
#ifdef CONFIG_CLOCKWORKPI_A06 #ifdef CONFIG_CLOCKWORKPI_A06
int offset = ((index - ((index >> 3) << 3)));
unsigned int cru_phyaddr, grf_phyaddr, gpio_phyaddr;
if(bank == 0){ if(bank == 0){
cru_phyaddr = PMUCRU_BASE + PMUCRU_CLKGATE_CON1_OFFSET; cru_phyaddr = PMUCRU_BASE + PMUCRU_CLKGATE_CON1_OFFSET;
grf_phyaddr = PMUGRF_BASE + ((index >> 3) << 2); grf_phyaddr = PMUGRF_BASE + ((index >> 3) << 2);
@ -295,7 +346,6 @@ int CPi_set_gpio_mode(int pin, int mode)
if (wiringPiDebug) if (wiringPiDebug)
printf("Register[%#x]: %#x index:%d\n", phyaddr, regval, index); printf("Register[%#x]: %#x index:%d\n", phyaddr, regval, index);
/* Set Input */
if (INPUT == mode) { if (INPUT == mode) {
#ifdef CONFIG_CLOCKWORKPI_A06 #ifdef CONFIG_CLOCKWORKPI_A06
writeR(0xffff0180, cru_phyaddr); writeR(0xffff0180, cru_phyaddr);
@ -317,7 +367,7 @@ int CPi_set_gpio_mode(int pin, int mode)
if (wiringPiDebug) if (wiringPiDebug)
printf("Input mode set over reg val: %#x\n",regval); printf("Input mode set over reg val: %#x\n",regval);
#endif #endif
} else if (OUTPUT == mode) { /* Set Output */ } else if (OUTPUT == mode) {
#ifdef CONFIG_CLOCKWORKPI_A06 #ifdef CONFIG_CLOCKWORKPI_A06
writeR(0xffff0180, cru_phyaddr); writeR(0xffff0180, cru_phyaddr);
regval = readR(grf_phyaddr); regval = readR(grf_phyaddr);
@ -356,10 +406,10 @@ int CPi_set_gpio_alt(int pin, int mode)
unsigned int phyaddr = 0; unsigned int phyaddr = 0;
int offset = ((index - ((index >> 3) << 3)) << 2); int offset = ((index - ((index >> 3) << 3)) << 2);
if (bank == 11) { if (bank >= 6) {
phyaddr = GPIOL_BASE + ((index >> 3) << 2); phyaddr = GPIOL_BASE + ((index >> 3) << 2);
}else }else
phyaddr = GPIO_BASE_MAP + (bank * 36) + ((index >> 3) << 2); phyaddr = GPIO_BASE_MAP + (bank * 0x24) + ((index >> 3) << 2);
/* Ignore unused gpio */ /* Ignore unused gpio */
if (CPI_PIN_MASK[bank][index] != -1) { if (CPI_PIN_MASK[bank][index] != -1) {
@ -385,22 +435,22 @@ void CPi_digitalWrite(int pin, int value)
unsigned int bank = pin >> 5; unsigned int bank = pin >> 5;
unsigned int index = pin - (bank << 5); unsigned int index = pin - (bank << 5);
unsigned int phyaddr = 0; unsigned int phyaddr = 0;
#ifdef CONFIG_CLOCKWORKPI_A06
unsigned int regval = 0;
unsigned int cru_phyaddr = 0;
#else
unsigned int regval = 0; unsigned int regval = 0;
if (bank == 11) { #ifdef CONFIG_CLOCKWORKPI_A04
phyaddr = GPIOL_BASE + 0x10;
if (bank >= 6) {
phyaddr = GPIOL_BASE + (bank -6) * 0x24 + 0x10;
} else {
phyaddr = GPIO_BASE_MAP + (bank * 0x24) + 0x10;
} }
else
phyaddr = GPIO_BASE_MAP + (bank * 36) + 0x10;
#endif #endif
#ifdef CONFIG_CLOCKWORKPI_A06 #ifdef CONFIG_CLOCKWORKPI_A06
unsigned int cru_phyaddr = 0;
if(bank == 0){ if(bank == 0){
phyaddr = GPIO0_BASE + GPIO_SWPORTA_DR_OFFSET; phyaddr = GPIO0_BASE + GPIO_SWPORTA_DR_OFFSET;
cru_phyaddr = PMUCRU_BASE + PMUCRU_CLKGATE_CON1_OFFSET; cru_phyaddr = PMUCRU_BASE + PMUCRU_CLKGATE_CON1_OFFSET;
@ -450,9 +500,7 @@ void CPi_digitalWrite(int pin, int value)
printf("HIGH val set over reg val: 0x%x\n", regval); 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 bank = pin >> 5;
int index = pin - (bank << 5); int index = pin - (bank << 5);
int val; int val;
#ifdef CONFIG_CLOCKWORKPI_A04
unsigned int phyaddr; unsigned int phyaddr;
if (bank == 11) { #ifdef CONFIG_CLOCKWORKPI_A04
phyaddr = GPIOL_BASE + 0x10;
if (bank >= 6) {
phyaddr = GPIOL_BASE + (bank -6) * 0x24 + 0x10;
} else { } else {
phyaddr = GPIO_BASE_MAP + (bank * 36) + 0x10; phyaddr = GPIO_BASE_MAP + (bank * 0x24) + 0x10;
} }
#endif #endif
#ifdef CONFIG_CLOCKWORKPI_A06 #ifdef CONFIG_CLOCKWORKPI_A06
unsigned int phyaddr;
if(bank == 0) if(bank == 0)
phyaddr = GPIO0_BASE + GPIO_EXT_PORTA_OFFSET; phyaddr = GPIO0_BASE + GPIO_EXT_PORTA_OFFSET;
else if(bank == 1) else if(bank == 1)
@ -486,6 +535,7 @@ int CPi_digitalRead(int pin)
phyaddr = GPIO3_BASE + GPIO_EXT_PORTA_OFFSET; phyaddr = GPIO3_BASE + GPIO_EXT_PORTA_OFFSET;
else if(bank == 4) else if(bank == 4)
phyaddr = GPIO4_BASE + GPIO_EXT_PORTA_OFFSET; phyaddr = GPIO4_BASE + GPIO_EXT_PORTA_OFFSET;
#endif #endif
if (CPI_PIN_MASK[bank][index] != -1) { if (CPI_PIN_MASK[bank][index] != -1) {
@ -493,7 +543,7 @@ int CPi_digitalRead(int pin)
val = val >> index; val = val >> index;
val &= 1; val &= 1;
if (wiringPiDebug) 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 val;
} }
return 0; return 0;
@ -504,9 +554,15 @@ int CPiSetup(int fd)
{ {
#ifdef CONFIG_CLOCKWORKPI_A04 #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) #elif defined(CONFIG_CLOCKWORKPI_A06)
gpio0_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO0_BASE); 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) if ((int32_t)(unsigned long)gpio0_base == -1)
return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (GPIO0_BASE) failed: %s\n", strerror(errno)); 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); 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) if ((int32_t)(unsigned long)pmugrf_base == -1)
return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (PMUGRF_BASE) failed: %s\n", strerror(errno)); return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (PMUGRF_BASE) failed: %s\n", strerror(errno));
#endif #endif
wpimode = WPI_MODE_BCM; wpimode = WPI_MODE_BCM;
} }

View File

@ -2,14 +2,11 @@
#define _WIRING_CPI_H #define _WIRING_CPI_H
#ifdef CONFIG_CLOCKWORKPI_A04 #ifdef CONFIG_CLOCKWORKPI_A04
#define GPIOA_BASE (0x0300B000) #define GPIOA_BASE 0x0300B000
#define GPIO_NUM (0x40) #define GPIO_BASE_MAP (GPIOA_BASE + 0x24 * 2)
#define GPIO_BASE_MAP (0x0300B000)
#define MEM_INFO (1024)
#define GPIOL_BASE (0x07022000) #define GPIOL_BASE (0x07022000)
#define GPIOL_BASE_MAP (0x07022000)
#define MAP_SIZE_L (4096 * 1)
#define GPIO_PWM_OP (0x0300A000) #define GPIO_PWM_OP (0x0300A000)
#define GPIO_NUM (256)
#endif #endif
#ifdef CONFIG_CLOCKWORKPI_A06 #ifdef CONFIG_CLOCKWORKPI_A06
@ -18,7 +15,6 @@
#define GPIO2_BASE 0xff780000 #define GPIO2_BASE 0xff780000
#define GPIO3_BASE 0xff788000 #define GPIO3_BASE 0xff788000
#define GPIO4_BASE 0xff790000 #define GPIO4_BASE 0xff790000
#define GPIO_NUM (160)
#define GPIO_SWPORTA_DR_OFFSET 0x00 #define GPIO_SWPORTA_DR_OFFSET 0x00
#define GPIO_SWPORTA_DDR_OFFSET 0x04 #define GPIO_SWPORTA_DDR_OFFSET 0x04
#define GPIO_EXT_PORTA_OFFSET 0x50 #define GPIO_EXT_PORTA_OFFSET 0x50
@ -26,12 +22,12 @@
#define GRF_BASE 0xff77e000 #define GRF_BASE 0xff77e000
#define CRU_BASE 0xff760000 #define CRU_BASE 0xff760000
#define PMUCRU_BASE 0xff750000 #define PMUCRU_BASE 0xff750000
#define CRU_CLKGATE_CON31_OFFSET 0x037c //bit 3 4 5 #define CRU_CLKGATE_CON31_OFFSET 0x037c
#define PMUCRU_CLKGATE_CON1_OFFSET 0x0104 #define PMUCRU_CLKGATE_CON1_OFFSET 0x0104
#define GPIO_NUM (160)
#endif #endif
#define MAP_SIZE_L (4*1024) #define MAP_SIZE (4*1024)
#define MAP_SIZE MAP_SIZE_L
#define MAP_MASK (MAP_SIZE - 1) #define MAP_MASK (MAP_SIZE - 1)
extern int CPi_set_gpio_mode(int pin, int mode); extern int CPi_set_gpio_mode(int pin, int mode);

View File

@ -109,7 +109,7 @@ int wiringPiSPISetupMode (int channel, int speed, int mode)
// Channel can be anything - lets hope for the best // Channel can be anything - lets hope for the best
// channel &= 1 ; // Channel is 0 or 1 // channel &= 1 ; // Channel is 0 or 1
#ifdef CONFIG_CLOCKWORKPI #ifdef CONFIG_CLOCKWORKPI_A06
snprintf (spiDev, 31, "/dev/spidev2.%d", channel) ; snprintf (spiDev, 31, "/dev/spidev2.%d", channel) ;
#else #else
snprintf (spiDev, 31, "/dev/spidev0.%d", channel) ; snprintf (spiDev, 31, "/dev/spidev0.%d", channel) ;

View File

@ -35,7 +35,7 @@
#define DRCN_ANALOG_READ 9 #define DRCN_ANALOG_READ 9
struct drcNetComStruct typedef struct drcNetComStruct
{ {
uint32_t pin ; uint32_t pin ;
uint32_t cmd ; uint32_t cmd ;