Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
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 @@
#define PULLUP PLATFORM_GPIO_PULLUP
#define FLOAT PLATFORM_GPIO_FLOAT
#define OUTPUT PLATFORM_GPIO_OUTPUT
#define OPENDRAIN PLATFORM_GPIO_OPENDRAIN
#define INPUT PLATFORM_GPIO_INPUT
#define INTERRUPT PLATFORM_GPIO_INT
#define HIGH PLATFORM_GPIO_HIGH
...
...
@@ -93,7 +94,7 @@ static int lgpio_mode( lua_State* L )
unsigned
pullup
=
luaL_optinteger
(
L
,
3
,
FLOAT
);
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
||
mode
==
INTERRUPT
#endif
...
...
@@ -204,6 +205,7 @@ static const LUA_REG_TYPE gpio_map[] = {
{
LSTRKEY
(
"INT"
),
LNUMVAL
(
INTERRUPT
)
},
#endif
{
LSTRKEY
(
"OUTPUT"
),
LNUMVAL
(
OUTPUT
)
},
{
LSTRKEY
(
"OPENDRAIN"
),
LNUMVAL
(
OPENDRAIN
)
},
{
LSTRKEY
(
"INPUT"
),
LNUMVAL
(
INPUT
)
},
{
LSTRKEY
(
"HIGH"
),
LNUMVAL
(
HIGH
)
},
{
LSTRKEY
(
"LOW"
),
LNUMVAL
(
LOW
)
},
...
...
app/platform/platform.c
View file @
23137b4e
...
...
@@ -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
*/
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
];
ETS_GPIO_INTR_DISABLE
();
#ifdef GPIO_INTERRUPT_ENABLE
...
...
@@ -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
);
//clear interrupt status
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_READ
(
GPIO_PIN_ADDR
(
GPIO_ID_PIN
(
pnum
)))
&
(
~
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
();
}
...
...
@@ -124,7 +132,10 @@ int platform_gpio_mode( unsigned pin, unsigned mode, unsigned pull )
GPIO_DIS_OUTPUT
(
pin_num
[
pin
]);
/* run on */
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
;
#ifdef GPIO_INTERRUPT_ENABLE
...
...
app/platform/platform.h
View file @
23137b4e
...
...
@@ -32,6 +32,7 @@ uint8_t platform_key_led( uint8_t level);
#define PLATFORM_GPIO_INT 2
#define PLATFORM_GPIO_OUTPUT 1
#define PLATFORM_GPIO_OPENDRAIN 3
#define PLATFORM_GPIO_INPUT 0
#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
| 5 | GPIO14 | 12 | GPIO10 |
| 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()
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
`gpio.mode(pin, mode [, pullup])`
#### Parameters
-
`pin`
pin to configure, IO index
-
`mode`
one of gpio.OUTPUT
or
gpio.INPUT, or gpio.INT(interrupt mode)
-
`pullup`
gpio.PULLUP
or gpio.FLOAT
; default is gpio.FLOAT
-
`mode`
one of gpio.OUTPUT
, gpio.OPENDRAIN,
gpio.INPUT, or gpio.INT
(interrupt mode)
-
`pullup`
gpio.PULLUP
enables the weak pull-up resistor
; default is gpio.FLOAT
#### Returns
`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