diff --git a/examples/wificfg/Makefile b/examples/wificfg/Makefile index 586b087..51b177f 100644 --- a/examples/wificfg/Makefile +++ b/examples/wificfg/Makefile @@ -3,10 +3,13 @@ PROGRAM=wificfg EXTRA_COMPONENTS=extras/dhcpserver extras/wificfg # For the mDNS responder included under extras: -# EXTRA_COMPONENTS+=extras/mdnsresponder -# EXTRA_CFLAGS=-DEXTRAS_MDNS_RESPONDER +# EXTRA_COMPONENTS += extras/mdnsresponder +# EXTRA_CFLAGS += -DEXTRAS_MDNS_RESPONDER # For the mDNS responder included with lwip: -EXTRA_CFLAGS=-DLWIP_MDNS_RESPONDER=1 -DLWIP_NUM_NETIF_CLIENT_DATA=1 -DLWIP_NETIF_EXT_STATUS_CALLBACK=1 +EXTRA_CFLAGS += -DLWIP_MDNS_RESPONDER=1 -DLWIP_NUM_NETIF_CLIENT_DATA=1 -DLWIP_NETIF_EXT_STATUS_CALLBACK=1 + +# Avoid writing the wifi state to flash when using wificfg. +EXTRA_CFLAGS += -DWIFI_PARAM_SAVE=0 include ../../common.mk diff --git a/open_esplibs/libmain/user_interface.c b/open_esplibs/libmain/user_interface.c index e81f175..cc0ffbe 100644 --- a/open_esplibs/libmain/user_interface.c +++ b/open_esplibs/libmain/user_interface.c @@ -576,6 +576,56 @@ enum sdk_dhcp_status sdk_wifi_station_dhcpc_status(void) { return sdk_dhcpc_flag; } + +#ifndef WIFI_PARAM_SAVE +#define WIFI_PARAM_SAVE 1 +#endif + +#if WIFI_PARAM_SAVE +static void wifi_save_protect(uint32_t sector, uint32_t sector_size, uint32_t *arg2, size_t size) { + uint32_t *buffer = malloc(size); + uint32_t offset = sector * sector_size; + + do { + sdk_spi_flash_erase_sector(sector); + sdk_spi_flash_write(offset, arg2, size); + sdk_spi_flash_read(offset, buffer, size); + if (memcmp(buffer, arg2, size) == 0) { + break; + } + printf("[W]sec %d error\n", sector); + } while (1); + + free(buffer); +} +#endif + +void sdk_wifi_param_save_protect(struct sdk_g_ic_saved_st *params) { +#if WIFI_PARAM_SAVE + uint32_t sector_size = sdk_flashchip.sector_size; + uint32_t sectors = sdk_flashchip.chip_size / sector_size; + + uint32_t dir_sector = sectors - 1; + struct param_dir_st dir; + sdk_spi_flash_read(dir_sector * sector_size, (uint32_t *)&dir, sizeof(dir)); + uint8_t current_sector = dir.current_sector ? 1 : 0; + dir.current_sector = current_sector; + + uint32_t param_sector_start = sectors - 3; + wifi_save_protect(param_sector_start + current_sector, sector_size, + (uint32_t *)params, sizeof(struct sdk_g_ic_saved_st)); + + dir.cksum_magic = 0x55AA55AA; + uint32_t save_count = dir.save_count + 1; + dir.save_count = (save_count) ? save_count : 1; + dir.cksum_len[current_sector] = sizeof(dir); + uint32_t checksum = sdk_system_get_checksum((uint8_t *)params, sizeof(dir)); + dir.cksum_value[current_sector] = checksum; + wifi_save_protect(dir_sector, sector_size, (uint32_t *)&dir, sizeof(dir)); +#endif +} + + uint8_t sdk_wifi_station_get_connect_status() { if (sdk_wifi_get_opmode() == 2) // ESPCONN_AP return 0xff;