ODROID-N2: Implement get pin MUX, PU/PD mode, get/set drive strength

Change-Id: I75099b4e2919860f7190ef9cdcd841b1d38844a7
This commit is contained in:
joshua-yang
2019-01-07 12:28:15 +09:00
parent 3384341906
commit 827072123b
6 changed files with 215 additions and 39 deletions

View File

@@ -72,7 +72,7 @@ char *usage = "Usage: gpio -v\n"
" gpio unexportall/exports\n"
" gpio export/edge/unexport ...\n"
" gpio wfi <pin> <mode>\n"
" gpio drive <group> <value>\n"
" gpio drive <pin> <value>\n"
" gpio pwm-bal/pwm-ms \n"
" gpio pwmr <range> \n"
" gpio pwmc <divider> \n"
@@ -598,32 +598,23 @@ void doMode (int argc, char *argv [])
/*
* doPadDrive:
* gpio drive group value
* gpio drive pin value for ODROIDs since it depends on the SoC
*********************************************************************************
*/
static void doPadDrive (int argc, char *argv [])
{
int group, val ;
int pin, val;
if (argc != 4) {
fprintf (stderr, "Usage: %s drive group value\n", argv [0]) ;
fprintf (stderr, "Usage: %s drive pin value\n", argv [0]) ;
exit (1) ;
}
group = atoi (argv [2]) ;
val = atoi (argv [3]) ;
pin = atoi (argv [2]) ;
val = atoi (argv [3]) ;
if ((group < 0) || (group > 2)) {
fprintf (stderr, "%s: drive group not 0, 1 or 2: %d\n", argv [0], group) ;
exit (1) ;
}
if ((val < 0) || (val > 7)) {
fprintf (stderr, "%s: drive value not 0-7: %d\n", argv [0], val) ;
exit (1) ;
}
setPadDrive (group, val) ;
setPadDrive (pin, val) ;
}
@@ -1214,7 +1205,7 @@ int main (int argc, char *argv [])
else if (strcasecmp (argv [1], "pwmr" ) == 0) doNothing (argc, argv) ;
else if (strcasecmp (argv [1], "pwmc" ) == 0) doNothing (argc, argv) ;
else if (strcasecmp (argv [1], "pwmTone" ) == 0) doNothing (argc, argv) ;
else if (strcasecmp (argv [1], "drive" ) == 0) doNothing (argc, argv) ;
else if (strcasecmp (argv [1], "drive" ) == 0) doPadDrive (argc, argv) ;
else if (strcasecmp (argv [1], "readall" ) == 0) doReadall () ;
else if (strcasecmp (argv [1], "nreadall" ) == 0) doReadall () ;
else if (strcasecmp (argv [1], "pins" ) == 0) doPins () ;

View File

@@ -67,11 +67,16 @@ static void doReadallExternal (void)
/*----------------------------------------------------------------------------*/
static const char *alts [] =
{
"IN", "OUT", "ALT"
"IN", "OUT", "ALT1", "ALT2", "ALT3", "ALT4", "ALT5", "ALT6", "ALT7"
} ;
static const char *pupd [] =
{
"DSBLD", "P/U", "P/D"
} ;
/*----------------------------------------------------------------------------*/
static const int physToWpi [64] =
static const int physToWpi [64] =
{
-1, // 0
-1, -1, // 1, 2
@@ -295,6 +300,7 @@ static void readallPhysOdroid (int model, int rev, int physPin, const char *phys
{
int pin ;
// GPIO, wPi pin number
if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
printf (" | | ") ;
else if (physPinToGpio (physPin) != -1)
@@ -302,10 +308,12 @@ static void readallPhysOdroid (int model, int rev, int physPin, const char *phys
else
printf (" | | %3d", physToWpi [physPin]);
// GPIO pin name
printf (" | %s", physNames [physPin]) ;
// GPIO pin mode, value, drive strength, pupd
if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1))
printf (" | | ") ;
printf (" | | | | ") ;
else {
if (wpMode == MODE_GPIO)
pin = physPinToGpio (physPin);
@@ -316,16 +324,18 @@ static void readallPhysOdroid (int model, int rev, int physPin, const char *phys
printf (" | %4s", alts [getAlt (pin)]) ;
printf (" | %d", digitalRead (pin)) ;
printf (" | %2d", getPadDrive (pin)) ;
printf (" | %5s", pupd [getPUPD (pin)]);
}
// Pin numbers:
// Physical pin number
printf (" | %2d", physPin) ;
++physPin ;
printf (" || %-2d", physPin) ;
// Same, reversed
// GPIO pin mode, value, drive strength, pupd
if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1))
printf (" | | ") ;
printf (" | | | | ") ;
else {
if (wpMode == MODE_GPIO)
pin = physPinToGpio (physPin);
@@ -334,12 +344,16 @@ static void readallPhysOdroid (int model, int rev, int physPin, const char *phys
else
pin = physToWpi [physPin];
printf (" | %-5s", pupd [getPUPD (pin)]);
printf (" | %-2d", getPadDrive (pin)) ;
printf (" | %d", digitalRead (pin));
printf (" | %-4s", alts [getAlt (pin)]);
}
// GPIO pin name
printf (" | %-6s", physNames [physPin]);
// GPIO, wPi pin number
if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
printf (" | | ") ;
else if (physPinToGpio (physPin) != -1)
@@ -355,11 +369,11 @@ void ReadallOdroid (int model, int rev, const char *physNames[])
{
int pin ;
printf (" | GPIO | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | GPIO |\n") ;
printf (" +------+-----+----------+------+---+----++----+---+------+----------+-----+------+\n") ;
printf (" | GPIO | wPi | Name | Mode | V | DS | PU/PD | Physical | PU/PD | DS | V | Mode | Name | wPi | GPIO |\n") ;
printf (" +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n") ;
for (pin = 1 ; pin <= 40 ; pin += 2)
readallPhysOdroid (model, rev, pin, physNames) ;
printf (" +------+-----+----------+------+---+----++----+---+------+----------+-----+------+\n") ;
printf (" +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n") ;
}
/*----------------------------------------------------------------------------*/
@@ -387,26 +401,26 @@ void doReadall (void)
switch (model) {
case MODEL_ODROID_C1:
printf (" +------+-----+----------+------+- Model ODROID-C -+------+----------+-----+------+\n") ;
printf (" +------+-----+----------+------+---+----+---- Model ODROID-C1 ----+----+---+------+----------+-----+------+\n") ;
physNames = physNamesOdroidC1;
break;
case MODEL_ODROID_C2:
printf (" +------+-----+----------+------+ Model ODROID-C2 +------+----------+-----+------+\n") ;
printf (" +------+-----+----------+------+---+----+---- Model ODROID-C2 ----+----+---+------+----------+-----+------+\n") ;
if (rev == 1)
physNames = physNamesOdroidC2_Rev1;
else
physNames = physNamesOdroidC2_Rev2;
break;
case MODEL_ODROID_XU3:
printf (" +------+-----+----------+------ Model ODROID-XU3/4 ------+----------+-----+------+\n") ;
printf (" +------+-----+----------+------+---+----+--- Model ODROID-XU3/4 ---+----+---+------+----------+-----+------+\n") ;
physNames = physNamesOdroidXU3;
break;
case MODEL_ODROID_N1:
printf (" +------+-----+----------+------+ Model ODROID-N1 +------+----------+-----+------+\n") ;
printf (" +------+-----+----------+------+---+----+---- Model ODROID-N1 ----+----+---+------+----------+-----+------+\n") ;
physNames = physNamesOdroidN1;
break;
case MODEL_ODROID_N2:
printf (" +------+-----+----------+------+ Model ODROID-N2 +------+----------+-----+------+\n") ;
printf (" +------+-----+----------+------+---+----+---- Model ODROID-N2 ----+----+---+------+----------+-----+------+\n") ;
physNames = physNamesOdroidN2;
break;
default: