diff --git a/README.md b/README.md index bbeb627..bc7cc96 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,16 @@ This is a GPIO access library for NanoPi. It is based on the WiringOP for Orange Currently supported boards: NanoPi Neo -NanoPi Neo Air -NanoPi Duo +NanoPi Neo Air +NanoPi Duo NanoPi NEO2 -NanoPi NEO Plus2 +NanoPi NEO Plus2 NanoPi M1 -NanoPi M1 Plus - +NanoPi M1 Plus +NanoPi NEO Core +NanoPi NEO Core2 +NanoPi K1 Plus + # Installation ## Install WiringNP @@ -26,34 +29,63 @@ The WiringNP library contains a set of gpio commands. Users can use them to acce ``` 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 - +-----+-----+----------+------+---+-NanoPi NEO/NEO2--+------+----------+-----+-----+ + +-----+-----+----------+------+---+-NanoPi-NEO-Core--+------+----------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+ - | | | 3.3V | | | 1 || 2 | | | 5V | | | - | 12 | 8 | GPIOA12 | OFF | 0 | 3 || 4 | | | 5V | | | - | 11 | 9 | GPIOA11 | OFF | 0 | 5 || 6 | | | 0v | | | - | 203 | 7 | GPIOG11 | OUT | 1 | 7 || 8 | 0 | OFF | GPIOG6 | 15 | 198 | - | | | 0v | | | 9 || 10 | 0 | OFF | GPIOG7 | 16 | 199 | - | 0 | 0 | GPIOA0 | OFF | 0 | 11 || 12 | 0 | OFF | GPIOA6 | 1 | 6 | + | | | 3.3v | | | 1 || 2 | | | 5v | | | + | 12 | 8 | GPIOA12 | ALT5 | 0 | 3 || 4 | | | 5v | | | + | 11 | 9 | GPIOA11 | ALT5 | 0 | 5 || 6 | | | 0v | | | + | 203 | 7 | GPIOG11 | OUT | 1 | 7 || 8 | 0 | ALT5 | GPIOG6 | 15 | 198 | + | | | 0v | | | 9 || 10 | 0 | ALT5 | GPIOG7 | 16 | 199 | + | 0 | 0 | GPIOA0 | OUT | 0 | 11 || 12 | 1 | OUT | GPIOA6 | 1 | 6 | | 2 | 2 | GPIOA2 | OFF | 0 | 13 || 14 | | | 0v | | | | 3 | 3 | GPIOA3 | OFF | 0 | 15 || 16 | 0 | OFF | GPIOG8 | 4 | 200 | - | | | 3.3v | | | 17 || 18 | 0 | OFF | GPIOG9 | 5 | 201 | - | 64 | 12 | GPIOC0 | OFF | 0 | 19 || 20 | | | 0v | | | - | 65 | 13 | GPIOC1 | OFF | 0 | 21 || 22 | 0 | OFF | GPIOA1 | 6 | 1 | - | 66 | 14 | GPIOC2 | OFF | 0 | 23 || 24 | 0 | OFF | GPIOC3 | 10 | 67 | + | | | 3.3v | | | 17 || 18 | 0 | ALT2 | GPIOG9 | 5 | 201 | + | 64 | 12 | GPIOC0 | ALT4 | 0 | 19 || 20 | | | 0v | | | + | 65 | 13 | GPIOC1 | ALT4 | 0 | 21 || 22 | 1 | OUT | GPIOA1 | 6 | 1 | + | 66 | 14 | GPIOC2 | ALT4 | 0 | 23 || 24 | 1 | OUT | GPIOC3 | 10 | 67 | +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | - +-----+-----+----------+------+---+-NanoPi NEO/NEO2--+------+----------+-----+-----+ - - +-----+----NanoPi NEO/NEO2 Debug UART-+----+ - | BCM | wPi | Name | Mode | V | Ph | - +-----+-----+----------+------+---+----+ - | 4 | 17 | GPIOA4 | ALT5 | 0 | 37 | - | 5 | 18 | GPIOA5 | ALT4 | 0 | 38 | - +-----+-----+----------+------+---+----+ + +-----+-----+----------+------+---+-NanoPi-NEO-Core--+------+----------+-----+-----+ + + +-----+-----+----------+---- NanoPi-NEO-Core USB/Audio ----+----------+-----+-----+ + | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | + +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+ + | | | 5v | | | 25 || 26 | 0 | ALT4 | GPIOA15 | 22 | 15 | + | | | 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 connect a LED module to a NanoPi (Pin7), Make a C source file: diff --git a/gpio/gpio.c b/gpio/gpio.c index 35f4753..7be7682 100644 --- a/gpio/gpio.c +++ b/gpio/gpio.c @@ -1133,10 +1133,8 @@ int main (int argc, char *argv []) int boardId; boardId = getBoardType(&retBoardInfo); if (boardId >= 0) { - if (boardId > ALLWINNER_BASE && boardId <= ALLWINNER_MAX - && boardId != NanoPi_A64 - && boardId != NanoPi_NEO_Core) { + && boardId != NanoPi_A64) { printf ("NanoPi Details:\n") ; printf (" Type: %s, Revision: %d, Maker: FriednlyELEC\n\n", retBoardInfo->boardDisplayName, retBoardInfo->kernelRevision) ; diff --git a/gpio/readall.c b/gpio/readall.c index 3c7a0b4..508fd72 100644 --- a/gpio/readall.c +++ b/gpio/readall.c @@ -80,8 +80,9 @@ static char *alts [] = "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, -1, // 1, 2 @@ -104,12 +105,15 @@ static int physToWpi_m1 [64] = 24, 27, //35, 36 25, 28, //37, 38 -1, 29, //39, 40 - -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, 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 + + /* 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, @@ -132,23 +136,27 @@ static char *physNames_m1 [64] = " GPIO.23", "0v ", " GPIO.24", "CTS1 ", " GPIO.25", "TxD1 ", - " 0v", "RxD1 ", + " 0v", "RxD1 ", //39, 40 " 0v", " 5v", " GPIO.4", " GPIO.5", NULL, NULL, NULL, NULL, - NULL, NULL, + NULL, NULL, //49, 50 "GPIO.17", "GPIO.18", "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 + /* 24pins */ -1, -1, // 1, 2 8, -1, // 3, 4 9, -1, // 5, 6 @@ -162,26 +170,28 @@ static int physToWpi_neo [64] = 13, 6, //21, 22 14, 10, //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 + /* 12pins */ + -1, -1, //25, 26 -> 1, 2 + -1, -1, //27, 28 -> 3, 4 + -1, -1, //29, 30 -> 5, 6 "GPIOL11 " + 19, -1, //31, 32 -> 7, 8 + -1, -1, //33, 34 -> 9, 10 + -1, -1, //35, 36 -> 11, 12 17, 18, //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, -} ; -//guenter ende -//guenter orange pi -static char *physNames_neo [64] = + /* 64~73 */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +} ; + +static char *physNames_neo [MAX_PIN_COUNT] = { NULL, -/* 24 Pin */ + /* 24 Pin */ " 3.3V", "5V ", " GPIOA12", "5V ", " GPIOA11", "0v ", @@ -195,16 +205,21 @@ static char *physNames_neo [64] = " GPIOC1", "GPIOA1 ", " GPIOC2", "GPIOC3 ", -/* 12 Pin */ - NULL, NULL, - NULL, NULL, - NULL, NULL, - NULL, NULL, - NULL, NULL, - NULL, NULL, - + /* 12 Pin */ + " 5V", " USB-DP1", //25, 26 -> 1, 2 + " USB-DM1", " USB-DP2", //27, 28 -> 3, 4 + " USB-DM2", " IR-RX", //29, 30 -> 5, 6 "GPIOL11 " + " GPIOA17", " PCM/I2C", //31, 32 -> 7, 8 + " PCM/I2C", " PCM/I2C", //33, 34 -> 9, 10 + " PCM/I2C", " 0V", //35, 36 -> 11, 12 + /* UART0, tx, rx */ " GPIOA4", " GPIOA5", + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, //47, 48 NULL, NULL, NULL, NULL, @@ -213,15 +228,17 @@ static char *physNames_neo [64] = NULL, NULL, NULL, NULL, NULL, NULL, + NULL, //63 + + //64 ~ 73 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, -1, // 1, 2 @@ -250,9 +267,12 @@ static int physToWpi_duo [64] = /* 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, } ; -static char *physNames_duo [64] = +static char *physNames_duo [MAX_PIN_COUNT] = { NULL, /* 32 Pin */ @@ -268,11 +288,11 @@ static char *physNames_duo [64] = " GPIOA14", "USB-DM3 ", " GPIOA13", "GPIOG11 ", " GPIOA12", "IR-RX ", - " GPIOA11", "0v ", //25, 26 + " GPIOA11", "0v ", //25, 26 " 0v", "3.3v ", " GPIOA4", "5v ", " GPIOA5", "5v ", - /* ---------nanopi duo end----------- */ + /* ---------nanopi duo end----------- */ NULL, NULL, NULL, NULL, @@ -280,22 +300,124 @@ static char *physNames_duo [64] = /* UART0, tx, rx */ 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, - NULL + NULL, NULL, //71, 72 + NULL //73 } ; +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: * 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; 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; physNames = physNames_m1; } 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) { physToWpi = physToWpi_duo; physNames = physNames_duo; + } else if (boardId == NanoPi_NEO_Core || boardId == NanoPi_NEO_Core2) { + physToWpi = physToWpi_neocore; + physNames = physNames_neocore; } else { return ; } @@ -391,8 +516,6 @@ static void readallPhys (int boardId, int physPin, int pair) printf (" |\n") ; } - -//guenter void NanoPiReadAll() { int pin ; @@ -401,8 +524,7 @@ void NanoPiReadAll() boardId = getBoardType(&retBoardInfo); if (boardId >= 0) { if (boardId > ALLWINNER_BASE && boardId <= ALLWINNER_MAX - && boardId != NanoPi_A64 - && boardId != NanoPi_NEO_Core) { + && boardId != NanoPi_A64) { // nothing to do. } else { printf ("This NanoPi model is currently not supported. ") ; @@ -416,9 +538,15 @@ void NanoPiReadAll() } 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; - } 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; } else if (boardId == NanoPi_Duo) { pinCount = 32; @@ -426,7 +554,7 @@ void NanoPiReadAll() return ; } - + /* Print 1 ~ 24/40 pins */ printf (" +-----+-----+----------+------+---+-%s--+------+----------+-----+-----+\n", retBoardInfo->boardDisplayName) ; printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ; printf (" +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+\n") ; @@ -437,8 +565,45 @@ void NanoPiReadAll() printf (" +-----+-----+----------+------+---+-%s--+------+----------+-----+-----+\n", retBoardInfo->boardDisplayName) ; 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 (" | BCM | wPi | Name | Mode | V | Ph |\n") ; printf (" +-----+-----+----------+------+---+----+\n") ; @@ -446,6 +611,7 @@ void NanoPiReadAll() readallPhys (boardId, pin, 0) ; } printf (" +-----+-----+----------+------+---+----+\n") ; + printf ("\n"); } else if (boardId == NanoPi_NEO || boardId == NanoPi_NEO_Air || boardId == NanoPi_NEO2 || boardId == NanoPi_NEO_Plus2) { printf (" +-----+----%s Debug UART-+----+\n", retBoardInfo->boardDisplayName) ; printf (" | BCM | wPi | Name | Mode | V | Ph |\n") ; @@ -454,11 +620,11 @@ void NanoPiReadAll() readallPhys (boardId, pin, 0) ; } 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. } } -//guenter ende void doReadall (void) { diff --git a/wiringPi/boardtype_friendlyelec.c b/wiringPi/boardtype_friendlyelec.c index c88ec58..4a7a31c 100644 --- a/wiringPi/boardtype_friendlyelec.c +++ b/wiringPi/boardtype_friendlyelec.c @@ -26,8 +26,8 @@ BoardHardwareInfo gAllBoardHardwareInfo[] = { //s5p6818 {"nanopi3", 1, NanoPC_T3, "NanoPC-T3",""}, - {"nanopi3", 2, NanoPi_S3, "NanoPi-S3",""}, - {"nanopi3", 3, Smart6818, "Smart6818",""}, + {"nanopi3", 4, NanoPC_T3T, "NanoPC-T3T",""}, + {"nanopi3", 5, NanoPi_Fire3, "NanoPi-Fire3",""}, {"nanopi3", 7, NanoPi_M3, "NanoPi-M3",""}, //allwinner h3 @@ -36,8 +36,9 @@ BoardHardwareInfo gAllBoardHardwareInfo[] = { {"sun8i", 0, NanoPi_NEO, "NanoPi-NEO", "1(0)"}, {"sun8i", 0, NanoPi_NEO_Air, "NanoPi-NEO-Air", "2(0)"}, {"sun8i", 0, NanoPi_M1_Plus, "NanoPi-M1-Plus", "3(0)"}, - {"sun8i", 0, NanoPi_Duo, "NanoPi-Duo", "4(0)"}, - {"sun8i", 0, NanoPi_NEO_Core, "NanoPi-NEO-Core", "5(0)"}, + {"sun8i", 0, NanoPi_Duo, "NanoPi-Duo", "4(0)"}, + {"sun8i", 0, NanoPi_NEO_Core, "NanoPi-NEO-Core", "5(0)"}, + {"sun8i", 0, NanoPi_K1, "NanoPi-K1", "6(0)"}, // kernel 4.x {"Allwinnersun8iFamily", 0, NanoPi_M1, "NanoPi-M1", "0(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_Duo, "NanoPi-Duo", "4(0)"}, {"Allwinnersun8iFamily", 0, NanoPi_NEO_Core, "NanoPi-NEO-Core", "5(0)"}, + {"Allwinnersun8iFamily", 0, NanoPi_K1, "NanoPi-K1", "6(0)"}, // a64 @@ -55,10 +57,15 @@ BoardHardwareInfo gAllBoardHardwareInfo[] = { {"sun50iw2", 4, NanoPi_NEO2, "NanoPi-NEO2", "1(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_Core2, "NanoPi-NEO-Core2", "0(0)"}, + {"sun50iw2", 4, NanoPi_K1_Plus, "NanoPi-K1-Plus", "4(0)"}, + // kernel 4.x {"Allwinnersun50iw2Family", 4, NanoPi_NEO2, "NanoPi-NEO2", "1(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_Core2, "NanoPi-NEO-Core2", "0(0)"}, + {"Allwinnersun50iw2Family", 4, NanoPi_K1_Plus, "NanoPi-K1-Plus", "4(0)"}, //k2 {"Amlogic", 0, NanoPi_K2, "NanoPi-K2", ""}, @@ -67,14 +74,16 @@ BoardHardwareInfo gAllBoardHardwareInfo[] = { static int getFieldValueInCpuInfo(char* hardware, int hardwareMaxLen, char* revision, int revisionMaxLen ) { int n,i,j; - char lineUntrim[1024], line[1024],*p,*p2; + char lineUntrim[1024], line[1024],line2[1024],*p,*p2; FILE *f; int isGotHardware = 0; int isGotRevision = 0; - if (!(f = fopen("/proc/cpuinfo", "r"))) { - LOGE("open /proc/cpuinfo failed."); - return -1; + if (!(f = fopen("/sys/devices/platform/board/info", "r"))) { + if (!(f = fopen("/proc/cpuinfo", "r"))) { + LOGE("open /proc/cpuinfo failed."); + return -1; + } } while (!feof(f)) { @@ -92,41 +101,31 @@ static int getFieldValueInCpuInfo(char* hardware, int hardwareMaxLen, char* revi n = strlen(line); if (n>0) { //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 (p = strtok(line, ":")) { - if (strncasecmp(p, "Hardware", strlen("Hardware")) == 0) { - if (p = strtok(0, ":")) { - memset(hardware,0,hardwareMaxLen); - strncpy(hardware, p, hardwareMaxLen-1); - isGotHardware = 1; - } - 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; + 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; 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; } diff --git a/wiringPi/boardtype_friendlyelec.h b/wiringPi/boardtype_friendlyelec.h index 00c237a..a57bf3e 100644 --- a/wiringPi/boardtype_friendlyelec.h +++ b/wiringPi/boardtype_friendlyelec.h @@ -39,9 +39,8 @@ typedef struct { //s5p6818 #define S5P6818_BASE (6818) #define NanoPC_T3 (S5P6818_BASE+1) -#define NanoPi_S3 (S5P6818_BASE+2) -#define Smart6818 (S5P6818_BASE+3) #define NanoPC_T3T (S5P6818_BASE+4) +#define NanoPi_Fire3 (S5P6818_BASE+5) #define NanoPi_M3 (S5P6818_BASE+7) #define S5P6818_MAX NanoPi_M3 @@ -62,7 +61,10 @@ typedef struct { #define NanoPi_NEO_Plus2 (ALLWINNER_BASE+8) #define NanoPi_NEO_Core (ALLWINNER_BASE+9) #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 #define AMLOGIC_BASE (8000) diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c index 76cbfd4..5e3f2fc 100644 --- a/wiringPi/wiringPi.c +++ b/wiringPi/wiringPi.c @@ -86,11 +86,6 @@ #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; // BCM Magic @@ -267,11 +262,16 @@ int wiringPiReturnCodes = FALSE; // sysFds: // 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, + + /* 64~73 */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }; // ISR Data @@ -284,6 +284,7 @@ static int upDnConvert[3] = {7, 7, 5}; static int *pinToGpio = 0; static int *physToGpio = 0; static int *physToPin = 0; +static int *syspin = 0; // Doing it the Arduino way with lookup tables... @@ -305,7 +306,8 @@ static int *physToPin = 0; // 192 - 223 = PG00-PG31 // 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 2, 3, // 2, 3 200, 201, // 4 5 @@ -326,44 +328,50 @@ static int pinToGpio_m1 [64] ={ 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, -1, -1, // ... 63 + + /* 64~73 */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }; - -static int pinToGpio_neo [64] ={ +// wPi number to /sys/gpio number +static int pinToGpio_neo [MAX_PIN_COUNT] ={ 0, //0 - /* 24 Pin */ + /* 24 Pin */ 6, 2, //1, 2 3, 200, //3, 4 201, 1, //5, 6 - 203, 12, //7, 8 + 203, 12, //7, 8 11, 67, //9, 10 - -1, 64, //11, 12 - 65, 66, //13, 14 - 198, 199, //15, 16 + -1, 64, //11, 12 + 65, 66, //13, 14 + 198, 199, //15, 16 4, 5, //17, 18 - -1, -1, //19, 20 - -1, 1, //21, 22 - -1, -1, //23, 24 + 17, -1, //19, 20 + -1, 1, //21, 22 + -1, -1, //23, 24 - /* 12 Pin */ - -1, -1, //25, 26 - -1, -1, //27, 28 - -1, -1, //29, 30 - -1, -1, //31, 32 - -1, -1, //33, 34 - -1, -1, //35, 36 + /* 12 Pin */ + -1, -1, //25, 26 + -1, -1, //27, 28 + -1, -1, //29, 30 + -1, -1, //31, 32 + -1, -1, //33, 34 + -1, -1, //35, 36 - /* UART0 Tx,Rx */ - -1, -1, //37, 38 + /* UART0 Tx,Rx */ + -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, + -1, -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 -static int pinToGpio_duo [64] ={ +static int pinToGpio_duo [MAX_PIN_COUNT] ={ 16, //0 /* 32 Pin */ -1, 14, //1, 2 @@ -393,8 +401,46 @@ static int pinToGpio_duo [64] ={ /* 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, }; -// 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 -static int physToGpio_neo [64] ={ +static int physToGpio_neo [MAX_PIN_COUNT] ={ -1, /* 24 Pin */ -1, -1, //1, 2 @@ -446,7 +492,7 @@ static int physToGpio_neo [64] ={ -1, -1, //25, 26 -1, -1, //27, 28 -1, -1, //29, 30 - -1, -1, //31, 32 + 17, -1, //31, 32 -1, -1, //33, 34 -1, -1, //35, 36 @@ -456,10 +502,62 @@ static int physToGpio_neo [64] ={ /* 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, }; -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, -1, // 1, 2 12, -1, // 3, 4 @@ -483,11 +581,14 @@ static int physToGpio_m1 [64] ={ -1, 14, //39, 40 -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 + + /* 64~73 */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }; // phys pin number to /sys/gpio number -static int physToGpio_duo [64] ={ +static int physToGpio_duo [MAX_PIN_COUNT] ={ -1, //0 /* 32 Pin */ -1, -1, //1, 2 @@ -517,28 +618,75 @@ static int physToGpio_duo [64] ={ /* 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, }; // -static int syspin [64] ={ - -1, -1, 2, 3, 4, 5, 6, 7, //GPIO0,1 used to I2C +static int syspin_neo [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 [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 8, 9, 10, 11, -1, -1, 14, 15, -1, 17, -1, -1, -1, -1, 22, 23, 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, + + // 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, -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, // ... 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, -1, // 1, 2 @@ -587,7 +738,7 @@ static int physToPin_neo [64] = //return wiringPI pin -1, -1, //25, 26 -1, -1, //27, 28 -1, -1, //29, 30 - -1, -1, //31, 32 + 19, -1, //31, 32 -1, -1, //33, 34 -1, -1, //35, 36 @@ -596,9 +747,62 @@ static int physToPin_neo [64] = //return wiringPI pin /* 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, }; -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, -1, // 1, 2 @@ -627,6 +831,9 @@ static int physToPin_duo [64] = //return wiringPI pin //note: same as physToWpi /* 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, }; // pins available on pin out by banks @@ -1075,7 +1282,6 @@ int isA20(void) { return 0; } } -/* guenter ende */ int piBoardRev(void) { BoardHardwareInfo* retBoardInfo; @@ -1083,8 +1289,7 @@ int piBoardRev(void) { boardId = getBoardType(&retBoardInfo); if (boardId >= 0) { if (boardId > ALLWINNER_BASE && boardId <= ALLWINNER_MAX - && boardId != NanoPi_A64 - && boardId != NanoPi_NEO_Core) { + && boardId != NanoPi_A64) { version = BPRVER; if (wiringPiDebug) printf("piBoardRev: %d\n", version); @@ -1119,8 +1324,7 @@ void piBoardId(int *model, int *rev, int *mem, int *maker, int *overVolted) { boardId = getBoardType(&retBoardInfo); if (boardId >= 0) { if (boardId > ALLWINNER_BASE && boardId <= ALLWINNER_MAX - && boardId != NanoPi_A64 - && boardId != NanoPi_NEO_Core) { + && boardId != NanoPi_A64) { *model = boardId; *rev = PI_VERSION_1_2; *mem = 1024; @@ -1152,7 +1356,11 @@ int wpiPinToGpio(int wpiPin) { printf("please call wiringPiSetup first.\n"); 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"); 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"); 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 alt; - pin &= 63; - + if (pin >= MAX_PIN_COUNT || pin < 0) { + printf("Invalid pin index.\n"); + return -1; + } + if (pinToGpio == 0 || physToGpio == 0) { printf("please call wiringPiSetup first.\n"); return -1; @@ -1216,8 +1435,7 @@ int getAlt(int pin) { pin = pinToGpio [pin]; else if (wiringPiMode == WPI_MODE_PHYS) pin = physToGpio[pin]; - else if (wiringPiMode == WPI_MODE_GPIO) - //pin = pinTobcm[pin]; + else if (wiringPiMode == WPI_MODE_GPIO) //pin = pinTobcm[pin]; pin = pin; else return 0; @@ -1334,12 +1552,10 @@ struct wiringPiNodeStruct *wiringPiNewNode(int pinBase, int numPins) { struct wiringPiNodeStruct *node; // Minimum pin base is 64 - if (pinBase < 64) (void)wiringPiFailure(WPI_FATAL, "wiringPiNewNode: pinBase of %d is < 64\n", pinBase); // Check all pins in-case there is overlap: - for (pin = pinBase; pin < (pinBase + numPins); ++pin) if (wiringPiFindNode(pin) != NULL) (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) { - struct wiringPiNodeStruct *node = wiringPiNodes; + struct wiringPiNodeStruct *node = wiringPiNodes; - if (wiringPiDebug) - printf("Func: %s, Line: %d,pin:%d,mode:%d\n", __func__, __LINE__, pin, mode); + if (wiringPiDebug) + printf("Func: %s, Line: %d,pin:%d,mode:%d\n", __func__, __LINE__, pin, mode); - if (pinToGpio == 0 || physToGpio == 0) { - printf("please call wiringPiSetup first.\n"); - return -1; - } + if (pinToGpio == 0 || physToGpio == 0) { + printf("please call wiringPiSetup first.\n"); + return -1; + } - if ((pin & PI_GPIO_MASK) == 0) // On-board pin - { - if (wiringPiMode == WPI_MODE_PINS) { - pin = pinToGpio [pin]; - if (wiringPiDebug) { - printf(">>> pinToGpio[pin] ret %d\n", pin); - } - } else if (wiringPiMode == WPI_MODE_PHYS) { - pin = physToGpio[pin]; - if (wiringPiDebug) { - printf(">>> physToGpio[pin] ret %d\n", pin); - } - } else if (wiringPiMode == WPI_MODE_GPIO) { - // pin = pinTobcm[pin]; - pin = pin; + // On-board pin + if (pin > 0 && pin < MAX_PIN_COUNT) { + if (wiringPiMode == WPI_MODE_PINS) { + pin = pinToGpio [pin]; + if (wiringPiDebug) { + printf(">>> pinToGpio[pin] ret %d\n", pin); + } + } else if (wiringPiMode == WPI_MODE_PHYS) { + pin = physToGpio[pin]; + if (wiringPiDebug) { + printf(">>> physToGpio[pin] ret %d\n", pin); + } + } else if (wiringPiMode == WPI_MODE_GPIO) { // pin = pinTobcm[pin]; - if (wiringPiDebug) { - printf(">>> pinTobcm[pin] ret %d\n", pin); - } + pin = pin; - } else { - if (wiringPiDebug) { - printf(">>> unknow wiringPiMode\n"); - } - return; - } + if (wiringPiDebug) { + printf(">>> pinTobcm[pin] ret %d\n", pin); + } - 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 { - if ((node = wiringPiFindNode(pin)) != NULL) - node->pinMode(node, pin, mode); + if (wiringPiDebug) { + 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; + } + //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]; - if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin - { + if (pin > 0 && pin < MAX_PIN_COUNT) { if (wiringPiMode == WPI_MODE_PINS) pin = pinToGpio [pin]; else if (wiringPiMode == WPI_MODE_PHYS) @@ -1524,8 +1741,7 @@ int digitalRead(int pin) { 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 (wiringPiDebug) { @@ -1536,10 +1752,15 @@ int digitalRead(int pin) { //printf("%d %s,%d invalid pin,please check it over.\n",pin,__func__, __LINE__); return 0; } + + //TODO: fix me + /* if (syspin[pin] == -1) { //printf("%d %s,%d invalid pin,please check it over.\n",pin,__func__, __LINE__); return 0; } + */ + if (sysFds [pin] == -1) { if (wiringPiDebug) printf("pin %d sysFds -1.%s,%d\n", pin, __func__, __LINE__); @@ -1596,25 +1817,31 @@ void digitalWrite(int pin, int value) { if (wiringPiDebug) 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 (wiringPiDebug) { printf("%d %s,%d invalid pin,please check it over.\n", pin, __func__, __LINE__); } 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; } + + //TODO: fix me + /* 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; } + */ + if (sysFds [pin] == -1) { if (wiringPiDebug) printf("pin %d sysFds -1.%s,%d\n", pin, __func__, __LINE__); } + if (sysFds [pin] != -1) { if (wiringPiDebug) 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"); - if ((pin < 0) || (pin > 63)) - return wiringPiFailure(WPI_FATAL, "wiringPiISR: pin must be 0-63 (%d)\n", pin); + if ((pin < 0) || (pin >= MAX_PIN_COUNT)) + return wiringPiFailure(WPI_FATAL, "wiringPiISR: pin must be 0-%d (%d)\n", MAX_PIN_COUNT-1,pin); /**/ if (wiringPiMode == WPI_MODE_UNINITIALISED) 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; 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; physToGpio = physToGpio_m1; physToPin = physToPin_m1; + syspin = syspin_m1; } else if (boardId == NanoPi_NEO || boardId == NanoPi_NEO_Air || boardId == NanoPi_NEO2 || boardId == NanoPi_NEO_Plus2) { pinToGpio = pinToGpio_neo; physToGpio = physToGpio_neo; physToPin = physToPin_neo; + syspin = syspin_neo; } else if (boardId == NanoPi_Duo) { pinToGpio = pinToGpio_duo; physToGpio = physToGpio_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 { return -1; } @@ -2191,20 +2426,9 @@ int wiringPiSetupSys(void) { if (wiringPiDebug) 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); 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; physToGpio = physToGpio_m1; physToPin = physToPin_m1; @@ -2216,7 +2440,20 @@ int wiringPiSetupSys(void) { pinToGpio = pinToGpio_duo; physToGpio = physToGpio_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; } diff --git a/wiringPi/wiringPiSPI.c b/wiringPi/wiringPiSPI.c index 215a027..020822f 100644 --- a/wiringPi/wiringPiSPI.c +++ b/wiringPi/wiringPiSPI.c @@ -1,7 +1,7 @@ /* * wiringPiSPI.c: * Simplified SPI access routines - * Copyright (c) 2012 Gordon Henderson + * Copyright (c) 2012-2015 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ @@ -28,6 +28,7 @@ #include #include #include +#include #include #include "wiringPi.h" @@ -38,11 +39,10 @@ // The SPI bus parameters // Variables as they need to be passed as pointers later on -const static char *spiDev0 = "/dev/spidev0.0" ; -const static char *spiDev1 = "/dev/spidev0.1" ; -const static uint8_t spiMode = 0 ; -const static uint8_t spiBPW = 8 ; -const static uint16_t spiDelay = 0 ; +static const char *spiDev0 = "/dev/spidev0.0" ; +static const char *spiDev1 = "/dev/spidev0.1" ; +static const uint8_t spiBPW = 8 ; +static const uint16_t spiDelay = 0 ; static uint32_t spiSpeeds [2] ; static int spiFds [2] ; @@ -75,6 +75,11 @@ int wiringPiSPIDataRW (int channel, unsigned char *data, int len) 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.rx_buf = (unsigned long)data ; spi.len = len ; @@ -87,16 +92,17 @@ int wiringPiSPIDataRW (int channel, unsigned char *data, int len) /* - * wiringPiSPISetup: - * Open the SPI device, and set it up, etc. + * wiringPiSPISetupMode: + * 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 ; - 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) 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 ; // 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)) ; - + if (ioctl (fd, SPI_IOC_WR_BITS_PER_WORD, &spiBPW) < 0) return wiringPiFailure (WPI_ALMOST, "SPI BPW Change failure: %s\n", strerror (errno)) ; @@ -119,3 +123,15 @@ int wiringPiSPISetup (int channel, int speed) 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) ; +} diff --git a/wiringPi/wiringPiSPI.h b/wiringPi/wiringPiSPI.h index f53697d..48cb7be 100644 --- a/wiringPi/wiringPiSPI.h +++ b/wiringPi/wiringPiSPI.h @@ -28,6 +28,7 @@ extern "C" { int wiringPiSPIGetFd (int channel) ; int wiringPiSPIDataRW (int channel, unsigned char *data, int len) ; +int wiringPiSPISetupMode (int channel, int speed, int mode) ; int wiringPiSPISetup (int channel, int speed) ; #ifdef __cplusplus