add support for NanoPi NEO Core, NEO Core2 and K1 Plus

This commit is contained in:
Lawrence-Tang 2018-06-07 15:50:20 +08:00
parent 30edaf15cd
commit 4d22e3fd65
8 changed files with 728 additions and 277 deletions

View File

@ -3,13 +3,16 @@ This is a GPIO access library for NanoPi. It is based on the WiringOP for Orange
Currently supported boards: Currently supported boards:
NanoPi Neo NanoPi Neo
NanoPi Neo Air NanoPi Neo Air
NanoPi Duo NanoPi Duo
NanoPi NEO2 NanoPi NEO2
NanoPi NEO Plus2 NanoPi NEO Plus2
NanoPi M1 NanoPi M1
NanoPi M1 Plus NanoPi M1 Plus
NanoPi NEO Core
NanoPi NEO Core2
NanoPi K1 Plus
# Installation # Installation
## Install WiringNP ## Install WiringNP
@ -26,34 +29,63 @@ The WiringNP library contains a set of gpio commands. Users can use them to acce
``` ```
gpio readall gpio readall
``` ```
If your installation is successful the following messages will show up. Here is the message list for NEO2: If your installation is successful the following messages will show up. Here is the message list for NanoPi NEO Core:
``` ```
root@FriendlyARM:~# gpio readall root@FriendlyARM:~# gpio readall
+-----+-----+----------+------+---+-NanoPi NEO/NEO2--+------+----------+-----+-----+ +-----+-----+----------+------+---+-NanoPi-NEO-Core--+------+----------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+ +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
| | | 3.3V | | | 1 || 2 | | | 5V | | | | | | 3.3v | | | 1 || 2 | | | 5v | | |
| 12 | 8 | GPIOA12 | OFF | 0 | 3 || 4 | | | 5V | | | | 12 | 8 | GPIOA12 | ALT5 | 0 | 3 || 4 | | | 5v | | |
| 11 | 9 | GPIOA11 | OFF | 0 | 5 || 6 | | | 0v | | | | 11 | 9 | GPIOA11 | ALT5 | 0 | 5 || 6 | | | 0v | | |
| 203 | 7 | GPIOG11 | OUT | 1 | 7 || 8 | 0 | OFF | GPIOG6 | 15 | 198 | | 203 | 7 | GPIOG11 | OUT | 1 | 7 || 8 | 0 | ALT5 | GPIOG6 | 15 | 198 |
| | | 0v | | | 9 || 10 | 0 | OFF | GPIOG7 | 16 | 199 | | | | 0v | | | 9 || 10 | 0 | ALT5 | GPIOG7 | 16 | 199 |
| 0 | 0 | GPIOA0 | OFF | 0 | 11 || 12 | 0 | OFF | GPIOA6 | 1 | 6 | | 0 | 0 | GPIOA0 | OUT | 0 | 11 || 12 | 1 | OUT | GPIOA6 | 1 | 6 |
| 2 | 2 | GPIOA2 | OFF | 0 | 13 || 14 | | | 0v | | | | 2 | 2 | GPIOA2 | OFF | 0 | 13 || 14 | | | 0v | | |
| 3 | 3 | GPIOA3 | OFF | 0 | 15 || 16 | 0 | OFF | GPIOG8 | 4 | 200 | | 3 | 3 | GPIOA3 | OFF | 0 | 15 || 16 | 0 | OFF | GPIOG8 | 4 | 200 |
| | | 3.3v | | | 17 || 18 | 0 | OFF | GPIOG9 | 5 | 201 | | | | 3.3v | | | 17 || 18 | 0 | ALT2 | GPIOG9 | 5 | 201 |
| 64 | 12 | GPIOC0 | OFF | 0 | 19 || 20 | | | 0v | | | | 64 | 12 | GPIOC0 | ALT4 | 0 | 19 || 20 | | | 0v | | |
| 65 | 13 | GPIOC1 | OFF | 0 | 21 || 22 | 0 | OFF | GPIOA1 | 6 | 1 | | 65 | 13 | GPIOC1 | ALT4 | 0 | 21 || 22 | 1 | OUT | GPIOA1 | 6 | 1 |
| 66 | 14 | GPIOC2 | OFF | 0 | 23 || 24 | 0 | OFF | GPIOC3 | 10 | 67 | | 66 | 14 | GPIOC2 | ALT4 | 0 | 23 || 24 | 1 | OUT | GPIOC3 | 10 | 67 |
+-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+ +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+----------+------+---+-NanoPi NEO/NEO2--+------+----------+-----+-----+ +-----+-----+----------+------+---+-NanoPi-NEO-Core--+------+----------+-----+-----+
+-----+----NanoPi NEO/NEO2 Debug UART-+----+ +-----+-----+----------+---- NanoPi-NEO-Core USB/Audio ----+----------+-----+-----+
| BCM | wPi | Name | Mode | V | Ph | | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+----------+------+---+----+ +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
| 4 | 17 | GPIOA4 | ALT5 | 0 | 37 | | | | 5v | | | 25 || 26 | 0 | ALT4 | GPIOA15 | 22 | 15 |
| 5 | 18 | GPIOA5 | ALT4 | 0 | 38 | | | | USB1 | | | 27 || 28 | 0 | ALT4 | GPIOA16 | 23 | 16 |
+-----+-----+----------+------+---+----+ | | | USB1 | | | 29 || 30 | 0 | ALT4 | GPIOA14 | 21 | 14 |
| | | USB2 | | | 31 || 32 | 0 | ALT4 | GPIOA13 | 20 | 13 |
| | | USB2 | | | 33 || 34 | | | Mic | | |
| | | IR | | | 35 || 36 | | | Mic | | |
| 17 | 19 | GPIOA17 | OFF | 0 | 37 || 38 | | | Audio | | |
| | | I2S | | | 39 || 40 | | | Audio | | |
| | | I2S | | | 41 || 42 | 0 | ALT5 | GPIOA5 | 18 | 5 |
| | | I2S | | | 43 || 44 | 0 | ALT5 | GPIOA4 | 17 | 4 |
| | | I2S | | | 45 || 46 | | | 5V | | |
| | | 0v | | | 47 || 48 | | | 0v | | |
+-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+----------+------+---+-NanoPi-NEO-Core--+------+----------+-----+-----+
+-----+-----+----------+---- NanoPi-NEO-Core Network ----+----------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
| | | Eth | | | 49 || 50 | | | Eth | | |
| | | Eth | | | 51 || 52 | | | Eth | | |
| | | Eth | | | 53 || 54 | | | Eth | | |
| | | NC | | | 55 || 56 | | | NC | | |
| | | NC | | | 57 || 58 | | | NC | | |
| | | 0v | | | 59 || 60 | | | 0v | | |
| | | USB3 | | | 61 || 62 | 0 | OFF | GPIOA7 | 24 | 7 |
| | | USB3 | | | 63 || 64 | | | GPIOE12 | | |
| | | 5v | | | 65 || 66 | | | GPIOE13 | | |
| | | 5v | | | 67 || 68 | | | 3.3v | | |
+-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+----------+------+---+-NanoPi-NEO-Core--+------+----------+-----+-----+
``` ```
# Code Sample with WiringNP # Code Sample with WiringNP
connect a LED module to a NanoPi (Pin7), Make a C source file: connect a LED module to a NanoPi (Pin7), Make a C source file:

View File

@ -1133,10 +1133,8 @@ int main (int argc, char *argv [])
int boardId; int boardId;
boardId = getBoardType(&retBoardInfo); boardId = getBoardType(&retBoardInfo);
if (boardId >= 0) { if (boardId >= 0) {
if (boardId > ALLWINNER_BASE && boardId <= ALLWINNER_MAX if (boardId > ALLWINNER_BASE && boardId <= ALLWINNER_MAX
&& boardId != NanoPi_A64 && boardId != NanoPi_A64) {
&& boardId != NanoPi_NEO_Core) {
printf ("NanoPi Details:\n") ; printf ("NanoPi Details:\n") ;
printf (" Type: %s, Revision: %d, Maker: FriednlyELEC\n\n", printf (" Type: %s, Revision: %d, Maker: FriednlyELEC\n\n",
retBoardInfo->boardDisplayName, retBoardInfo->kernelRevision) ; retBoardInfo->boardDisplayName, retBoardInfo->kernelRevision) ;

View File

@ -80,8 +80,9 @@ static char *alts [] =
"IN", "OUT", "ALT5", "ALT4", "ALT0", "ALT1", "ALT2", "OFF" "IN", "OUT", "ALT5", "ALT4", "ALT0", "ALT1", "ALT2", "OFF"
} ; } ;
#define MAX_PIN_COUNT 74
static int physToWpi_m1 [64] = static int physToWpi_m1 [MAX_PIN_COUNT] =
{ {
-1, // 0 -1, // 0
-1, -1, // 1, 2 -1, -1, // 1, 2
@ -104,12 +105,15 @@ static int physToWpi_m1 [64] =
24, 27, //35, 36 24, 27, //35, 36
25, 28, //37, 38 25, 28, //37, 38
-1, 29, //39, 40 -1, 29, //39, 40
-1, -1, 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //41-> 55 -1, -1, 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //41-> 55
-1, -1, -1, -1, -1, -1, -1, -1 // 56-> 63 -1, -1, -1, -1, -1, -1, -1, -1 // 56-> 63
/* 64~73 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
} ; } ;
static char *physNames_m1 [64] = static char *physNames_m1 [MAX_PIN_COUNT] =
{ {
NULL, NULL,
@ -132,23 +136,27 @@ static char *physNames_m1 [64] =
" GPIO.23", "0v ", " GPIO.23", "0v ",
" GPIO.24", "CTS1 ", " GPIO.24", "CTS1 ",
" GPIO.25", "TxD1 ", " GPIO.25", "TxD1 ",
" 0v", "RxD1 ", " 0v", "RxD1 ", //39, 40
" 0v", " 5v", " 0v", " 5v",
" GPIO.4", " GPIO.5", " GPIO.4", " GPIO.5",
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, //49, 50
"GPIO.17", "GPIO.18", "GPIO.17", "GPIO.18",
"GPIO.19", "GPIO.20", "GPIO.19", "GPIO.20",
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, //55 ~ 63
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, //64 ~ 73
} ; } ;
static int physToWpi_neo [64] = static int physToWpi_neo [MAX_PIN_COUNT] =
{ {
-1, // 0 -1, // 0
/* 24pins */
-1, -1, // 1, 2 -1, -1, // 1, 2
8, -1, // 3, 4 8, -1, // 3, 4
9, -1, // 5, 6 9, -1, // 5, 6
@ -162,26 +170,28 @@ static int physToWpi_neo [64] =
13, 6, //21, 22 13, 6, //21, 22
14, 10, //23, 24 14, 10, //23, 24
-1, -1, //25, 26 /* 12pins */
-1, -1, //27, 28 -1, -1, //25, 26 -> 1, 2
-1, -1, //29, 30 -1, -1, //27, 28 -> 3, 4
-1, -1, //31, 32 -1, -1, //29, 30 -> 5, 6 "GPIOL11 "
-1, -1, //33, 34 19, -1, //31, 32 -> 7, 8
-1, -1, //35, 36 -1, -1, //33, 34 -> 9, 10
-1, -1, //35, 36 -> 11, 12
17, 18, //37, 38 17, 18, //37, 38
/* 39~63 */ /* 39~63 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
} ;
//guenter ende
//guenter orange pi /* 64~73 */
static char *physNames_neo [64] = -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
} ;
static char *physNames_neo [MAX_PIN_COUNT] =
{ {
NULL, NULL,
/* 24 Pin */ /* 24 Pin */
" 3.3V", "5V ", " 3.3V", "5V ",
" GPIOA12", "5V ", " GPIOA12", "5V ",
" GPIOA11", "0v ", " GPIOA11", "0v ",
@ -195,16 +205,21 @@ static char *physNames_neo [64] =
" GPIOC1", "GPIOA1 ", " GPIOC1", "GPIOA1 ",
" GPIOC2", "GPIOC3 ", " GPIOC2", "GPIOC3 ",
/* 12 Pin */ /* 12 Pin */
NULL, NULL, " 5V", " USB-DP1", //25, 26 -> 1, 2
NULL, NULL, " USB-DM1", " USB-DP2", //27, 28 -> 3, 4
NULL, NULL, " USB-DM2", " IR-RX", //29, 30 -> 5, 6 "GPIOL11 "
NULL, NULL, " GPIOA17", " PCM/I2C", //31, 32 -> 7, 8
NULL, NULL, " PCM/I2C", " PCM/I2C", //33, 34 -> 9, 10
NULL, NULL, " PCM/I2C", " 0V", //35, 36 -> 11, 12
/* UART0, tx, rx */ /* UART0, tx, rx */
" GPIOA4", " GPIOA5", " GPIOA4", " GPIOA5",
NULL, NULL,
NULL, NULL,
NULL, NULL,
NULL, NULL,
NULL, NULL, //47, 48
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
@ -213,15 +228,17 @@ static char *physNames_neo [64] =
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, //63
//64 ~ 73
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL
} ; } ;
static int physToWpi_duo [64] = static int physToWpi_duo [MAX_PIN_COUNT] =
{ {
-1, // 0 -1, // 0
-1, -1, // 1, 2 -1, -1, // 1, 2
@ -250,9 +267,12 @@ static int physToWpi_duo [64] =
/* 39~63 */ /* 39~63 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
/* 64~73 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
} ; } ;
static char *physNames_duo [64] = static char *physNames_duo [MAX_PIN_COUNT] =
{ {
NULL, NULL,
/* 32 Pin */ /* 32 Pin */
@ -268,11 +288,11 @@ static char *physNames_duo [64] =
" GPIOA14", "USB-DM3 ", " GPIOA14", "USB-DM3 ",
" GPIOA13", "GPIOG11 ", " GPIOA13", "GPIOG11 ",
" GPIOA12", "IR-RX ", " GPIOA12", "IR-RX ",
" GPIOA11", "0v ", //25, 26 " GPIOA11", "0v ", //25, 26
" 0v", "3.3v ", " 0v", "3.3v ",
" GPIOA4", "5v ", " GPIOA4", "5v ",
" GPIOA5", "5v ", " GPIOA5", "5v ",
/* ---------nanopi duo end----------- */ /* ---------nanopi duo end----------- */
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
@ -280,22 +300,124 @@ static char *physNames_duo [64] =
/* UART0, tx, rx */ /* UART0, tx, rx */
NULL, NULL, NULL, NULL,
NULL, NULL, //39, 40
NULL, NULL,
NULL, NULL,
NULL, NULL,
NULL, NULL,
NULL, NULL, //49, 50
NULL, NULL,
NULL, NULL,
NULL, NULL,
NULL, NULL,
NULL, NULL, //59, 60
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, //71, 72
NULL, NULL, NULL //73
NULL, NULL,
NULL, NULL,
NULL, NULL,
NULL, NULL,
NULL, NULL,
NULL
} ; } ;
static int physToWpi_neocore [MAX_PIN_COUNT] =
{
/* GPIO-1 24Pin */
-1, // 0
-1, -1, // 1, 2 -> 1, 2
8, -1, // 3, 4 -> 3, 4
9, -1, // 5, 6 -> 5, 6
7, 15, // 7, 8 -> 7, 8
-1, 16, // 9, 10 -> 9, 10
0, 1, //11, 12 -> 11, 12
2, -1, //13, 14 -> 13, 14
3, 4, //15, 16 -> 15, 16
-1, 5, //17, 18 -> 17, 18
12, -1, //19, 20 -> 19, 20
13, 6, //21, 22 -> 21, 22
14, 10, //23, 24 -> 23, 24
/* GPIO-2 24Pin */
-1, 22, //25, 26 -> 1, 2
-1, 23, //27, 28 -> 3, 4
-1, 21, //29, 30 -> 5, 6
-1, 20, //31, 32 -> 7, 8
-1, -1, //33, 34 -> 9, 10
-1, -1, //35, 36 -> 11, 12
19, -1, //37, 38 -> 13, 14
-1, -1, //39, 40 -> 15, 16
-1, 18, //41, 42 -> 17, 18
-1, 17, //43, 44 -> 19, 20
-1, -1, //45, 46 -> 21, 22
-1, -1, //47, 48 -> 23, 24
/* GPIO-3 24Pin */
-1, -1, //49, 50 -> 1, 2
-1, -1, //51, 52 -> 3, 4
-1, -1, //53, 54 -> 5, 6
-1, -1, //55, 56 -> 7, 8
-1, -1, //57, 58 -> 9, 10
-1, -1, //59, 60 -> 11, 12
-1, 24, //61, 62 -> 13, 14
-1, -1, //63, 64 -> 15, 16
-1, -1, //65, 66 -> 17, 18
-1, -1, //67, 68 -> 19, 20
-1, -1, //69, 70 -> 21, 22
-1, -1, //71, 72 -> 23, 24
-1, //73
} ;
static char *physNames_neocore [MAX_PIN_COUNT] =
{
NULL, // 0
/* GPIO-1 24Pin */
" 3.3v", "5v ", // 1, 2 -> 1, 2
" GPIOA12", "5v ", // 3, 4 -> 3, 4
" GPIOA11", "0v ", // 5, 6 -> 5, 6
" GPIOG11", "GPIOG6 ", // 7, 8 -> 7, 8
" 0v", "GPIOG7 ", // 9, 10 -> 9, 10
" GPIOA0", "GPIOA6 ", //11, 12 -> 11, 12
" GPIOA2", "0v ", //13, 14 -> 13, 14
" GPIOA3", "GPIOG8 ", //15, 16 -> 15, 16
" 3.3v", "GPIOG9 ", //17, 18 -> 17, 18
" GPIOC0", "0v ", //19, 20 -> 19, 20
" GPIOC1", "GPIOA1 ", //21, 22 -> 21, 22
" GPIOC2", "GPIOC3 ", //23, 24 -> 23, 24
/* GPIO-2 24Pin */
" 5v", "GPIOA15 ", //25, 26 -> 1, 2
" USB1", "GPIOA16 ", //27, 28 -> 3, 4
" USB1", "GPIOA14 ", //29, 30 -> 5, 6
" USB2", "GPIOA13 ", //31, 32 -> 7, 8
" USB2", "Mic ", //33, 34 -> 9, 10
" IR", "Mic ", //35, 36 -> 11, 12 " GPIOL11"
" GPIOA17", "Audio ", //37, 38 -> 13, 14
" I2S", "Audio ", //39, 40 -> 15, 16
" I2S", "GPIOA5 ", //41, 42 -> 17, 18
" I2S", "GPIOA4 ", //43, 44 -> 19, 20
" I2S", "5V ", //45, 46 -> 21, 22
" 0v", "0v ", //47, 48 -> 23, 24
/* GPIO-3 20Pin */
" Eth", "Eth ", //49, 50 -> 1, 2
" Eth", "Eth ", //51, 52 -> 3, 4
" Eth", "Eth ", //53, 54 -> 5, 6
" NC", "NC ", //55, 56 -> 7, 8
" NC", "NC ", //57, 58 -> 9, 10
" 0v", "0v ", //59, 60 -> 11, 12
" USB3", "GPIOA7 ", //61, 62 -> 13, 14
" USB3", "GPIOE12 ", //63, 64 -> 15, 16
" 5v", "GPIOE13 ", //65, 66 -> 17, 18
" 5v", "3.3v ", //67, 68 -> 19, 20
NULL, NULL, //69, 70 -> 21, 22
NULL, NULL, //71, 72 -> 23, 24
NULL, //73
} ;
/* /*
* readallPhys: * readallPhys:
* Given a physical pin output the data on it and the next pin: * Given a physical pin output the data on it and the next pin:
@ -309,7 +431,7 @@ static void readallPhys (int boardId, int physPin, int pair)
int *physToWpi; int *physToWpi;
char **physNames; char **physNames;
if (boardId == NanoPi_M1 || boardId == NanoPi_M1_Plus || boardId == NanoPi_M1_Plus2) { if (boardId == NanoPi_M1 || boardId == NanoPi_K1_Plus || boardId == NanoPi_M1_Plus || boardId == NanoPi_M1_Plus2) {
physToWpi = physToWpi_m1; physToWpi = physToWpi_m1;
physNames = physNames_m1; physNames = physNames_m1;
} else if (boardId == NanoPi_NEO || boardId == NanoPi_NEO_Air || boardId == NanoPi_NEO2 || boardId == NanoPi_NEO_Plus2) { } else if (boardId == NanoPi_NEO || boardId == NanoPi_NEO_Air || boardId == NanoPi_NEO2 || boardId == NanoPi_NEO_Plus2) {
@ -318,6 +440,9 @@ static void readallPhys (int boardId, int physPin, int pair)
} else if (boardId == NanoPi_Duo) { } else if (boardId == NanoPi_Duo) {
physToWpi = physToWpi_duo; physToWpi = physToWpi_duo;
physNames = physNames_duo; physNames = physNames_duo;
} else if (boardId == NanoPi_NEO_Core || boardId == NanoPi_NEO_Core2) {
physToWpi = physToWpi_neocore;
physNames = physNames_neocore;
} else { } else {
return ; return ;
} }
@ -391,8 +516,6 @@ static void readallPhys (int boardId, int physPin, int pair)
printf (" |\n") ; printf (" |\n") ;
} }
//guenter
void NanoPiReadAll() void NanoPiReadAll()
{ {
int pin ; int pin ;
@ -401,8 +524,7 @@ void NanoPiReadAll()
boardId = getBoardType(&retBoardInfo); boardId = getBoardType(&retBoardInfo);
if (boardId >= 0) { if (boardId >= 0) {
if (boardId > ALLWINNER_BASE && boardId <= ALLWINNER_MAX if (boardId > ALLWINNER_BASE && boardId <= ALLWINNER_MAX
&& boardId != NanoPi_A64 && boardId != NanoPi_A64) {
&& boardId != NanoPi_NEO_Core) {
// nothing to do. // nothing to do.
} else { } else {
printf ("This NanoPi model is currently not supported. ") ; printf ("This NanoPi model is currently not supported. ") ;
@ -416,9 +538,15 @@ void NanoPiReadAll()
} }
int pinCount; int pinCount;
if (boardId == NanoPi_M1 || boardId == NanoPi_M1_Plus || boardId == NanoPi_M1_Plus2) { if (boardId == NanoPi_M1 || boardId == NanoPi_K1_Plus || boardId == NanoPi_M1_Plus || boardId == NanoPi_M1_Plus2) {
pinCount = 40; pinCount = 40;
} else if (boardId == NanoPi_NEO || boardId == NanoPi_NEO_Air || boardId == NanoPi_NEO2 || boardId == NanoPi_NEO_Plus2) { } else if (boardId == NanoPi_NEO
|| boardId == NanoPi_NEO_Air
|| boardId == NanoPi_NEO2
|| boardId == NanoPi_NEO_Plus2
|| boardId == NanoPi_NEO_Core
|| boardId == NanoPi_NEO_Core2
) {
pinCount = 24; pinCount = 24;
} else if (boardId == NanoPi_Duo) { } else if (boardId == NanoPi_Duo) {
pinCount = 32; pinCount = 32;
@ -426,7 +554,7 @@ void NanoPiReadAll()
return ; return ;
} }
/* Print 1 ~ 24/40 pins */
printf (" +-----+-----+----------+------+---+-%s--+------+----------+-----+-----+\n", retBoardInfo->boardDisplayName) ; printf (" +-----+-----+----------+------+---+-%s--+------+----------+-----+-----+\n", retBoardInfo->boardDisplayName) ;
printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ; printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ;
printf (" +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+\n") ; printf (" +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+\n") ;
@ -437,8 +565,45 @@ void NanoPiReadAll()
printf (" +-----+-----+----------+------+---+-%s--+------+----------+-----+-----+\n", retBoardInfo->boardDisplayName) ; printf (" +-----+-----+----------+------+---+-%s--+------+----------+-----+-----+\n", retBoardInfo->boardDisplayName) ;
printf ("\n"); printf ("\n");
/* Print Second 1 ~ 12/24 pins */
if (boardId == NanoPi_M1 || boardId == NanoPi_K1_Plus || boardId == NanoPi_M1_Plus || boardId == NanoPi_M1_Plus2) {
// nothing to do.
} else if (boardId == NanoPi_NEO || boardId == NanoPi_NEO_Air || boardId == NanoPi_NEO2 || boardId == NanoPi_NEO_Plus2) {
printf (" +-----+----%s USB/Audio-+----+\n", retBoardInfo->boardDisplayName) ;
printf (" | BCM | wPi | Name | Mode | V | Ph |\n") ;
printf (" +-----+-----+----------+------+---+----+\n") ;
for (pin = 25 ; pin <= 36 ; pin++) {
readallPhys (boardId, pin, 0) ;
}
printf (" +-----+-----+----------+------+---+----+\n") ;
printf ("\n");
} else if (boardId == NanoPi_Duo || boardId == NanoPi_NEO_Core || boardId == NanoPi_NEO_Core2) {
// nothing to do.
}
if (boardId == NanoPi_M1 || boardId == NanoPi_M1_Plus || boardId == NanoPi_M1_Plus2) { if (boardId == NanoPi_NEO_Core || boardId == NanoPi_NEO_Core2) {
printf (" +-----+-----+----------+---- %s USB/Audio ----+----------+-----+-----+\n", retBoardInfo->boardDisplayName) ;
printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ;
printf (" +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+\n") ;
for (pin = 25 ; pin <= 48 ; pin += 2)
readallPhys (boardId, pin, 1) ;
printf (" +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+\n") ;
printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ;
printf (" +-----+-----+----------+------+---+-%s--+------+----------+-----+-----+\n", retBoardInfo->boardDisplayName) ;
printf ("\n");
printf (" +-----+-----+----------+---- %s Network ----+----------+-----+-----+\n", retBoardInfo->boardDisplayName) ;
printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ;
printf (" +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+\n") ;
for (pin = 49 ; pin <= 68 ; pin += 2)
readallPhys (boardId, pin, 1) ;
printf (" +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+\n") ;
printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ;
printf (" +-----+-----+----------+------+---+-%s--+------+----------+-----+-----+\n", retBoardInfo->boardDisplayName) ;
printf ("\n");
}
if (boardId == NanoPi_M1 || boardId == NanoPi_K1_Plus || boardId == NanoPi_M1_Plus || boardId == NanoPi_M1_Plus2) {
printf (" +-----+----%s Debug UART-+----+\n", retBoardInfo->boardDisplayName) ; printf (" +-----+----%s Debug UART-+----+\n", retBoardInfo->boardDisplayName) ;
printf (" | BCM | wPi | Name | Mode | V | Ph |\n") ; printf (" | BCM | wPi | Name | Mode | V | Ph |\n") ;
printf (" +-----+-----+----------+------+---+----+\n") ; printf (" +-----+-----+----------+------+---+----+\n") ;
@ -446,6 +611,7 @@ void NanoPiReadAll()
readallPhys (boardId, pin, 0) ; readallPhys (boardId, pin, 0) ;
} }
printf (" +-----+-----+----------+------+---+----+\n") ; printf (" +-----+-----+----------+------+---+----+\n") ;
printf ("\n");
} else if (boardId == NanoPi_NEO || boardId == NanoPi_NEO_Air || boardId == NanoPi_NEO2 || boardId == NanoPi_NEO_Plus2) { } else if (boardId == NanoPi_NEO || boardId == NanoPi_NEO_Air || boardId == NanoPi_NEO2 || boardId == NanoPi_NEO_Plus2) {
printf (" +-----+----%s Debug UART-+----+\n", retBoardInfo->boardDisplayName) ; printf (" +-----+----%s Debug UART-+----+\n", retBoardInfo->boardDisplayName) ;
printf (" | BCM | wPi | Name | Mode | V | Ph |\n") ; printf (" | BCM | wPi | Name | Mode | V | Ph |\n") ;
@ -454,11 +620,11 @@ void NanoPiReadAll()
readallPhys (boardId, pin, 0) ; readallPhys (boardId, pin, 0) ;
} }
printf (" +-----+-----+----------+------+---+----+\n") ; printf (" +-----+-----+----------+------+---+----+\n") ;
} else if (boardId == NanoPi_Duo) { printf ("\n");
} else if (boardId == NanoPi_Duo || boardId == NanoPi_NEO_Core || boardId == NanoPi_NEO_Core2) {
// nothing to do. // nothing to do.
} }
} }
//guenter ende
void doReadall (void) void doReadall (void)
{ {

View File

@ -26,8 +26,8 @@ BoardHardwareInfo gAllBoardHardwareInfo[] = {
//s5p6818 //s5p6818
{"nanopi3", 1, NanoPC_T3, "NanoPC-T3",""}, {"nanopi3", 1, NanoPC_T3, "NanoPC-T3",""},
{"nanopi3", 2, NanoPi_S3, "NanoPi-S3",""}, {"nanopi3", 4, NanoPC_T3T, "NanoPC-T3T",""},
{"nanopi3", 3, Smart6818, "Smart6818",""}, {"nanopi3", 5, NanoPi_Fire3, "NanoPi-Fire3",""},
{"nanopi3", 7, NanoPi_M3, "NanoPi-M3",""}, {"nanopi3", 7, NanoPi_M3, "NanoPi-M3",""},
//allwinner h3 //allwinner h3
@ -36,8 +36,9 @@ BoardHardwareInfo gAllBoardHardwareInfo[] = {
{"sun8i", 0, NanoPi_NEO, "NanoPi-NEO", "1(0)"}, {"sun8i", 0, NanoPi_NEO, "NanoPi-NEO", "1(0)"},
{"sun8i", 0, NanoPi_NEO_Air, "NanoPi-NEO-Air", "2(0)"}, {"sun8i", 0, NanoPi_NEO_Air, "NanoPi-NEO-Air", "2(0)"},
{"sun8i", 0, NanoPi_M1_Plus, "NanoPi-M1-Plus", "3(0)"}, {"sun8i", 0, NanoPi_M1_Plus, "NanoPi-M1-Plus", "3(0)"},
{"sun8i", 0, NanoPi_Duo, "NanoPi-Duo", "4(0)"}, {"sun8i", 0, NanoPi_Duo, "NanoPi-Duo", "4(0)"},
{"sun8i", 0, NanoPi_NEO_Core, "NanoPi-NEO-Core", "5(0)"}, {"sun8i", 0, NanoPi_NEO_Core, "NanoPi-NEO-Core", "5(0)"},
{"sun8i", 0, NanoPi_K1, "NanoPi-K1", "6(0)"},
// kernel 4.x // kernel 4.x
{"Allwinnersun8iFamily", 0, NanoPi_M1, "NanoPi-M1", "0(0)"}, {"Allwinnersun8iFamily", 0, NanoPi_M1, "NanoPi-M1", "0(0)"},
{"Allwinnersun8iFamily", 0, NanoPi_NEO, "NanoPi-NEO", "1(0)"}, {"Allwinnersun8iFamily", 0, NanoPi_NEO, "NanoPi-NEO", "1(0)"},
@ -45,6 +46,7 @@ BoardHardwareInfo gAllBoardHardwareInfo[] = {
{"Allwinnersun8iFamily", 0, NanoPi_M1_Plus, "NanoPi-M1-Plus", "3(0)"}, {"Allwinnersun8iFamily", 0, NanoPi_M1_Plus, "NanoPi-M1-Plus", "3(0)"},
{"Allwinnersun8iFamily", 0, NanoPi_Duo, "NanoPi-Duo", "4(0)"}, {"Allwinnersun8iFamily", 0, NanoPi_Duo, "NanoPi-Duo", "4(0)"},
{"Allwinnersun8iFamily", 0, NanoPi_NEO_Core, "NanoPi-NEO-Core", "5(0)"}, {"Allwinnersun8iFamily", 0, NanoPi_NEO_Core, "NanoPi-NEO-Core", "5(0)"},
{"Allwinnersun8iFamily", 0, NanoPi_K1, "NanoPi-K1", "6(0)"},
// a64 // a64
@ -55,10 +57,15 @@ BoardHardwareInfo gAllBoardHardwareInfo[] = {
{"sun50iw2", 4, NanoPi_NEO2, "NanoPi-NEO2", "1(0)"}, {"sun50iw2", 4, NanoPi_NEO2, "NanoPi-NEO2", "1(0)"},
{"sun50iw2", 4, NanoPi_M1_Plus2, "NanoPi-M1-Plus2", "3(0)"}, {"sun50iw2", 4, NanoPi_M1_Plus2, "NanoPi-M1-Plus2", "3(0)"},
{"sun50iw2", 4, NanoPi_NEO_Plus2, "NanoPi-NEO-Plus2", "2(0)"}, {"sun50iw2", 4, NanoPi_NEO_Plus2, "NanoPi-NEO-Plus2", "2(0)"},
{"sun50iw2", 4, NanoPi_NEO_Core2, "NanoPi-NEO-Core2", "0(0)"},
{"sun50iw2", 4, NanoPi_K1_Plus, "NanoPi-K1-Plus", "4(0)"},
// kernel 4.x // kernel 4.x
{"Allwinnersun50iw2Family", 4, NanoPi_NEO2, "NanoPi-NEO2", "1(0)"}, {"Allwinnersun50iw2Family", 4, NanoPi_NEO2, "NanoPi-NEO2", "1(0)"},
{"Allwinnersun50iw2Family", 4, NanoPi_M1_Plus2, "NanoPi-M1-Plus2", "3(0)"}, {"Allwinnersun50iw2Family", 4, NanoPi_M1_Plus2, "NanoPi-M1-Plus2", "3(0)"},
{"Allwinnersun50iw2Family", 4, NanoPi_NEO_Plus2, "NanoPi-NEO-Plus2", "2(0)"}, {"Allwinnersun50iw2Family", 4, NanoPi_NEO_Plus2, "NanoPi-NEO-Plus2", "2(0)"},
{"Allwinnersun50iw2Family", 4, NanoPi_NEO_Core2, "NanoPi-NEO-Core2", "0(0)"},
{"Allwinnersun50iw2Family", 4, NanoPi_K1_Plus, "NanoPi-K1-Plus", "4(0)"},
//k2 //k2
{"Amlogic", 0, NanoPi_K2, "NanoPi-K2", ""}, {"Amlogic", 0, NanoPi_K2, "NanoPi-K2", ""},
@ -67,14 +74,16 @@ BoardHardwareInfo gAllBoardHardwareInfo[] = {
static int getFieldValueInCpuInfo(char* hardware, int hardwareMaxLen, char* revision, int revisionMaxLen ) static int getFieldValueInCpuInfo(char* hardware, int hardwareMaxLen, char* revision, int revisionMaxLen )
{ {
int n,i,j; int n,i,j;
char lineUntrim[1024], line[1024],*p,*p2; char lineUntrim[1024], line[1024],line2[1024],*p,*p2;
FILE *f; FILE *f;
int isGotHardware = 0; int isGotHardware = 0;
int isGotRevision = 0; int isGotRevision = 0;
if (!(f = fopen("/proc/cpuinfo", "r"))) { if (!(f = fopen("/sys/devices/platform/board/info", "r"))) {
LOGE("open /proc/cpuinfo failed."); if (!(f = fopen("/proc/cpuinfo", "r"))) {
return -1; LOGE("open /proc/cpuinfo failed.");
return -1;
}
} }
while (!feof(f)) { while (!feof(f)) {
@ -92,41 +101,31 @@ static int getFieldValueInCpuInfo(char* hardware, int hardwareMaxLen, char* revi
n = strlen(line); n = strlen(line);
if (n>0) { if (n>0) {
//LOGD("LINE: %s\n", line); //LOGD("LINE: %s\n", line);
#define GetKeyValue(isGot,valP,keyName,buff,buffLen) \
if (isGot==0) { \
strcpy(line2, line); \
if (valP=strtok(line2, ":")) { \
if (strncasecmp(valP,keyName,strlen(keyName))==0) { \
if (valP=strtok(0, ":")) { \
memset(buff,0,buffLen); \
strncpy(buff,valP,buffLen-1); \
isGot=1; \
} \
continue; \
} \
} \
}
GetKeyValue(isGotHardware,p,"Hardware",hardware,hardwareMaxLen);
GetKeyValue(isGotRevision,p2,"Revision",revision,revisionMaxLen);
if (isGotHardware == 0) { if (isGotHardware == 1 && isGotRevision == 1) {
if (p = strtok(line, ":")) { break;
if (strncasecmp(p, "Hardware", strlen("Hardware")) == 0) { }
if (p = strtok(0, ":")) { }
memset(hardware,0,hardwareMaxLen); }
strncpy(hardware, p, hardwareMaxLen-1); }
isGotHardware = 1; fclose(f);
} return isGotHardware + isGotRevision;
continue;
}
}
}
if (isGotRevision == 0) {
if (p2 = strtok(line, ":")) {
if (strncasecmp(p2, "Revision", strlen("Revision")) == 0) {
if (p2 = strtok(0, ":")) {
memset(revision,0,revisionMaxLen);
strncpy(revision, p2, revisionMaxLen-1);
isGotRevision = 1;
}
continue;
}
}
}
if (isGotHardware == 1 && isGotRevision == 1) {
break;
}
}
}
}
fclose(f);
return isGotHardware + isGotRevision;
} }
@ -139,7 +138,7 @@ static int getAllwinnerBoardID(char* boardId, int boardIdMaxLen )
int ret = -1; int ret = -1;
if (!(f = fopen("/sys/class/sunxi_info/sys_info", "r"))) { if (!(f = fopen("/sys/class/sunxi_info/sys_info", "r"))) {
LOGE("open /proc/cpuinfo failed."); LOGE("open /sys/class/sunxi_info/sys_info failed.");
return -1; return -1;
} }

View File

@ -39,9 +39,8 @@ typedef struct {
//s5p6818 //s5p6818
#define S5P6818_BASE (6818) #define S5P6818_BASE (6818)
#define NanoPC_T3 (S5P6818_BASE+1) #define NanoPC_T3 (S5P6818_BASE+1)
#define NanoPi_S3 (S5P6818_BASE+2)
#define Smart6818 (S5P6818_BASE+3)
#define NanoPC_T3T (S5P6818_BASE+4) #define NanoPC_T3T (S5P6818_BASE+4)
#define NanoPi_Fire3 (S5P6818_BASE+5)
#define NanoPi_M3 (S5P6818_BASE+7) #define NanoPi_M3 (S5P6818_BASE+7)
#define S5P6818_MAX NanoPi_M3 #define S5P6818_MAX NanoPi_M3
@ -62,7 +61,10 @@ typedef struct {
#define NanoPi_NEO_Plus2 (ALLWINNER_BASE+8) #define NanoPi_NEO_Plus2 (ALLWINNER_BASE+8)
#define NanoPi_NEO_Core (ALLWINNER_BASE+9) #define NanoPi_NEO_Core (ALLWINNER_BASE+9)
#define NanoPi_Duo (ALLWINNER_BASE+10) #define NanoPi_Duo (ALLWINNER_BASE+10)
#define ALLWINNER_MAX NanoPi_Duo #define NanoPi_NEO_Core2 (ALLWINNER_BASE+11)
#define NanoPi_K1 (ALLWINNER_BASE+12)
#define NanoPi_K1_Plus (ALLWINNER_BASE+13)
#define ALLWINNER_MAX NanoPi_K1_Plus
//amlogic //amlogic
#define AMLOGIC_BASE (8000) #define AMLOGIC_BASE (8000)

View File

@ -86,11 +86,6 @@
#define ENV_CODES "WIRINGPI_CODES" #define ENV_CODES "WIRINGPI_CODES"
// Mask for the bottom 64 pins which belong to the Banana Pro
// The others are available for the other devices
#define PI_GPIO_MASK (0xFFFFFFC0)
struct wiringPiNodeStruct *wiringPiNodes = NULL; struct wiringPiNodeStruct *wiringPiNodes = NULL;
// BCM Magic // BCM Magic
@ -267,11 +262,16 @@ int wiringPiReturnCodes = FALSE;
// sysFds: // sysFds:
// Map a file descriptor from the /sys/class/gpio/gpioX/value // Map a file descriptor from the /sys/class/gpio/gpioX/value
static int sysFds [64] ={ #define MAX_PIN_COUNT 74
static int sysFds [MAX_PIN_COUNT] ={
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
/* 64~73 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
}; };
// ISR Data // ISR Data
@ -284,6 +284,7 @@ static int upDnConvert[3] = {7, 7, 5};
static int *pinToGpio = 0; static int *pinToGpio = 0;
static int *physToGpio = 0; static int *physToGpio = 0;
static int *physToPin = 0; static int *physToPin = 0;
static int *syspin = 0;
// Doing it the Arduino way with lookup tables... // Doing it the Arduino way with lookup tables...
@ -305,7 +306,8 @@ static int *physToPin = 0;
// 192 - 223 = PG00-PG31 // 192 - 223 = PG00-PG31
// nanopi m1 done // nanopi m1 done
static int pinToGpio_m1 [64] ={ // wPi number to /sys/gpio number
static int pinToGpio_m1 [MAX_PIN_COUNT] ={
0, 6, // 0, 1 0, 6, // 0, 1
2, 3, // 2, 3 2, 3, // 2, 3
200, 201, // 4 5 200, 201, // 4 5
@ -326,44 +328,50 @@ static int pinToGpio_m1 [64] ={
4, 5, // 32, 33 Debug UART pins 4, 5, // 32, 33 Debug UART pins
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63
/* 64~73 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
}; };
// wPi number to /sys/gpio number
static int pinToGpio_neo [64] ={ static int pinToGpio_neo [MAX_PIN_COUNT] ={
0, //0 0, //0
/* 24 Pin */ /* 24 Pin */
6, 2, //1, 2 6, 2, //1, 2
3, 200, //3, 4 3, 200, //3, 4
201, 1, //5, 6 201, 1, //5, 6
203, 12, //7, 8 203, 12, //7, 8
11, 67, //9, 10 11, 67, //9, 10
-1, 64, //11, 12 -1, 64, //11, 12
65, 66, //13, 14 65, 66, //13, 14
198, 199, //15, 16 198, 199, //15, 16
4, 5, //17, 18 4, 5, //17, 18
-1, -1, //19, 20 17, -1, //19, 20
-1, 1, //21, 22 -1, 1, //21, 22
-1, -1, //23, 24 -1, -1, //23, 24
/* 12 Pin */ /* 12 Pin */
-1, -1, //25, 26 -1, -1, //25, 26
-1, -1, //27, 28 -1, -1, //27, 28
-1, -1, //29, 30 -1, -1, //29, 30
-1, -1, //31, 32 -1, -1, //31, 32
-1, -1, //33, 34 -1, -1, //33, 34
-1, -1, //35, 36 -1, -1, //35, 36
/* UART0 Tx,Rx */ /* UART0 Tx,Rx */
-1, -1, //37, 38 -1, -1, //37, 38
/* 39~63 */ /* 39~63 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
/* 64~73 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
}; };
// wPi number to /sys/gpio number // wPi number to /sys/gpio number
static int pinToGpio_duo [64] ={ static int pinToGpio_duo [MAX_PIN_COUNT] ={
16, //0 16, //0
/* 32 Pin */ /* 32 Pin */
-1, 14, //1, 2 -1, 14, //1, 2
@ -393,8 +401,46 @@ static int pinToGpio_duo [64] ={
/* 39~63 */ /* 39~63 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
/* 64~73 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
}; };
// guenter neu ende
// wPi number to /sys/gpio number
static int pinToGpio_neocore [MAX_PIN_COUNT] ={
0, //0
6, 2, //1, 2
3, 200, //3, 4
201, 1, //5, 6
203, 12, //7, 8
11, 67, //9, 10
-1, 64, //11, 12
65, 66, //13, 14
198, 199, //15, 16
4, 5, //17, 18
17, 13, //19, 20
14, 15, //21, 22
16, 7, //23, 24
-1, -1, //25, 26
-1, -1, //27, 28
-1, -1, //29, 30
-1, -1, //31, 32
-1, -1, //33, 34
-1, -1, //35, 36
-1, -1, //37, 38
/* 39~63 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
/* 64~73 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
};
/* /*
@ -426,7 +472,7 @@ static int pinTobcm [64] ={
// Also add in the P5 connector, so the P5 pins are 3,4,5,6, so 53,54,55,56 // Also add in the P5 connector, so the P5 pins are 3,4,5,6, so 53,54,55,56
static int physToGpio_neo [64] ={ static int physToGpio_neo [MAX_PIN_COUNT] ={
-1, -1,
/* 24 Pin */ /* 24 Pin */
-1, -1, //1, 2 -1, -1, //1, 2
@ -446,7 +492,7 @@ static int physToGpio_neo [64] ={
-1, -1, //25, 26 -1, -1, //25, 26
-1, -1, //27, 28 -1, -1, //27, 28
-1, -1, //29, 30 -1, -1, //29, 30
-1, -1, //31, 32 17, -1, //31, 32
-1, -1, //33, 34 -1, -1, //33, 34
-1, -1, //35, 36 -1, -1, //35, 36
@ -456,10 +502,62 @@ static int physToGpio_neo [64] ={
/* 39~63 */ /* 39~63 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
/* 64~73 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
}; };
static int physToGpio_m1 [64] ={
static int physToGpio_neocore [MAX_PIN_COUNT] ={
-1,
/* GPIO-1 24Pin */
-1, -1, //1, 2
12, -1, //3, 4
11, -1, //5, 6
203, 198, //7, 8
-1, 199, //9, 10
0, 6, //11, 12
2, -1, //13, 14
3, 200, //15, 16
-1, 201, //17, 18
64, -1, //19, 20
65, 1, //21, 22
66, 67, //23, 24
/* GPIO-2 24Pin */
-1, 15, //25, 26 -> 1, 2
-1, 16, //27, 28 -> 3, 4
-1, 14, //29, 30 -> 5, 6
-1, 13, //31, 32 -> 7, 8
-1, -1, //33, 34 -> 9, 10
-1, -1, //35, 36 -> 11, 12
17, -1, //37, 38 -> 13, 14
-1, -1, //39, 40 -> 15, 16
-1, 5, //41, 42 -> 17, 18
-1, 4, //43, 44 -> 19, 20
-1, -1, //45, 46 -> 21, 22
-1, -1, //47, 48 -> 23, 24
/* GPIO-3 24Pin */
-1, -1, //49, 50 -> 1, 2
-1, -1, //51, 52 -> 3, 4
-1, -1, //53, 54 -> 5, 6
-1, -1, //55, 56 -> 7, 8
-1, -1, //57, 58 -> 9, 10
-1, -1, //59, 60 -> 11, 12
-1, 7, //61, 62 -> 13, 14
-1, -1, //63, 64 -> 15, 16
-1, -1, //65, 66 -> 17, 18
-1, -1, //67, 68 -> 19, 20
-1, -1, //69, 70 -> 21, 22
-1, -1, //71, 72 -> 23, 24
-1, //73
};
static int physToGpio_m1 [MAX_PIN_COUNT] ={
-1, // 0 -1, // 0
-1, -1, // 1, 2 -1, -1, // 1, 2
12, -1, // 3, 4 12, -1, // 3, 4
@ -483,11 +581,14 @@ static int physToGpio_m1 [64] ={
-1, 14, //39, 40 -1, 14, //39, 40
-1, -1, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //41-> 55 -1, -1, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //41-> 55
-1, -1, -1, -1, -1, -1, -1, -1 // 56-> 63 -1, -1, -1, -1, -1, -1, -1, -1 // 56-> 63
/* 64~73 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
}; };
// phys pin number to /sys/gpio number // phys pin number to /sys/gpio number
static int physToGpio_duo [64] ={ static int physToGpio_duo [MAX_PIN_COUNT] ={
-1, //0 -1, //0
/* 32 Pin */ /* 32 Pin */
-1, -1, //1, 2 -1, -1, //1, 2
@ -517,28 +618,75 @@ static int physToGpio_duo [64] ={
/* 39~63 */ /* 39~63 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
/* 64~73 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
}; };
// //
static int syspin [64] ={ static int syspin_neo [MAX_PIN_COUNT] ={
-1, -1, 2, 3, 4, 5, 6, 7, //GPIO0,1 used to I2C -1, -1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, -1, -1, -1, -1, 24, 25, 26, 27, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
/* 64~73 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
}; };
/*static int edge [64] ={ static int syspin_neocore [MAX_PIN_COUNT] ={
-1, -1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
/* 64~73 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
};
static int syspin_m1 [MAX_PIN_COUNT] ={
-1, -1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
/* 64~73 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
};
static int syspin_duo [MAX_PIN_COUNT] ={
-1, -1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
/* 64~73 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
};
/*static int edge [MAX_PIN_COUNT] ={
-1, -1, -1, -1, 4, -1, -1, 7, //support the INT -1, -1, -1, -1, 4, -1, -1, 7, //support the INT
8, 9, 10, 11, -1, -1, 14, 15, 8, 9, 10, 11, -1, -1, 14, 15,
-1, 17, -1, -1, -1, -1, 22, 23, -1, 17, -1, -1, -1, -1, 22, 23,
24, 25, -1, 27, -1, -1, -1, -1, 24, 25, -1, 27, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
// 64~73
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
};*/ };*/
static int physToPin_m1 [64] = //return wiringPI pin static int physToPin_m1 [MAX_PIN_COUNT] = //return wiringPI pin
{ {
-1, // 0 -1, // 0
-1, -1, // 1, 2 -1, -1, // 1, 2
@ -566,9 +714,12 @@ static int physToPin_m1 [64] = //return wiringPI pin
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 56 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 56
-1, -1, -1, -1, -1, -1, -1, // ... 63 -1, -1, -1, -1, -1, -1, -1, // ... 63
/* 64~73 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
}; };
static int physToPin_neo [64] = //return wiringPI pin static int physToPin_neo [MAX_PIN_COUNT] = //return wiringPI pin
{ {
-1, // 0 -1, // 0
-1, -1, // 1, 2 -1, -1, // 1, 2
@ -587,7 +738,7 @@ static int physToPin_neo [64] = //return wiringPI pin
-1, -1, //25, 26 -1, -1, //25, 26
-1, -1, //27, 28 -1, -1, //27, 28
-1, -1, //29, 30 -1, -1, //29, 30
-1, -1, //31, 32 19, -1, //31, 32
-1, -1, //33, 34 -1, -1, //33, 34
-1, -1, //35, 36 -1, -1, //35, 36
@ -596,9 +747,62 @@ static int physToPin_neo [64] = //return wiringPI pin
/* 39~63 */ /* 39~63 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
/* 64~73 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
}; };
static int physToPin_duo [64] = //return wiringPI pin //note: same as physToWpi
static int physToPin_neocore [MAX_PIN_COUNT] = //return wiringPI pin
{
/* GPIO-1 24Pin */
-1, // 0
-1, -1, // 1, 2 -> 1, 2
8, -1, // 3, 4 -> 3, 4
9, -1, // 5, 6 -> 5, 6
7, 15, // 7, 8 -> 7, 8
-1, 16, // 9, 10 -> 9, 10
0, 1, //11, 12 -> 11, 12
2, -1, //13, 14 -> 13, 14
3, 4, //15, 16 -> 15, 16
-1, 5, //17, 18 -> 17, 18
12, -1, //19, 20 -> 19, 20
13, 6, //21, 22 -> 21, 22
14, 10, //23, 24 -> 23, 24
/* GPIO-2 24Pin */
-1, 22, //25, 26 -> 1, 2
-1, 23, //27, 28 -> 3, 4
-1, 21, //29, 30 -> 5, 6
-1, 20, //31, 32 -> 7, 8
-1, -1, //33, 34 -> 9, 10
-1, -1, //35, 36 -> 11, 12
19, -1, //37, 38 -> 13, 14
-1, -1, //39, 40 -> 15, 16
-1, 18, //41, 42 -> 17, 18
-1, 17, //43, 44 -> 19, 20
-1, -1, //45, 46 -> 21, 22
-1, -1, //47, 48 -> 23, 24
/* GPIO-3 24Pin */
-1, -1, //49, 50 -> 1, 2
-1, -1, //51, 52 -> 3, 4
-1, -1, //53, 54 -> 5, 6
-1, -1, //55, 56 -> 7, 8
-1, -1, //57, 58 -> 9, 10
-1, -1, //59, 60 -> 11, 12
-1, 24, //61, 62 -> 13, 14
-1, -1, //63, 64 -> 15, 16
-1, -1, //65, 66 -> 17, 18
-1, -1, //67, 68 -> 19, 20
-1, -1, //69, 70 -> 21, 22
-1, -1, //71, 72 -> 23, 24
-1, //73
};
static int physToPin_duo [MAX_PIN_COUNT] = //return wiringPI pin //note: same as physToWpi
{ {
-1, // 0 -1, // 0
-1, -1, // 1, 2 -1, -1, // 1, 2
@ -627,6 +831,9 @@ static int physToPin_duo [64] = //return wiringPI pin //note: same as physToWpi
/* 39~63 */ /* 39~63 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
/* 64~73 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
}; };
// pins available on pin out by banks // pins available on pin out by banks
@ -1075,7 +1282,6 @@ int isA20(void) {
return 0; return 0;
} }
} }
/* guenter ende */
int piBoardRev(void) { int piBoardRev(void) {
BoardHardwareInfo* retBoardInfo; BoardHardwareInfo* retBoardInfo;
@ -1083,8 +1289,7 @@ int piBoardRev(void) {
boardId = getBoardType(&retBoardInfo); boardId = getBoardType(&retBoardInfo);
if (boardId >= 0) { if (boardId >= 0) {
if (boardId > ALLWINNER_BASE && boardId <= ALLWINNER_MAX if (boardId > ALLWINNER_BASE && boardId <= ALLWINNER_MAX
&& boardId != NanoPi_A64 && boardId != NanoPi_A64) {
&& boardId != NanoPi_NEO_Core) {
version = BPRVER; version = BPRVER;
if (wiringPiDebug) if (wiringPiDebug)
printf("piBoardRev: %d\n", version); printf("piBoardRev: %d\n", version);
@ -1119,8 +1324,7 @@ void piBoardId(int *model, int *rev, int *mem, int *maker, int *overVolted) {
boardId = getBoardType(&retBoardInfo); boardId = getBoardType(&retBoardInfo);
if (boardId >= 0) { if (boardId >= 0) {
if (boardId > ALLWINNER_BASE && boardId <= ALLWINNER_MAX if (boardId > ALLWINNER_BASE && boardId <= ALLWINNER_MAX
&& boardId != NanoPi_A64 && boardId != NanoPi_A64) {
&& boardId != NanoPi_NEO_Core) {
*model = boardId; *model = boardId;
*rev = PI_VERSION_1_2; *rev = PI_VERSION_1_2;
*mem = 1024; *mem = 1024;
@ -1152,7 +1356,11 @@ int wpiPinToGpio(int wpiPin) {
printf("please call wiringPiSetup first.\n"); printf("please call wiringPiSetup first.\n");
return -1; return -1;
} }
return pinToGpio [wpiPin & 63]; if (wpiPin >= MAX_PIN_COUNT || wpiPin < 0) {
printf("Invalid pin index.\n");
return -1;
}
return pinToGpio [wpiPin];
} }
/* /*
@ -1167,7 +1375,11 @@ int physPinToGpio(int physPin) {
printf("please call wiringPiSetup first.\n"); printf("please call wiringPiSetup first.\n");
return -1; return -1;
} }
return physToGpio [physPin & 63]; if (physPin >= MAX_PIN_COUNT || physPin < 0) {
printf("Invalid pin index.\n");
return -1;
}
return physToGpio [physPin];
} }
/* /*
@ -1181,7 +1393,11 @@ int physPinToPin(int physPin) {
printf("please call wiringPiSetup first.\n"); printf("please call wiringPiSetup first.\n");
return -1; return -1;
} }
return physToPin [physPin & 63]; if (physPin >= MAX_PIN_COUNT || physPin < 0) {
printf("Invalid pin index.\n");
return -1;
}
return physToPin [physPin];
} }
/* /*
@ -1204,8 +1420,11 @@ void setPadDrive(int group, int value) {
int getAlt(int pin) { int getAlt(int pin) {
int alt; int alt;
pin &= 63; if (pin >= MAX_PIN_COUNT || pin < 0) {
printf("Invalid pin index.\n");
return -1;
}
if (pinToGpio == 0 || physToGpio == 0) { if (pinToGpio == 0 || physToGpio == 0) {
printf("please call wiringPiSetup first.\n"); printf("please call wiringPiSetup first.\n");
return -1; return -1;
@ -1216,8 +1435,7 @@ int getAlt(int pin) {
pin = pinToGpio [pin]; pin = pinToGpio [pin];
else if (wiringPiMode == WPI_MODE_PHYS) else if (wiringPiMode == WPI_MODE_PHYS)
pin = physToGpio[pin]; pin = physToGpio[pin];
else if (wiringPiMode == WPI_MODE_GPIO) else if (wiringPiMode == WPI_MODE_GPIO) //pin = pinTobcm[pin];
//pin = pinTobcm[pin];
pin = pin; pin = pin;
else return 0; else return 0;
@ -1334,12 +1552,10 @@ struct wiringPiNodeStruct *wiringPiNewNode(int pinBase, int numPins) {
struct wiringPiNodeStruct *node; struct wiringPiNodeStruct *node;
// Minimum pin base is 64 // Minimum pin base is 64
if (pinBase < 64) if (pinBase < 64)
(void)wiringPiFailure(WPI_FATAL, "wiringPiNewNode: pinBase of %d is < 64\n", pinBase); (void)wiringPiFailure(WPI_FATAL, "wiringPiNewNode: pinBase of %d is < 64\n", pinBase);
// Check all pins in-case there is overlap: // Check all pins in-case there is overlap:
for (pin = pinBase; pin < (pinBase + numPins); ++pin) for (pin = pinBase; pin < (pinBase + numPins); ++pin)
if (wiringPiFindNode(pin) != NULL) if (wiringPiFindNode(pin) != NULL)
(void)wiringPiFailure(WPI_FATAL, "wiringPiNewNode: Pin %d overlaps with existing definition\n", pin); (void)wiringPiFailure(WPI_FATAL, "wiringPiNewNode: Pin %d overlaps with existing definition\n", pin);
@ -1388,75 +1604,77 @@ void pinModeAlt(int pin, int mode) {
void pinMode(int pin, int mode) { void pinMode(int pin, int mode) {
struct wiringPiNodeStruct *node = wiringPiNodes; struct wiringPiNodeStruct *node = wiringPiNodes;
if (wiringPiDebug) if (wiringPiDebug)
printf("Func: %s, Line: %d,pin:%d,mode:%d\n", __func__, __LINE__, pin, mode); printf("Func: %s, Line: %d,pin:%d,mode:%d\n", __func__, __LINE__, pin, mode);
if (pinToGpio == 0 || physToGpio == 0) { if (pinToGpio == 0 || physToGpio == 0) {
printf("please call wiringPiSetup first.\n"); printf("please call wiringPiSetup first.\n");
return -1; return -1;
} }
if ((pin & PI_GPIO_MASK) == 0) // On-board pin // On-board pin
{ if (pin > 0 && pin < MAX_PIN_COUNT) {
if (wiringPiMode == WPI_MODE_PINS) { if (wiringPiMode == WPI_MODE_PINS) {
pin = pinToGpio [pin]; pin = pinToGpio [pin];
if (wiringPiDebug) { if (wiringPiDebug) {
printf(">>> pinToGpio[pin] ret %d\n", pin); printf(">>> pinToGpio[pin] ret %d\n", pin);
} }
} else if (wiringPiMode == WPI_MODE_PHYS) { } else if (wiringPiMode == WPI_MODE_PHYS) {
pin = physToGpio[pin]; pin = physToGpio[pin];
if (wiringPiDebug) { if (wiringPiDebug) {
printf(">>> physToGpio[pin] ret %d\n", pin); printf(">>> physToGpio[pin] ret %d\n", pin);
} }
} else if (wiringPiMode == WPI_MODE_GPIO) { } else if (wiringPiMode == WPI_MODE_GPIO) { // pin = pinTobcm[pin];
// pin = pinTobcm[pin];
pin = pin;
if (wiringPiDebug) { pin = pin;
printf(">>> pinTobcm[pin] ret %d\n", pin);
}
} else { if (wiringPiDebug) {
if (wiringPiDebug) { printf(">>> pinTobcm[pin] ret %d\n", pin);
printf(">>> unknow wiringPiMode\n"); }
}
return;
}
if (-1 == pin) /*VCC or GND return directly*/ {
//printf("[%s:L%d] the pin:%d is invaild,please check it over!\n", __func__, __LINE__, pin);
return;
}
if (mode == INPUT) {
sunxi_set_gpio_mode(pin, INPUT);
wiringPinMode = INPUT;
return;
} else if (mode == OUTPUT) {
sunxi_set_gpio_mode(pin, OUTPUT); //gootoomoon_set_mode
wiringPinMode = OUTPUT;
return;
} else if (mode == PWM_OUTPUT) {
if (pin != 5) {
printf("the pin you choose doesn't support hardware PWM\n");
printf("you can select wiringPi pin %d for PWM pin\n", 1);
printf("or you can use it in softPwm mode\n");
return;
}
//printf("you choose the hardware PWM:%d\n", 1);
sunxi_set_gpio_mode(pin, PWM_OUTPUT);
wiringPinMode = PWM_OUTPUT;
return;
} else
return;
} else { } else {
if ((node = wiringPiFindNode(pin)) != NULL) if (wiringPiDebug) {
node->pinMode(node, pin, mode); printf(">>> unknow wiringPiMode\n");
}
return;
}
/*VCC or GND return directly*/
if (-1 == pin) {
//printf("[%s:L%d] the pin:%d is invaild,please check it over!\n", __func__, __LINE__, pin);
return;
}
if (mode == INPUT) {
sunxi_set_gpio_mode(pin, INPUT);
wiringPinMode = INPUT;
return;
} else if (mode == OUTPUT) {
sunxi_set_gpio_mode(pin, OUTPUT); //gootoomoon_set_mode
wiringPinMode = OUTPUT;
return;
} else if (mode == PWM_OUTPUT) {
if (pin != 5) {
printf("the pin you choose doesn't support hardware PWM\n");
printf("you can select wiringPi pin %d for PWM pin\n", 1);
printf("or you can use it in softPwm mode\n");
return; return;
}
//printf("you choose the hardware PWM:%d\n", 1);
sunxi_set_gpio_mode(pin, PWM_OUTPUT);
wiringPinMode = PWM_OUTPUT;
return;
} else {
return;
} }
} else {
if ((node = wiringPiFindNode(pin)) != NULL)
node->pinMode(node, pin, mode);
return;
}
} }
/* /*
@ -1478,8 +1696,7 @@ void pullUpDnControl(int pin, int pud) {
pud = upDnConvert[pud]; pud = upDnConvert[pud];
if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin if (pin > 0 && pin < MAX_PIN_COUNT) {
{
if (wiringPiMode == WPI_MODE_PINS) if (wiringPiMode == WPI_MODE_PINS)
pin = pinToGpio [pin]; pin = pinToGpio [pin];
else if (wiringPiMode == WPI_MODE_PHYS) else if (wiringPiMode == WPI_MODE_PHYS)
@ -1524,8 +1741,7 @@ int digitalRead(int pin) {
return; return;
} }
if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin if (pin > 0 && pin < MAX_PIN_COUNT) {
{
if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode
{ {
if (wiringPiDebug) { if (wiringPiDebug) {
@ -1536,10 +1752,15 @@ int digitalRead(int pin) {
//printf("%d %s,%d invalid pin,please check it over.\n",pin,__func__, __LINE__); //printf("%d %s,%d invalid pin,please check it over.\n",pin,__func__, __LINE__);
return 0; return 0;
} }
//TODO: fix me
/*
if (syspin[pin] == -1) { if (syspin[pin] == -1) {
//printf("%d %s,%d invalid pin,please check it over.\n",pin,__func__, __LINE__); //printf("%d %s,%d invalid pin,please check it over.\n",pin,__func__, __LINE__);
return 0; return 0;
} }
*/
if (sysFds [pin] == -1) { if (sysFds [pin] == -1) {
if (wiringPiDebug) if (wiringPiDebug)
printf("pin %d sysFds -1.%s,%d\n", pin, __func__, __LINE__); printf("pin %d sysFds -1.%s,%d\n", pin, __func__, __LINE__);
@ -1596,25 +1817,31 @@ void digitalWrite(int pin, int value) {
if (wiringPiDebug) if (wiringPiDebug)
printf("%s,%d\n", __func__, __LINE__); printf("%s,%d\n", __func__, __LINE__);
if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin
{ if (pin > 0 && pin < MAX_PIN_COUNT) {
/**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode
{ {
if (wiringPiDebug) { if (wiringPiDebug) {
printf("%d %s,%d invalid pin,please check it over.\n", pin, __func__, __LINE__); printf("%d %s,%d invalid pin,please check it over.\n", pin, __func__, __LINE__);
} }
if (pin == 0) { if (pin == 0) {
//printf("%d %s,%d invalid pin,please check it over.\n",pin,__func__, __LINE__); printf("%d %s,%d invalid pin,please check it over.\n",pin,__func__, __LINE__);
return; return;
} }
//TODO: fix me
/*
if (syspin[pin] == -1) { if (syspin[pin] == -1) {
//printf("%d %s,%d invalid pin,please check it over.\n",pin,__func__, __LINE__); printf("%d %s,%d invalid pin,please check it over.\n",pin,__func__, __LINE__);
return; return;
} }
*/
if (sysFds [pin] == -1) { if (sysFds [pin] == -1) {
if (wiringPiDebug) if (wiringPiDebug)
printf("pin %d sysFds -1.%s,%d\n", pin, __func__, __LINE__); printf("pin %d sysFds -1.%s,%d\n", pin, __func__, __LINE__);
} }
if (sysFds [pin] != -1) { if (sysFds [pin] != -1) {
if (wiringPiDebug) if (wiringPiDebug)
printf("pin %d :%d.%s,%d\n", pin, sysFds [pin], __func__, __LINE__); printf("pin %d :%d.%s,%d\n", pin, sysFds [pin], __func__, __LINE__);
@ -1907,8 +2134,8 @@ int wiringPiISR(int pin, int mode, void (*function)(void)) {
return wiringPiFailure(WPI_FATAL, "wiringPiISR: Not implemented"); return wiringPiFailure(WPI_FATAL, "wiringPiISR: Not implemented");
if ((pin < 0) || (pin > 63)) if ((pin < 0) || (pin >= MAX_PIN_COUNT))
return wiringPiFailure(WPI_FATAL, "wiringPiISR: pin must be 0-63 (%d)\n", pin); return wiringPiFailure(WPI_FATAL, "wiringPiISR: pin must be 0-%d (%d)\n", MAX_PIN_COUNT-1,pin);
/**/ if (wiringPiMode == WPI_MODE_UNINITIALISED) /**/ if (wiringPiMode == WPI_MODE_UNINITIALISED)
return wiringPiFailure(WPI_FATAL, "wiringPiISR: wiringPi has not been initialised. Unable to continue.\n"); return wiringPiFailure(WPI_FATAL, "wiringPiISR: wiringPi has not been initialised. Unable to continue.\n");
@ -2108,18 +2335,26 @@ int wiringPiSetup(void) {
wiringPiMode = WPI_MODE_PINS; wiringPiMode = WPI_MODE_PINS;
int boardId = model; int boardId = model;
if (boardId == NanoPi_M1 || boardId == NanoPi_M1_Plus || boardId == NanoPi_M1_Plus2) { if (boardId == NanoPi_M1 || boardId == NanoPi_M1_Plus || boardId == NanoPi_M1_Plus2 || boardId == NanoPi_K1_Plus) {
pinToGpio = pinToGpio_m1; pinToGpio = pinToGpio_m1;
physToGpio = physToGpio_m1; physToGpio = physToGpio_m1;
physToPin = physToPin_m1; physToPin = physToPin_m1;
syspin = syspin_m1;
} else if (boardId == NanoPi_NEO || boardId == NanoPi_NEO_Air || boardId == NanoPi_NEO2 || boardId == NanoPi_NEO_Plus2) { } else if (boardId == NanoPi_NEO || boardId == NanoPi_NEO_Air || boardId == NanoPi_NEO2 || boardId == NanoPi_NEO_Plus2) {
pinToGpio = pinToGpio_neo; pinToGpio = pinToGpio_neo;
physToGpio = physToGpio_neo; physToGpio = physToGpio_neo;
physToPin = physToPin_neo; physToPin = physToPin_neo;
syspin = syspin_neo;
} else if (boardId == NanoPi_Duo) { } else if (boardId == NanoPi_Duo) {
pinToGpio = pinToGpio_duo; pinToGpio = pinToGpio_duo;
physToGpio = physToGpio_duo; physToGpio = physToGpio_duo;
physToPin = physToPin_duo; physToPin = physToPin_duo;
syspin = syspin_duo;
} else if (boardId == NanoPi_NEO_Core || boardId == NanoPi_NEO_Core2) {
pinToGpio = pinToGpio_neocore;
physToGpio = physToGpio_neocore;
physToPin = physToPin_neocore;
syspin = syspin_neocore;
} else { } else {
return -1; return -1;
} }
@ -2191,20 +2426,9 @@ int wiringPiSetupSys(void) {
if (wiringPiDebug) if (wiringPiDebug)
printf("wiringPi: wiringPiSetupSys called\n"); printf("wiringPi: wiringPiSetupSys called\n");
//boardRev = piBoardRev();
for (pin = 1; pin < 32; ++pin) {
sprintf(fName, "/sys/class/gpio/gpio%d/value", pin);
sysFds [pin] = open(fName, O_RDWR);
}
initialiseEpoch();
wiringPiMode = WPI_MODE_GPIO_SYS;
piBoardId(&model, &rev, &mem, &maker, &overVolted); piBoardId(&model, &rev, &mem, &maker, &overVolted);
int boardId = model; int boardId = model;
if (boardId == NanoPi_M1 || boardId == NanoPi_M1_Plus || boardId == NanoPi_M1_Plus2) { if (boardId == NanoPi_M1 || boardId == NanoPi_M1_Plus || boardId == NanoPi_M1_Plus2 || boardId == NanoPi_K1_Plus) {
pinToGpio = pinToGpio_m1; pinToGpio = pinToGpio_m1;
physToGpio = physToGpio_m1; physToGpio = physToGpio_m1;
physToPin = physToPin_m1; physToPin = physToPin_m1;
@ -2216,7 +2440,20 @@ int wiringPiSetupSys(void) {
pinToGpio = pinToGpio_duo; pinToGpio = pinToGpio_duo;
physToGpio = physToGpio_duo; physToGpio = physToGpio_duo;
physToPin = physToPin_duo; physToPin = physToPin_duo;
} else if (boardId == NanoPi_NEO_Core || boardId == NanoPi_NEO_Core2) {
pinToGpio = pinToGpio_neocore;
physToGpio = physToGpio_neocore;
physToPin = physToPin_neocore;
} }
for (pin = 1; pin < MAX_PIN_COUNT; ++pin) {
if (physToGpio[pin] != -1) {
sprintf(fName, "/sys/class/gpio/gpio%d/value", physToGpio[pin]);
sysFds [pin] = open(fName, O_RDWR);
}
}
initialiseEpoch();
wiringPiMode = WPI_MODE_GPIO_SYS;
return 0; return 0;
} }

View File

@ -1,7 +1,7 @@
/* /*
* wiringPiSPI.c: * wiringPiSPI.c:
* Simplified SPI access routines * Simplified SPI access routines
* Copyright (c) 2012 Gordon Henderson * Copyright (c) 2012-2015 Gordon Henderson
*********************************************************************** ***********************************************************************
* This file is part of wiringPi: * This file is part of wiringPi:
* https://projects.drogon.net/raspberry-pi/wiringpi/ * https://projects.drogon.net/raspberry-pi/wiringpi/
@ -28,6 +28,7 @@
#include <errno.h> #include <errno.h>
#include <string.h> #include <string.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <asm/ioctl.h>
#include <linux/spi/spidev.h> #include <linux/spi/spidev.h>
#include "wiringPi.h" #include "wiringPi.h"
@ -38,11 +39,10 @@
// The SPI bus parameters // The SPI bus parameters
// Variables as they need to be passed as pointers later on // Variables as they need to be passed as pointers later on
const static char *spiDev0 = "/dev/spidev0.0" ; static const char *spiDev0 = "/dev/spidev0.0" ;
const static char *spiDev1 = "/dev/spidev0.1" ; static const char *spiDev1 = "/dev/spidev0.1" ;
const static uint8_t spiMode = 0 ; static const uint8_t spiBPW = 8 ;
const static uint8_t spiBPW = 8 ; static const uint16_t spiDelay = 0 ;
const static uint16_t spiDelay = 0 ;
static uint32_t spiSpeeds [2] ; static uint32_t spiSpeeds [2] ;
static int spiFds [2] ; static int spiFds [2] ;
@ -75,6 +75,11 @@ int wiringPiSPIDataRW (int channel, unsigned char *data, int len)
channel &= 1 ; channel &= 1 ;
// Mentioned in spidev.h but not used in the original kernel documentation
// test program )-:
memset (&spi, 0, sizeof (spi)) ;
spi.tx_buf = (unsigned long)data ; spi.tx_buf = (unsigned long)data ;
spi.rx_buf = (unsigned long)data ; spi.rx_buf = (unsigned long)data ;
spi.len = len ; spi.len = len ;
@ -87,16 +92,17 @@ int wiringPiSPIDataRW (int channel, unsigned char *data, int len)
/* /*
* wiringPiSPISetup: * wiringPiSPISetupMode:
* Open the SPI device, and set it up, etc. * Open the SPI device, and set it up, with the mode, etc.
********************************************************************************* *********************************************************************************
*/ */
int wiringPiSPISetup (int channel, int speed) int wiringPiSPISetupMode (int channel, int speed, int mode)
{ {
int fd ; int fd ;
channel &= 1 ; mode &= 3 ; // Mode is 0, 1, 2 or 3
channel &= 1 ; // Channel is 0 or 1
if ((fd = open (channel == 0 ? spiDev0 : spiDev1, O_RDWR)) < 0) if ((fd = open (channel == 0 ? spiDev0 : spiDev1, 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)) ;
@ -105,12 +111,10 @@ int wiringPiSPISetup (int channel, int speed)
spiFds [channel] = fd ; spiFds [channel] = fd ;
// Set SPI parameters. // Set SPI parameters.
// Why are we reading it afterwriting it? I've no idea, but for now I'm blindly
// copying example code I've seen online...
if (ioctl (fd, SPI_IOC_WR_MODE, &spiMode) < 0) if (ioctl (fd, SPI_IOC_WR_MODE, &mode) < 0)
return wiringPiFailure (WPI_ALMOST, "SPI Mode Change failure: %s\n", strerror (errno)) ; return wiringPiFailure (WPI_ALMOST, "SPI Mode Change failure: %s\n", strerror (errno)) ;
if (ioctl (fd, SPI_IOC_WR_BITS_PER_WORD, &spiBPW) < 0) if (ioctl (fd, SPI_IOC_WR_BITS_PER_WORD, &spiBPW) < 0)
return wiringPiFailure (WPI_ALMOST, "SPI BPW Change failure: %s\n", strerror (errno)) ; return wiringPiFailure (WPI_ALMOST, "SPI BPW Change failure: %s\n", strerror (errno)) ;
@ -119,3 +123,15 @@ int wiringPiSPISetup (int channel, int speed)
return fd ; return fd ;
} }
/*
* wiringPiSPISetup:
* Open the SPI device, and set it up, etc. in the default MODE 0
*********************************************************************************
*/
int wiringPiSPISetup (int channel, int speed)
{
return wiringPiSPISetupMode (channel, speed, 0) ;
}

View File

@ -28,6 +28,7 @@ extern "C" {
int wiringPiSPIGetFd (int channel) ; int wiringPiSPIGetFd (int channel) ;
int wiringPiSPIDataRW (int channel, unsigned char *data, int len) ; int wiringPiSPIDataRW (int channel, unsigned char *data, int len) ;
int wiringPiSPISetupMode (int channel, int speed, int mode) ;
int wiringPiSPISetup (int channel, int speed) ; int wiringPiSPISetup (int channel, int speed) ;
#ifdef __cplusplus #ifdef __cplusplus