diff --git a/build b/build index 6844946..886827c 100755 --- a/build +++ b/build @@ -1,4 +1,4 @@ -#!/bin/sh -e +#!/bin/bash -e # build # Simple wiringPi build and install script @@ -43,6 +43,48 @@ check_make_ok() { fi } +select_boards() +{ + local cnt=0 + local choice + local call=${1} + + boards=("clockworkpi-a04" "clockworkpi-a06" "clockworkpi-d1") + + 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 + [[ $BOARD == clockworkpi-d1 ]] && BOARD=clockworkpi-d1 + + export BOARD="${BOARD}" +} + sudo=${WIRINGPI_SUDO-sudo} if [ x$1 = "xclean" ]; then @@ -103,6 +145,8 @@ if [ x$1 != "x" ]; then exit 1 fi + select_boards + echo "wiringPi Build script" echo "=====================" echo diff --git a/gpio/CPi.h b/gpio/CPi.h new file mode 100644 index 0000000..5b8a141 --- /dev/null +++ b/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 diff --git a/gpio/CPi_readall.c b/gpio/CPi_readall.c new file mode 100755 index 0000000..cf1232b --- /dev/null +++ b/gpio/CPi_readall.c @@ -0,0 +1,284 @@ +#include +#include +#include +#include +#include "CPi.h" + +#ifdef CONFIG_CLOCKWORKPI_A04 + +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 +}; + +#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 + +#ifdef CONFIG_CLOCKWORKPI_D1 + +int bcmToGpioCPi[64] = +{ + 11, 10, // 0, 1 + 105, 171, // 2, 3 + 170, 178, // 4 5 + 177, 176, // 6, 7 + 83, 84, // 8, 9 + 12, 97, //10,11 + 98, 99, //12,13 + 166, 167, //14,15 + + 169, 168, //16,17 + 173, 172, //18,19 + 174, 175, //20,21 + 160, 161, //22,23 + 162, 163, //24,25 + 164, 165, //26,27 + 113, 112, //28,29 + 111, 110, //30,31 + + 8, 9, //32,33 + 109, 108, //34,35 + 107, 106, //36,37 + 76, 75, //38,39 + 86, 74, //40,41 + 77, 81, //42,43 + 78, 79, //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_D1 + +static char *alts [] = +{ + "IN", "OUT", "ALT2", "ALT3", "ALT4", "ALT5", "ALT6", "ALT7", "ALT8", "RSRV", "RSRV", "RSRV", "RSRV", "RSRV", "EINT", "OFF" +} ; + +#else + +static char *alts [] = +{ + "IN", "OUT", "ALT2", "ALT3", "ALT4", "ALT5", "ALT6", "OFF" +} ; + +#endif + +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); + +#elif defined(CONFIG_CLOCKWORKPI_D1) + + c = b + 'B'; + sprintf(name, "P%c%d", c, d); + +#endif + return name; +} + +void CPiReadAll(void) +{ + int pin, pin2; + int tmp = wiringPiDebug; + wiringPiDebug = FALSE; + + 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 | Name | Mode | V | BCM | GPIO | Name | Mode | V |\n"); + printf (" +-----+------+------+------+---+-----+------+------+------+---+\n"); + + wiringPiDebug = tmp; +} + +void CPiReadAllRaw(void) +{ + int pin, pin2, i; + 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"); + + 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"); + +#elif defined(CONFIG_CLOCKWORKPI_D1) + + 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 < 23; 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; + } + 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"); + +#endif + + wiringPiDebug = tmp; +} + diff --git a/gpio/Makefile b/gpio/Makefile index 9ec160d..3e34160 100644 --- a/gpio/Makefile +++ b/gpio/Makefile @@ -39,10 +39,28 @@ CFLAGS = $(DEBUG) -Wall -Wextra $(INCLUDE) -Winline -pipe LDFLAGS = -L$(DESTDIR)$(PREFIX)/lib LIBS = -lwiringPi -lwiringPiDev -lpthread -lrt -lm -lcrypt +ifeq ($(BOARD),) + BOARD = clockworkpi-d1 +endif + +ifeq ($(BOARD), clockworkpi-a04-h6) +EXTRA_CFLAGS = -DCONFIG_CLOCKWORKPI_A04 +endif + +ifeq ($(BOARD), clockworkpi-a06-rk3399) +EXTRA_CFLAGS = -DCONFIG_CLOCKWORKPI_A06 +endif + +ifeq ($(BOARD), clockworkpi-d1) +EXTRA_CFLAGS = -DCONFIG_CLOCKWORKPI_D1 +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 +75,7 @@ gpio: $(OBJ) .c.o: $Q echo [Compile] $< - $Q $(CC) -c $(CFLAGS) $< -o $@ + $Q $(CC) -c $(CFLAGS) $(EXTRA_CFLAGS) $< -o $@ .PHONY: clean clean: diff --git a/gpio/gpio.c b/gpio/gpio.c index 714e790..1a12a41 100644 --- a/gpio/gpio.c +++ b/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]) ; diff --git a/gpio/readall.c b/gpio/readall.c index 097755a..09eb0a4 100644 --- a/gpio/readall.c +++ b/gpio/readall.c @@ -35,6 +35,10 @@ #include +#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 } diff --git a/wiringPi/Makefile b/wiringPi/Makefile index 287fa58..dec500b 100644 --- a/wiringPi/Makefile +++ b/wiringPi/Makefile @@ -44,6 +44,24 @@ CFLAGS = $(DEBUG) $(DEFS) -Wformat=2 -Wall -Wextra -Winline $(INCLUDE) -pipe -fP LIBS = -lm -lpthread -lrt -lcrypt +ifeq ($(BOARD),) + BOARD = clockworkpi-d1 +endif + +ifeq ($(BOARD), clockworkpi-a04-h6) +EXTRA_CFLAGS = -DCONFIG_CLOCKWORKPI_A04 +endif + +ifeq ($(BOARD), clockworkpi-a06-rk3399) +EXTRA_CFLAGS = -DCONFIG_CLOCKWORKPI_A06 +endif + +ifeq ($(BOARD), clockworkpi-d1) +EXTRA_CFLAGS = -DCONFIG_CLOCKWORKPI_D1 +endif + +EXTRA_CFLAGS += -DCONFIG_CLOCKWORKPI + ############################################################################### SRC = wiringPi.c \ @@ -61,7 +79,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 +98,7 @@ $(DYNAMIC): $(OBJ) .c.o: $Q echo [Compile] $< - $Q $(CC) -c $(CFLAGS) $< -o $@ + $Q $(CC) -c $(EXTRA_CFLAGS) $(CFLAGS) $< -o $@ .PHONY: clean diff --git a/wiringPi/wiringCPi.c b/wiringPi/wiringCPi.c new file mode 100755 index 0000000..f5f1303 --- /dev/null +++ b/wiringPi/wiringCPi.c @@ -0,0 +1,819 @@ +#include "wiringPi.h" +#include +#include +#include +#include +#include +#include "wiringCPi.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#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 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,},//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 + +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,},//GPIO0 + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//GPIO1 + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//GPIO2 + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//GPIO3 + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//GPIO4 + }; + +volatile uint32_t *cru_base; +volatile uint32_t *grf_base; +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 + +#ifdef CONFIG_CLOCKWORKPI_D1 + +int bcmToGpioCPi[64] = +{ + 11, 10, // 0, 1 + 105, 171, // 2, 3 + 170, 178, // 4 5 + 177, 176, // 6, 7 + 83, 84, // 8, 9 + 12, 97, //10,11 + 98, 99, //12,13 + 166, 167, //14,15 + + 169, 168, //16,17 + 173, 172, //18,19 + 174, 175, //20,21 + 160, 161, //22,23 + 162, 163, //24,25 + 164, 165, //26,27 + 113, 112, //28,29 + 111, 110, //30,31 + + 8, 9, //32,33 + 109, 108, //34,35 + 107, 106, //36,37 + 76, 75, //38,39 + 86, 74, //40,41 + 77, 81, //42,43 + 78, 79, //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[6][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,},//PB 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,},//PC 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,},//PD 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,},//PE 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,},//PF 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,},//PG 160 +}; + +volatile uint32_t *gpio_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; + 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; + +#elif (defined CONFIG_CLOCKWORKPI_D1) + + uint32_t val = 0; + uint32_t mmap_base = (addr & ~MAP_MASK); + uint32_t mmap_seek = ((addr - mmap_base) >> 2); + + val = *(gpio_base + mmap_seek); + + 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) + + 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; + +#elif (defined CONFIG_CLOCKWORKPI_D1) + + unsigned int mmap_base = (addr & ~MAP_MASK); + unsigned int mmap_seek = ((addr - mmap_base) >> 2); + + *(gpio_base + mmap_seek) = val; + +#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; + + if (CPI_PIN_MASK[bank][index] < 0) + return -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; + } + + 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 >= 6) { + phyaddr = GPIOL_BASE + (bank -6) * 0x24 + ((index >> 3) << 2); + } + else { + phyaddr = GPIO_BASE_MAP + (bank * 0x24) + ((index >> 3) << 2); + } + + regval = readR(phyaddr); + mode = (regval >> offset) & 7; + + return mode; + +#elif (defined CONFIG_CLOCKWORKPI_D1) + + int offset = ((index - ((index >> 3) << 3)) << 2); + + phyaddr = GPIO_BASE_MAP + (bank * 0x30) + ((index >> 3) << 2); + + regval = readR(phyaddr); + mode = (regval >> offset) & 0xf; + + 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_A04 + + int offset = ((index - ((index >> 3) << 3)) << 2); + + if (bank >= 6) { + phyaddr = GPIOL_BASE + (bank -6) * 0x24 + ((index >> 3) << 2); + } else { + 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); + 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 + +#ifdef CONFIG_CLOCKWORKPI_D1 + + int offset = ((index - ((index >> 3) << 3)) << 2); + + phyaddr = GPIO_BASE_MAP + (bank * 0x30) + ((index >> 3) << 2); + +#endif + + if (CPI_PIN_MASK[bank][index] != -1) { +#ifndef CONFIG_CLOCKWORKPI_A06 + 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); + + 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) { +#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 >= 6) { + phyaddr = GPIOL_BASE + ((index >> 3) << 2); + }else + phyaddr = GPIO_BASE_MAP + (bank * 0x24) + ((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 + +#ifdef CONFIG_CLOCKWORKPI_D1 + 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); + + phyaddr = GPIO_BASE_MAP + (bank * 0x30) + ((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; + 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; + + 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 + +#ifdef CONFIG_CLOCKWORKPI_D1 + + phyaddr = GPIO_BASE_MAP + (bank * 0x30) + 0x10; + +#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); + } + + } +} + +/* + * CPi Digital Read + */ +int CPi_digitalRead(int pin) +{ + int bank = pin >> 5; + int index = pin - (bank << 5); + int val; + unsigned int phyaddr; + +#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 + + 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 + +#ifdef CONFIG_CLOCKWORKPI_D1 + + phyaddr = GPIO_BASE_MAP + (bank * 0x30) + 0x10; + +#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 phyaddr: 0x%x\n", val, bank, index, phyaddr); + return val; + } + return 0; +} + + +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)); + 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)); + +#elif defined(CONFIG_CLOCKWORKPI_D1) + + 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)); + +#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; +#elif defined(CONFIG_CLOCKWORKPI_D1) + *model = CPI_MODEL_D1; + *rev = PI_VERSION_1; + *mem = 2; + *maker = 3; +#endif +} + diff --git a/wiringPi/wiringCPi.h b/wiringPi/wiringCPi.h new file mode 100755 index 0000000..a4213d5 --- /dev/null +++ b/wiringPi/wiringCPi.h @@ -0,0 +1,45 @@ +#ifndef _WIRING_CPI_H +#define _WIRING_CPI_H + +#ifdef CONFIG_CLOCKWORKPI_A04 +#define GPIOA_BASE 0x0300B000 +#define GPIO_BASE_MAP (GPIOA_BASE + 0x24 * 2) +#define GPIOL_BASE (0x07022000) +#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_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 + +#ifdef CONFIG_CLOCKWORKPI_D1 +#define GPIOA_BASE 0x02000000 +#define GPIO_BASE_MAP (GPIOA_BASE + 0x30) +#define GPIO_NUM (256) +#endif + +#define MAP_SIZE (4*1024) +#define MAP_MASK (MAP_SIZE - 1) + +extern int CPi_set_gpio_mode(int pin, int mode); +extern int CPi_set_gpio_alt(int pin, int mode); +extern int 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 diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c index 3db6866..d90960b 100644 --- a/wiringPi/wiringPi.c +++ b/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 + "CPi D1", // 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,14 @@ 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"); +#elif defined(CONFIG_CLOCKWORKPI_D1) + strcpy(line, "Hardware : Allwinner D1 Family"); +#endif + if (strncmp (line, "Hardware", 8) != 0) piGpioLayoutOops ("No \"Hardware\" line") ; @@ -811,6 +829,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 +976,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 +1447,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 +1566,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 +1633,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 +2335,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 +2393,7 @@ int wiringPiSetup (void) _wiringPiClk = clk ; _wiringPiPads = pads ; _wiringPiTimer = timer ; +#endif initialiseEpoch () ; @@ -2377,6 +2422,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: diff --git a/wiringPi/wiringPi.h b/wiringPi/wiringPi.h index 0ff0c92..ffda745 100644 --- a/wiringPi/wiringPi.h +++ b/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,11 @@ #define PI_MODEL_3BP 13 #define PI_MODEL_3AP 14 #define PI_MODEL_CM3P 16 - +#ifdef CONFIG_CLOCKWORKPI +#define CPI_MODEL_A04 0xa4 +#define CPI_MODEL_A06 0xa6 +#define CPI_MODEL_D1 0xd1 +#endif #define PI_VERSION_1 0 #define PI_VERSION_1_1 1 #define PI_VERSION_1_2 2 @@ -187,6 +195,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 diff --git a/wiringPi/wiringPiSPI.c b/wiringPi/wiringPiSPI.c index 749c8fe..1ce6880 100644 --- a/wiringPi/wiringPiSPI.c +++ b/wiringPi/wiringPiSPI.c @@ -109,7 +109,13 @@ 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_A06 + snprintf (spiDev, 31, "/dev/spidev2.%d", channel) ; +#elif defined(CONFIG_CLOCKWORKPI_D1) + snprintf (spiDev, 31, "/dev/spidev1.%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)) ; diff --git a/wiringPiD/drcNetCmd.h b/wiringPiD/drcNetCmd.h index 23f7dc1..4300396 100644 --- a/wiringPiD/drcNetCmd.h +++ b/wiringPiD/drcNetCmd.h @@ -35,7 +35,7 @@ #define DRCN_ANALOG_READ 9 -struct drcNetComStruct +typedef struct drcNetComStruct { uint32_t pin ; uint32_t cmd ;