apply a06 patch

This commit is contained in:
cuu
2021-08-23 15:30:36 +08:00
parent 03e88aef04
commit f06b33c66b
12 changed files with 1116 additions and 17 deletions

12
gpio/CPi.h Normal file
View File

@@ -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
gpio/CPi_readall.c Executable file
View File

@@ -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;
}

View File

@@ -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:

View File

@@ -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]) ;

View File

@@ -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
}