ODROID-C1: Implement get pin MUX, PU/PD mode
Change-Id: I65f7be92205a1808c6b2f9bb86fc3a468ca819b5
This commit is contained in:
@@ -108,6 +108,7 @@ static int gpioToGPFSELReg (int pin);
|
|||||||
static int getModeToGpio (int mode, int pin);
|
static int getModeToGpio (int mode, int pin);
|
||||||
static void pinMode (int pin, int mode);
|
static void pinMode (int pin, int mode);
|
||||||
static int getAlt (int pin);
|
static int getAlt (int pin);
|
||||||
|
static int getPUPD (int pin);
|
||||||
static void pullUpDnControl (int pin, int pud);
|
static void pullUpDnControl (int pin, int pud);
|
||||||
static int digitalRead (int pin);
|
static int digitalRead (int pin);
|
||||||
static void digitalWrite (int pin, int value);
|
static void digitalWrite (int pin, int value);
|
||||||
@@ -219,6 +220,7 @@ static int gpioToGPFSELReg (int pin)
|
|||||||
return GPIODV_FSEL_REG_OFFSET;
|
return GPIODV_FSEL_REG_OFFSET;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------*/
|
||||||
static int getModeToGpio (int mode, int pin)
|
static int getModeToGpio (int mode, int pin)
|
||||||
{
|
{
|
||||||
@@ -295,6 +297,7 @@ static void pinMode (int pin, int mode)
|
|||||||
static int getAlt (int pin)
|
static int getAlt (int pin)
|
||||||
{
|
{
|
||||||
int fsel, shift;
|
int fsel, shift;
|
||||||
|
int mode = 0;
|
||||||
|
|
||||||
if (lib->mode == MODE_GPIO_SYS)
|
if (lib->mode == MODE_GPIO_SYS)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -302,9 +305,195 @@ static int getAlt (int pin)
|
|||||||
if ((pin = getModeToGpio(lib->mode, pin)) < 0)
|
if ((pin = getModeToGpio(lib->mode, pin)) < 0)
|
||||||
return 2;
|
return 2;
|
||||||
|
|
||||||
|
fsel = gpioToGPFSELReg(pin);
|
||||||
shift = gpioToShiftReg(pin);
|
shift = gpioToShiftReg(pin);
|
||||||
|
|
||||||
return (*(gpio + gpioToGPFSELReg(pin)) & (1 << shift)) ? 0 : 1;
|
switch (pin) {
|
||||||
|
case GPIOX_PIN_START ...GPIOX_PIN_END:
|
||||||
|
switch (shift) {
|
||||||
|
case 0:
|
||||||
|
if (*(gpio + MUX_REG_8_OFFSET) & (1 << 5)) mode = 1; break;
|
||||||
|
if (*(gpio + MUX_REG_5_OFFSET) & (1 << 14)) mode = 2; break;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if (*(gpio + MUX_REG_8_OFFSET) & (1 << 4)) mode = 1; break;
|
||||||
|
if (*(gpio + MUX_REG_5_OFFSET) & (1 << 13)) mode = 2; break;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if (*(gpio + MUX_REG_8_OFFSET) & (1 << 3)) mode = 1; break;
|
||||||
|
if (*(gpio + MUX_REG_5_OFFSET) & (1 << 13)) mode = 2; break;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if (*(gpio + MUX_REG_8_OFFSET) & (1 << 2)) mode = 1; break;
|
||||||
|
if (*(gpio + MUX_REG_5_OFFSET) & (1 << 13)) mode = 2; break;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
if ((*(gpio + MUX_REG_5_OFFSET) & (1 << 29)) &&
|
||||||
|
(*(gpio + MUX_REG_5_OFFSET) & (1 << 12))) mode = 1; break;
|
||||||
|
if (*(gpio + MUX_REG_3_OFFSET) & (1 << 30)) mode = 2; break;
|
||||||
|
if (*(gpio + MUX_REG_4_OFFSET) & (1 << 17)) mode = 3; break;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
if ((*(gpio + MUX_REG_5_OFFSET) & (1 << 28)) &&
|
||||||
|
(*(gpio + MUX_REG_5_OFFSET) & (1 << 12))) mode = 1; break;
|
||||||
|
if (*(gpio + MUX_REG_3_OFFSET) & (1 << 29)) mode = 2; break;
|
||||||
|
if (*(gpio + MUX_REG_4_OFFSET) & (1 << 16)) mode = 3; break;
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
if ((*(gpio + MUX_REG_5_OFFSET) & (1 << 28)) &&
|
||||||
|
(*(gpio + MUX_REG_5_OFFSET) & (1 << 12))) mode = 1; break;
|
||||||
|
if (*(gpio + MUX_REG_3_OFFSET) & (1 << 27)) mode = 2; break;
|
||||||
|
if (*(gpio + MUX_REG_4_OFFSET) & (1 << 15)) mode = 3; break;
|
||||||
|
if (*(gpio + MUX_REG_5_OFFSET) & (1 << 9)) mode = 4; break;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
if ((*(gpio + MUX_REG_5_OFFSET) & (1 << 28)) &&
|
||||||
|
(*(gpio + MUX_REG_5_OFFSET) & (1 << 12))) mode = 1; break;
|
||||||
|
if (*(gpio + MUX_REG_3_OFFSET) & (1 << 27)) mode = 2; break;
|
||||||
|
if (*(gpio + MUX_REG_4_OFFSET) & (1 << 14)) mode = 3; break;
|
||||||
|
if (*(gpio + MUX_REG_5_OFFSET) & (1 << 8)) mode = 4; break;
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
if (*(gpio + MUX_REG_8_OFFSET) & (1 << 1)) mode = 1; break;
|
||||||
|
if (*(gpio + MUX_REG_5_OFFSET) & (1 << 11)) mode = 2; break;
|
||||||
|
if (*(gpio + MUX_REG_6_OFFSET) & (1 << 19)) mode = 3; break;
|
||||||
|
if (*(gpio + MUX_REG_4_OFFSET) & (1 << 22)) mode = 4; break;
|
||||||
|
if (*(gpio + MUX_REG_3_OFFSET) & (1 << 6)) mode = 5; break;
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
if (*(gpio + MUX_REG_8_OFFSET) & (1 << 0)) mode = 1; break;
|
||||||
|
if (*(gpio + MUX_REG_5_OFFSET) & (1 << 10)) mode = 2; break;
|
||||||
|
if (*(gpio + MUX_REG_6_OFFSET) & (1 << 18)) mode = 3; break;
|
||||||
|
if (*(gpio + MUX_REG_4_OFFSET) & (1 << 24)) mode = 4; break;
|
||||||
|
if (*(gpio + MUX_REG_3_OFFSET) & (1 << 6)) mode = 5; break;
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
if (*(gpio + MUX_REG_3_OFFSET) & (1 << 22)) mode = 1; break;
|
||||||
|
if ((*(gpio + MUX_REG_7_OFFSET) & (1 << 31)) &&
|
||||||
|
(*(gpio + MUX_REG_9_OFFSET) & (1 << 19))) mode = 2; break;
|
||||||
|
if (*(gpio + MUX_REG_6_OFFSET) & (1 << 17)) mode = 3; break;
|
||||||
|
if (*(gpio + MUX_REG_4_OFFSET) & (1 << 23)) mode = 4; break;
|
||||||
|
if (*(gpio + MUX_REG_3_OFFSET) & (1 << 8)) mode = 5; break;
|
||||||
|
break;
|
||||||
|
case 11:
|
||||||
|
if (*(gpio + MUX_REG_3_OFFSET) & (1 << 20)) mode = 1; break;
|
||||||
|
if (*(gpio + MUX_REG_7_OFFSET) & (1 << 30)) mode = 2; break;
|
||||||
|
if (*(gpio + MUX_REG_2_OFFSET) & (1 << 3)) mode = 5; break;
|
||||||
|
break;
|
||||||
|
case 16:
|
||||||
|
if (*(gpio + MUX_REG_4_OFFSET) & (1 << 9)) mode = 1; break;
|
||||||
|
if (*(gpio + MUX_REG_4_OFFSET) & (1 << 21)) mode = 4; break;
|
||||||
|
if (*(gpio + MUX_REG_4_OFFSET) & (1 << 5)) mode = 5; break;
|
||||||
|
break;
|
||||||
|
case 17:
|
||||||
|
if (*(gpio + MUX_REG_4_OFFSET) & (1 << 8)) mode = 1; break;
|
||||||
|
if (*(gpio + MUX_REG_4_OFFSET) & (1 << 20)) mode = 4; break;
|
||||||
|
if (*(gpio + MUX_REG_4_OFFSET) & (1 << 4)) mode = 5; break;
|
||||||
|
break;
|
||||||
|
case 18:
|
||||||
|
if (*(gpio + MUX_REG_4_OFFSET) & (1 << 7)) mode = 1; break;
|
||||||
|
if (*(gpio + MUX_REG_4_OFFSET) & (1 << 19)) mode = 4; break;
|
||||||
|
break;
|
||||||
|
case 19:
|
||||||
|
if (*(gpio + MUX_REG_4_OFFSET) & (1 << 6)) mode = 1; break;
|
||||||
|
if (*(gpio + MUX_REG_4_OFFSET) & (1 << 18)) mode = 4; break;
|
||||||
|
break;
|
||||||
|
case 20:
|
||||||
|
if (*(gpio + MUX_REG_6_OFFSET) & (1 << 16)) mode = 3; break;
|
||||||
|
if (*(gpio + MUX_REG_4_OFFSET) & (1 << 25)) mode = 4; break;
|
||||||
|
if (*(gpio + MUX_REG_3_OFFSET) & (1 << 9)) mode = 5; break;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GPIOY_PIN_START ...GPIOY_PIN_END:
|
||||||
|
switch (shift) {
|
||||||
|
case 0:
|
||||||
|
if (*(gpio + MUX_REG_3_OFFSET) & (1 << 2)) mode = 1; break;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if (*(gpio + MUX_REG_3_OFFSET) & (1 << 1)) mode = 1; break;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if (*(gpio + MUX_REG_1_OFFSET) & (1 << 7)) mode = 2; break;
|
||||||
|
if (*(gpio + MUX_REG_3_OFFSET) & (1 << 18)) mode = 3; break;
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
if (*(gpio + MUX_REG_3_OFFSET) & (1 << 5)) mode = 1; break;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
if (*(gpio + MUX_REG_3_OFFSET) & (1 << 5)) mode = 1; break;
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
if (*(gpio + MUX_REG_3_OFFSET) & (1 << 0)) mode = 1; break;
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
if (*(gpio + MUX_REG_3_OFFSET) & (1 << 4)) mode = 1; break;
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
if (*(gpio + MUX_REG_3_OFFSET) & (1 << 5)) mode = 1; break;
|
||||||
|
break;
|
||||||
|
case 11:
|
||||||
|
if (*(gpio + MUX_REG_3_OFFSET) & (1 << 5)) mode = 1; break;
|
||||||
|
break;
|
||||||
|
case 12:
|
||||||
|
if (*(gpio + MUX_REG_3_OFFSET) & (1 << 5)) mode = 1; break;
|
||||||
|
break;
|
||||||
|
case 13:
|
||||||
|
if (*(gpio + MUX_REG_3_OFFSET) & (1 << 5)) mode = 1; break;
|
||||||
|
if (*(gpio + MUX_REG_5_OFFSET) & (1 << 7)) mode = 3; break;
|
||||||
|
break;
|
||||||
|
case 14:
|
||||||
|
if (*(gpio + MUX_REG_3_OFFSET) & (1 << 5)) mode = 1; break;
|
||||||
|
if (*(gpio + MUX_REG_5_OFFSET) & (1 << 6)) mode = 3; break;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GPIODV_PIN_START...GPIODV_PIN_END:
|
||||||
|
switch (shift) {
|
||||||
|
case 24:
|
||||||
|
if (*(gpio + MUX_REG_6_OFFSET) & (1 << 23)) mode = 4; break;
|
||||||
|
if (*(gpio + MUX_REG_9_OFFSET) & (1 << 31)) mode = 5; break;
|
||||||
|
break;
|
||||||
|
case 25:
|
||||||
|
if (*(gpio + MUX_REG_6_OFFSET) & (1 << 22)) mode = 4; break;
|
||||||
|
if (*(gpio + MUX_REG_9_OFFSET) & (1 << 30)) mode = 5; break;
|
||||||
|
break;
|
||||||
|
case 26:
|
||||||
|
if (*(gpio + MUX_REG_6_OFFSET) & (1 << 21)) mode = 4; break;
|
||||||
|
if (*(gpio + MUX_REG_9_OFFSET) & (1 << 29)) mode = 5; break;
|
||||||
|
break;
|
||||||
|
case 27:
|
||||||
|
if (*(gpio + MUX_REG_6_OFFSET) & (1 << 20)) mode = 4; break;
|
||||||
|
if (*(gpio + MUX_REG_9_OFFSET) & (1 << 28)) mode = 5; break;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return mode ? mode + 1 : (*(gpio + fsel) & (1 << shift)) ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
static int getPUPD (int pin)
|
||||||
|
{
|
||||||
|
int puen, pupd, shift;
|
||||||
|
|
||||||
|
if (lib->mode == MODE_GPIO_SYS)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ((pin = getModeToGpio(lib->mode, pin)) < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
puen = gpioToPUENReg(pin);
|
||||||
|
pupd = gpioToPUPDReg(pin);
|
||||||
|
shift = gpioToShiftReg(pin);
|
||||||
|
|
||||||
|
if (*(gpio + puen) & (1 << shift))
|
||||||
|
return *(gpio + pupd) & (1 << shift) ? 1 : 2;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------*/
|
||||||
@@ -531,6 +720,7 @@ void init_odroidc1 (struct libodroid *libwiring)
|
|||||||
libwiring->getModeToGpio = getModeToGpio;
|
libwiring->getModeToGpio = getModeToGpio;
|
||||||
libwiring->pinMode = pinMode;
|
libwiring->pinMode = pinMode;
|
||||||
libwiring->getAlt = getAlt;
|
libwiring->getAlt = getAlt;
|
||||||
|
libwiring->getPUPD = getPUPD;
|
||||||
libwiring->pullUpDnControl = pullUpDnControl;
|
libwiring->pullUpDnControl = pullUpDnControl;
|
||||||
libwiring->digitalRead = digitalRead;
|
libwiring->digitalRead = digitalRead;
|
||||||
libwiring->digitalWrite = digitalWrite;
|
libwiring->digitalWrite = digitalWrite;
|
||||||
|
|||||||
@@ -39,6 +39,16 @@
|
|||||||
#define GPIODV_PUPD_REG_OFFSET 0x3A
|
#define GPIODV_PUPD_REG_OFFSET 0x3A
|
||||||
#define GPIODV_PUEN_REG_OFFSET 0x48
|
#define GPIODV_PUEN_REG_OFFSET 0x48
|
||||||
|
|
||||||
|
#define MUX_REG_1_OFFSET 0x2D
|
||||||
|
#define MUX_REG_2_OFFSET 0x2E
|
||||||
|
#define MUX_REG_3_OFFSET 0x2F
|
||||||
|
#define MUX_REG_4_OFFSET 0x30
|
||||||
|
#define MUX_REG_5_OFFSET 0x31
|
||||||
|
#define MUX_REG_6_OFFSET 0x32
|
||||||
|
#define MUX_REG_7_OFFSET 0x33
|
||||||
|
#define MUX_REG_8_OFFSET 0x34
|
||||||
|
#define MUX_REG_9_OFFSET 0x35
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user