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 *.o
/gpio/gpio
libwiringPiDev.so.2.0 libwiringPiDev.so.2.0
libwiringPi.so.2.0 libwiringPi.so.2.0
/test/ /test/

View File

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

View File

@ -1130,11 +1130,10 @@ int main (int argc, char *argv [])
printf ("\n") ; printf ("\n") ;
BoardHardwareInfo* retBoardInfo; BoardHardwareInfo* retBoardInfo;
int boardId; int ret = getBoardType(&retBoardInfo);
boardId = getBoardType(&retBoardInfo); if (ret >= 0) {
if (boardId >= 0) { if (retBoardInfo->boardTypeId > ALLWINNER_BASE && retBoardInfo->boardTypeId <= ALLWINNER_MAX
if (boardId > ALLWINNER_BASE && boardId <= ALLWINNER_MAX && retBoardInfo->boardTypeId != NanoPi_A64) {
&& boardId != NanoPi_A64) {
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

@ -42,6 +42,8 @@ extern int wpMode ;
# define FALSE (1==2) # define FALSE (1==2)
#endif #endif
#define DEBUG_READALL 0
/* /*
* doReadallExternal: * doReadallExternal:
* A relatively crude way to read the pins on an external device. * 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 0, -1, //17, 18
2, -1, //19, 20 2, -1, //19, 20
3, 16, //21, 22 3, 16, //21, 22
12, -1, //23, 24 12, 18, //23, 24
13, -1, //25, 26 13, -1, //25, 26
-1, -1, //27, 28 -1, -1, //27, 28
@ -287,7 +289,7 @@ static char *physNames_duo [MAX_PIN_COUNT] =
" GPIOA16", "USB-DP3 ", " GPIOA16", "USB-DP3 ",
" GPIOA14", "USB-DM3 ", " GPIOA14", "USB-DM3 ",
" GPIOA13", "GPIOG11 ", " GPIOA13", "GPIOG11 ",
" GPIOA12", "IR-RX ", " GPIOA12", "GPIOL11 ",
" GPIOA11", "0v ", //25, 26 " GPIOA11", "0v ", //25, 26
" 0v", "3.3v ", " 0v", "3.3v ",
" GPIOA4", "5v ", " GPIOA4", "5v ",
@ -320,6 +322,91 @@ static char *physNames_duo [MAX_PIN_COUNT] =
NULL //73 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] = 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 pin ;
int *physToWpi; int *physToWpi;
char **physNames; 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; 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 (faBoardId == NanoPi_NEO || faBoardId == NanoPi_NEO_Air || faBoardId == NanoPi_NEO2 || faBoardId == NanoPi_NEO_Plus2) {
physToWpi = physToWpi_neo; physToWpi = physToWpi_neo;
physNames = physNames_neo; physNames = physNames_neo;
} else if (boardId == NanoPi_Duo) { } else if (faBoardId == NanoPi_Duo) {
physToWpi = physToWpi_duo; physToWpi = physToWpi_duo;
physNames = physNames_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; physToWpi = physToWpi_neocore;
physNames = physNames_neocore; physNames = physNames_neocore;
} else { } else {
@ -469,8 +559,14 @@ static void readallPhys (int boardId, int physPin, int pair)
pin = physToWpi [physPin] ; pin = physToWpi [physPin] ;
} }
printf (" | %4s", alts [getAlt (pin)]) ; int alt = getAltSilence (pin);
printf (" | %d", digitalRead (pin)) ; if (alt >= 0) {
printf (" | %4s", alts [alt]) ;
} else {
printf (" | ") ;
}
printf (" | %d", digitalReadSilence (pin)) ;
} }
// Pin numbers: // Pin numbers:
@ -502,8 +598,13 @@ static void readallPhys (int boardId, int physPin, int pair)
pin = physToWpi [physPin] ; pin = physToWpi [physPin] ;
} }
printf (" | %d", digitalRead (pin)) ; printf (" | %d", digitalReadSilence (pin)) ;
printf (" | %-4s", alts [getAlt (pin)]) ; int alt = getAltSilence (pin);
if (alt >= 0) {
printf (" | %4s", alts [alt]) ;
} else {
printf (" | ") ;
}
} }
printf (" | %-5s", physNames [physPin]) ; printf (" | %-5s", physNames [physPin]) ;
@ -516,18 +617,68 @@ static void readallPhys (int boardId, int physPin, int pair)
printf (" |\n") ; 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() void NanoPiReadAll()
{ {
int pin ; int pin ;
BoardHardwareInfo* retBoardInfo; BoardHardwareInfo* retBoardInfo;
int boardId; int ret = getBoardType(&retBoardInfo);
boardId = getBoardType(&retBoardInfo); if (ret >= 0) {
if (boardId >= 0) { if (retBoardInfo->boardTypeId > ALLWINNER_BASE
if (boardId > ALLWINNER_BASE && boardId <= ALLWINNER_MAX && retBoardInfo->boardTypeId <= ALLWINNER_MAX
&& boardId != NanoPi_A64) { && retBoardInfo->boardTypeId != NanoPi_A64) {
// nothing to do. // nothing to do.
} else { } else {
printf ("This NanoPi model is currently not supported. ") ; printf ("This NanoPi model is currently not supported. \n") ;
return ; return ;
} }
} else { } else {
@ -538,19 +689,32 @@ void NanoPiReadAll()
} }
int pinCount; 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; pinCount = 40;
} else if (boardId == NanoPi_NEO } else if (retBoardInfo->boardTypeId == NanoPi_NEO
|| boardId == NanoPi_NEO_Air || retBoardInfo->boardTypeId == NanoPi_NEO_Air
|| boardId == NanoPi_NEO2 || retBoardInfo->boardTypeId == NanoPi_NEO2
|| boardId == NanoPi_NEO_Plus2 || retBoardInfo->boardTypeId == NanoPi_NEO_Plus2
|| boardId == NanoPi_NEO_Core || retBoardInfo->boardTypeId == NanoPi_NEO_Core
|| boardId == NanoPi_NEO_Core2 || retBoardInfo->boardTypeId == NanoPi_NEO_Core2
) { ) {
pinCount = 24; pinCount = 24;
} else if (boardId == NanoPi_Duo) { } else if (retBoardInfo->boardTypeId == NanoPi_Duo
|| retBoardInfo->boardTypeId == NanoPi_Duo2) {
pinCount = 32; pinCount = 32;
} else { } 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 ; return ;
} }
@ -559,34 +723,44 @@ void NanoPiReadAll()
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") ;
for (pin = 1 ; pin <= pinCount ; pin += 2) for (pin = 1 ; pin <= pinCount ; pin += 2)
readallPhys (boardId, pin, 1) ; readallPhys (retBoardInfo->boardTypeId, pin, 1) ;
printf (" +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+\n") ; printf (" +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+\n") ;
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 (" +-----+-----+----------+------+---+-%s--+------+----------+-----+-----+\n", retBoardInfo->boardDisplayName) ; printf (" +-----+-----+----------+------+---+-%s--+------+----------+-----+-----+\n", retBoardInfo->boardDisplayName) ;
printf ("\n"); printf ("\n");
/* Print Second 1 ~ 12/24 pins */ /* 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. // 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 (" +-----+----%s USB/Audio-+----+\n", retBoardInfo->boardDisplayName) ;
printf (" | BCM | wPi | Name | Mode | V | Ph |\n") ; printf (" | BCM | wPi | Name | Mode | V | Ph |\n") ;
printf (" +-----+-----+----------+------+---+----+\n") ; printf (" +-----+-----+----------+------+---+----+\n") ;
for (pin = 25 ; pin <= 36 ; pin++) { for (pin = 25 ; pin <= 36 ; pin++) {
readallPhys (boardId, pin, 0) ; readallPhys (retBoardInfo->boardTypeId, pin, 0) ;
} }
printf (" +-----+-----+----------+------+---+----+\n") ; printf (" +-----+-----+----------+------+---+----+\n") ;
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. // 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 (" +-----+-----+----------+---- %s USB/Audio ----+----------+-----+-----+\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") ;
for (pin = 25 ; pin <= 48 ; pin += 2) for (pin = 25 ; pin <= 48 ; pin += 2)
readallPhys (boardId, pin, 1) ; readallPhys (retBoardInfo->boardTypeId, pin, 1) ;
printf (" +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+\n") ; printf (" +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+\n") ;
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 (" +-----+-----+----------+------+---+-%s--+------+----------+-----+-----+\n", retBoardInfo->boardDisplayName) ; 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 (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ;
printf (" +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+\n") ; printf (" +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+\n") ;
for (pin = 49 ; pin <= 68 ; pin += 2) for (pin = 49 ; pin <= 68 ; pin += 2)
readallPhys (boardId, pin, 1) ; readallPhys (retBoardInfo->boardTypeId, pin, 1) ;
printf (" +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+\n") ; printf (" +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+\n") ;
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 (" +-----+-----+----------+------+---+-%s--+------+----------+-----+-----+\n", retBoardInfo->boardDisplayName) ; printf (" +-----+-----+----------+------+---+-%s--+------+----------+-----+-----+\n", retBoardInfo->boardDisplayName) ;
printf ("\n"); 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 (" +-----+----%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") ;
for (pin = 41 ; pin < 45 ; pin++) { for (pin = 41 ; pin < 45 ; pin++) {
readallPhys (boardId, pin, 0) ; readallPhys (retBoardInfo->boardTypeId, pin, 0) ;
} }
printf (" +-----+-----+----------+------+---+----+\n") ; printf (" +-----+-----+----------+------+---+----+\n") ;
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 (" +-----+----%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") ;
for (pin = 37 ; pin <= 38 ; pin++) { for (pin = 37 ; pin <= 38 ; pin++) {
readallPhys (boardId, pin, 0) ; readallPhys (retBoardInfo->boardTypeId, pin, 0) ;
} }
printf (" +-----+-----+----------+------+---+----+\n") ; printf (" +-----+-----+----------+------+---+----+\n") ;
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. // nothing to do.
} }
} }

View File

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

View File

@ -39,6 +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_M3B (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_Fire3 (S5P6818_BASE+5)
#define NanoPi_M3 (S5P6818_BASE+7) #define NanoPi_M3 (S5P6818_BASE+7)
@ -64,12 +66,21 @@ typedef struct {
#define NanoPi_NEO_Core2 (ALLWINNER_BASE+11) #define NanoPi_NEO_Core2 (ALLWINNER_BASE+11)
#define NanoPi_K1 (ALLWINNER_BASE+12) #define NanoPi_K1 (ALLWINNER_BASE+12)
#define NanoPi_K1_Plus (ALLWINNER_BASE+13) #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 //amlogic
#define AMLOGIC_BASE (8000) #define AMLOGIC_BASE (8000)
#define NanoPi_K2 (AMLOGIC_BASE+1) #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); extern int getBoardType(BoardHardwareInfo** retBoardInfo);
#endif #endif

View File

@ -382,7 +382,7 @@ static int pinToGpio_duo [MAX_PIN_COUNT] ={
-1, 12, //11, 12 -1, 12, //11, 12
11, 4, //13, 14 11, 4, //13, 14
5, 203, //15, 16 5, 203, //15, 16
-1, -1, //17, 18 -1,363, //17, 18
-1, -1, //19, 20 -1, -1, //19, 20
-1, -1, //21, 22 -1, -1, //21, 22
-1, -1, //23, 24 -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, -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 // wPi number to /sys/gpio number
static int pinToGpio_neocore [MAX_PIN_COUNT] ={ static int pinToGpio_neocore [MAX_PIN_COUNT] ={
@ -440,9 +474,6 @@ static int pinToGpio_neocore [MAX_PIN_COUNT] ={
}; };
/* /*
static int pinTobcm [64] ={ static int pinTobcm [64] ={
19, 18, //map to BCM GPIO0,1 19, 18, //map to BCM GPIO0,1
@ -555,8 +586,6 @@ static int physToGpio_neocore [MAX_PIN_COUNT] ={
-1, //73 -1, //73
}; };
static int physToGpio_m1 [MAX_PIN_COUNT] ={ static int physToGpio_m1 [MAX_PIN_COUNT] ={
-1, // 0 -1, // 0
-1, -1, // 1, 2 -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, -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 [MAX_PIN_COUNT] ={ static int physToGpio_duo [MAX_PIN_COUNT] ={
-1, //0 -1, //0
@ -596,7 +624,7 @@ static int physToGpio_duo [MAX_PIN_COUNT] ={
-1, -1, //5, 6 -1, -1, //5, 6
-1, -1, //7, 8 -1, -1, //7, 8
-1, -1, //9, 10 -1, -1, //9, 10
198,-1, //11, 12 198,363, //11, 12
199,-1, //13, 14 199,-1, //13, 14
15, -1, //15, 16 15, -1, //15, 16
16, -1, //17, 18 16, -1, //17, 18
@ -622,6 +650,44 @@ static int physToGpio_duo [MAX_PIN_COUNT] ={
/* 64~73 */ /* 64~73 */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -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] ={ 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, -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] ={ /*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
@ -817,7 +894,6 @@ static int physToPin_duo [MAX_PIN_COUNT] = //return wiringPI pin //note: same as
2, -1, //19, 20 2, -1, //19, 20
3, 16, //21, 22 3, 16, //21, 22
12, -1, //23, 24 12, -1, //23, 24
13, -1, //25, 26 13, -1, //25, 26
-1, -1, //27, 28 -1, -1, //27, 28
14, -1, //29, 30 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, -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 // pins available on pin out by banks
static int BP_PIN_MASK[9][32] = //[BANK] [INDEX] static int BP_PIN_MASK[9][32] = //[BANK] [INDEX]
{ {
@ -1285,11 +1394,10 @@ int isA20(void) {
int piBoardRev(void) { int piBoardRev(void) {
BoardHardwareInfo* retBoardInfo; BoardHardwareInfo* retBoardInfo;
int boardId; int ret = getBoardType(&retBoardInfo);
boardId = getBoardType(&retBoardInfo); if (ret >= 0) {
if (boardId >= 0) { if (retBoardInfo->boardTypeId > ALLWINNER_BASE && retBoardInfo->boardTypeId <= ALLWINNER_MAX
if (boardId > ALLWINNER_BASE && boardId <= ALLWINNER_MAX && retBoardInfo->boardTypeId != NanoPi_A64) {
&& boardId != NanoPi_A64) {
version = BPRVER; version = BPRVER;
if (wiringPiDebug) if (wiringPiDebug)
printf("piBoardRev: %d\n", version); printf("piBoardRev: %d\n", version);
@ -1313,19 +1421,14 @@ int piBoardRev(void) {
*/ */
void piBoardId(int *model, int *rev, int *mem, int *maker, int *overVolted) { 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. (void) piBoardRev(); // Call this first to make sure all's OK. Don't care about the result.
BoardHardwareInfo* retBoardInfo; BoardHardwareInfo* retBoardInfo;
int boardId; int ret = getBoardType(&retBoardInfo);
boardId = getBoardType(&retBoardInfo); if (ret >= 0) {
if (boardId >= 0) { if (retBoardInfo->boardTypeId > ALLWINNER_BASE && retBoardInfo->boardTypeId <= ALLWINNER_MAX
if (boardId > ALLWINNER_BASE && boardId <= ALLWINNER_MAX && retBoardInfo->boardTypeId != NanoPi_A64) {
&& boardId != NanoPi_A64) { *model = retBoardInfo->boardTypeId;
*model = boardId;
*rev = PI_VERSION_1_2; *rev = PI_VERSION_1_2;
*mem = 1024; *mem = 1024;
*maker = PI_MAKER_FRIENDLYELEC; *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: * pwmSetMode:
* Select the native "balanced" mode, or standard mark:space mode * 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) { if (pinToGpio == 0 || physToGpio == 0) {
printf("please call wiringPiSetup first.\n"); printf("please call wiringPiSetup first.\n");
return -1; return;
} }
// On-board pin // On-board pin
@ -1736,9 +1866,12 @@ int digitalRead(int pin) {
struct wiringPiNodeStruct *node = wiringPiNodes; struct wiringPiNodeStruct *node = wiringPiNodes;
int oldPin = pin; int oldPin = pin;
if (wiringPiDebug)
printf("Func: %s, Line: %d,pin:%d\n", __func__, __LINE__, pin);
if (pinToGpio == 0 || physToGpio == 0) { if (pinToGpio == 0 || physToGpio == 0) {
printf("please call wiringPiSetup first.\n"); printf("please call wiringPiSetup first.\n");
return; return 0;
} }
if (pin > 0 && pin < MAX_PIN_COUNT) { if (pin > 0 && pin < MAX_PIN_COUNT) {
@ -1753,13 +1886,13 @@ int digitalRead(int pin) {
return 0; return 0;
} }
//TODO: fix me //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)
@ -1783,7 +1916,7 @@ int digitalRead(int pin) {
} }
} else if (wiringPiMode == WPI_MODE_GPIO) { } else if (wiringPiMode == WPI_MODE_GPIO) {
// pin = pinTobcm[pin]; // pin = pinTobcm[pin];
pin = pin; pin = pin;
if (wiringPiDebug) { if (wiringPiDebug) {
printf(">>> pinTobcm[pin] ret %d\n", pin); printf(">>> pinTobcm[pin] ret %d\n", pin);
@ -1802,8 +1935,49 @@ int digitalRead(int pin) {
return LOW; return LOW;
return node->digitalRead(node, pin); 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); piBoardId(&model, &rev, &mem, &maker, &overVolted);
wiringPiMode = WPI_MODE_PINS; wiringPiMode = WPI_MODE_PINS;
int boardId = model; int faBoardId = model;
if (boardId == NanoPi_M1 || boardId == NanoPi_M1_Plus || boardId == NanoPi_M1_Plus2 || boardId == NanoPi_K1_Plus) { if (faBoardId == NanoPi_M1 || faBoardId == NanoPi_M1_Plus || faBoardId == NanoPi_M1_Plus2 || faBoardId == NanoPi_K1_Plus) {
pinToGpio = pinToGpio_m1; pinToGpio = pinToGpio_m1;
physToGpio = physToGpio_m1; physToGpio = physToGpio_m1;
physToPin = physToPin_m1; physToPin = physToPin_m1;
syspin = syspin_m1; syspin = syspin_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; pinToGpio = pinToGpio_neo;
physToGpio = physToGpio_neo; physToGpio = physToGpio_neo;
physToPin = physToPin_neo; physToPin = physToPin_neo;
syspin = syspin_neo; syspin = syspin_neo;
} else if (boardId == NanoPi_Duo) { } else if (faBoardId == NanoPi_Duo) {
pinToGpio = pinToGpio_duo; pinToGpio = pinToGpio_duo;
physToGpio = physToGpio_duo; physToGpio = physToGpio_duo;
physToPin = physToPin_duo; physToPin = physToPin_duo;
syspin = syspin_duo; syspin = syspin_duo;
} else if (boardId == NanoPi_NEO_Core || boardId == NanoPi_NEO_Core2) { } 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; pinToGpio = pinToGpio_neocore;
physToGpio = physToGpio_neocore; physToGpio = physToGpio_neocore;
physToPin = physToPin_neocore; physToPin = physToPin_neocore;
@ -2427,23 +2606,27 @@ int wiringPiSetupSys(void) {
printf("wiringPi: wiringPiSetupSys called\n"); printf("wiringPi: wiringPiSetupSys called\n");
piBoardId(&model, &rev, &mem, &maker, &overVolted); piBoardId(&model, &rev, &mem, &maker, &overVolted);
int boardId = model; int faBoardId = model;
if (boardId == NanoPi_M1 || boardId == NanoPi_M1_Plus || boardId == NanoPi_M1_Plus2 || boardId == NanoPi_K1_Plus) { if (faBoardId == NanoPi_M1 || faBoardId == NanoPi_M1_Plus || faBoardId == NanoPi_M1_Plus2 || faBoardId == NanoPi_K1_Plus) {
pinToGpio = pinToGpio_m1; pinToGpio = pinToGpio_m1;
physToGpio = physToGpio_m1; physToGpio = physToGpio_m1;
physToPin = physToPin_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; pinToGpio = pinToGpio_neo;
physToGpio = physToGpio_neo; physToGpio = physToGpio_neo;
physToPin = physToPin_neo; physToPin = physToPin_neo;
} else if (boardId == NanoPi_Duo) { } else if (faBoardId == NanoPi_Duo) {
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) { } else if (faBoardId == NanoPi_Duo2) {
pinToGpio = pinToGpio_neocore; pinToGpio = pinToGpio_duo2;
physToGpio = physToGpio_neocore; physToGpio = physToGpio_duo2;
physToPin = physToPin_neocore; 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) { for (pin = 1; pin < MAX_PIN_COUNT; ++pin) {