|  | @@ -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;
 |