Browse Source

add wiringPi a04 code

cuu 2 years ago
parent
commit
57f5328423

+ 98 - 36
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
-
-	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
-
-	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
-
-	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,// ... 63	
-}
+	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
+};
 
 #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;
 }
 

+ 186 - 129
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] =
+{
+	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,},//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
+	{ 1, 1, 1, 1, 1, 1, 1, 1, 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,32 +253,30 @@ 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 * 36) + ((index >> 3) << 2);
-
-	/* Ignore unused gpio */
-	if (CPI_PIN_MASK[bank][index] != -1) {
-		regval = readR(phyaddr);
-		mode = (regval >> offset) & 7;
+	else {
+		phyaddr = GPIO_BASE_MAP + (bank * 0x24) + ((index >> 3) << 2);
 	}
 
+	regval = readR(phyaddr);
+	mode = (regval >> offset) & 7;
+
 	return mode;
 
 #endif
@@ -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;
-	unsigned int cru_phyaddr = 0;
 
-#else
-    unsigned int regval = 0;
+#ifdef CONFIG_CLOCKWORKPI_A04
 	
-	if (bank == 11) {
-		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
 
 #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;
-		}
+	unsigned int cru_phyaddr = 0;
+
+	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;
+	}
 
 #endif
 
-    if (CPI_PIN_MASK[bank][index] != -1) {
+	if (CPI_PIN_MASK[bank][index] != -1) {
 
-	#ifdef CONFIG_CLOCKWORKPI_A06
+#ifdef CONFIG_CLOCKWORKPI_A06
 		writeR(0xffff0180, cru_phyaddr);
-	#endif
+#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
 }

+ 22 - 26
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);

+ 1 - 1
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) ;

+ 1 - 1
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 ;