mirror of
https://github.com/clockworkpi/WiringPi.git
synced 2025-12-12 16:08:49 +01:00
apply a06 patch
This commit is contained in:
parent
03e88aef04
commit
f06b33c66b
45
build
45
build
@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh -e
|
#!/bin/bash -e
|
||||||
|
|
||||||
# build
|
# build
|
||||||
# Simple wiringPi build and install script
|
# Simple wiringPi build and install script
|
||||||
@ -43,6 +43,47 @@ check_make_ok() {
|
|||||||
fi
|
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}
|
sudo=${WIRINGPI_SUDO-sudo}
|
||||||
|
|
||||||
if [ x$1 = "xclean" ]; then
|
if [ x$1 = "xclean" ]; then
|
||||||
@ -103,6 +144,8 @@ if [ x$1 != "x" ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
select_boards
|
||||||
|
|
||||||
echo "wiringPi Build script"
|
echo "wiringPi Build script"
|
||||||
echo "====================="
|
echo "====================="
|
||||||
echo
|
echo
|
||||||
|
|||||||
12
gpio/CPi.h
Normal file
12
gpio/CPi.h
Normal 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
141
gpio/CPi_readall.c
Executable 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;
|
||||||
|
}
|
||||||
|
|
||||||
@ -39,10 +39,24 @@ CFLAGS = $(DEBUG) -Wall -Wextra $(INCLUDE) -Winline -pipe
|
|||||||
LDFLAGS = -L$(DESTDIR)$(PREFIX)/lib
|
LDFLAGS = -L$(DESTDIR)$(PREFIX)/lib
|
||||||
LIBS = -lwiringPi -lwiringPiDev -lpthread -lrt -lm -lcrypt
|
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
|
# 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)
|
OBJ = $(SRC:.c=.o)
|
||||||
|
|
||||||
@ -57,7 +71,7 @@ gpio: $(OBJ)
|
|||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
$Q echo [Compile] $<
|
$Q echo [Compile] $<
|
||||||
$Q $(CC) -c $(CFLAGS) $< -o $@
|
$Q $(CC) -c $(CFLAGS) $(EXTRA_CFLAGS) $< -o $@
|
||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
clean:
|
clean:
|
||||||
|
|||||||
128
gpio/gpio.c
128
gpio/gpio.c
@ -42,6 +42,10 @@
|
|||||||
|
|
||||||
#include "../version.h"
|
#include "../version.h"
|
||||||
|
|
||||||
|
#ifdef CONFIG_CLOCKWORKPI
|
||||||
|
#include "CPi.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
extern int wiringPiDebug ;
|
extern int wiringPiDebug ;
|
||||||
|
|
||||||
// External functions I can't be bothered creating a separate .h file for:
|
// 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]) ;
|
pin = atoi (argv [2]) ;
|
||||||
|
|
||||||
mode = argv [3] ;
|
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) ;
|
/**/ if (strcasecmp (mode, "in") == 0) pinMode (pin, INPUT) ;
|
||||||
else if (strcasecmp (mode, "input") == 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, "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, "alt3") == 0) pinModeAlt (pin, 0b111) ;
|
||||||
else if (strcasecmp (mode, "alt4") == 0) pinModeAlt (pin, 0b011) ;
|
else if (strcasecmp (mode, "alt4") == 0) pinModeAlt (pin, 0b011) ;
|
||||||
else if (strcasecmp (mode, "alt5") == 0) pinModeAlt (pin, 0b010) ;
|
else if (strcasecmp (mode, "alt5") == 0) pinModeAlt (pin, 0b010) ;
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fprintf (stderr, "%s: Invalid mode: %s. Should be in/out/pwm/clock/up/down/tri\n", argv [1], mode) ;
|
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") ;
|
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:
|
* 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]) ;
|
fprintf (stderr, "%s: Must be root to run. Program should be suid root. This is an error.\n", argv [0]) ;
|
||||||
exit (EXIT_FAILURE) ;
|
exit (EXIT_FAILURE) ;
|
||||||
}
|
}
|
||||||
|
#ifndef CONFIG_CLOCKWORKPI
|
||||||
// Initial test for /sys/class/gpio operations:
|
// Initial test for /sys/class/gpio operations:
|
||||||
|
|
||||||
/**/ if (strcasecmp (argv [1], "exports" ) == 0) { doExports (argc, argv) ; return 0 ; }
|
/**/ 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], "gbr" ) == 0) { doGbr (argc, argv) ; return 0 ; }
|
||||||
if (strcasecmp (argv [1], "gbw" ) == 0) { doGbw (argc, argv) ; return 0 ; }
|
if (strcasecmp (argv [1], "gbw" ) == 0) { doGbw (argc, argv) ; return 0 ; }
|
||||||
|
#endif
|
||||||
// Check for allreadall command, force Gpio mode
|
// Check for allreadall command, force Gpio mode
|
||||||
|
|
||||||
if (strcasecmp (argv [1], "allreadall") == 0)
|
if (strcasecmp (argv [1], "allreadall") == 0)
|
||||||
@ -1453,7 +1553,16 @@ int main (int argc, char *argv [])
|
|||||||
--argc ;
|
--argc ;
|
||||||
wpMode = WPI_MODE_UNINITIALISED ;
|
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
|
// Default to wiringPi mode
|
||||||
|
|
||||||
else
|
else
|
||||||
@ -1494,6 +1603,16 @@ int main (int argc, char *argv [])
|
|||||||
exit (EXIT_FAILURE) ;
|
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
|
// Core wiringPi functions
|
||||||
|
|
||||||
/**/ if (strcasecmp (argv [1], "mode" ) == 0) doMode (argc, argv) ;
|
/**/ 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], "rbd" ) == 0) doReadByte (argc, argv, FALSE) ;
|
||||||
else if (strcasecmp (argv [1], "clock" ) == 0) doClock (argc, argv) ;
|
else if (strcasecmp (argv [1], "clock" ) == 0) doClock (argc, argv) ;
|
||||||
else if (strcasecmp (argv [1], "wfi" ) == 0) doWfi (argc, argv) ;
|
else if (strcasecmp (argv [1], "wfi" ) == 0) doWfi (argc, argv) ;
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fprintf (stderr, "%s: Unknown command: %s.\n", argv [0], argv [1]) ;
|
fprintf (stderr, "%s: Unknown command: %s.\n", argv [0], argv [1]) ;
|
||||||
|
|||||||
@ -35,6 +35,10 @@
|
|||||||
|
|
||||||
#include <wiringPi.h>
|
#include <wiringPi.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_CLOCKWORKPI
|
||||||
|
#include "CPi.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
extern int wpMode ;
|
extern int wpMode ;
|
||||||
|
|
||||||
#ifndef TRUE
|
#ifndef TRUE
|
||||||
@ -341,7 +345,9 @@ static void piPlusReadall (int model)
|
|||||||
void doReadall (void)
|
void doReadall (void)
|
||||||
{
|
{
|
||||||
int model, rev, mem, maker, overVolted ;
|
int model, rev, mem, maker, overVolted ;
|
||||||
|
#ifdef CONFIG_CLOCKWORKPI
|
||||||
|
CPiReadAll();
|
||||||
|
#else
|
||||||
if (wiringPiNodes != NULL) // External readall
|
if (wiringPiNodes != NULL) // External readall
|
||||||
{
|
{
|
||||||
doReadallExternal () ;
|
doReadallExternal () ;
|
||||||
@ -362,6 +368,7 @@ void doReadall (void)
|
|||||||
allReadall () ;
|
allReadall () ;
|
||||||
else
|
else
|
||||||
printf ("Oops - unable to determine board type... model: %d\n", model) ;
|
printf ("Oops - unable to determine board type... model: %d\n", model) ;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -44,6 +44,20 @@ CFLAGS = $(DEBUG) $(DEFS) -Wformat=2 -Wall -Wextra -Winline $(INCLUDE) -pipe -fP
|
|||||||
|
|
||||||
LIBS = -lm -lpthread -lrt -lcrypt
|
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 \
|
SRC = wiringPi.c \
|
||||||
@ -61,7 +75,8 @@ SRC = wiringPi.c \
|
|||||||
bmp180.c htu21d.c ds18b20.c rht03.c \
|
bmp180.c htu21d.c ds18b20.c rht03.c \
|
||||||
drcSerial.c drcNet.c \
|
drcSerial.c drcNet.c \
|
||||||
pseudoPins.c \
|
pseudoPins.c \
|
||||||
wpiExtensions.c
|
wpiExtensions.c \
|
||||||
|
wiringCPi.c
|
||||||
|
|
||||||
HEADERS = $(shell ls *.h)
|
HEADERS = $(shell ls *.h)
|
||||||
|
|
||||||
@ -79,7 +94,7 @@ $(DYNAMIC): $(OBJ)
|
|||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
$Q echo [Compile] $<
|
$Q echo [Compile] $<
|
||||||
$Q $(CC) -c $(CFLAGS) $< -o $@
|
$Q $(CC) -c $(EXTRA_CFLAGS) $(CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
|
|||||||
632
wiringPi/wiringCPi.c
Executable file
632
wiringPi/wiringCPi.c
Executable file
@ -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
wiringPi/wiringCPi.h
Executable file
44
wiringPi/wiringCPi.h
Executable file
@ -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
|
||||||
@ -77,6 +77,10 @@
|
|||||||
#include "wiringPi.h"
|
#include "wiringPi.h"
|
||||||
#include "../version.h"
|
#include "../version.h"
|
||||||
|
|
||||||
|
#ifdef CONFIG_CLOCKWORKPI
|
||||||
|
#include "wiringCPi.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
// Environment Variables
|
// Environment Variables
|
||||||
|
|
||||||
#define ENV_DEBUG "WIRINGPI_DEBUG"
|
#define ENV_DEBUG "WIRINGPI_DEBUG"
|
||||||
@ -237,9 +241,15 @@ const char *piModelNames [20] =
|
|||||||
"Pi 3A+", // 14
|
"Pi 3A+", // 14
|
||||||
"Unknown15", // 15
|
"Unknown15", // 15
|
||||||
"CM3+", // 16
|
"CM3+", // 16
|
||||||
"Unknown17", // 17
|
#ifdef CONFIG_CLOCKWORKPI
|
||||||
"Unknown18", // 18
|
"CPi A04", // 17
|
||||||
"Unknown19", // 19
|
"CPi A06", // 18
|
||||||
|
"Unknown", // 19
|
||||||
|
#else
|
||||||
|
"Unknown17", // 17
|
||||||
|
"Unknown18", // 18
|
||||||
|
"Unknown19", // 19
|
||||||
|
#endif
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
const char *piRevisionNames [16] =
|
const char *piRevisionNames [16] =
|
||||||
@ -287,8 +297,8 @@ const int piMemorySize [8] =
|
|||||||
256, // 0
|
256, // 0
|
||||||
512, // 1
|
512, // 1
|
||||||
1024, // 2
|
1024, // 2
|
||||||
0, // 3
|
2048, // 3
|
||||||
0, // 4
|
4096, // 4
|
||||||
0, // 5
|
0, // 5
|
||||||
0, // 6
|
0, // 6
|
||||||
0, // 7
|
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, "Oops: Unable to determine board revision from /proc/cpuinfo\n") ;
|
||||||
fprintf (stderr, " -> %s\n", why) ;
|
fprintf (stderr, " -> %s\n", why) ;
|
||||||
@ -755,6 +765,12 @@ int piGpioLayout (void)
|
|||||||
if (strncmp (line, "Hardware", 8) == 0)
|
if (strncmp (line, "Hardware", 8) == 0)
|
||||||
break ;
|
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)
|
if (strncmp (line, "Hardware", 8) != 0)
|
||||||
piGpioLayoutOops ("No \"Hardware\" line") ;
|
piGpioLayoutOops ("No \"Hardware\" line") ;
|
||||||
|
|
||||||
@ -811,6 +827,10 @@ int piGpioLayout (void)
|
|||||||
|
|
||||||
fclose (cpuFd) ;
|
fclose (cpuFd) ;
|
||||||
|
|
||||||
|
#ifdef CONFIG_CLOCKWORKPI
|
||||||
|
strcpy(line, "Revision : 0000");
|
||||||
|
#endif
|
||||||
|
|
||||||
if (strncmp (line, "Revision", 8) != 0)
|
if (strncmp (line, "Revision", 8) != 0)
|
||||||
piGpioLayoutOops ("No \"Revision\" line") ;
|
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...
|
// Will deal with the properly later on - for now, lets just get it going...
|
||||||
// unsigned int modelNum ;
|
// 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.
|
(void)piGpioLayout () ; // Call this first to make sure all's OK. Don't care about the result.
|
||||||
|
|
||||||
if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL)
|
if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL)
|
||||||
@ -1420,6 +1445,11 @@ void pinMode (int pin, int mode)
|
|||||||
|
|
||||||
setupCheck ("pinMode") ;
|
setupCheck ("pinMode") ;
|
||||||
|
|
||||||
|
#ifdef CONFIG_CLOCKWORKPI
|
||||||
|
CPiPinMode(pin, mode);
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
if ((pin & PI_GPIO_MASK) == 0) // On-board pin
|
if ((pin & PI_GPIO_MASK) == 0) // On-board pin
|
||||||
{
|
{
|
||||||
/**/ if (wiringPiMode == WPI_MODE_PINS)
|
/**/ if (wiringPiMode == WPI_MODE_PINS)
|
||||||
@ -1534,6 +1564,10 @@ int digitalRead (int pin)
|
|||||||
char c ;
|
char c ;
|
||||||
struct wiringPiNodeStruct *node = wiringPiNodes ;
|
struct wiringPiNodeStruct *node = wiringPiNodes ;
|
||||||
|
|
||||||
|
#ifdef CONFIG_CLOCKWORKPI
|
||||||
|
return CPiDigitalRead(pin);
|
||||||
|
#endif
|
||||||
|
|
||||||
if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin
|
if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin
|
||||||
{
|
{
|
||||||
/**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode
|
/**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode
|
||||||
@ -1597,6 +1631,11 @@ void digitalWrite (int pin, int value)
|
|||||||
{
|
{
|
||||||
struct wiringPiNodeStruct *node = wiringPiNodes ;
|
struct wiringPiNodeStruct *node = wiringPiNodes ;
|
||||||
|
|
||||||
|
#ifdef CONFIG_CLOCKWORKPI
|
||||||
|
CPiDigitalWrite(pin, value);
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin
|
if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin
|
||||||
{
|
{
|
||||||
/**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode
|
/**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode
|
||||||
@ -2294,6 +2333,9 @@ int wiringPiSetup (void)
|
|||||||
" Try running with sudo?\n", strerror (errno)) ;
|
" Try running with sudo?\n", strerror (errno)) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_CLOCKWORKPI
|
||||||
|
CPiSetup(fd);
|
||||||
|
#else
|
||||||
// Set the offsets into the memory interface.
|
// Set the offsets into the memory interface.
|
||||||
|
|
||||||
GPIO_PADS = piGpioBase + 0x00100000 ;
|
GPIO_PADS = piGpioBase + 0x00100000 ;
|
||||||
@ -2349,6 +2391,7 @@ int wiringPiSetup (void)
|
|||||||
_wiringPiClk = clk ;
|
_wiringPiClk = clk ;
|
||||||
_wiringPiPads = pads ;
|
_wiringPiPads = pads ;
|
||||||
_wiringPiTimer = timer ;
|
_wiringPiTimer = timer ;
|
||||||
|
#endif
|
||||||
|
|
||||||
initialiseEpoch () ;
|
initialiseEpoch () ;
|
||||||
|
|
||||||
@ -2377,6 +2420,19 @@ int wiringPiSetupGpio (void)
|
|||||||
return 0 ;
|
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:
|
* wiringPiSetupPhys:
|
||||||
|
|||||||
@ -44,6 +44,10 @@
|
|||||||
|
|
||||||
// Handy defines
|
// Handy defines
|
||||||
|
|
||||||
|
#ifdef CONFIG_CLOCKWORKPI
|
||||||
|
extern int wiringPiDebug;
|
||||||
|
#endif
|
||||||
|
|
||||||
// wiringPi modes
|
// wiringPi modes
|
||||||
|
|
||||||
#define WPI_MODE_PINS 0
|
#define WPI_MODE_PINS 0
|
||||||
@ -102,7 +106,10 @@
|
|||||||
#define PI_MODEL_3BP 13
|
#define PI_MODEL_3BP 13
|
||||||
#define PI_MODEL_3AP 14
|
#define PI_MODEL_3AP 14
|
||||||
#define PI_MODEL_CM3P 16
|
#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 0
|
||||||
#define PI_VERSION_1_1 1
|
#define PI_VERSION_1_1 1
|
||||||
#define PI_VERSION_1_2 2
|
#define PI_VERSION_1_2 2
|
||||||
@ -187,6 +194,10 @@ extern "C" {
|
|||||||
|
|
||||||
// Internal
|
// Internal
|
||||||
|
|
||||||
|
#ifdef CONFIG_CLOCKWORKPI
|
||||||
|
extern void piGpioLayoutOops (const char *why);
|
||||||
|
#endif
|
||||||
|
|
||||||
extern int wiringPiFailure (int fatal, const char *message, ...) ;
|
extern int wiringPiFailure (int fatal, const char *message, ...) ;
|
||||||
|
|
||||||
// Core wiringPi functions
|
// Core wiringPi functions
|
||||||
|
|||||||
@ -109,7 +109,11 @@ int wiringPiSPISetupMode (int channel, int speed, int mode)
|
|||||||
// Channel can be anything - lets hope for the best
|
// Channel can be anything - lets hope for the best
|
||||||
// channel &= 1 ; // Channel is 0 or 1
|
// channel &= 1 ; // Channel is 0 or 1
|
||||||
|
|
||||||
|
#ifdef CONFIG_CLOCKWORKPI
|
||||||
|
snprintf (spiDev, 31, "/dev/spidev2.%d", channel) ;
|
||||||
|
#else
|
||||||
snprintf (spiDev, 31, "/dev/spidev0.%d", channel) ;
|
snprintf (spiDev, 31, "/dev/spidev0.%d", channel) ;
|
||||||
|
#endif
|
||||||
|
|
||||||
if ((fd = open (spiDev, O_RDWR)) < 0)
|
if ((fd = open (spiDev, O_RDWR)) < 0)
|
||||||
return wiringPiFailure (WPI_ALMOST, "Unable to open SPI device: %s\n", strerror (errno)) ;
|
return wiringPiFailure (WPI_ALMOST, "Unable to open SPI device: %s\n", strerror (errno)) ;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user