cuu 2 лет назад
Родитель
Сommit
f06b33c66b
12 измененных файлов с 1116 добавлено и 17 удалено
  1. 44 1
      build
  2. 12 0
      gpio/CPi.h
  3. 141 0
      gpio/CPi_readall.c
  4. 16 2
      gpio/Makefile
  5. 124 4
      gpio/gpio.c
  6. 8 1
      gpio/readall.c
  7. 17 2
      wiringPi/Makefile
  8. 632 0
      wiringPi/wiringCPi.c
  9. 44 0
      wiringPi/wiringCPi.h
  10. 62 6
      wiringPi/wiringPi.c
  11. 12 1
      wiringPi/wiringPi.h
  12. 4 0
      wiringPi/wiringPiSPI.c

+ 44 - 1
build

@@ -1,4 +1,4 @@
-#!/bin/sh -e
+#!/bin/bash -e
 
 # build
 #	Simple wiringPi build and install script
@@ -43,6 +43,47 @@ check_make_ok() {
   fi
 }
 
+select_boards()
+{
+    local cnt=0
+    local choice
+    local call=${1}
+
+    boards=("clockworkpi-a04" "clockworkpi-a06" )
+
+    if [[ -f /etc/armbian-release ]]; then 
+
+	source /etc/armbian-release
+
+    else
+
+	printf "All available boards:\n"
+    	for var in ${boards[@]} ; do
+       		 printf "%4d. %s\n" $cnt ${boards[$cnt]}
+			((cnt+=1))
+    	done
+
+    	while true ; do
+        	read -p "Choice: " choice
+        	if [ -z "${choice}" ] ; then
+            		continue
+        	fi
+        	if [ -z "${choice//[0-9]/}" ] ; then
+            		if [ $choice -ge 0 -a $choice -lt $cnt ] ; then
+				export BOARD="${boards[$choice]}"
+				break
+            		fi
+        	fi
+        	printf "Invalid input ...\n"
+    	done
+    fi
+
+	[[ $BOARD == clockworkpi-a04 ]] && BOARD=clockworkpi-a04-h6
+	[[ $BOARD == clockworkpi-a06 ]] && BOARD=clockworkpi-a06-rk3399
+
+	export BOARD="${BOARD}"
+}
+
 sudo=${WIRINGPI_SUDO-sudo}
 
 if [ x$1 = "xclean" ]; then
@@ -103,6 +144,8 @@ if [ x$1 != "x" ]; then
   exit 1
 fi
 
+  select_boards
+
   echo "wiringPi Build script"
   echo "====================="
   echo

+ 12 - 0
gpio/CPi.h

@@ -0,0 +1,12 @@
+#ifndef _CPI_H_
+#define _CPI_H_
+
+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 void CPiReadAll(void);
+extern void CPiReadAllRaw(void);
+
+#endif

+ 141 - 0
gpio/CPi_readall.c

@@ -0,0 +1,141 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <wiringPi.h>
+#include "CPi.h"
+
+#ifdef CONFIG_CLOCKWORKPI_A04
+
+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	
+}
+
+#endif
+
+#ifdef CONFIG_CLOCKWORKPI_A06
+
+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	
+};
+
+#endif
+
+static char *alts [] =
+{
+  "IN", "OUT", "ALT2", "ALT3", "ALT4", "ALT5", "ALT6", "OFF"
+} ;
+
+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");
+
+	for (pin = 0 ; pin < 23; pin ++) {
+		printf (" | %3d", pin);
+		printf (" | %4d", 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", 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");
+
+	wiringPiDebug = tmp;
+}
+
+void CPiReadAllRaw(void)
+{
+	int pin, pin2, i;
+	int tmp = wiringPiDebug;
+	wiringPiDebug = FALSE;
+
+	printf (" +------+------+---+------+------+---+------+------+---+------+------+---+------+------+---+\n");
+	printf (" | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V |\n");
+	printf (" +------+------+---+------+------+---+------+------+---+------+------+---+------+------+---+\n");
+
+	for (pin = 0 ; pin < 32; pin++) {
+		pin2 = pin;
+		for(i = 0; i < 5; i++) {
+			printf (" | %4d", pin2) ;
+			printf (" | %4s", alts [CPi_get_gpio_mode(pin2)]) ;
+			printf (" | %d", CPi_digitalRead(pin2)) ;
+			pin2 += 32;
+		}
+		printf (" |\n") ;
+	}
+
+	printf (" +------+------+---+------+------+---+------+------+---+------+------+---+------+------+---+\n");
+	printf (" | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V |\n");
+	printf (" +------+------+---+------+------+---+------+------+---+------+------+---+------+------+---+\n");
+
+	wiringPiDebug = tmp;
+}
+

+ 16 - 2
gpio/Makefile

@@ -39,10 +39,24 @@ CFLAGS	= $(DEBUG) -Wall -Wextra $(INCLUDE) -Winline -pipe
 LDFLAGS	= -L$(DESTDIR)$(PREFIX)/lib
 LIBS    = -lwiringPi -lwiringPiDev -lpthread -lrt -lm -lcrypt
 
+ifeq ($(BOARD),)
+  BOARD = clockworkpi-a06-rk3399
+endif
+
+ifeq ($(BOARD), clockworkpi-a04-h6)
+EXTRA_CFLAGS = -DCONFIG_CLOCKWORKPI_A04
+endif
+
+ifeq ($(BOARD), clockworkpi-a06-rk3399)
+EXTRA_CFLAGS = -DCONFIG_CLOCKWORKPI_A06
+endif
+
+EXTRA_CFLAGS += -DCONFIG_CLOCKWORKPI
+
 # May not need to  alter anything below this line
 ###############################################################################
 
-SRC	=	gpio.c readall.c
+SRC	=	gpio.c readall.c CPi_readall.c
 
 OBJ	=	$(SRC:.c=.o)
 
@@ -57,7 +71,7 @@ gpio:	$(OBJ)
 
 .c.o:
 	$Q echo [Compile] $<
-	$Q $(CC) -c $(CFLAGS) $< -o $@
+	$Q $(CC) -c $(CFLAGS) $(EXTRA_CFLAGS) $< -o $@
 
 .PHONY:	clean
 clean:

+ 124 - 4
gpio/gpio.c

@@ -42,6 +42,10 @@
 
 #include "../version.h"
 
+#ifdef CONFIG_CLOCKWORKPI
+#include "CPi.h"
+#endif
+
 extern int wiringPiDebug ;
 
 // External functions I can't be bothered creating a separate .h file for:
@@ -742,7 +746,18 @@ void doMode (int argc, char *argv [])
   pin = atoi (argv [2]) ;
 
   mode = argv [3] ;
-
+#ifdef CONFIG_CLOCKWORKPI
+  if (strcasecmp (mode, "in")	  == 0) pinMode (pin, INPUT) ;
+  else if (strcasecmp (mode, "input")   == 0) pinMode (pin, INPUT) ;
+  else if (strcasecmp (mode, "out")	  == 0) pinMode (pin, OUTPUT) ;
+  else if (strcasecmp (mode, "output")  == 0) pinMode (pin, OUTPUT) ;
+  else if (strcasecmp (mode, "alt2")    == 0) pinModeAlt (pin, 0b010) ;
+  else if (strcasecmp (mode, "alt3")    == 0) pinModeAlt (pin, 0b011) ;
+  else if (strcasecmp (mode, "alt4")    == 0) pinModeAlt (pin, 0b100) ;
+  else if (strcasecmp (mode, "alt5")    == 0) pinModeAlt (pin, 0b101) ;
+  else if (strcasecmp (mode, "alt6")    == 0) pinModeAlt (pin, 0b110) ;
+  else if (strcasecmp (mode, "alt7")    == 0) pinModeAlt (pin, 0b111) ;
+#else
   /**/ if (strcasecmp (mode, "in")      == 0) pinMode         (pin, INPUT) ;
   else if (strcasecmp (mode, "input")   == 0) pinMode         (pin, INPUT) ;
   else if (strcasecmp (mode, "out")     == 0) pinMode         (pin, OUTPUT) ;
@@ -760,6 +775,7 @@ void doMode (int argc, char *argv [])
   else if (strcasecmp (mode, "alt3")    == 0) pinModeAlt (pin, 0b111) ;
   else if (strcasecmp (mode, "alt4")    == 0) pinModeAlt (pin, 0b011) ;
   else if (strcasecmp (mode, "alt5")    == 0) pinModeAlt (pin, 0b010) ;
+#endif
   else
   {
     fprintf (stderr, "%s: Invalid mode: %s. Should be in/out/pwm/clock/up/down/tri\n", argv [1], mode) ;
@@ -1299,6 +1315,90 @@ static void doVersion (char *argv [])
     printf ("  * Root or sudo required for GPIO access.\n") ;
 }
 
+static void doReadRaw (int argc, char *argv []) 
+{
+#ifdef CONFIG_CLOCKWORKPI
+	int pin, val ;
+
+	if (argc != 3) {
+		fprintf (stderr, "Usage: %s readraw pin\n", argv [0]) ;
+		exit (1) ;
+	}
+
+	pin = atoi (argv [2]) ;
+	val = CPi_digitalRead(pin);	
+
+	printf ("%s\n", val == 0 ? "0" : "1") ;
+#endif
+}
+
+static void doWriteRaw (int argc, char *argv [])
+{
+#ifdef CONFIG_CLOCKWORKPI
+	int pin, val ;
+
+	if (argc != 4) {
+		fprintf (stderr, "Usage: %s writeraw pin value\n", argv [0]) ;
+		exit (1) ;
+	}
+
+	pin = atoi (argv [2]) ;
+
+	if ((strcasecmp (argv [3], "up") == 0) || (strcasecmp (argv [3], "on") == 0))
+		val = 1 ;
+	else if ((strcasecmp (argv [3], "down") == 0) || (strcasecmp (argv [3], "off") == 0))
+		val = 0 ;
+	else
+		val = atoi (argv [3]) ;
+
+	if (val == 0)
+		CPi_digitalWrite (pin, LOW) ;
+	else
+		CPi_digitalWrite (pin, HIGH) ;
+#endif
+}
+
+static void doModeRaw (int argc, char *argv [])
+{
+#ifdef CONFIG_CLOCKWORKPI
+  int pin ;
+  char *mode ;
+
+  if (argc != 4)
+  {
+    fprintf (stderr, "Usage: %s mode pin mode\n", argv [0]) ;
+    exit (1) ;
+  }
+  wiringPiSetupRaw();
+
+  pin = atoi (argv [2]) ;
+
+  mode = argv [3] ;
+
+  /**/ if (strcasecmp (mode, "in")      == 0) pinMode         (pin, INPUT) ;
+  else if (strcasecmp (mode, "input")   == 0) pinMode         (pin, INPUT) ;
+  else if (strcasecmp (mode, "out")     == 0) pinMode         (pin, OUTPUT) ;
+  else if (strcasecmp (mode, "output")  == 0) pinMode         (pin, OUTPUT) ;
+  else if (strcasecmp (mode, "pwm")     == 0) pinMode         (pin, PWM_OUTPUT) ;
+  else if (strcasecmp (mode, "pwmTone") == 0) pinMode         (pin, PWM_TONE_OUTPUT) ;
+  else if (strcasecmp (mode, "clock")   == 0) pinMode         (pin, GPIO_CLOCK) ;
+  else if (strcasecmp (mode, "up")      == 0) pullUpDnControl (pin, PUD_UP) ;
+  else if (strcasecmp (mode, "down")    == 0) pullUpDnControl (pin, PUD_DOWN) ;
+  else if (strcasecmp (mode, "tri")     == 0) pullUpDnControl (pin, PUD_OFF) ;
+  else if (strcasecmp (mode, "off")     == 0) pullUpDnControl (pin, PUD_OFF) ;
+  else if (strcasecmp (mode, "alt2")    == 0) pinModeAlt (pin, 0b010) ;
+  else if (strcasecmp (mode, "alt3")    == 0) pinModeAlt (pin, 0b011) ;
+  else if (strcasecmp (mode, "alt4")    == 0) pinModeAlt (pin, 0b100) ;
+  else if (strcasecmp (mode, "alt5")    == 0) pinModeAlt (pin, 0b101) ;
+  else if (strcasecmp (mode, "alt6")    == 0) pinModeAlt (pin, 0b110) ;
+  else if (strcasecmp (mode, "alt7")    == 0) pinModeAlt (pin, 0b111) ;
+  else
+  {
+    fprintf (stderr, "%s: Invalid mode: %s. Should be in/out/pwm/clock/up/down/tri\n", argv [1], mode) ;
+    exit (1) ;
+  }
+#endif
+}
 
 /*
  * main:
@@ -1376,7 +1476,7 @@ int main (int argc, char *argv [])
     fprintf (stderr, "%s: Must be root to run. Program should be suid root. This is an error.\n", argv [0]) ;
     exit (EXIT_FAILURE) ;
   }
-
+#ifndef CONFIG_CLOCKWORKPI
 // Initial test for /sys/class/gpio operations:
 
   /**/ if (strcasecmp (argv [1], "exports"    ) == 0)	{ doExports     (argc, argv) ;	return 0 ; }
@@ -1398,7 +1498,7 @@ int main (int argc, char *argv [])
 
   if (strcasecmp (argv [1], "gbr" ) == 0)	{ doGbr (argc, argv) ; return 0 ; }
   if (strcasecmp (argv [1], "gbw" ) == 0)	{ doGbw (argc, argv) ; return 0 ; }
-
+#endif
 // Check for allreadall command, force Gpio mode
 
   if (strcasecmp (argv [1], "allreadall") == 0)
@@ -1453,7 +1553,16 @@ int main (int argc, char *argv [])
     --argc ;
     wpMode = WPI_MODE_UNINITIALISED ;
   }
-
+#ifdef CONFIG_CLOCKWORKPI
+  else if (strcasecmp (argv [1], "-r") == 0)
+  {
+    wiringPiSetupRaw();
+    for (i = 2 ; i < argc ; ++i)
+      argv [i - 1] = argv [i] ;
+    --argc ;
+    wpMode = WPI_MODE_GPIO ;
+  }
+#endif
 // Default to wiringPi mode
 
   else
@@ -1494,6 +1603,16 @@ int main (int argc, char *argv [])
     exit (EXIT_FAILURE) ;
   }
 
+#ifdef CONFIG_CLOCKWORKPI
+  /**/ if (strcasecmp (argv [1], "mode"   ) == 0) doMode      (argc, argv) ;
+  else if (strcasecmp (argv [1], "moderaw"   ) == 0) doModeRaw      (argc, argv) ;  
+  else if (strcasecmp (argv [1], "read"   ) == 0) doRead      (argc, argv) ;
+  else if (strcasecmp (argv [1], "readraw"   ) == 0) doReadRaw      (argc, argv) ;
+  else if (strcasecmp (argv [1], "write"  ) == 0) doWrite     (argc, argv) ;
+  else if (strcasecmp (argv [1], "writeraw"  ) == 0) doWriteRaw     (argc, argv) ;
+  else if (strcasecmp (argv [1], "readall"  ) == 0) CPiReadAll    () ;
+  else if (strcasecmp (argv [1], "readallraw"  ) == 0) CPiReadAllRaw    () ;
+#else
 // Core wiringPi functions
 
   /**/ if (strcasecmp (argv [1], "mode"   ) == 0) doMode      (argc, argv) ;
@@ -1528,6 +1647,7 @@ int main (int argc, char *argv [])
   else if (strcasecmp (argv [1], "rbd"      ) == 0) doReadByte   (argc, argv, FALSE) ;
   else if (strcasecmp (argv [1], "clock"    ) == 0) doClock      (argc, argv) ;
   else if (strcasecmp (argv [1], "wfi"      ) == 0) doWfi        (argc, argv) ;
+#endif
   else
   {
     fprintf (stderr, "%s: Unknown command: %s.\n", argv [0], argv [1]) ;

+ 8 - 1
gpio/readall.c

@@ -35,6 +35,10 @@
 
 #include <wiringPi.h>
 
+#ifdef CONFIG_CLOCKWORKPI
+#include "CPi.h"
+#endif
+
 extern int wpMode ;
 
 #ifndef TRUE
@@ -341,7 +345,9 @@ static void piPlusReadall (int model)
 void doReadall (void)
 {
   int model, rev, mem, maker, overVolted ;
-
+#ifdef CONFIG_CLOCKWORKPI
+  CPiReadAll();
+#else
   if (wiringPiNodes != NULL)	// External readall
   {
     doReadallExternal () ;
@@ -362,6 +368,7 @@ void doReadall (void)
     allReadall () ;
   else
     printf ("Oops - unable to determine board type... model: %d\n", model) ;
+#endif
 }
 
 

+ 17 - 2
wiringPi/Makefile

@@ -44,6 +44,20 @@ CFLAGS	= $(DEBUG) $(DEFS) -Wformat=2 -Wall -Wextra -Winline $(INCLUDE) -pipe -fP
 
 LIBS    = -lm -lpthread -lrt -lcrypt
 
+ifeq ($(BOARD),)
+  BOARD = clockworkpi-a06-rk3399
+endif
+
+ifeq ($(BOARD), clockworkpi-a04-h6)
+EXTRA_CFLAGS = -DCONFIG_CLOCKWORKPI_A04
+endif
+
+ifeq ($(BOARD), clockworkpi-a06-rk3399)
+EXTRA_CFLAGS = -DCONFIG_CLOCKWORKPI_A06
+endif
+
+EXTRA_CFLAGS += -DCONFIG_CLOCKWORKPI
+
 ###############################################################################
 
 SRC	=	wiringPi.c						\
@@ -61,7 +75,8 @@ SRC	=	wiringPi.c						\
 		bmp180.c htu21d.c ds18b20.c rht03.c			\
 		drcSerial.c drcNet.c					\
 		pseudoPins.c						\
-		wpiExtensions.c
+		wpiExtensions.c 					\
+		wiringCPi.c
 
 HEADERS =	$(shell ls *.h)
 
@@ -79,7 +94,7 @@ $(DYNAMIC):	$(OBJ)
 
 .c.o:
 	$Q echo [Compile] $<
-	$Q $(CC) -c $(CFLAGS) $< -o $@
+	$Q $(CC) -c $(EXTRA_CFLAGS) $(CFLAGS) $< -o $@
 
 
 .PHONY:	clean

+ 632 - 0
wiringPi/wiringCPi.c

@@ -0,0 +1,632 @@
+#include "wiringPi.h"
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include "wiringCPi.h"
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <poll.h>
+#include <errno.h>
+#include <time.h>
+#include <pthread.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <sys/ioctl.h>
+#include <limits.h>
+#include "softPwm.h"
+#include "softTone.h"
+
+
+static int wpimode = -1 ;
+#define WPI_MODE_BCM 0
+#define WPI_MODE_RAW 1
+#define BLOCK_SIZE (4*1024)
+
+#ifdef CONFIG_CLOCKWORKPI_A04
+
+int CPI_PIN_MASK[12][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
+};
+
+#endif
+
+#ifdef CONFIG_CLOCKWORKPI_A06
+
+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	
+};
+
+  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
+  };
+
+volatile uint32_t *cru_base;
+volatile uint32_t *grf_base;
+volatile uint32_t *pmugrf_base;
+volatile uint32_t *pmucru_base;
+volatile uint32_t *gpio0_base;
+volatile uint32_t *gpio1_base;
+volatile uint32_t *gpio2_base;
+volatile uint32_t *gpio3_base;
+volatile uint32_t *gpio4_base;
+#endif
+
+static unsigned int readR(unsigned int addr)
+{
+#ifdef CONFIG_CLOCKWORKPI_A06
+
+	unsigned int val = 0;
+	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));
+
+	return val;
+
+#elif (defined CONFIG_CLOCKWORKPI_A04)
+	uint32_t val = 0;
+	return val;
+#endif
+}
+
+static void writeR(unsigned int val, unsigned int addr)
+{
+#ifdef CONFIG_CLOCKWORKPI_A06
+
+	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;
+
+#elif (defined CONFIG_CLOCKWORKPI_A04)
+
+#endif
+}
+
+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;
+	
+#ifdef CONFIG_CLOCKWORKPI_A06
+
+	unsigned int grf_phyaddr = 0, ddr_phyaddr = 0;
+	int offset = ((index - ((index >> 3) << 3)));
+
+	if(bank == 0){
+		grf_phyaddr = PMUGRF_BASE + ((index >> 3) << 2);
+		ddr_phyaddr = GPIO0_BASE + GPIO_SWPORTA_DDR_OFFSET;
+	}
+	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;
+	}
+	else if(bank == 3){
+		grf_phyaddr = GRF_BASE + ((index >> 3) << 2) +0x10;
+		ddr_phyaddr = GPIO3_BASE + GPIO_SWPORTA_DDR_OFFSET;
+	}
+	else if(bank == 4){
+		grf_phyaddr = GRF_BASE + ((index >> 3) << 2) +0x20;
+		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;
+	}
+
+#elif (defined CONFIG_CLOCKWORKPI_A04)
+
+	int offset = ((index - ((index >> 3) << 3)) << 2);
+
+	if (bank == 11) {
+		phyaddr = GPIOL_BASE + ((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;
+	}
+
+	return mode;
+
+#endif
+}
+
+/*
+ * Set GPIO Mode
+ */
+int 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;
+
+#ifdef CONFIG_CLOCKWORKPI_A06
+	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);
+
+	if (bank == 11) {
+		phyaddr = GPIOL_BASE + ((index >> 3) << 2);
+	} else {
+		phyaddr = GPIO_BASE_MAP + (bank * 36) + ((index >> 3) << 2);
+	}
+#endif
+
+#ifdef CONFIG_CLOCKWORKPI_A06
+
+	if(bank == 0){
+		cru_phyaddr = PMUCRU_BASE + PMUCRU_CLKGATE_CON1_OFFSET;
+		grf_phyaddr = PMUGRF_BASE + ((index >> 3) << 2);
+		gpio_phyaddr = GPIO0_BASE + GPIO_SWPORTA_DDR_OFFSET;
+	}
+	else if(bank == 1){
+		cru_phyaddr = PMUCRU_BASE + PMUCRU_CLKGATE_CON1_OFFSET;
+		grf_phyaddr = PMUGRF_BASE + ((index >> 3) << 2) + 0x10;
+		gpio_phyaddr = GPIO1_BASE + GPIO_SWPORTA_DDR_OFFSET;
+	}
+	else if(bank == 2){
+		cru_phyaddr = CRU_BASE + CRU_CLKGATE_CON31_OFFSET;
+		grf_phyaddr = GRF_BASE + ((index >> 3) << 2);
+		gpio_phyaddr = GPIO2_BASE + GPIO_SWPORTA_DDR_OFFSET;
+	}
+	else if(bank == 3){
+		cru_phyaddr = CRU_BASE + CRU_CLKGATE_CON31_OFFSET;
+		grf_phyaddr = GRF_BASE + ((index >> 3) << 2) +0x10;
+		gpio_phyaddr = GPIO3_BASE + GPIO_SWPORTA_DDR_OFFSET;
+	}
+	else if(bank == 4){
+		cru_phyaddr = CRU_BASE + CRU_CLKGATE_CON31_OFFSET;
+		grf_phyaddr = GRF_BASE + ((index >> 3) << 2) +0x20;
+		gpio_phyaddr = GPIO4_BASE + GPIO_SWPORTA_DDR_OFFSET;
+	}
+
+#endif
+
+    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);
+#endif
+        if (wiringPiDebug)
+            printf("Register[%#x]: %#x index:%d\n", phyaddr, regval, index);
+
+        /* Set Input */
+        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){
+			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);
+#endif
+        } else if (OUTPUT == mode) { /* Set Output */
+#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){
+				regval = readR(gpio_phyaddr);
+				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);
+#endif
+        }else 
+            printf("Unknow mode\n");
+    } else
+        printf("unused pin\n");
+}
+
+int CPi_set_gpio_alt(int pin, int mode)
+{
+#ifdef CONFIG_CLOCKWORKPI_A04
+	unsigned int regval = 0;
+	unsigned int bank   = pin >> 5;
+	unsigned int index  = pin - (bank << 5);
+	unsigned int phyaddr = 0;
+	int offset = ((index - ((index >> 3) << 3)) << 2);
+
+	if (bank == 11) {
+		phyaddr = GPIOL_BASE + ((index >> 3) << 2);
+	}else
+		phyaddr = GPIO_BASE_MAP + (bank * 36) + ((index >> 3) << 2);
+
+	/* Ignore unused gpio */
+	if (CPI_PIN_MASK[bank][index] != -1) {
+		if (wiringPiDebug)
+			printf("Register[%#x]: %#x index:%d\n", phyaddr, regval, index);
+
+		regval = readR(phyaddr);
+		regval &= ~(7 << offset);
+		regval |=  (mode << offset);
+		writeR(regval, phyaddr);
+	} else
+		printf("Pin alt mode failed!\n");
+#endif
+
+	return 0;
+}
+
+/*
+ * CPi Digital write 
+ */
+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 regval = 0;
+	unsigned int cru_phyaddr = 0;
+
+#else
+    unsigned int regval = 0;
+	
+	if (bank == 11) {
+		phyaddr = GPIOL_BASE + 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;
+		}
+
+#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);
+
+		regval = readR(phyaddr);
+		if (wiringPiDebug)
+			printf("befor write reg val: 0x%x,index:%d\n", regval, index);
+		if(0 == value) {
+			regval &= ~(1 << index);
+			writeR(regval, phyaddr);
+			regval = readR(phyaddr);
+			if (wiringPiDebug)
+				printf("LOW val set over reg val: 0x%x\n", regval);
+		} else {
+			regval |= (1 << index);
+			writeR(regval, phyaddr);
+			regval = readR(phyaddr);
+			if (wiringPiDebug)
+				printf("HIGH val set over reg val: 0x%x\n", regval);
+		}
+
+    } else
+        printf("unused pin\n");
+
+}
+
+/*
+ * CPi Digital Read
+ */
+int CPi_digitalRead(int pin)
+{
+	int bank = pin >> 5;
+	int index = pin - (bank << 5);
+	int val;
+#ifdef CONFIG_CLOCKWORKPI_A04
+
+	unsigned int phyaddr;
+	
+	if (bank == 11) {
+		phyaddr = GPIOL_BASE + 0x10;
+	} else {
+		phyaddr = GPIO_BASE_MAP + (bank * 36) + 0x10;
+	}
+#endif
+
+#ifdef CONFIG_CLOCKWORKPI_A06
+	unsigned int phyaddr;
+	if(bank == 0)
+		phyaddr = GPIO0_BASE + GPIO_EXT_PORTA_OFFSET;
+	else if(bank == 1)
+		phyaddr = GPIO1_BASE + GPIO_EXT_PORTA_OFFSET;
+	else if(bank == 2)
+		phyaddr = GPIO2_BASE + GPIO_EXT_PORTA_OFFSET;
+	else if(bank == 3)
+		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) {
+		val = readR(phyaddr);
+		val = val >> index;
+		val &= 1;
+		if (wiringPiDebug)
+			printf("Read reg val: 0x%#x, bank:%d, index:%d\n", val, bank, index);
+		return val;
+	}
+	return 0;
+}
+
+
+int CPiSetup(int fd)
+{
+#ifdef CONFIG_CLOCKWORKPI_A04
+
+
+
+#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));
+	gpio1_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO1_BASE);
+	if ((int32_t)(unsigned long)grf_base == -1)
+		return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (GPIO1_BASE) failed: %s\n", strerror(errno));
+	gpio2_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO2_BASE);
+	if ((int32_t)(unsigned long)gpio2_base == -1)
+		return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (GPIO2_BASE) failed: %s\n", strerror(errno));
+	gpio3_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO3_BASE);
+	if ((int32_t)(unsigned long)gpio3_base == -1)
+		return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (GPIO3_BASE) failed: %s\n", strerror(errno));
+	gpio4_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO4_BASE);
+	if ((int32_t)(unsigned long)gpio4_base == -1)
+		return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (GPIO4_BASE) failed: %s\n", strerror(errno));
+
+	cru_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, CRU_BASE);
+	if ((int32_t)(unsigned long)cru_base == -1)
+		return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (CRU_BASE) failed: %s\n", strerror(errno));
+	pmucru_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, PMUCRU_BASE);
+	if ((int32_t)(unsigned long)pmucru_base == -1)
+		return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (PMUCRU_BASE) failed: %s\n", strerror(errno));
+	grf_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GRF_BASE);
+	if ((int32_t)(unsigned long)grf_base == -1)
+		return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (GRF_BASE) failed: %s\n", strerror(errno));
+	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;
+}
+
+void CPiSetupRaw(void)
+{
+	wpimode = WPI_MODE_RAW;
+}
+
+void CPiPinMode(int pin, int mode)
+{
+	if (wiringPiDebug)
+		printf("CPiPinMode: pin:%d,mode:%d\n", pin, mode);
+
+	if (pin >= GPIO_NUM) {
+		printf("CPiPinMode: invaild pin:%d\n", pin);
+		return;
+	}
+
+	if (wpimode == WPI_MODE_BCM) {
+		if(pin >= sizeof(bcmToGpioCPi)/sizeof(bcmToGpioCPi[0])) {
+			printf("CPiPinMode: invaild pin:%d\n", pin);
+			return;
+		}
+		pin = bcmToGpioCPi[pin];
+	}
+
+	CPi_set_gpio_mode(pin, mode);
+}
+
+void CPiDigitalWrite(int pin, int value)
+{
+	if (wiringPiDebug)
+		printf("CPiDigitalWrite: pin:%d,value:%d\n", pin, value);
+
+	if (pin >= GPIO_NUM) {
+		printf("CPiDigitalWrite: invaild pin:%d\n", pin);
+		return;
+	}
+
+	if (wpimode == WPI_MODE_BCM) {
+		if(pin >= sizeof(bcmToGpioCPi)/sizeof(bcmToGpioCPi[0])) {
+			printf("CPiDigitalWrite: invaild pin:%d\n", pin);
+			return;
+		}
+		pin = bcmToGpioCPi[pin];
+	}
+
+	CPi_digitalWrite(pin, value);
+}
+
+int CPiDigitalRead(int pin)
+{
+	int value;
+
+	if (pin >= GPIO_NUM) {
+		printf("CPiDigitalRead: invaild pin:%d\n", pin);
+		return -1;
+	}
+
+	if (wpimode == WPI_MODE_BCM) {
+		if(pin >= sizeof(bcmToGpioCPi)/sizeof(bcmToGpioCPi[0])) {
+			printf("CPiDigitalRead: invaild pin:%d\n", pin);
+			return -1;
+		}
+		pin = bcmToGpioCPi[pin];
+	}
+
+	value = CPi_digitalRead(pin);
+
+	if (wiringPiDebug)
+		printf("CPiDigitalRead: pin:%d,value:%d\n", pin, value);
+
+	return value;
+}
+
+void pinModeAltCP(int pin, int mode)
+{
+}
+
+void CPiBoardId (int *model, int *rev, int *mem, int *maker, int *warranty)
+{
+#ifdef CONFIG_CLOCKWORKPI_A04
+	*model = CPI_MODEL_A04; 
+	*rev = PI_VERSION_1; 
+	*mem = 3; 
+	*maker = 3;
+#elif defined(CONFIG_CLOCKWORKPI_A06)
+	*model = CPI_MODEL_A06; 
+	*rev = PI_VERSION_1; 
+	*mem = 4; 
+	*maker = 3;
+#endif
+}
+

+ 44 - 0
wiringPi/wiringCPi.h

@@ -0,0 +1,44 @@
+#ifndef _WIRING_CPI_H
+#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)
+#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
+#endif
+
+#define MAP_SIZE_L                         (4*1024)
+#define MAP_SIZE           MAP_SIZE_L
+#define MAP_MASK           (MAP_SIZE - 1)
+
+extern int CPi_set_gpio_mode(int pin, int mode);
+extern int CPi_set_gpio_alt(int pin, int mode);
+extern int CPi_get_gpio_mode(int pin);
+extern void CPi_digitalWrite(int pin, int value);
+extern int CPi_digitalRead(int pin);
+extern void CPiSetupRaw(void);
+
+#endif

+ 62 - 6
wiringPi/wiringPi.c

@@ -77,6 +77,10 @@
 #include "wiringPi.h"
 #include "../version.h"
 
+#ifdef CONFIG_CLOCKWORKPI
+#include "wiringCPi.h"
+#endif
+
 // Environment Variables
 
 #define	ENV_DEBUG	"WIRINGPI_DEBUG"
@@ -237,9 +241,15 @@ const char *piModelNames [20] =
   "Pi 3A+",	// 14
   "Unknown15",	// 15
   "CM3+",	// 16
-  "Unknown17",	// 17
-  "Unknown18",	// 18
-  "Unknown19",	// 19
+#ifdef CONFIG_CLOCKWORKPI
+  "CPi A04",	// 17
+  "CPi A06",	// 18
+  "Unknown",	// 19
+#else
+  "Unknown17",  // 17
+  "Unknown18",  // 18
+  "Unknown19",  // 19
+#endif
 } ;
 
 const char *piRevisionNames [16] =
@@ -287,8 +297,8 @@ const int piMemorySize [8] =
    256,		//	 0
    512,		//	 1
   1024,		//	 2
-     0,		//	 3
-     0,		//	 4
+  2048,		//	 3
+  4096,		//	 4
      0,		//	 5
      0,		//	 6
      0,		//	 7
@@ -725,7 +735,7 @@ static void usingGpioMemCheck (const char *what)
  *********************************************************************************
  */
 
-static void piGpioLayoutOops (const char *why)
+void piGpioLayoutOops (const char *why)
 {
   fprintf (stderr, "Oops: Unable to determine board revision from /proc/cpuinfo\n") ;
   fprintf (stderr, " -> %s\n", why) ;
@@ -755,6 +765,12 @@ int piGpioLayout (void)
     if (strncmp (line, "Hardware", 8) == 0)
       break ;
 
+#ifdef CONFIG_CLOCKWORKPI_A06
+  strcpy(line, "Hardware		 : Rockchip rk3399 Family");	
+#elif defined(CONFIG_CLOCKWORKPI_A04)
+  strcpy(line, "Hardware		 : Allwinner H6 Family");	
+#endif
+
   if (strncmp (line, "Hardware", 8) != 0)
     piGpioLayoutOops ("No \"Hardware\" line") ;
 
@@ -811,6 +827,10 @@ int piGpioLayout (void)
 
   fclose (cpuFd) ;
 
+#ifdef CONFIG_CLOCKWORKPI
+	  strcpy(line, "Revision  : 0000");
+#endif
+
   if (strncmp (line, "Revision", 8) != 0)
     piGpioLayoutOops ("No \"Revision\" line") ;
 
@@ -954,6 +974,11 @@ void piBoardId (int *model, int *rev, int *mem, int *maker, int *warranty)
 //	Will deal with the properly later on - for now, lets just get it going...
 //  unsigned int modelNum ;
 
+#ifdef CONFIG_CLOCKWORKPI
+  CPiBoardId(model, rev, mem, maker);
+  return;
+#endif
+
   (void)piGpioLayout () ;	// Call this first to make sure all's OK. Don't care about the result.
 
   if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL)
@@ -1420,6 +1445,11 @@ void pinMode (int pin, int mode)
 
   setupCheck ("pinMode") ;
 
+#ifdef CONFIG_CLOCKWORKPI
+  CPiPinMode(pin, mode);
+  return;
+#endif
+
   if ((pin & PI_GPIO_MASK) == 0)		// On-board pin
   {
     /**/ if (wiringPiMode == WPI_MODE_PINS)
@@ -1534,6 +1564,10 @@ int digitalRead (int pin)
   char c ;
   struct wiringPiNodeStruct *node = wiringPiNodes ;
 
+#ifdef CONFIG_CLOCKWORKPI
+  return CPiDigitalRead(pin);
+#endif
+
   if ((pin & PI_GPIO_MASK) == 0)		// On-Board Pin
   {
     /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS)	// Sys mode
@@ -1597,6 +1631,11 @@ void digitalWrite (int pin, int value)
 {
   struct wiringPiNodeStruct *node = wiringPiNodes ;
 
+#ifdef CONFIG_CLOCKWORKPI
+  CPiDigitalWrite(pin, value);
+  return;
+#endif
+
   if ((pin & PI_GPIO_MASK) == 0)		// On-Board Pin
   {
     /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS)	// Sys mode
@@ -2294,6 +2333,9 @@ int wiringPiSetup (void)
 	"  Try running with sudo?\n", strerror (errno)) ;
   }
 
+#ifdef CONFIG_CLOCKWORKPI
+  CPiSetup(fd);
+#else
 // Set the offsets into the memory interface.
 
   GPIO_PADS 	  = piGpioBase + 0x00100000 ;
@@ -2349,6 +2391,7 @@ int wiringPiSetup (void)
   _wiringPiClk   = clk ;
   _wiringPiPads  = pads ;
   _wiringPiTimer = timer ;
+#endif
 
   initialiseEpoch () ;
 
@@ -2377,6 +2420,19 @@ int wiringPiSetupGpio (void)
   return 0 ;
 }
 
+int wiringPiSetupRaw (void)
+{
+  (void)wiringPiSetup () ;
+
+  if (wiringPiDebug)
+    printf ("wiringPi: wiringPiSetupRaw called\n") ;
+
+  wiringPiMode = WPI_MODE_GPIO ;
+#ifdef CONFIG_CLOCKWORKPI
+  CPiSetupRaw();
+#endif
+  return 0 ;
+}
 
 /*
  * wiringPiSetupPhys:

+ 12 - 1
wiringPi/wiringPi.h

@@ -44,6 +44,10 @@
 
 // Handy defines
 
+#ifdef CONFIG_CLOCKWORKPI
+extern int wiringPiDebug;
+#endif
+
 // wiringPi modes
 
 #define	WPI_MODE_PINS		 0
@@ -102,7 +106,10 @@
 #define	PI_MODEL_3BP 		13
 #define	PI_MODEL_3AP 		14
 #define	PI_MODEL_CM3P 		16
-
+#ifdef CONFIG_CLOCKWORKPI
+#define	CPI_MODEL_A04   24
+#define	CPI_MODEL_A06   26
+#endif
 #define	PI_VERSION_1		0
 #define	PI_VERSION_1_1		1
 #define	PI_VERSION_1_2		2
@@ -187,6 +194,10 @@ extern "C" {
 
 // Internal
 
+#ifdef CONFIG_CLOCKWORKPI
+extern void piGpioLayoutOops (const char *why);
+#endif
+
 extern int wiringPiFailure (int fatal, const char *message, ...) ;
 
 // Core wiringPi functions

+ 4 - 0
wiringPi/wiringPiSPI.c

@@ -109,7 +109,11 @@ 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
+  snprintf (spiDev, 31, "/dev/spidev2.%d", channel) ;
+#else
   snprintf (spiDev, 31, "/dev/spidev0.%d", channel) ;
+#endif
 
   if ((fd = open (spiDev, O_RDWR)) < 0)
     return wiringPiFailure (WPI_ALMOST, "Unable to open SPI device: %s\n", strerror (errno)) ;