From 2a9d87b6c5432969e547a1befaebc31d7455d843 Mon Sep 17 00:00:00 2001 From: Philippe G Date: Wed, 1 Dec 2021 19:15:29 -0800 Subject: [PATCH] add multi-expander --- components/services/accessors.c | 37 ++++++++++++++++++++------------- components/services/accessors.h | 2 +- components/services/services.c | 6 +++--- 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/components/services/accessors.c b/components/services/accessors.c index 2ddb1fea..58652bbd 100644 --- a/components/services/accessors.c +++ b/components/services/accessors.c @@ -485,24 +485,31 @@ const i2c_config_t * config_i2c_get(int * i2c_port) { /**************************************************************************************** * Get IO expander config structure from config string */ -const gpio_exp_config_t* config_gpio_exp_get(void) { - char *nvs_item, *p; - static gpio_exp_config_t config = { - .intr = -1, - .count = 16, - .base = GPIO_NUM_MAX, - }; - config.phy.port = i2c_system_port; +const gpio_exp_config_t* config_gpio_exp_get(int index) { + char *nvs_item, *item, *p; + static gpio_exp_config_t config; + + // re-initialize config every time + memset(&config, 0, sizeof(config)); + config.intr = -1; config.count = 16; config.base = GPIO_NUM_MAX; config.phy.port = i2c_system_port; nvs_item = config_alloc_get(NVS_TYPE_STR, "gpio_exp_config"); if (!nvs_item || !*nvs_item) return NULL; - - if ((p = strcasestr(nvs_item, "addr")) != NULL) config.phy.addr = atoi(strchr(p, '=') + 1); - if ((p = strcasestr(nvs_item, "intr")) != NULL) config.intr = atoi(strchr(p, '=') + 1); - if ((p = strcasestr(nvs_item, "base")) != NULL) config.base = atoi(strchr(p, '=') + 1); - if ((p = strcasestr(nvs_item, "count")) != NULL) config.count = atoi(strchr(p, '=') + 1); - if ((p = strcasestr(nvs_item, "model")) != NULL) sscanf(p, "%*[^=]=%31[^,]", config.model); - if ((p = strcasestr(nvs_item, "port")) != NULL) { + + // search index items + for (item = strtok(nvs_item, ";"); index && item; index--) { + if ((item = strtok(NULL, ";")) == NULL) { + free(nvs_item); + return NULL; + } + } + + if ((p = strcasestr(item, "addr")) != NULL) config.phy.addr = atoi(strchr(p, '=') + 1); + if ((p = strcasestr(item, "intr")) != NULL) config.intr = atoi(strchr(p, '=') + 1); + if ((p = strcasestr(item, "base")) != NULL) config.base = atoi(strchr(p, '=') + 1); + if ((p = strcasestr(item, "count")) != NULL) config.count = atoi(strchr(p, '=') + 1); + if ((p = strcasestr(item, "model")) != NULL) sscanf(p, "%*[^=]=%31[^,]", config.model); + if ((p = strcasestr(item, "port")) != NULL) { char port[8] = ""; sscanf(p, "%*[^=]=%7[^,]", port); if (strcasestr(port, "dac")) config.phy.port = 0; diff --git a/components/services/accessors.h b/components/services/accessors.h index 3b731136..e0fc45e2 100644 --- a/components/services/accessors.h +++ b/components/services/accessors.h @@ -95,7 +95,7 @@ esp_err_t config_i2s_set(const i2s_platform_config_t * config, const char * esp_err_t config_spi_set(const spi_bus_config_t * config, int host, int dc); const i2c_config_t * config_i2c_get(int * i2c_port); const spi_bus_config_t * config_spi_get(spi_host_device_t * spi_host); -const gpio_exp_config_t * config_gpio_exp_get(void); +const gpio_exp_config_t * config_gpio_exp_get(int index); void parse_set_GPIO(void (*cb)(int gpio, char *value)); const i2s_platform_config_t * config_dac_get(); const i2s_platform_config_t * config_spdif_get( ); diff --git a/components/services/services.c b/components/services/services.c index 53e71749..dc005f60 100644 --- a/components/services/services.c +++ b/components/services/services.c @@ -70,9 +70,9 @@ void services_init(void) { } #endif - // create GPIO expander - const gpio_exp_config_t * gpio_exp_config = config_gpio_exp_get(); - if (gpio_exp_config) gpio_exp_create(gpio_exp_config); + // create GPIO expanders + const gpio_exp_config_t* gpio_exp_config; + for (int count = 0; (gpio_exp_config = config_gpio_exp_get(count)); count++) gpio_exp_create(gpio_exp_config); // set potential power GPIO (a GPIO-powered expander might be an issue) parse_set_GPIO(set_power_gpio);