libmain: add a compile option to avoid saving wifi params to flash

Add source code for sdk_wifi_param_save_protect() and a compile time,
WIFI_PARAM_SAVE, option to skip writing the wifi state to flash. This
avoids wear on the flash and does not appear to be necessary when the
app initializes the state anyway.

Define WIFI_PARAM_SAVE to 0 for the wificfg example.
This commit is contained in:
Our Air Quality 2018-06-17 20:08:58 +10:00
parent f89ba44f6e
commit 7a8ee567b6
2 changed files with 56 additions and 3 deletions

View file

@ -4,9 +4,12 @@ EXTRA_COMPONENTS=extras/dhcpserver extras/wificfg
# For the mDNS responder included under extras:
# EXTRA_COMPONENTS += extras/mdnsresponder
# EXTRA_CFLAGS=-DEXTRAS_MDNS_RESPONDER
# 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

View file

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