瀏覽代碼

add multi-expander

Philippe G 3 年之前
父節點
當前提交
2a9d87b6c5
共有 3 個文件被更改,包括 26 次插入19 次删除
  1. 22 15
      components/services/accessors.c
  2. 1 1
      components/services/accessors.h
  3. 3 3
      components/services/services.c

+ 22 - 15
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;

+ 1 - 1
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( );

+ 3 - 3
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);