Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
Nodemcu Firmware
Commits
23137b4e
Commit
23137b4e
authored
Mar 10, 2016
by
devsaurus
Browse files
Add support for GPIO open-drain output mode.
parent
13f519ee
Changes
4
Show whitespace changes
Inline
Side-by-side
app/modules/gpio.c
View file @
23137b4e
...
@@ -12,6 +12,7 @@
...
@@ -12,6 +12,7 @@
#define PULLUP PLATFORM_GPIO_PULLUP
#define PULLUP PLATFORM_GPIO_PULLUP
#define FLOAT PLATFORM_GPIO_FLOAT
#define FLOAT PLATFORM_GPIO_FLOAT
#define OUTPUT PLATFORM_GPIO_OUTPUT
#define OUTPUT PLATFORM_GPIO_OUTPUT
#define OPENDRAIN PLATFORM_GPIO_OPENDRAIN
#define INPUT PLATFORM_GPIO_INPUT
#define INPUT PLATFORM_GPIO_INPUT
#define INTERRUPT PLATFORM_GPIO_INT
#define INTERRUPT PLATFORM_GPIO_INT
#define HIGH PLATFORM_GPIO_HIGH
#define HIGH PLATFORM_GPIO_HIGH
...
@@ -93,7 +94,7 @@ static int lgpio_mode( lua_State* L )
...
@@ -93,7 +94,7 @@ static int lgpio_mode( lua_State* L )
unsigned
pullup
=
luaL_optinteger
(
L
,
3
,
FLOAT
);
unsigned
pullup
=
luaL_optinteger
(
L
,
3
,
FLOAT
);
luaL_argcheck
(
L
,
platform_gpio_exists
(
pin
)
&&
(
mode
!=
INTERRUPT
||
pin
>
0
),
1
,
"Invalid pin"
);
luaL_argcheck
(
L
,
platform_gpio_exists
(
pin
)
&&
(
mode
!=
INTERRUPT
||
pin
>
0
),
1
,
"Invalid pin"
);
luaL_argcheck
(
L
,
mode
==
OUTPUT
||
mode
==
INPUT
luaL_argcheck
(
L
,
mode
==
OUTPUT
||
mode
==
OPENDRAIN
||
mode
==
INPUT
#ifdef GPIO_INTERRUPT_ENABLE
#ifdef GPIO_INTERRUPT_ENABLE
||
mode
==
INTERRUPT
||
mode
==
INTERRUPT
#endif
#endif
...
@@ -204,6 +205,7 @@ static const LUA_REG_TYPE gpio_map[] = {
...
@@ -204,6 +205,7 @@ static const LUA_REG_TYPE gpio_map[] = {
{
LSTRKEY
(
"INT"
),
LNUMVAL
(
INTERRUPT
)
},
{
LSTRKEY
(
"INT"
),
LNUMVAL
(
INTERRUPT
)
},
#endif
#endif
{
LSTRKEY
(
"OUTPUT"
),
LNUMVAL
(
OUTPUT
)
},
{
LSTRKEY
(
"OUTPUT"
),
LNUMVAL
(
OUTPUT
)
},
{
LSTRKEY
(
"OPENDRAIN"
),
LNUMVAL
(
OPENDRAIN
)
},
{
LSTRKEY
(
"INPUT"
),
LNUMVAL
(
INPUT
)
},
{
LSTRKEY
(
"INPUT"
),
LNUMVAL
(
INPUT
)
},
{
LSTRKEY
(
"HIGH"
),
LNUMVAL
(
HIGH
)
},
{
LSTRKEY
(
"HIGH"
),
LNUMVAL
(
HIGH
)
},
{
LSTRKEY
(
"LOW"
),
LNUMVAL
(
LOW
)
},
{
LSTRKEY
(
"LOW"
),
LNUMVAL
(
LOW
)
},
...
...
app/platform/platform.c
View file @
23137b4e
...
@@ -60,7 +60,7 @@ uint8_t platform_key_led( uint8_t level){
...
@@ -60,7 +60,7 @@ uint8_t platform_key_led( uint8_t level){
/*
/*
* Set GPIO mode to output. Optionally in RAM helper because interrupts are dsabled
* Set GPIO mode to output. Optionally in RAM helper because interrupts are dsabled
*/
*/
static
void
NO_INTR_CODE
set_gpio_no_interrupt
(
uint8
pin
)
{
static
void
NO_INTR_CODE
set_gpio_no_interrupt
(
uint8
pin
,
uint8_t
push_pull
)
{
unsigned
pnum
=
pin_num
[
pin
];
unsigned
pnum
=
pin_num
[
pin
];
ETS_GPIO_INTR_DISABLE
();
ETS_GPIO_INTR_DISABLE
();
#ifdef GPIO_INTERRUPT_ENABLE
#ifdef GPIO_INTERRUPT_ENABLE
...
@@ -71,9 +71,17 @@ static void NO_INTR_CODE set_gpio_no_interrupt(uint8 pin) {
...
@@ -71,9 +71,17 @@ static void NO_INTR_CODE set_gpio_no_interrupt(uint8 pin) {
gpio_pin_intr_state_set
(
GPIO_ID_PIN
(
pnum
),
GPIO_PIN_INTR_DISABLE
);
gpio_pin_intr_state_set
(
GPIO_ID_PIN
(
pnum
),
GPIO_PIN_INTR_DISABLE
);
//clear interrupt status
//clear interrupt status
GPIO_REG_WRITE
(
GPIO_STATUS_W1TC_ADDRESS
,
BIT
(
pnum
));
GPIO_REG_WRITE
(
GPIO_STATUS_W1TC_ADDRESS
,
BIT
(
pnum
));
// configure push-pull vs open-drain
if
(
push_pull
)
{
GPIO_REG_WRITE
(
GPIO_PIN_ADDR
(
GPIO_ID_PIN
(
pnum
)),
GPIO_REG_WRITE
(
GPIO_PIN_ADDR
(
GPIO_ID_PIN
(
pnum
)),
GPIO_REG_READ
(
GPIO_PIN_ADDR
(
GPIO_ID_PIN
(
pnum
)))
&
GPIO_REG_READ
(
GPIO_PIN_ADDR
(
GPIO_ID_PIN
(
pnum
)))
&
(
~
GPIO_PIN_PAD_DRIVER_SET
(
GPIO_PAD_DRIVER_ENABLE
)));
//disable open drain;
(
~
GPIO_PIN_PAD_DRIVER_SET
(
GPIO_PAD_DRIVER_ENABLE
)));
//disable open drain;
}
else
{
GPIO_REG_WRITE
(
GPIO_PIN_ADDR
(
GPIO_ID_PIN
(
pnum
)),
GPIO_REG_READ
(
GPIO_PIN_ADDR
(
GPIO_ID_PIN
(
pnum
)))
|
GPIO_PIN_PAD_DRIVER_SET
(
GPIO_PAD_DRIVER_ENABLE
));
//enable open drain;
}
ETS_GPIO_INTR_ENABLE
();
ETS_GPIO_INTR_ENABLE
();
}
}
...
@@ -124,7 +132,10 @@ int platform_gpio_mode( unsigned pin, unsigned mode, unsigned pull )
...
@@ -124,7 +132,10 @@ int platform_gpio_mode( unsigned pin, unsigned mode, unsigned pull )
GPIO_DIS_OUTPUT
(
pin_num
[
pin
]);
GPIO_DIS_OUTPUT
(
pin_num
[
pin
]);
/* run on */
/* run on */
case
PLATFORM_GPIO_OUTPUT
:
case
PLATFORM_GPIO_OUTPUT
:
set_gpio_no_interrupt
(
pin
);
set_gpio_no_interrupt
(
pin
,
TRUE
);
break
;
case
PLATFORM_GPIO_OPENDRAIN
:
set_gpio_no_interrupt
(
pin
,
FALSE
);
break
;
break
;
#ifdef GPIO_INTERRUPT_ENABLE
#ifdef GPIO_INTERRUPT_ENABLE
...
...
app/platform/platform.h
View file @
23137b4e
...
@@ -32,6 +32,7 @@ uint8_t platform_key_led( uint8_t level);
...
@@ -32,6 +32,7 @@ uint8_t platform_key_led( uint8_t level);
#define PLATFORM_GPIO_INT 2
#define PLATFORM_GPIO_INT 2
#define PLATFORM_GPIO_OUTPUT 1
#define PLATFORM_GPIO_OUTPUT 1
#define PLATFORM_GPIO_OPENDRAIN 3
#define PLATFORM_GPIO_INPUT 0
#define PLATFORM_GPIO_INPUT 0
#define PLATFORM_GPIO_HIGH 1
#define PLATFORM_GPIO_HIGH 1
...
...
docs/en/modules/gpio.md
View file @
23137b4e
...
@@ -20,20 +20,20 @@ If not using a NodeMCU dev kit, please refer to the below GPIO pin maps for the
...
@@ -20,20 +20,20 @@ If not using a NodeMCU dev kit, please refer to the below GPIO pin maps for the
| 5 | GPIO14 | 12 | GPIO10 |
| 5 | GPIO14 | 12 | GPIO10 |
| 6 | GPIO12 | | |
| 6 | GPIO12 | | |
** [*] D0(GPIO16) can only be used as gpio read/write. No
interrupt support. No
pwm/i2c/ow
support
. **
** [*] D0(GPIO16) can only be used as gpio read/write. No
support for open-drain/interrupt/
pwm/i2c/ow. **
## gpio.mode()
## gpio.mode()
Initialize pin to GPIO mode, set the pin in/out direction, and optional internal pullup.
Initialize pin to GPIO mode, set the pin in/out direction, and optional internal
weak
pull
-
up.
#### Syntax
#### Syntax
`gpio.mode(pin, mode [, pullup])`
`gpio.mode(pin, mode [, pullup])`
#### Parameters
#### Parameters
-
`pin`
pin to configure, IO index
-
`pin`
pin to configure, IO index
-
`mode`
one of gpio.OUTPUT
or
gpio.INPUT, or gpio.INT(interrupt mode)
-
`mode`
one of gpio.OUTPUT
, gpio.OPENDRAIN,
gpio.INPUT, or gpio.INT
(interrupt mode)
-
`pullup`
gpio.PULLUP
or gpio.FLOAT
; default is gpio.FLOAT
-
`pullup`
gpio.PULLUP
enables the weak pull-up resistor
; default is gpio.FLOAT
#### Returns
#### Returns
`nil`
`nil`
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment