add support for NanoPi-Duo2

This commit is contained in:
Lawrence-Tang 2018-11-06 07:42:05 +00:00
parent 6a608ee8ab
commit 9a6860b4bd
7 changed files with 680 additions and 282 deletions

1
.gitignore vendored
View File

@ -1,4 +1,5 @@
*.o
/gpio/gpio
libwiringPiDev.so.2.0
libwiringPi.so.2.0
/test/

View File

@ -5,6 +5,7 @@ Currently supported boards:
NanoPi Neo
NanoPi Neo Air
NanoPi Duo
NanoPi Duo2
NanoPi NEO2
NanoPi NEO Plus2
NanoPi M1

View File

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

View File

@ -42,6 +42,8 @@ extern int wpMode ;
# define FALSE (1==2)
#endif
#define DEBUG_READALL 0
/*
* doReadallExternal:
* A relatively crude way to read the pins on an external device.
@ -252,7 +254,7 @@ static int physToWpi_duo [MAX_PIN_COUNT] =
0, -1, //17, 18
2, -1, //19, 20
3, 16, //21, 22
12, -1, //23, 24
12, 18, //23, 24
13, -1, //25, 26
-1, -1, //27, 28
@ -287,7 +289,7 @@ static char *physNames_duo [MAX_PIN_COUNT] =
" GPIOA16", "USB-DP3 ",
" GPIOA14", "USB-DM3 ",
" GPIOA13", "GPIOG11 ",
" GPIOA12", "IR-RX ",
" GPIOA12", "GPIOL11 ",
" GPIOA11", "0v ", //25, 26
" 0v", "3.3v ",
" GPIOA4", "5v ",
@ -320,6 +322,91 @@ static char *physNames_duo [MAX_PIN_COUNT] =
NULL //73
} ;
static int physToWpi_duo2 [MAX_PIN_COUNT] =
{
-1, // 0
-1, 15, // 1, 2
-1, 14, // 3, 4
-1, -1, // 5, 6
-1, 13, // 7, 8
18, 12, // 9, 10
16, 3, //11, 12
-1, 2, //13, 14
-1, 0, //15, 16
-1, 7, //17, 18
-1, 9, //19, 20
-1, 8, //21, 22
-1, -1, //23, 24
-1, -1, //25, 26
-1, -1, //27, 28
-1, -1, //29, 30
-1, -1, //31, 32
/* ---------nanopi duo end----------- */
-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,
} ;
static char *physNames_duo2 [MAX_PIN_COUNT] =
{
NULL,
// 32 Pin
" 5v", "GPIOA5 ",
" 5v", "GPIOA4 ",
" 3.3v", "0v ",
" 0v", "GPIOA11 ",
" GPIOL11", "GPIOA12 ",
" GPIOG11", "GPIOA13 ",
" USB-DM3", "GPIOA14 ", //13, 14
" USB-DP3", "GPIOA16 ",
" USB-DM2", "GPIOA15 ",
" USB-DP2", "GPIOG7 ",
" EPhyRXN", "GPIOG6 ",
" EPhyRXP", "CVBS ",
" EPhyTXN", "LineOutL", //25, 26
" EPhyTXP", "LineOutR",
"EPhyLinK", "MIC_P ",
" EPhySPD", "MIC_N ",
/* ---------nanopi duo end----------- */
NULL, NULL,
NULL, NULL,
/* 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, //71, 72
NULL //73
} ;
static int physToWpi_neocore [MAX_PIN_COUNT] =
{
@ -425,22 +512,25 @@ static char *physNames_neocore [MAX_PIN_COUNT] =
*********************************************************************************
*/
static void readallPhys (int boardId, int physPin, int pair)
static void readallPhys (int faBoardId, int physPin, int pair)
{
int pin ;
int *physToWpi;
char **physNames;
if (boardId == NanoPi_M1 || boardId == NanoPi_K1_Plus || boardId == NanoPi_M1_Plus || boardId == NanoPi_M1_Plus2) {
if (faBoardId == NanoPi_M1 || faBoardId == NanoPi_K1_Plus || faBoardId == NanoPi_M1_Plus || faBoardId == 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) {
} else if (faBoardId == NanoPi_NEO || faBoardId == NanoPi_NEO_Air || faBoardId == NanoPi_NEO2 || faBoardId == NanoPi_NEO_Plus2) {
physToWpi = physToWpi_neo;
physNames = physNames_neo;
} else if (boardId == NanoPi_Duo) {
} else if (faBoardId == NanoPi_Duo) {
physToWpi = physToWpi_duo;
physNames = physNames_duo;
} else if (boardId == NanoPi_NEO_Core || boardId == NanoPi_NEO_Core2) {
} else if (faBoardId == NanoPi_Duo2) {
physToWpi = physToWpi_duo2;
physNames = physNames_duo2;
} else if (faBoardId == NanoPi_NEO_Core || faBoardId == NanoPi_NEO_Core2) {
physToWpi = physToWpi_neocore;
physNames = physNames_neocore;
} else {
@ -469,8 +559,14 @@ static void readallPhys (int boardId, int physPin, int pair)
pin = physToWpi [physPin] ;
}
printf (" | %4s", alts [getAlt (pin)]) ;
printf (" | %d", digitalRead (pin)) ;
int alt = getAltSilence (pin);
if (alt >= 0) {
printf (" | %4s", alts [alt]) ;
} else {
printf (" | ") ;
}
printf (" | %d", digitalReadSilence (pin)) ;
}
// Pin numbers:
@ -502,8 +598,13 @@ static void readallPhys (int boardId, int physPin, int pair)
pin = physToWpi [physPin] ;
}
printf (" | %d", digitalRead (pin)) ;
printf (" | %-4s", alts [getAlt (pin)]) ;
printf (" | %d", digitalReadSilence (pin)) ;
int alt = getAltSilence (pin);
if (alt >= 0) {
printf (" | %4s", alts [alt]) ;
} else {
printf (" | ") ;
}
}
printf (" | %-5s", physNames [physPin]) ;
@ -516,18 +617,68 @@ static void readallPhys (int boardId, int physPin, int pair)
printf (" |\n") ;
}
static void debugReadallPhys (int faBoardId, int physPin)
{
int pin ;
int *physToWpi;
char **physNames;
if (faBoardId == NanoPi_M1 || faBoardId == NanoPi_K1_Plus || faBoardId == NanoPi_M1_Plus || faBoardId == NanoPi_M1_Plus2) {
physToWpi = physToWpi_m1;
physNames = physNames_m1;
} else if (faBoardId == NanoPi_NEO || faBoardId == NanoPi_NEO_Air || faBoardId == NanoPi_NEO2 || faBoardId == NanoPi_NEO_Plus2) {
physToWpi = physToWpi_neo;
physNames = physNames_neo;
} else if (faBoardId == NanoPi_Duo) {
physToWpi = physToWpi_duo;
physNames = physNames_duo;
} else if (faBoardId == NanoPi_Duo2) {
physToWpi = physToWpi_duo2;
physNames = physNames_duo2;
} else if (faBoardId == NanoPi_NEO_Core || faBoardId == NanoPi_NEO_Core2) {
physToWpi = physToWpi_neocore;
physNames = physNames_neocore;
} else {
return ;
}
printf("## physPin: %d, %s\n", physPin, physNames [physPin]);
if (physPinToGpio (physPin) == -1)
printf("\tnot gpio\n");
else
printf("\tphysPinToGpio=%d, physToWpi=%d\n", physPinToGpio (physPin), physToWpi [physPin]);
if (physToWpi [physPin] == -1) {
printf("\t\tnot Wpi pin\n");
} else {
if (wpMode == WPI_MODE_GPIO) {
pin = physPinToGpio (physPin) ;
printf("\t\tWPI_MODE_GPIO, physPinToGpio (physPin) = %d\n", pin);
} else if (wpMode == WPI_MODE_PHYS) {
pin = physPin ;
printf("\t\tWPI_MODE_PHYS, pin = physPin = %d\n", pin);
} else {
printf("\t\tUnknow Mode, physPin=%d, physToWpi [physPin] =%d\n", physPin, physToWpi [physPin]);
pin = physToWpi [physPin] ;
}
printf ("\t\t\talts = %4s\n", alts [getAltSilence (pin)]) ;
printf ("\t\t\tdigitalRead = %d\n", digitalReadSilence (pin)) ;
}
}
void NanoPiReadAll()
{
int pin ;
BoardHardwareInfo* retBoardInfo;
int boardId;
boardId = getBoardType(&retBoardInfo);
if (boardId >= 0) {
if (boardId > ALLWINNER_BASE && boardId <= ALLWINNER_MAX
&& boardId != NanoPi_A64) {
int ret = getBoardType(&retBoardInfo);
if (ret >= 0) {
if (retBoardInfo->boardTypeId > ALLWINNER_BASE
&& retBoardInfo->boardTypeId <= ALLWINNER_MAX
&& retBoardInfo->boardTypeId != NanoPi_A64) {
// nothing to do.
} else {
printf ("This NanoPi model is currently not supported. ") ;
printf ("This NanoPi model is currently not supported. \n") ;
return ;
}
} else {
@ -538,19 +689,32 @@ void NanoPiReadAll()
}
int pinCount;
if (boardId == NanoPi_M1 || boardId == NanoPi_K1_Plus || boardId == NanoPi_M1_Plus || boardId == NanoPi_M1_Plus2) {
if (retBoardInfo->boardTypeId == NanoPi_M1
|| retBoardInfo->boardTypeId == NanoPi_K1_Plus
|| retBoardInfo->boardTypeId == NanoPi_M1_Plus
|| retBoardInfo->boardTypeId == NanoPi_M1_Plus2) {
pinCount = 40;
} else if (boardId == NanoPi_NEO
|| boardId == NanoPi_NEO_Air
|| boardId == NanoPi_NEO2
|| boardId == NanoPi_NEO_Plus2
|| boardId == NanoPi_NEO_Core
|| boardId == NanoPi_NEO_Core2
} else if (retBoardInfo->boardTypeId == NanoPi_NEO
|| retBoardInfo->boardTypeId == NanoPi_NEO_Air
|| retBoardInfo->boardTypeId == NanoPi_NEO2
|| retBoardInfo->boardTypeId == NanoPi_NEO_Plus2
|| retBoardInfo->boardTypeId == NanoPi_NEO_Core
|| retBoardInfo->boardTypeId == NanoPi_NEO_Core2
) {
pinCount = 24;
} else if (boardId == NanoPi_Duo) {
} else if (retBoardInfo->boardTypeId == NanoPi_Duo
|| retBoardInfo->boardTypeId == NanoPi_Duo2) {
pinCount = 32;
} else {
printf ("This NanoPi model(id: %d) is currently not supported. \n", retBoardInfo->boardTypeId) ;
return ;
}
if (DEBUG_READALL) {
printf (" +-----+-----+----------+------+---+-%s--+------+----------+-----+-----+\n", retBoardInfo->boardDisplayName) ;
for (pin = 1 ; pin <= pinCount ; pin++) {
debugReadallPhys (retBoardInfo->boardTypeId, pin) ;
}
return ;
}
@ -559,34 +723,44 @@ void NanoPiReadAll()
printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ;
printf (" +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+\n") ;
for (pin = 1 ; pin <= pinCount ; pin += 2)
readallPhys (boardId, pin, 1) ;
readallPhys (retBoardInfo->boardTypeId, pin, 1) ;
printf (" +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+\n") ;
printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ;
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) {
if (retBoardInfo->boardTypeId == NanoPi_M1
|| retBoardInfo->boardTypeId == NanoPi_K1_Plus
|| retBoardInfo->boardTypeId == NanoPi_M1_Plus
|| retBoardInfo->boardTypeId == NanoPi_M1_Plus2) {
// nothing to do.
} else if (boardId == NanoPi_NEO || boardId == NanoPi_NEO_Air || boardId == NanoPi_NEO2 || boardId == NanoPi_NEO_Plus2) {
} else if (retBoardInfo->boardTypeId == NanoPi_NEO
|| retBoardInfo->boardTypeId == NanoPi_NEO_Air
|| retBoardInfo->boardTypeId == NanoPi_NEO2
|| retBoardInfo->boardTypeId == 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) ;
readallPhys (retBoardInfo->boardTypeId, pin, 0) ;
}
printf (" +-----+-----+----------+------+---+----+\n") ;
printf ("\n");
} else if (boardId == NanoPi_Duo || boardId == NanoPi_NEO_Core || boardId == NanoPi_NEO_Core2) {
} else if (retBoardInfo->boardTypeId == NanoPi_Duo
|| retBoardInfo->boardTypeId == NanoPi_Duo2
|| retBoardInfo->boardTypeId == NanoPi_NEO_Core
|| retBoardInfo->boardTypeId == NanoPi_NEO_Core2) {
// nothing to do.
}
if (boardId == NanoPi_NEO_Core || boardId == NanoPi_NEO_Core2) {
if (retBoardInfo->boardTypeId == NanoPi_NEO_Core
|| retBoardInfo->boardTypeId == 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) ;
readallPhys (retBoardInfo->boardTypeId, pin, 1) ;
printf (" +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+\n") ;
printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ;
printf (" +-----+-----+----------+------+---+-%s--+------+----------+-----+-----+\n", retBoardInfo->boardDisplayName) ;
@ -596,32 +770,41 @@ void NanoPiReadAll()
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) ;
readallPhys (retBoardInfo->boardTypeId, 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) {
if (retBoardInfo->boardTypeId == NanoPi_M1
|| retBoardInfo->boardTypeId == NanoPi_K1_Plus
|| retBoardInfo->boardTypeId == NanoPi_M1_Plus
|| retBoardInfo->boardTypeId == NanoPi_M1_Plus2) {
printf (" +-----+----%s Debug UART-+----+\n", retBoardInfo->boardDisplayName) ;
printf (" | BCM | wPi | Name | Mode | V | Ph |\n") ;
printf (" +-----+-----+----------+------+---+----+\n") ;
for (pin = 41 ; pin < 45 ; pin++) {
readallPhys (boardId, pin, 0) ;
readallPhys (retBoardInfo->boardTypeId, pin, 0) ;
}
printf (" +-----+-----+----------+------+---+----+\n") ;
printf ("\n");
} else if (boardId == NanoPi_NEO || boardId == NanoPi_NEO_Air || boardId == NanoPi_NEO2 || boardId == NanoPi_NEO_Plus2) {
} else if (retBoardInfo->boardTypeId == NanoPi_NEO
|| retBoardInfo->boardTypeId == NanoPi_NEO_Air
|| retBoardInfo->boardTypeId == NanoPi_NEO2
|| retBoardInfo->boardTypeId == NanoPi_NEO_Plus2) {
printf (" +-----+----%s Debug UART-+----+\n", retBoardInfo->boardDisplayName) ;
printf (" | BCM | wPi | Name | Mode | V | Ph |\n") ;
printf (" +-----+-----+----------+------+---+----+\n") ;
for (pin = 37 ; pin <= 38 ; pin++) {
readallPhys (boardId, pin, 0) ;
readallPhys (retBoardInfo->boardTypeId, pin, 0) ;
}
printf (" +-----+-----+----------+------+---+----+\n") ;
printf ("\n");
} else if (boardId == NanoPi_Duo || boardId == NanoPi_NEO_Core || boardId == NanoPi_NEO_Core2) {
} else if (retBoardInfo->boardTypeId == NanoPi_Duo
|| retBoardInfo->boardTypeId == NanoPi_Duo2
|| retBoardInfo->boardTypeId == NanoPi_NEO_Core
|| retBoardInfo->boardTypeId == NanoPi_NEO_Core2) {
// nothing to do.
}
}

View File

@ -9,159 +9,173 @@ const char* allwinner_tempfile = "/sys/class/thermal/thermal_zone0/temp";
#define LOGE printf
BoardHardwareInfo gAllBoardHardwareInfo[] = {
{"MINI6410", -1, S3C6410_COMMON, "S3C6410_Board",""},
{"MINI210", -1, S5PV210_COMMON, "S5PV210_Board",""},
{"TINY4412", -1, S5P4412_COMMON, "S5P4412_Board",""},
{"mini2451", 0, S3C2451_COMMON, "S3C2451_Board", ""},
{"MINI6410", -1, S3C6410_COMMON, "S3C6410_Board",""},
{"MINI210", -1, S5PV210_COMMON, "S5PV210_Board",""},
{"TINY4412", -1, S5P4412_COMMON, "S5P4412_Board",""},
{"mini2451", 0, S3C2451_COMMON, "S3C2451_Board", ""},
//s5p4418
{"nanopi2", 0, NanoPi2, "NanoPi2",""},
{"nanopi2", 1, NanoPC_T2, "NanoPC-T2",""},
{"nanopi2", 2, NanoPi_S2, "NanoPi-S2",""},
{"nanopi2", 3, Smart4418, "Smart4418",""},
{"nanopi2", 4, NanoPi2_Fire, "NanoPi2-Fire",""},
{"nanopi2", 5, NanoPi_M2, "NanoPi-M2",""},
{"nanopi2", 7, NanoPi_M2A, "NanoPi-M2A",""},
{"nanopi2", 0x103, Smart4418SDK, "Smart4418SDK",""},
//s5p4418
{"nanopi2", 0, NanoPi2, "NanoPi2",""},
{"nanopi2", 1, NanoPC_T2, "NanoPC-T2",""},
{"nanopi2", 2, NanoPi_S2, "NanoPi-S2",""},
{"nanopi2", 3, Smart4418, "Smart4418",""},
{"nanopi2", 4, NanoPi2_Fire, "NanoPi2-Fire",""},
{"nanopi2", 5, NanoPi_M2, "NanoPi-M2",""},
{"nanopi2", 7, NanoPi_M2A, "NanoPi-M2A",""},
{"nanopi2", 0x103, Smart4418SDK, "Smart4418SDK",""},
//s5p6818
{"nanopi3", 1, NanoPC_T3, "NanoPC-T3",""},
{"nanopi3", 4, NanoPC_T3T, "NanoPC-T3T",""},
{"nanopi3", 5, NanoPi_Fire3, "NanoPi-Fire3",""},
{"nanopi3", 7, NanoPi_M3, "NanoPi-M3",""},
//s5p6818
{"nanopi3", 1, NanoPC_T3, "NanoPC-T3",""},
{"nanopi3", 2, NanoPi_M3B, "NanoPi-M3B",""},
{"nanopi3", 3, Smart6818, "Smart6818",""},
{"nanopi3", 4, NanoPC_T3T, "NanoPC-T3T",""},
{"nanopi3", 5, NanoPi_Fire3, "NanoPi-Fire3",""},
{"nanopi3", 7, NanoPi_M3, "NanoPi-M3",""},
//allwinner h3
// kernel 3.x
{"sun8i", 0, NanoPi_M1, "NanoPi-M1", "0(0)"},
{"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_K1, "NanoPi-K1", "6(0)"},
// kernel 4.x
{"Allwinnersun8iFamily", 0, NanoPi_M1, "NanoPi-M1", "0(0)"},
{"Allwinnersun8iFamily", 0, NanoPi_NEO, "NanoPi-NEO", "1(0)"},
{"Allwinnersun8iFamily", 0, NanoPi_NEO_Air, "NanoPi-NEO-Air", "2(0)"},
{"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)"},
//allwinner h3
// kernel 3.x
{"sun8i", 0, NanoPi_M1, "NanoPi-M1", "0(0)"},
{"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_K1, "NanoPi-K1", "6(0)"},
{"sun8i", 0, NanoPi_Hero, "NanoPi-Hero", "7(0)"},
{"sun8i", 0, NanoPi_Duo2, "NanoPi-Duo2", "8(0)"},
{"sun8i", 0, NanoPi_R1, "NanoPi-R1", "9(0)"},
// kernel 4.x
{"Allwinnersun8iFamily", 0, NanoPi_M1, "NanoPi-M1", "0(0)"},
{"Allwinnersun8iFamily", 0, NanoPi_NEO, "NanoPi-NEO", "1(0)"},
{"Allwinnersun8iFamily", 0, NanoPi_NEO_Air, "NanoPi-NEO-Air", "2(0)"},
{"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)"},
{"Allwinnersun8iFamily", 0, NanoPi_Hero, "NanoPi-Hero", "7(0)"},
{"Allwinnersun8iFamily", 0, NanoPi_Duo2, "NanoPi-Duo2", "8(0)"},
{"Allwinnersun8iFamily", 0, NanoPi_R1, "NanoPi-R1", "9(0)"},
// a64
{"sun50iw1p1", 0, NanoPi_A64, "NanoPi-A64", "0"},
// a64
{"sun50iw1p1", 0, NanoPi_A64, "NanoPi-A64", "0"},
//allwinner h5
// kernel 3.x
{"sun50iw2", 4, NanoPi_NEO2, "NanoPi-NEO2", "1(0)"},
{"sun50iw2", 4, NanoPi_M1_Plus2, "NanoPi-M1-Plus2", "3(0)"},
//allwinner h5
// kernel 3.x
{"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)"},
// 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", ""},
//k2
{"Amlogic", 0, NanoPi_K2, "NanoPi-K2", ""},
//t4
{"nanopi4", 0, NanoPC_T4, "NanoPC-T4",""},
{"nanopi4", 1, NanoPi_M4, "NanoPi-M4",""},
{"nanopi4", 2, NanoPC_T4, "NanoPC-T4",""},
{"nanopi4", 4, NanoPi_NEO4, "NanoPi-NEO4",""},
};
static int getFieldValueInCpuInfo(char* hardware, int hardwareMaxLen, char* revision, int revisionMaxLen )
{
int n,i,j;
char lineUntrim[1024], line[1024],line2[1024],*p,*p2;
FILE *f;
int isGotHardware = 0;
int isGotRevision = 0;
int n,i,j;
char lineUntrim[1024], line[1024],line2[1024],*p,*p2;
FILE *f;
int isGotHardware = 0;
int isGotRevision = 0;
if (!(f = fopen("/sys/devices/platform/board/info", "r"))) {
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)) {
if(!fgets(lineUntrim, sizeof(lineUntrim), f)) {
break;
} else {
j=0;
for(i=0; i<strlen(lineUntrim);i++) {
if (lineUntrim[i] == ' ' || lineUntrim[i] == '\t' || lineUntrim[i] == '\r' || lineUntrim[i] == '\n') {
} else {
line[j++]=lineUntrim[i];
}
}
line[j] = 0x00;
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);
while (!feof(f)) {
if(!fgets(lineUntrim, sizeof(lineUntrim), f)) {
break;
} else {
j=0;
for(i=0; i<strlen(lineUntrim);i++) {
if (lineUntrim[i] == ' ' || lineUntrim[i] == '\t' || lineUntrim[i] == '\r' || lineUntrim[i] == '\n') {
} else {
line[j++]=lineUntrim[i];
}
}
line[j] = 0x00;
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 == 1 && isGotRevision == 1) {
break;
}
}
}
}
fclose(f);
return isGotHardware + isGotRevision;
if (isGotHardware == 1 && isGotRevision == 1) {
break;
}
}
}
}
fclose(f);
return isGotHardware + isGotRevision;
}
static int getAllwinnerBoardID(char* boardId, int boardIdMaxLen )
{
int n,i,j;
char lineUntrim[1024], line[1024],*p;
const char* sunxi_board_id_fieldname = "sunxi_board_id";
FILE *f;
int ret = -1;
int n,i,j;
char lineUntrim[1024], line[1024],*p;
const char* sunxi_board_id_fieldname = "sunxi_board_id";
FILE *f;
int ret = -1;
if (!(f = fopen("/sys/class/sunxi_info/sys_info", "r"))) {
LOGE("open /sys/class/sunxi_info/sys_info failed.");
return -1;
}
if (!(f = fopen("/sys/class/sunxi_info/sys_info", "r"))) {
LOGE("open /sys/class/sunxi_info/sys_info failed.");
return -1;
}
while (!feof(f)) {
if(!fgets(lineUntrim, sizeof(lineUntrim), f)) {
break;
} else {
j=0;
for(i=0; i<strlen(lineUntrim);i++) {
if (lineUntrim[i] == ' ' || lineUntrim[i] == '\t' || lineUntrim[i] == '\r' || lineUntrim[i] == '\n') {
} else {
line[j++]=lineUntrim[i];
}
}
line[j] = 0x00;
n = strlen(line);
if (n>0) {
//LOGD("LINE: %s\n", line);
while (!feof(f)) {
if(!fgets(lineUntrim, sizeof(lineUntrim), f)) {
break;
} else {
j=0;
for(i=0; i<strlen(lineUntrim);i++) {
if (lineUntrim[i] == ' ' || lineUntrim[i] == '\t' || lineUntrim[i] == '\r' || lineUntrim[i] == '\n') {
} else {
line[j++]=lineUntrim[i];
}
}
line[j] = 0x00;
n = strlen(line);
if (n>0) {
//LOGD("LINE: %s\n", line);
if (p = strtok(line, ":")) {
if (strncasecmp(p, sunxi_board_id_fieldname, strlen(sunxi_board_id_fieldname)) == 0) {
//LOGD("\t\tkey=\"%s\"\n", p);
//LOGD("\t\tkey=\"%s\"\n", p);
if (p = strtok(0, ":")) {
//LOGD("\t\tv=\"%s\"\n", p);
//LOGD("\t\tv=\"%s\"\n", p);
memset(boardId,0,boardIdMaxLen);
strncpy(boardId, p, boardIdMaxLen-1);
ret = 0;
@ -177,86 +191,92 @@ static int getAllwinnerBoardID(char* boardId, int boardIdMaxLen )
}
int getBoardType(BoardHardwareInfo** retBoardInfo) {
char hardware[255];
char revision[255];
char allwinnerBoardID[255];
int ret;
int i;
memset(hardware, 0, sizeof(hardware));
memset(revision, 0, sizeof(revision));
if ((ret = getFieldValueInCpuInfo(hardware, sizeof(hardware), revision, sizeof(revision))) > 0) {
//LOGD("hardware:%s,revision:%s\n", hardware, revision);
} else {
//LOGD("%s, ret:%d\n", "getFieldValueInCpuInfo failed", ret);
return -1;
}
char hardware[255];
char revision[255];
char allwinnerBoardID[255];
int ret;
int i;
memset(hardware, 0, sizeof(hardware));
memset(revision, 0, sizeof(revision));
if ((ret = getFieldValueInCpuInfo(hardware, sizeof(hardware), revision, sizeof(revision))) > 0) {
//LOGD("hardware:%s,revision:%s\n", hardware, revision);
} else {
//LOGD("%s, ret:%d\n", "getFieldValueInCpuInfo failed", ret);
return -1;
}
const char* a64 = "sun50iw1p1";
const char* amlogic = "Amlogic";
const char* h3 = "sun8i";
const char* h5 = "sun50iw2";
const char* h3_kernel4 = "Allwinnersun8iFamily";
const char* a64 = "sun50iw1p1";
const char* amlogic = "Amlogic";
const char* h3 = "sun8i";
const char* h5 = "sun50iw2";
const char* h3_kernel4 = "Allwinnersun8iFamily";
const char* h5_kernel4 = "Allwinnersun50iw2Family";
//a64 and amlogic, only check hardware
if (strncasecmp(hardware, a64, strlen(a64)) == 0 || strncasecmp(hardware, amlogic, strlen(amlogic)) == 0) {
for (i=0; i<(sizeof(gAllBoardHardwareInfo)/sizeof(BoardHardwareInfo)); i++) {
if (strncasecmp(gAllBoardHardwareInfo[i].kernelHardware, hardware, strlen(gAllBoardHardwareInfo[i].kernelHardware)) == 0) {
if (retBoardInfo != 0) {
*retBoardInfo = &gAllBoardHardwareInfo[i];
}
return gAllBoardHardwareInfo[i].boardTypeId;
}
}
return -1;
//a64 and amlogic, only check hardware
if (strncasecmp(hardware, a64, strlen(a64)) == 0 || strncasecmp(hardware, amlogic, strlen(amlogic)) == 0) {
for (i=0; i<(sizeof(gAllBoardHardwareInfo)/sizeof(BoardHardwareInfo)); i++) {
if (strncasecmp(gAllBoardHardwareInfo[i].kernelHardware, hardware, strlen(gAllBoardHardwareInfo[i].kernelHardware)) == 0) {
if (retBoardInfo != 0) {
*retBoardInfo = &gAllBoardHardwareInfo[i];
}
return gAllBoardHardwareInfo[i].boardTypeId;
}
}
return -1;
}
// h3 and h5, check hardware and boardid
if (strncasecmp(hardware, h3, strlen(h3)) == 0 || strncasecmp(hardware, h5, strlen(h5)) == 0
|| strncasecmp(hardware, h3_kernel4, strlen(h3_kernel4)) == 0 || strncasecmp(hardware, h5_kernel4, strlen(h5_kernel4)) == 0) {
int ret = getAllwinnerBoardID(allwinnerBoardID, sizeof(allwinnerBoardID));
if (ret == 0) {
//LOGD("got boardid: %s\n", allwinnerBoardID);
for (i=0; i<(sizeof(gAllBoardHardwareInfo)/sizeof(BoardHardwareInfo)); i++) {
//LOGD("\t\t enum, start compare[%d]: %s <--> %s\n", i, gAllBoardHardwareInfo[i].kernelHardware, hardware);
if (strncasecmp(gAllBoardHardwareInfo[i].kernelHardware, hardware, strlen(gAllBoardHardwareInfo[i].kernelHardware)) == 0) {
if (strncasecmp(gAllBoardHardwareInfo[i].allwinnerBoardID, allwinnerBoardID, strlen(gAllBoardHardwareInfo[i].allwinnerBoardID)) == 0) {
if (retBoardInfo != 0) {
*retBoardInfo = &gAllBoardHardwareInfo[i];
}
return gAllBoardHardwareInfo[i].boardTypeId;
}
}
//LOGD("\t\t enum, end compare[%d]\n", i);
}
}
return -1;
}
if (strncasecmp(hardware, h3, strlen(h3)) == 0 || strncasecmp(hardware, h5, strlen(h5)) == 0
|| strncasecmp(hardware, h3_kernel4, strlen(h3_kernel4)) == 0 || strncasecmp(hardware, h5_kernel4, strlen(h5_kernel4)) == 0) {
int ret = getAllwinnerBoardID(allwinnerBoardID, sizeof(allwinnerBoardID));
if (ret == 0) {
//LOGD("got boardid: %s\n", allwinnerBoardID);
for (i=0; i<(sizeof(gAllBoardHardwareInfo)/sizeof(BoardHardwareInfo)); i++) {
//LOGD("\t{{ enum, start compare[%d]: %s <--> %s\n", i, gAllBoardHardwareInfo[i].kernelHardware, hardware);
if (strncasecmp(gAllBoardHardwareInfo[i].kernelHardware, hardware, strlen(gAllBoardHardwareInfo[i].kernelHardware)) == 0) {
//LOGD("\t\tMATCH %s\n", hardware);
if (strncasecmp(gAllBoardHardwareInfo[i].allwinnerBoardID, allwinnerBoardID, strlen(gAllBoardHardwareInfo[i].allwinnerBoardID)) == 0) {
if (retBoardInfo != 0) {
*retBoardInfo = &gAllBoardHardwareInfo[i];
}
//LOGD("\t\t\tMATCH board id: %s\n", allwinnerBoardID);
return gAllBoardHardwareInfo[i].boardTypeId;
} else {
//LOGD("\t\t\tnot match board id: %s\n", allwinnerBoardID);
}
} else {
//LOGD("\t\tnot match %s\n", hardware);
}
//LOGD("\t}} enum, end compare[%d]\n", i);
}
}
return -1;
}
if (strlen(revision) == 0) {
//LOGD("failed, revision is empty.");
return -1;
}
if (strlen(revision) == 0) {
//LOGD("failed, revision is empty.");
return -1;
}
char revision2[255];
sprintf(revision2, "0x%s", revision);
int iRev;
iRev = strtol(revision2, NULL, 16);
char revision2[255];
sprintf(revision2, "0x%s", revision);
int iRev;
iRev = strtol(revision2, NULL, 16);
// other, check hardware and revision
for (i=0; i<(sizeof(gAllBoardHardwareInfo)/sizeof(BoardHardwareInfo)); i++) {
if (strncasecmp(gAllBoardHardwareInfo[i].kernelHardware, hardware, strlen(gAllBoardHardwareInfo[i].kernelHardware)) == 0) {
if (gAllBoardHardwareInfo[i].kernelRevision == -1
|| gAllBoardHardwareInfo[i].kernelRevision == iRev
) {
if (retBoardInfo != 0) {
*retBoardInfo = &gAllBoardHardwareInfo[i];
}
return gAllBoardHardwareInfo[i].boardTypeId;
}
}
}
return -1;
for (i=0; i<(sizeof(gAllBoardHardwareInfo)/sizeof(BoardHardwareInfo)); i++) {
if (strncasecmp(gAllBoardHardwareInfo[i].kernelHardware, hardware, strlen(gAllBoardHardwareInfo[i].kernelHardware)) == 0) {
if (gAllBoardHardwareInfo[i].kernelRevision == -1
|| gAllBoardHardwareInfo[i].kernelRevision == iRev
) {
if (retBoardInfo != 0) {
*retBoardInfo = &gAllBoardHardwareInfo[i];
}
return gAllBoardHardwareInfo[i].boardTypeId;
}
}
}
return -1;
}
/*

View File

@ -39,6 +39,8 @@ typedef struct {
//s5p6818
#define S5P6818_BASE (6818)
#define NanoPC_T3 (S5P6818_BASE+1)
#define NanoPi_M3B (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)
@ -64,12 +66,21 @@ typedef struct {
#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
#define NanoPi_Hero (ALLWINNER_BASE+14)
#define NanoPi_Duo2 (ALLWINNER_BASE+15)
#define NanoPi_R1 (ALLWINNER_BASE+16)
#define ALLWINNER_MAX NanoPi_R1
//amlogic
#define AMLOGIC_BASE (8000)
#define NanoPi_K2 (AMLOGIC_BASE+1)
//rk3399
#define RK3399_BASE (9000)
#define NanoPC_T4 (RK3399_BASE+1)
#define NanoPi_M4 (RK3399_BASE+2)
#define NanoPi_NEO4 (RK3399_BASE+3)
extern int getBoardType(BoardHardwareInfo** retBoardInfo);
#endif

View File

@ -382,7 +382,7 @@ static int pinToGpio_duo [MAX_PIN_COUNT] ={
-1, 12, //11, 12
11, 4, //13, 14
5, 203, //15, 16
-1, -1, //17, 18
-1,363, //17, 18
-1, -1, //19, 20
-1, -1, //21, 22
-1, -1, //23, 24
@ -406,7 +406,41 @@ static int pinToGpio_duo [MAX_PIN_COUNT] ={
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
};
// wPi number to /sys/gpio number
static int pinToGpio_duo2 [MAX_PIN_COUNT] ={
16, //0
/* 32 Pin */
-1, 14, //1, 2
13, -1, //3, 4
-1, -1, //5, 6
15,198, //7, 8
-1,199, //9, 10
-1, 12, //11, 12
11, 4, //13, 14
5,203, //15, 16
-1,363, //17, 18
-1, -1, //19, 20
-1, -1, //21, 22
-1, -1, //23, 24
-1, -1, //25, 26
-1, -1, //27, 28
-1, -1, //29, 30
-1, -1, //31, 32
/* ---------nanopi duo end----------- */
-1, -1, //33, 34
-1, -1, //35, 36
/* 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,
/* 64~73 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
};
// wPi number to /sys/gpio number
static int pinToGpio_neocore [MAX_PIN_COUNT] ={
@ -440,9 +474,6 @@ static int pinToGpio_neocore [MAX_PIN_COUNT] ={
};
/*
static int pinTobcm [64] ={
19, 18, //map to BCM GPIO0,1
@ -555,8 +586,6 @@ static int physToGpio_neocore [MAX_PIN_COUNT] ={
-1, //73
};
static int physToGpio_m1 [MAX_PIN_COUNT] ={
-1, // 0
-1, -1, // 1, 2
@ -586,7 +615,6 @@ static int physToGpio_m1 [MAX_PIN_COUNT] ={
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
};
// phys pin number to /sys/gpio number
static int physToGpio_duo [MAX_PIN_COUNT] ={
-1, //0
@ -596,7 +624,7 @@ static int physToGpio_duo [MAX_PIN_COUNT] ={
-1, -1, //5, 6
-1, -1, //7, 8
-1, -1, //9, 10
198,-1, //11, 12
198,363, //11, 12
199,-1, //13, 14
15, -1, //15, 16
16, -1, //17, 18
@ -622,6 +650,44 @@ static int physToGpio_duo [MAX_PIN_COUNT] ={
/* 64~73 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
};
// phys pin number to /sys/gpio number
static int physToGpio_duo2 [MAX_PIN_COUNT] ={
-1, //0
/* 32 Pin */
-1, 5, //1, 2
-1, 4, //3, 4
-1, -1, //5, 6
-1, 11, //7, 8
363, 12, //9, 10
203, 13, //11, 12
-1, 14, //13, 14
-1, 16, //15, 16
-1, 15, //17, 18
-1, 199, //19, 20
-1, 198, //21, 22
-1, -1, //23, 24
-1, -1, //25, 26
-1, -1, //27, 28
-1, -1, //29, 30
-1, -1, //31, 32
/* ---------nanopi duo end----------- */
-1, -1, //33, 34
-1, -1, //35, 36
/* 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,
/* 64~73 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
};
//
static int syspin_neo [MAX_PIN_COUNT] ={
@ -673,6 +739,17 @@ static int syspin_duo [MAX_PIN_COUNT] ={
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
};
static int syspin_duo2 [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
@ -817,7 +894,6 @@ static int physToPin_duo [MAX_PIN_COUNT] = //return wiringPI pin //note: same as
2, -1, //19, 20
3, 16, //21, 22
12, -1, //23, 24
13, -1, //25, 26
-1, -1, //27, 28
14, -1, //29, 30
@ -836,6 +912,39 @@ static int physToPin_duo [MAX_PIN_COUNT] = //return wiringPI pin //note: same as
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
};
static int physToPin_duo2 [MAX_PIN_COUNT] = //return wiringPI pin //note: same as physToWpi
{
-1, // 0
-1, 15, // 1, 2
-1, 14, // 3, 4
-1, -1, // 5, 6
-1, 13, // 7, 8
-1, 12, // 9, 10
16, 3, //11, 12
-1, 2, //13, 14
-1, 0, //15, 16
-1, 7, //17, 18
-1, 9, //19, 20
-1, 8, //21, 22
-1, -1, //23, 24
-1, -1, //25, 26
-1, -1, //27, 28
-1, -1, //29, 30
-1, -1, //31, 32
/* ---------nanopi duo end----------- */
-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,
};
// pins available on pin out by banks
static int BP_PIN_MASK[9][32] = //[BANK] [INDEX]
{
@ -1285,11 +1394,10 @@ int isA20(void) {
int piBoardRev(void) {
BoardHardwareInfo* retBoardInfo;
int boardId;
boardId = getBoardType(&retBoardInfo);
if (boardId >= 0) {
if (boardId > ALLWINNER_BASE && boardId <= ALLWINNER_MAX
&& boardId != NanoPi_A64) {
int ret = getBoardType(&retBoardInfo);
if (ret >= 0) {
if (retBoardInfo->boardTypeId > ALLWINNER_BASE && retBoardInfo->boardTypeId <= ALLWINNER_MAX
&& retBoardInfo->boardTypeId != NanoPi_A64) {
version = BPRVER;
if (wiringPiDebug)
printf("piBoardRev: %d\n", version);
@ -1313,19 +1421,14 @@ int piBoardRev(void) {
*/
void piBoardId(int *model, int *rev, int *mem, int *maker, int *overVolted) {
FILE *cpuFd;
char line [120];
char *c;
(void) piBoardRev(); // Call this first to make sure all's OK. Don't care about the result.
BoardHardwareInfo* retBoardInfo;
int boardId;
boardId = getBoardType(&retBoardInfo);
if (boardId >= 0) {
if (boardId > ALLWINNER_BASE && boardId <= ALLWINNER_MAX
&& boardId != NanoPi_A64) {
*model = boardId;
int ret = getBoardType(&retBoardInfo);
if (ret >= 0) {
if (retBoardInfo->boardTypeId > ALLWINNER_BASE && retBoardInfo->boardTypeId <= ALLWINNER_MAX
&& retBoardInfo->boardTypeId != NanoPi_A64) {
*model = retBoardInfo->boardTypeId;
*rev = PI_VERSION_1_2;
*mem = 1024;
*maker = PI_MAKER_FRIENDLYELEC;
@ -1448,6 +1551,33 @@ int getAlt(int pin) {
}
int getAltSilence(int pin) {
int alt;
if (pin >= MAX_PIN_COUNT || pin < 0) {
return -1;
}
if (pinToGpio == 0 || physToGpio == 0) {
return -1;
}
//printf("[%s:L%d] the pin:%d mode: %d is invaild,please check it over!\n", __func__, __LINE__, pin, wiringPiMode);
if (wiringPiMode == WPI_MODE_PINS)
pin = pinToGpio [pin];
else if (wiringPiMode == WPI_MODE_PHYS)
pin = physToGpio[pin];
else if (wiringPiMode == WPI_MODE_GPIO) //pin = pinTobcm[pin];
pin = pin;
else return 0;
if (-1 == pin) {
return -1;
}
alt = sunxi_get_gpio_mode(pin);
return alt;
}
/*
* pwmSetMode:
* Select the native "balanced" mode, or standard mark:space mode
@ -1611,7 +1741,7 @@ void pinMode(int pin, int mode) {
if (pinToGpio == 0 || physToGpio == 0) {
printf("please call wiringPiSetup first.\n");
return -1;
return;
}
// On-board pin
@ -1736,9 +1866,12 @@ int digitalRead(int pin) {
struct wiringPiNodeStruct *node = wiringPiNodes;
int oldPin = pin;
if (wiringPiDebug)
printf("Func: %s, Line: %d,pin:%d\n", __func__, __LINE__, pin);
if (pinToGpio == 0 || physToGpio == 0) {
printf("please call wiringPiSetup first.\n");
return;
return 0;
}
if (pin > 0 && pin < MAX_PIN_COUNT) {
@ -1753,13 +1886,13 @@ int digitalRead(int pin) {
return 0;
}
//TODO: fix me
/*
//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)
@ -1783,7 +1916,7 @@ int digitalRead(int pin) {
}
} else if (wiringPiMode == WPI_MODE_GPIO) {
// pin = pinTobcm[pin];
pin = pin;
pin = pin;
if (wiringPiDebug) {
printf(">>> pinTobcm[pin] ret %d\n", pin);
@ -1802,8 +1935,49 @@ int digitalRead(int pin) {
return LOW;
return node->digitalRead(node, pin);
}
}
int digitalReadSilence(int pin) {
char c;
struct wiringPiNodeStruct *node = wiringPiNodes;
int oldPin = pin;
if (pinToGpio == 0 || physToGpio == 0) {
return 0;
}
if (pin > 0 && pin < MAX_PIN_COUNT) {
if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode
{
if (pin == 0) {
return 0;
}
if (sysFds [pin] == -1) {
return LOW;
}
lseek(sysFds [pin], 0L, SEEK_SET);
read(sysFds [pin], &c, 1);
return (c == '0') ? LOW : HIGH;
} else if (wiringPiMode == WPI_MODE_PINS) {
pin = pinToGpio [pin];
} else if (wiringPiMode == WPI_MODE_PHYS) {
pin = physToGpio[pin];
} else if (wiringPiMode == WPI_MODE_GPIO) {
// pin = pinTobcm[pin];
pin = pin;
} else {
return LOW;
}
if (-1 == pin) {
return LOW;
}
return sunxi_digitalRead(pin);
} else {
if ((node = wiringPiFindNode(pin)) == NULL)
return LOW;
return node->digitalRead(node, pin);
}
}
/*
@ -2334,23 +2508,28 @@ int wiringPiSetup(void) {
piBoardId(&model, &rev, &mem, &maker, &overVolted);
wiringPiMode = WPI_MODE_PINS;
int boardId = model;
if (boardId == NanoPi_M1 || boardId == NanoPi_M1_Plus || boardId == NanoPi_M1_Plus2 || boardId == NanoPi_K1_Plus) {
int faBoardId = model;
if (faBoardId == NanoPi_M1 || faBoardId == NanoPi_M1_Plus || faBoardId == NanoPi_M1_Plus2 || faBoardId == 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) {
syspin = syspin_m1;
} else if (faBoardId == NanoPi_NEO || faBoardId == NanoPi_NEO_Air || faBoardId == NanoPi_NEO2 || faBoardId == NanoPi_NEO_Plus2) {
pinToGpio = pinToGpio_neo;
physToGpio = physToGpio_neo;
physToPin = physToPin_neo;
syspin = syspin_neo;
} else if (boardId == NanoPi_Duo) {
syspin = syspin_neo;
} else if (faBoardId == NanoPi_Duo) {
pinToGpio = pinToGpio_duo;
physToGpio = physToGpio_duo;
physToPin = physToPin_duo;
syspin = syspin_duo;
} else if (boardId == NanoPi_NEO_Core || boardId == NanoPi_NEO_Core2) {
syspin = syspin_duo;
} else if (faBoardId == NanoPi_Duo2) {
pinToGpio = pinToGpio_duo2;
physToGpio = physToGpio_duo2;
physToPin = physToPin_duo2;
syspin = syspin_duo2;
} else if (faBoardId == NanoPi_NEO_Core || faBoardId == NanoPi_NEO_Core2) {
pinToGpio = pinToGpio_neocore;
physToGpio = physToGpio_neocore;
physToPin = physToPin_neocore;
@ -2427,23 +2606,27 @@ int wiringPiSetupSys(void) {
printf("wiringPi: wiringPiSetupSys called\n");
piBoardId(&model, &rev, &mem, &maker, &overVolted);
int boardId = model;
if (boardId == NanoPi_M1 || boardId == NanoPi_M1_Plus || boardId == NanoPi_M1_Plus2 || boardId == NanoPi_K1_Plus) {
int faBoardId = model;
if (faBoardId == NanoPi_M1 || faBoardId == NanoPi_M1_Plus || faBoardId == NanoPi_M1_Plus2 || faBoardId == NanoPi_K1_Plus) {
pinToGpio = pinToGpio_m1;
physToGpio = physToGpio_m1;
physToPin = physToPin_m1;
} else if (boardId == NanoPi_NEO || boardId == NanoPi_NEO_Air || boardId == NanoPi_NEO2 || boardId == NanoPi_NEO_Plus2) {
} else if (faBoardId == NanoPi_NEO || faBoardId == NanoPi_NEO_Air || faBoardId == NanoPi_NEO2 || faBoardId == NanoPi_NEO_Plus2) {
pinToGpio = pinToGpio_neo;
physToGpio = physToGpio_neo;
physToPin = physToPin_neo;
} else if (boardId == NanoPi_Duo) {
} else if (faBoardId == NanoPi_Duo) {
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;
} else if (faBoardId == NanoPi_Duo2) {
pinToGpio = pinToGpio_duo2;
physToGpio = physToGpio_duo2;
physToPin = physToPin_duo2;
} else if (faBoardId == NanoPi_NEO_Core || faBoardId == NanoPi_NEO_Core2) {
pinToGpio = pinToGpio_neocore;
physToGpio = physToGpio_neocore;
physToPin = physToPin_neocore;
}
for (pin = 1; pin < MAX_PIN_COUNT; ++pin) {