WiringPi: Add support for Odroid-HC4

Signed-off-by: Deokgyu Yang <secugyu@gmail.com>
Change-Id: If64c712eef681a2a9aa4b7828d95b612a1de91db
diff --git a/gpio/readall.c b/gpio/readall.c
index 462a22f..db9c764 100644
--- a/gpio/readall.c
+++ b/gpio/readall.c
@@ -110,6 +110,15 @@
 } ;
 
 /*----------------------------------------------------------------------------*/
+static const int physToWpiHC4 [64] =
+{
+	-1,	// 0
+	-1,  0,	// 1, 2
+	 1,  2,
+	-1,
+} ;
+
+/*----------------------------------------------------------------------------*/
 static const char *physNamesOdroidC1All [64] =
 {
 	NULL,
@@ -544,6 +553,44 @@
 };
 
 /*----------------------------------------------------------------------------*/
+static const char *physNamesOdroidHC4All [64] =
+{
+	NULL,
+
+	"    3.3V",
+	"   SDA.2",
+	"   SCL.2",
+	"GPIO.481",
+	"      0V",
+
+	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,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,NULL,NULL,NULL,NULL,
+};
+
+/*----------------------------------------------------------------------------*/
+static const char *physNamesOdroidHC4 [64] =
+{
+	NULL,
+
+	"   3.3V",
+	"  SDA.2",
+	"  SCL.2",
+	" IO.481",
+	"     0V",
+
+	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,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,NULL,NULL,NULL,NULL,
+};
+
+/*----------------------------------------------------------------------------*/
 static void readallPhys(int model, int UNU rev, int physPin, const char *physNames[], int isAll) {
 	int pin ;
 
@@ -670,7 +717,6 @@
 	printf (" |\n") ;
 }
 
-/*----------------------------------------------------------------------------*/
 static void printHeader(const char *headerName, int isAll) {
 	const char *headerLeft = " +-----+-----+---------+------+---+";
 	const char *headerRight = "+---+------+---------+-----+-----+\n";
@@ -703,6 +749,94 @@
 }
 
 /*----------------------------------------------------------------------------*/
+static void readallPhysHC4(int model, int UNU rev, int physPin, const char *physNames[], int isAll) {
+	int pin ;
+
+	// GPIO, wPi pin number
+	if (isAll == TRUE) {
+		if ((physPinToGpio (physPin) == -1) && (physToWpiHC4 [physPin] == -1))
+			printf(" |      |    ");
+		else if (physPinToGpio (physPin) != -1) {
+			printf(" |  %3d | %3d", physPinToGpio(physPin), physToWpiHC4[physPin]);
+		} else
+			printf(" |      | %3d", physToWpiHC4 [physPin]);
+	} else {
+		if ((physPinToGpio (physPin) == -1) && (physToWpiHC4 [physPin] == -1))
+			printf(" |     |    ");
+		else if (physPinToGpio (physPin) != -1) {
+			printf(" | %3d | %3d", physPinToGpio(physPin), physToWpiHC4[physPin]);
+		} else
+			printf(" |     | %3d", physToWpiHC4 [physPin]);
+	}
+
+	// GPIO pin name
+	printf (" | %s", physNames [physPin]) ;
+
+	// GPIO pin mode, value
+	if ((physToWpiHC4 [physPin] == -1) || (physPinToGpio (physPin) == -1)) {
+		printf(" |      |  ");
+		if (isAll == TRUE)
+			printf(" |    |      ");
+	} else {
+		if (wpMode == MODE_GPIO)
+			pin = physPinToGpio (physPin);
+		else if (wpMode == MODE_PHYS)
+			pin = physPin ;
+		else
+			pin = physToWpiHC4 [physPin];
+
+		printf (" | %4s", alts [getAlt (pin)]) ;
+		printf (" | %d", digitalRead (pin)) ;
+
+		// GPIO pin drive strength, pu/pd
+		if (isAll == TRUE) {
+			switch (model) {
+			case MODEL_ODROID_HC4:
+				printf (" | %2d | %5s", getDrive(pin), pupd[getPUPD(pin)]);
+				break;
+			default:
+				break;
+			}
+		}
+	}
+
+	// Physical pin number
+	printf(" |  %2d |\n", physPin);
+}
+
+/*----------------------------------------------------------------------------*/
+static void printHeaderHC4(const char *headerName, int isAll) {
+	const char *header = " +-----+-----+---------+------+---+-----+";
+	const char *headerAll = " +------+-----+----------+------+---+----+-------+-----+";
+
+	(isAll == FALSE) ? printf("%s\n", header) : printf("%s\n", headerAll);
+	(isAll == FALSE)
+		? printf(" |              %s              |\n", headerName)
+		: printf(" |             %s              |\n", headerName);
+	(isAll == FALSE) ? printf("%s\n", header) : printf("%s\n", headerAll);
+}
+
+/*----------------------------------------------------------------------------*/
+static void printBodyHC4(int model, int rev, const char *physNames[], int isAll) {
+	(isAll == FALSE)
+		? printf(
+			" | I/O | wPi |   Name  | Mode | V | Phy |\n"
+			" +-----+-----+---------+------+---+-----+\n")
+		: printf(
+			" | GPIO | wPi |   Name   | Mode | V | DS | PU/PD | Phy |\n"
+			" +------+-----+----------+------+---+----+-------+-----+\n");
+	for (int pin = 1; pin <= 5; pin ++)
+		readallPhysHC4(model, rev, pin, physNames, isAll);
+	(isAll == FALSE)
+		? printf(
+			" +-----+-----+---------+------+---+-----+\n"
+			" | I/O | wPi |   Name  | Mode | V | Phy |\n")
+		: printf(
+			" +------+-----+----------+------+---+----+-------+-----+\n"
+			" | GPIO | wPi |   Name   | Mode | V | DS | PU/PD | Phy |\n");
+}
+
+/*----------------------------------------------------------------------------*/
 /*
  * doReadall:
  *	Read all the GPIO pins
@@ -764,14 +898,27 @@
 			headerName = (isAll == FALSE) ? "--- C4 ---" : "---- Model  ODROID-C4 ----";
 			physNames = (char *) ((isAll == FALSE) ? physNamesOdroidC4 : physNamesOdroidC4All);
 			break;
+		case MODEL_ODROID_HC4:
+			headerName = (isAll == FALSE) ? "   HC4    " : "     Model ODROID-HC4     ";
+			physNames = (char *) ((isAll == FALSE) ? physNamesOdroidHC4 : physNamesOdroidHC4All);
+			break;
 		default:
 			printf("Oops - unknown model: %d\n", model);
 			return;
 	}
 
-	printHeader((const char *) headerName, isAll);
-	printBody(model, rev, (const char **) physNames, isAll);
-	printHeader((const char *) headerName, isAll);
+	switch (model) {
+		case MODEL_ODROID_HC4:
+			printHeaderHC4((const char *) headerName, isAll);
+			printBodyHC4(model, rev, (const char **) physNames, isAll);
+			printHeaderHC4((const char *) headerName, isAll);
+			break;
+		default:
+			printHeader((const char *) headerName, isAll);
+			printBody(model, rev, (const char **) physNames, isAll);
+			printHeader((const char *) headerName, isAll);
+			break;
+	}
 }
 
 /*----------------------------------------------------------------------------*/