From a2d5d84ecca175fbfbf42e892d6376efd08758eb Mon Sep 17 00:00:00 2001 From: Damien George Date: Fri, 22 Apr 2016 10:04:12 +0100 Subject: [PATCH] esp8266: Convert mp_hal_pin_obj_t from pin ptr to simple integer. Most pin I/O can be done just knowing the pin number as a simple integer, and it's more efficient this way (code size, speed) because it doesn't require a memory lookup to get the pin id from the pin object. If the full pin object is needed then it can be easily looked up in the pin table. --- esp8266/esp_mphal.c | 12 ++++++++++++ esp8266/esp_mphal.h | 21 ++++++--------------- esp8266/modpyb.h | 2 ++ esp8266/modpybpin.c | 2 +- 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/esp8266/esp_mphal.c b/esp8266/esp_mphal.c index 0573f3d56c..686f54bc31 100644 --- a/esp8266/esp_mphal.c +++ b/esp8266/esp_mphal.c @@ -212,3 +212,15 @@ void dupterm_task_init() { void mp_hal_signal_dupterm_input(void) { system_os_post(DUPTERM_TASK_ID, 0, 0); } + +void mp_hal_pin_config_od(mp_hal_pin_obj_t pin_id) { + const pyb_pin_obj_t *pin = &pyb_pin_obj[pin_id]; + ETS_GPIO_INTR_DISABLE(); + PIN_FUNC_SELECT(pin->periph, pin->func); + GPIO_REG_WRITE(GPIO_PIN_ADDR(GPIO_ID_PIN(pin->phys_port)), + GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(pin->phys_port))) + | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE)); // open drain + GPIO_REG_WRITE(GPIO_ENABLE_ADDRESS, + GPIO_REG_READ(GPIO_ENABLE_ADDRESS) | (1 << pin->phys_port)); + ETS_GPIO_INTR_ENABLE(); +} diff --git a/esp8266/esp_mphal.h b/esp8266/esp_mphal.h index 39cf60ab16..4dca17d0a4 100644 --- a/esp8266/esp_mphal.h +++ b/esp8266/esp_mphal.h @@ -63,20 +63,11 @@ void ets_event_poll(void); #include "etshal.h" #include "gpio.h" #include "esp8266/modpyb.h" -#define mp_hal_pin_obj_t pyb_pin_obj_t* -#define mp_hal_get_pin_obj(o) mp_obj_get_pin_obj(o) -#define mp_hal_pin_config_od(p) do { \ - ETS_GPIO_INTR_DISABLE(); \ - PIN_FUNC_SELECT((p)->periph, (p)->func); \ - GPIO_REG_WRITE(GPIO_PIN_ADDR(GPIO_ID_PIN((p)->phys_port)), \ - GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN((p)->phys_port))) \ - | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE)); /* open drain */ \ - GPIO_REG_WRITE(GPIO_ENABLE_ADDRESS, \ - GPIO_REG_READ(GPIO_ENABLE_ADDRESS) | (1 << (p)->phys_port)); \ - ETS_GPIO_INTR_ENABLE(); \ - } while (0) -#define mp_hal_pin_low(p) gpio_output_set(0, 1 << (p)->phys_port, 1 << (p)->phys_port, 0) -#define mp_hal_pin_od_high(p) gpio_output_set(1 << (p)->phys_port, 0, 1 << (p)->phys_port, 0) -#define mp_hal_pin_read(p) GPIO_INPUT_GET(GPIO_ID_PIN((p)->phys_port)) +#define mp_hal_pin_obj_t uint32_t +#define mp_hal_get_pin_obj(o) mp_obj_get_pin(o) +void mp_hal_pin_config_od(mp_hal_pin_obj_t pin); +#define mp_hal_pin_low(p) gpio_output_set(0, 1 << (p), 1 << (p), 0) +#define mp_hal_pin_od_high(p) gpio_output_set(1 << (p), 0, 1 << (p), 0) +#define mp_hal_pin_read(p) GPIO_INPUT_GET(GPIO_ID_PIN((p))) #endif // _INCLUDED_MPHAL_H_ diff --git a/esp8266/modpyb.h b/esp8266/modpyb.h index 8d27ebed72..c1a0413f04 100644 --- a/esp8266/modpyb.h +++ b/esp8266/modpyb.h @@ -18,6 +18,8 @@ typedef struct _pyb_pin_obj_t { uint32_t periph; } pyb_pin_obj_t; +const pyb_pin_obj_t pyb_pin_obj[16 + 1]; + void pin_init0(void); void pin_intr_handler_iram(void *arg); void pin_intr_handler(uint32_t); diff --git a/esp8266/modpybpin.c b/esp8266/modpybpin.c index 2049d4bf34..a65911cbd1 100644 --- a/esp8266/modpybpin.c +++ b/esp8266/modpybpin.c @@ -59,7 +59,7 @@ typedef struct _pin_irq_obj_t { uint16_t phys_port; } pin_irq_obj_t; -STATIC const pyb_pin_obj_t pyb_pin_obj[16 + 1] = { +const pyb_pin_obj_t pyb_pin_obj[16 + 1] = { {{&pyb_pin_type}, 0, FUNC_GPIO0, PERIPHS_IO_MUX_GPIO0_U}, {{&pyb_pin_type}, 1, FUNC_GPIO1, PERIPHS_IO_MUX_U0TXD_U}, {{&pyb_pin_type}, 2, FUNC_GPIO2, PERIPHS_IO_MUX_GPIO2_U},