Add pullup/down mode to pinMode

ex)
pinMode(pin, INPUT_PULLUP);
pinMode(pin, INPUT_PULLDOWN);
This commit is contained in:
Hyeonki Hong
2019-08-14 09:42:25 +09:00
committed by Joshua Yang
parent 53b8871ccf
commit 50e35741d1
6 changed files with 65 additions and 7 deletions

View File

@@ -281,10 +281,19 @@ static int _pinMode (int pin, int mode)
switch (mode) { switch (mode) {
case INPUT: case INPUT:
*(gpio + fsel) = (*(gpio + fsel) | (1 << shift)); *(gpio + fsel) = (*(gpio + fsel) | (1 << shift));
_pullUpDnControl(origPin, PUD_OFF);
break; break;
case OUTPUT: case OUTPUT:
*(gpio + fsel) = (*(gpio + fsel) & ~(1 << shift)); *(gpio + fsel) = (*(gpio + fsel) & ~(1 << shift));
break; break;
case INPUT_PULLUP:
*(gpio + fsel) = (*(gpio + fsel) | (1 << shift));
_pullUpDnControl(origPin, PUD_UP);
break;
case INPUT_PULLDOWN:
*(gpio + fsel) = (*(gpio + fsel) | (1 << shift));
_pullUpDnControl(origPin, PUD_DOWN);
break;
case SOFT_PWM_OUTPUT: case SOFT_PWM_OUTPUT:
softPwmCreate (origPin, 0, 100); softPwmCreate (origPin, 0, 100);
break; break;

View File

@@ -335,10 +335,19 @@ static int _pinMode (int pin, int mode)
switch (mode) { switch (mode) {
case INPUT: case INPUT:
*(gpio + fsel) = (*(gpio + fsel) | (1 << shift)); *(gpio + fsel) = (*(gpio + fsel) | (1 << shift));
_pullUpDnControl(origPin, PUD_OFF);
break; break;
case OUTPUT: case OUTPUT:
*(gpio + fsel) = (*(gpio + fsel) & ~(1 << shift)); *(gpio + fsel) = (*(gpio + fsel) & ~(1 << shift));
break; break;
case INPUT_PULLUP:
*(gpio + fsel) = (*(gpio + fsel) | (1 << shift));
_pullUpDnControl(origPin, PUD_UP);
break;
case INPUT_PULLDOWN:
*(gpio + fsel) = (*(gpio + fsel) | (1 << shift));
_pullUpDnControl(origPin, PUD_DOWN);
break;
case SOFT_PWM_OUTPUT: case SOFT_PWM_OUTPUT:
softPwmCreate (origPin, 0, 100); softPwmCreate (origPin, 0, 100);
break; break;

View File

@@ -286,10 +286,19 @@ static int _pinMode (int pin, int mode)
switch (mode) { switch (mode) {
case INPUT: case INPUT:
*(gpio[bank] + (N1_GPIO_CON_OFFSET >> 2)) &= ~(1 << gpioToShiftReg(pin)); *(gpio[bank] + (N1_GPIO_CON_OFFSET >> 2)) &= ~(1 << gpioToShiftReg(pin));
_pullUpDnControl(origPin, PUD_OFF);
break; break;
case OUTPUT: case OUTPUT:
*(gpio[bank] + (N1_GPIO_CON_OFFSET >> 2)) |= (1 << gpioToShiftReg(pin)); *(gpio[bank] + (N1_GPIO_CON_OFFSET >> 2)) |= (1 << gpioToShiftReg(pin));
break; break;
case INPUT_PULLUP:
*(gpio[bank] + (N1_GPIO_CON_OFFSET >> 2)) &= ~(1 << gpioToShiftReg(pin));
_pullUpDnControl(origPin, PUD_UP);
break;
case INPUT_PULLDOWN:
*(gpio[bank] + (N1_GPIO_CON_OFFSET >> 2)) &= ~(1 << gpioToShiftReg(pin));
_pullUpDnControl(origPin, PUD_DOWN);
break;
case SOFT_PWM_OUTPUT: case SOFT_PWM_OUTPUT:
softPwmCreate (origPin, 0, 100); softPwmCreate (origPin, 0, 100);
break; break;

View File

@@ -449,11 +449,22 @@ static int _pinMode (int pin, int mode)
case INPUT: case INPUT:
*(gpio + mux) = (*(gpio + mux) & ~(0xF << target)); *(gpio + mux) = (*(gpio + mux) & ~(0xF << target));
*(gpio + fsel) = (*(gpio + fsel) | (1 << shift)); *(gpio + fsel) = (*(gpio + fsel) | (1 << shift));
_pullUpDnControl(origPin, PUD_OFF);
break; break;
case OUTPUT: case OUTPUT:
*(gpio + mux) = (*(gpio + mux) & ~(0xF << target)); *(gpio + mux) = (*(gpio + mux) & ~(0xF << target));
*(gpio + fsel) = (*(gpio + fsel) & ~(1 << shift)); *(gpio + fsel) = (*(gpio + fsel) & ~(1 << shift));
break; break;
case INPUT_PULLUP:
*(gpio + mux) = (*(gpio + mux) & ~(0xF << target));
*(gpio + fsel) = (*(gpio + fsel) | (1 << shift));
_pullUpDnControl(origPin, PUD_UP);
break;
case INPUT_PULLDOWN:
*(gpio + mux) = (*(gpio + mux) & ~(0xF << target));
*(gpio + fsel) = (*(gpio + fsel) | (1 << shift));
_pullUpDnControl(origPin, PUD_DOWN);
break;
case SOFT_PWM_OUTPUT: case SOFT_PWM_OUTPUT:
softPwmCreate (origPin, 0, 100); softPwmCreate (origPin, 0, 100);
break; break;

View File

@@ -352,10 +352,12 @@ static int _pinMode (int pin, int mode)
switch (mode) { switch (mode) {
case INPUT: case INPUT:
if(pin < 100) if(pin < 100) {
*(gpio + fsel) &= ~(0xF << shift); *(gpio + fsel) &= ~(0xF << shift);
else } else {
*(gpio1 + fsel) &= ~(0xF << shift); *(gpio1 + fsel) &= ~(0xF << shift);
}
_pullUpDnControl(origPin, PUD_OFF);
break; break;
case OUTPUT: case OUTPUT:
if(pin < 100) { if(pin < 100) {
@@ -366,6 +368,22 @@ static int _pinMode (int pin, int mode)
*(gpio1 + fsel) |= (0x1 << shift); *(gpio1 + fsel) |= (0x1 << shift);
} }
break; break;
case INPUT_PULLUP:
if(pin < 100) {
*(gpio + fsel) &= ~(0xF << shift);
} else {
*(gpio1 + fsel) &= ~(0xF << shift);
}
_pullUpDnControl(origPin, PUD_UP);
break;
case INPUT_PULLDOWN:
if(pin < 100) {
*(gpio + fsel) &= ~(0xF << shift);
} else {
*(gpio1 + fsel) &= ~(0xF << shift);
}
_pullUpDnControl(origPin, PUD_DOWN);
break;
case SOFT_PWM_OUTPUT: case SOFT_PWM_OUTPUT:
softPwmCreate (origPin, 0, 100); softPwmCreate (origPin, 0, 100);
break; break;

View File

@@ -68,11 +68,13 @@
// Pin modes // Pin modes
#define INPUT 0 #define INPUT 0
#define OUTPUT 1 #define OUTPUT 1
#define PWM_OUTPUT 2 #define INPUT_PULLUP 2
#define GPIO_CLOCK 3 #define INPUT_PULLDOWN 3
#define SOFT_PWM_OUTPUT 4 #define PWM_OUTPUT 4
#define SOFT_TONE_OUTPUT 5 #define GPIO_CLOCK 5
#define PWM_TONE_OUTPUT 6 #define SOFT_PWM_OUTPUT 6
#define SOFT_TONE_OUTPUT 7
#define PWM_TONE_OUTPUT 8
#define LOW 0 #define LOW 0
#define HIGH 1 #define HIGH 1