Updated to latest IDF.

- Switched hardcoded interrupts to new IDF interrupt allocation
framework.

- gpio module switched to the IDF's per-pin interrupt callback service.

- Improved NodeMCU linker script since it broke with the IDF upgrade.

- Various compatibility updates.
This commit is contained in:
Johny Mattsson 2016-12-30 19:20:01 +11:00
parent 4ece8de4d9
commit 7abda5c9e0
7 changed files with 33 additions and 54 deletions

View File

@ -1,9 +1,8 @@
SECTIONS {
.lua_lib : ALIGN(4)
.flash.rodata : ALIGN(4)
{
/* Link-time arrays containing the defs for the included modules */
lua_libs = ABSOLUTE(.);
/* Allow either empty define or defined-to-1 to include the module */
KEEP(*(.lua_libs))
LONG(0) LONG(0) /* Null-terminate the array */
lua_rotable = ABSOLUTE(.);
@ -14,4 +13,4 @@ SECTIONS {
LONG(0) LONG(0) /* Null-terminate the array */
}
}
INSERT AFTER .flash.text
INSERT BEFORE .flash.text

View File

@ -33,6 +33,7 @@
#include "driver/console.h"
#include "esp_intr.h"
#include "esp_intr_alloc.h"
#include "soc/soc.h"
#include "soc/uart_reg.h"
#include "soc/dport_reg.h"
@ -44,7 +45,6 @@
#include "sys/reent.h"
#define UART_INPUT_QUEUE_SZ 0x100
#define MAP_CONSOLE_UART_PRO_INT_NO 9 // PRO interrupt used by this driver for uart0
// These used to be available in soc/uart_register.h:
#define UART_GET_RXFIFO_RD_BYTE(i) GET_PERI_REG_BITS2(UART_FIFO_REG(i) , UART_RXFIFO_RD_BYTE_V, UART_RXFIFO_RD_BYTE_S)
@ -66,7 +66,7 @@ static _read_r_fn _read_r_pro, _read_r_app;
static xQueueHandle uart0Q;
static task_handle_t input_task = 0;
static intr_handle_t intr_handle;
// --- Syscall support for reading from STDIN_FILENO ---------------
@ -159,9 +159,9 @@ void console_init (const ConsoleSetup_t *cfg, task_handle_t tsk)
console_setup (cfg);
ESP_INTR_DISABLE(MAP_CONSOLE_UART_PRO_INT_NO);
xt_set_interrupt_handler (MAP_CONSOLE_UART_PRO_INT_NO, uart0_rx_intr_handler, NULL);
esp_intr_alloc (ETS_UART0_INTR_SOURCE,
ESP_INTR_FLAG_LOWMED | ESP_INTR_FLAG_INTRDISABLED,
uart0_rx_intr_handler, NULL, &intr_handle);
UART_SET_RX_TOUT_EN(CONSOLE_UART, true);
UART_SET_RX_TOUT_THRHD(CONSOLE_UART, 2);
@ -172,8 +172,7 @@ void console_init (const ConsoleSetup_t *cfg, task_handle_t tsk)
UART_RXFIFO_FULL_INT_ENA |
UART_FRM_ERR_INT_ENA);
WRITE_PERI_REG(DPORT_PRO_UART_INTR_MAP_REG, MAP_CONSOLE_UART_PRO_INT_NO);
ESP_INTR_ENABLE(MAP_CONSOLE_UART_PRO_INT_NO);
esp_intr_enable (intr_handle);
// Register our console_read_r_xxx functions to support stdin input
_read_r_pro = syscall_table_ptr_pro->_read_r;

View File

@ -42,9 +42,6 @@
#define PULL_UP 1
#define PULL_DOWN 2
// TODO: change this to dynamically allocated once that framework is available!
#define MAP_GPIO_PRO_INT_NO 12
static int *gpio_cb_refs = NULL; // Lazy init
static task_handle_t cb_task;
@ -53,11 +50,21 @@ static int check_err (lua_State *L, esp_err_t err)
switch (err)
{
case ESP_ERR_INVALID_ARG: luaL_error (L, "invalid argument");
case ESP_ERR_INVALID_STATE: luaL_error (L, "internal logic error");
case ESP_OK: break;
}
return 0;
}
// TODO: can/should we attempt to guard against task q overflow?
_Static_assert(GPIO_PIN_COUNT<256, "task post encoding assumes < 256 gpios");
static void IRAM_ATTR single_pin_isr (void *p)
{
gpio_num_t gpio_num = (gpio_num_t)p;
gpio_intr_disable (gpio_num);
task_post_low (cb_task, (gpio_num) | (gpio_get_level (gpio_num) << 8));
}
/* Lua: gpio.config({
* gpio= x || { x, y ... }
@ -159,10 +166,14 @@ static int lgpio_trig (lua_State *L)
check_err (L, gpio_intr_disable (gpio));
if (gpio_cb_refs[gpio] == LUA_NOREF)
{
check_err (L, gpio_set_intr_type (gpio, GPIO_INTR_DISABLE));
check_err (L, gpio_isr_handler_remove (gpio));
}
else
{
check_err (L, gpio_set_intr_type (gpio, intr_type));
check_err (L, gpio_isr_handler_add (gpio, single_pin_isr, (void *)gpio));
check_err (L, gpio_intr_enable (gpio));
}
return 0;
@ -192,36 +203,6 @@ static int lgpio_write (lua_State *L)
}
// TODO: move this to the platform layer so it can be shared
// TODO: can/should we attempt to guard against task q overflow?
_Static_assert(GPIO_PIN_COUNT<256, "task post encoding assumes < 256 gpios");
static void IRAM_ATTR nodemcu_gpio_isr (void *p)
{
uint32_t intrs = READ_PERI_REG(GPIO_STATUS_REG);
uint32_t intrs_rtc = READ_PERI_REG(GPIO_STATUS1_REG);
#define handle_gpio_intr(gpio_num) do { \
gpio_intr_disable (gpio_num); \
task_post_low (cb_task, (gpio_num) | (gpio_get_level (gpio_num) << 8)); \
} while (0)
// Regular gpios
for (uint32_t gpio = 0; intrs && gpio < 32; ++gpio)
{
if (intrs & BIT(gpio))
handle_gpio_intr (gpio);
}
// RTC gpios
for (uint32_t gpio = 0; intrs_rtc && gpio < (GPIO_PIN_COUNT - 32); ++gpio)
{
if (intrs_rtc & BIT(gpio))
handle_gpio_intr (gpio + 32);
}
SET_PERI_REG_MASK(GPIO_STATUS_W1TC_REG, intrs);
SET_PERI_REG_MASK(GPIO_STATUS1_W1TC_REG, intrs_rtc);
}
static void nodemcu_gpio_callback_task (task_param_t param, task_prio_t prio)
{
@ -245,7 +226,7 @@ static int nodemcu_gpio_init (lua_State *L)
{
cb_task = task_get_id (nodemcu_gpio_callback_task);
check_err (L,
gpio_isr_register (MAP_GPIO_PRO_INT_NO, nodemcu_gpio_isr, NULL));
gpio_install_isr_service (ESP_INTR_FLAG_LOWMED | ESP_INTR_FLAG_IRAM));
return 0;
}

View File

@ -134,14 +134,14 @@ static int wifi_ap_config (lua_State *L)
const char *str = luaL_checklstring (L, -1, &len);
if (len > sizeof (cfg.ap.ssid))
len = sizeof (cfg.ap.ssid);
strncpy (cfg.ap.ssid, str, len);
strncpy ((char *)cfg.ap.ssid, str, len);
cfg.ap.ssid_len = len;
lua_getfield (L, 1, "pwd");
str = luaL_optlstring (L, -1, "", &len);
if (len > sizeof (cfg.ap.password))
len = sizeof (cfg.ap.password);
strncpy (cfg.ap.password, str, len);
strncpy ((char *)cfg.ap.password, str, len);
lua_getfield (L, 1, "auth");
int authmode = luaL_optint (L, -1, WIFI_AUTH_WPA2_PSK);

View File

@ -176,13 +176,13 @@ static int wifi_sta_config (lua_State *L)
const char *str = luaL_checklstring (L, -1, &len);
if (len > sizeof (cfg.sta.ssid))
len = sizeof (cfg.sta.ssid);
strncpy (cfg.sta.ssid, str, len);
strncpy ((char *)cfg.sta.ssid, str, len);
lua_getfield (L, 1, "pwd");
str = luaL_optlstring (L, -1, "", &len);
if (len > sizeof (cfg.sta.password))
len = sizeof (cfg.sta.password);
strncpy (cfg.sta.password, str, len);
strncpy ((char *)cfg.sta.password, str, len);
lua_getfield (L, 1, "bssid");
cfg.sta.bssid_set = false;
@ -251,12 +251,12 @@ static int wifi_sta_getconfig (lua_State *L)
return luaL_error (L, "failed to get config, code %d", err);
lua_createtable (L, 0, 3);
size_t ssid_len = strnlen (cfg.sta.ssid, sizeof (cfg.sta.ssid));
lua_pushlstring (L, cfg.sta.ssid, ssid_len);
size_t ssid_len = strnlen ((char *)cfg.sta.ssid, sizeof (cfg.sta.ssid));
lua_pushlstring (L, (char *)cfg.sta.ssid, ssid_len);
lua_setfield (L, -2, "ssid");
size_t pwd_len = strnlen (cfg.sta.password, sizeof (cfg.sta.password));
lua_pushlstring (L, cfg.sta.password, pwd_len);
size_t pwd_len = strnlen ((char *)cfg.sta.password, sizeof (cfg.sta.password));
lua_pushlstring (L, (char *)cfg.sta.password, pwd_len);
lua_setfield (L, -2, "pwd");
if (cfg.sta.bssid_set)

View File

@ -93,7 +93,7 @@ bool platform_partition_add (const platform_partition_t *info)
slot->pos.offset = info->offs;
slot->pos.size = info->size;
memcpy (slot->label, info->label, sizeof (slot->label));
memset (slot->reserved, 0xff, sizeof (slot->reserved));
slot->flags = 0;
err = spi_flash_erase_sector (
ESP_PARTITION_TABLE_ADDR / SPI_FLASH_SEC_SIZE);
if (err == ESP_OK)

@ -1 +1 @@
Subproject commit c8685c200276abda4418f1367743f650d2aeacb2
Subproject commit 8bcd341fcae23c534ea98f47d1ba33e1694a9e48