Use safe flash options.

This commit is contained in:
HuangRui 2015-01-06 19:32:17 +08:00
parent 7e51c5d67e
commit 3c6ebea059
3 changed files with 52 additions and 17 deletions

View File

@ -71,10 +71,10 @@ bool flash_set_size(uint8_t size)
// Reboot required!!! // Reboot required!!!
// If you don't know what you're doing, your nodemcu may turn into stone ... // If you don't know what you're doing, your nodemcu may turn into stone ...
uint8_t data[SPI_FLASH_SEC_SIZE] ICACHE_STORE_ATTR; uint8_t data[SPI_FLASH_SEC_SIZE] ICACHE_STORE_ATTR;
SPIRead(0, data, sizeof(data)); spi_flash_read(0, (uint32 *)data, sizeof(data));
SPIFlashInfo *p_spi_flash_info = (SPIFlashInfo *)(data); SPIFlashInfo *p_spi_flash_info = (SPIFlashInfo *)(data);
p_spi_flash_info->size = size; p_spi_flash_info->size = size;
SPIEraseSector(0); spi_flash_erase_sector(0);
spi_flash_write(0, (uint32 *)data, sizeof(data)); spi_flash_write(0, (uint32 *)data, sizeof(data));
//p_spi_flash_info = flash_get_info(); //p_spi_flash_info = flash_get_info();
//p_spi_flash_info->size = size; //p_spi_flash_info->size = size;
@ -175,13 +175,13 @@ uint32_t flash_get_speed(void)
bool flash_init_data_written(void) bool flash_init_data_written(void)
{ {
// FLASH SEC - 4 // FLASH SEC - 4
// Dangerous, here are dinosaur infested!!!!!
// Reboot required!!!
// It will init system data to default!
uint32_t data[2] ICACHE_STORE_ATTR; uint32_t data[2] ICACHE_STORE_ATTR;
SPIRead((flash_get_sec_num() - 4) * SPI_FLASH_SEC_SIZE, data, sizeof(data)); if (SPI_FLASH_RESULT_OK == spi_flash_read((flash_get_sec_num() - 4) * SPI_FLASH_SEC_SIZE, (uint32 *)data, sizeof(data)))
if(data[0] == 0xFFFFFFFF && data[1] == 0xFFFFFFFF) { {
return false; if (data[0] == 0xFFFFFFFF && data[1] == 0xFFFFFFFF)
{
return false;
}
} }
return true; return true;
} }
@ -192,10 +192,15 @@ bool flash_init_data_default(void)
// Dangerous, here are dinosaur infested!!!!! // Dangerous, here are dinosaur infested!!!!!
// Reboot required!!! // Reboot required!!!
// It will init system data to default! // It will init system data to default!
bool result = false;
SPIEraseSector((flash_get_sec_num() - 4)); if (SPI_FLASH_RESULT_OK == spi_flash_erase_sector((flash_get_sec_num() - 4)))
spi_flash_write((flash_get_sec_num() - 4) * SPI_FLASH_SEC_SIZE, (uint32 *)flash_init_data, 128); {
return true; if (SPI_FLASH_RESULT_OK == spi_flash_write((flash_get_sec_num() - 4) * SPI_FLASH_SEC_SIZE, (uint32 *)flash_init_data, 128))
{
result = true;
}
}
return result;
} }
bool flash_init_data_blank(void) bool flash_init_data_blank(void)
@ -204,14 +209,19 @@ bool flash_init_data_blank(void)
// Dangerous, here are dinosaur infested!!!!! // Dangerous, here are dinosaur infested!!!!!
// Reboot required!!! // Reboot required!!!
// It will init system config to blank! // It will init system config to blank!
SPIEraseSector((flash_get_sec_num() - 2)); bool result = false;
SPIEraseSector((flash_get_sec_num() - 1)); if ((SPI_FLASH_RESULT_OK == spi_flash_erase_sector((flash_get_sec_num() - 2))) &&
return true; (SPI_FLASH_RESULT_OK == spi_flash_erase_sector((flash_get_sec_num() - 1))))
{
result = true;
}
return result ;
} }
bool flash_self_destruct(void) bool flash_self_destruct(void)
{ {
// Erase your flash. Good bye! // Dangerous, Erase your flash. Good bye!
SPIEraseChip(); SPIEraseChip();
return true; return true;
} }

View File

@ -5,6 +5,28 @@
#include "cpu_esp8266.h" #include "cpu_esp8266.h"
#define FLASH_MAP_START_ADDRESS (INTERNAL_FLASH_START_ADDRESS) #define FLASH_MAP_START_ADDRESS (INTERNAL_FLASH_START_ADDRESS)
/******************************************************************************
* ROM Function definition
* Note: It is unsafe to use ROM function, but it may efficient.
* SPIEraseSector
* unknown SPIEraseSector(uint16 sec);
* The 1st parameter is flash sector number.
* SPIRead (Unsafe)
* unknown SPIRead(uint32_t src_addr, uint32_t *des_addr, uint32_t size);
* The 1st parameter is source addresses.
* The 2nd parameter is destination addresses.
* The 3rd parameter is size.
* Note: Sometimes it have no effect, may be need a delay or other option(lock or unlock, etc.) with known reason.
* SPIWrite (Unsafe)
* unknown SPIWrite(uint32_t des_addr, uint32_t *src_addr, uint32_t size);
* The 1st parameter is destination addresses.
* The 2nd parameter is source addresses.
* The 3rd parameter is size.
* Note: Sometimes it have no effect, may be need a delay or other option(lock or unlock, etc.) with known reason.
*******************************************************************************/
typedef struct typedef struct
{ {
uint8_t unknown0; uint8_t unknown0;

View File

@ -83,9 +83,12 @@ void user_init(void)
return; return;
} }
if(!flash_init_data_written()){ if( !flash_init_data_written() ){
NODE_ERR("Restore init data.\n"); NODE_ERR("Restore init data.\n");
// Flash init data at FLASHSIZE - 0x04000 Byte.
flash_init_data_default(); flash_init_data_default();
// Flash blank data at FLASHSIZE - 0x02000 Byte.
flash_init_data_blank();
} }
#if defined( BUILD_WOFS ) #if defined( BUILD_WOFS )