esp8266/modpybpin: Add support for GPIO16.
GPIO16 is actually special-function I/O, though some boards have LED there.
This commit is contained in:
parent
342d903a13
commit
eb247eacd8
@ -65,9 +65,12 @@ STATIC const pyb_pin_obj_t pyb_pin_obj[] = {
|
|||||||
{{&pyb_pin_type}, 13, 13, PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13},
|
{{&pyb_pin_type}, 13, 13, PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13},
|
||||||
{{&pyb_pin_type}, 14, 14, PERIPHS_IO_MUX_MTMS_U, FUNC_GPIO14},
|
{{&pyb_pin_type}, 14, 14, PERIPHS_IO_MUX_MTMS_U, FUNC_GPIO14},
|
||||||
{{&pyb_pin_type}, 15, 15, PERIPHS_IO_MUX_MTDO_U, FUNC_GPIO15},
|
{{&pyb_pin_type}, 15, 15, PERIPHS_IO_MUX_MTDO_U, FUNC_GPIO15},
|
||||||
|
// GPIO16 is special, belongs to different register set, and
|
||||||
|
// otherwise handled specially.
|
||||||
|
{{&pyb_pin_type}, 16, 16, -1, -1},
|
||||||
};
|
};
|
||||||
|
|
||||||
STATIC uint8_t pin_mode[16];
|
STATIC uint8_t pin_mode[16 + 1];
|
||||||
|
|
||||||
uint mp_obj_get_pin(mp_obj_t pin_in) {
|
uint mp_obj_get_pin(mp_obj_t pin_in) {
|
||||||
if (mp_obj_get_type(pin_in) != &pyb_pin_type) {
|
if (mp_obj_get_type(pin_in) != &pyb_pin_type) {
|
||||||
@ -78,10 +81,22 @@ uint mp_obj_get_pin(mp_obj_t pin_in) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int pin_get(uint pin) {
|
int pin_get(uint pin) {
|
||||||
|
if (pin == 16) {
|
||||||
|
return READ_PERI_REG(RTC_GPIO_IN_DATA) & 1;
|
||||||
|
}
|
||||||
return GPIO_INPUT_GET(pin);
|
return GPIO_INPUT_GET(pin);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pin_set(uint pin, int value) {
|
void pin_set(uint pin, int value) {
|
||||||
|
if (pin == 16) {
|
||||||
|
int out_en = (pin_mode[pin] == GPIO_MODE_OUTPUT);
|
||||||
|
WRITE_PERI_REG(PAD_XPD_DCDC_CONF, (READ_PERI_REG(PAD_XPD_DCDC_CONF) & 0xffffffbc) | 1);
|
||||||
|
WRITE_PERI_REG(RTC_GPIO_CONF, READ_PERI_REG(RTC_GPIO_CONF) & ~1);
|
||||||
|
WRITE_PERI_REG(RTC_GPIO_ENABLE, (READ_PERI_REG(RTC_GPIO_ENABLE) & ~1) | out_en);
|
||||||
|
WRITE_PERI_REG(RTC_GPIO_OUT, (READ_PERI_REG(RTC_GPIO_OUT) & ~1) | value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t enable = 0;
|
uint32_t enable = 0;
|
||||||
uint32_t disable = 0;
|
uint32_t disable = 0;
|
||||||
switch (pin_mode[pin]) {
|
switch (pin_mode[pin]) {
|
||||||
@ -155,6 +170,9 @@ STATIC mp_obj_t pyb_pin_obj_init_helper(pyb_pin_obj_t *self, mp_uint_t n_args, c
|
|||||||
pin_mode[self->phys_port] = mode;
|
pin_mode[self->phys_port] = mode;
|
||||||
|
|
||||||
// configure the GPIO as requested
|
// configure the GPIO as requested
|
||||||
|
if (self->phys_port == 16) {
|
||||||
|
// TODO: Set pull up/pull down
|
||||||
|
} else {
|
||||||
PIN_FUNC_SELECT(self->periph, self->func);
|
PIN_FUNC_SELECT(self->periph, self->func);
|
||||||
#if 0
|
#if 0
|
||||||
// Removed in SDK 1.1.0
|
// Removed in SDK 1.1.0
|
||||||
@ -173,6 +191,7 @@ STATIC mp_obj_t pyb_pin_obj_init_helper(pyb_pin_obj_t *self, mp_uint_t n_args, c
|
|||||||
if ((pull & GPIO_PULL_UP) != 0) {
|
if ((pull & GPIO_PULL_UP) != 0) {
|
||||||
PIN_PULLUP_EN(self->periph);
|
PIN_PULLUP_EN(self->periph);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pin_set(self->phys_port, value);
|
pin_set(self->phys_port, value);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user