Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion SPARK_Firmware_Driver/inc/hw_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,8 @@ void FLASH_Erase(void);
void FLASH_Backup(uint32_t sFLASH_Address);
void FLASH_Restore(uint32_t sFLASH_Address);
/* External Flash Helper routines */
void FLASH_Begin(uint32_t sFLASH_Address);
uint32_t FLASH_PagesMask(uint32_t fileSize);
void FLASH_Begin(uint32_t sFLASH_Address, uint32_t fileSize);
uint16_t FLASH_Update(uint8_t *pBuffer, uint32_t bufferSize);
void FLASH_End(void);
void FLASH_Read_ServerAddress(ServerAddress *server_addr);
Expand Down
38 changes: 25 additions & 13 deletions SPARK_Firmware_Driver/src/hw_config.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ uint16_t Flash_Update_Index = 0;
uint32_t EraseCounter = 0;
uint32_t NbrOfPage = 0;
volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;
static uint32_t External_Flash_Start_Address = 0;

__IO uint16_t CC3000_SPI_CR;
__IO uint16_t sFLASH_SPI_CR;
Expand Down Expand Up @@ -1481,28 +1482,41 @@ void FLASH_Restore(uint32_t sFLASH_Address)
#endif
}

void FLASH_Begin(uint32_t sFLASH_Address)
uint32_t FLASH_PagesMask(uint32_t fileSize)
{
#ifdef SPARK_SFLASH_ENABLE
//Calculate the number of flash pages that needs to be erased
uint32_t numPages = 0x0;

LED_SetRGBColor(RGB_COLOR_MAGENTA);
LED_On(LED_RGB);
if ((fileSize % sFLASH_PAGESIZE) != 0)
{
numPages = (fileSize / sFLASH_PAGESIZE) + 1;
}
else
{
numPages = fileSize / sFLASH_PAGESIZE;
}

OTA_FLASHED_Status_SysFlag = 0x0000;
//FLASH_OTA_Update_SysFlag = 0x5555;
return numPages;
}

void FLASH_Begin(uint32_t sFLASH_Address, uint32_t fileSize)
{
#ifdef SPARK_SFLASH_ENABLE

OTA_FLASHED_Status_SysFlag = 0x0000;
Save_SystemFlags();
//BKP_WriteBackupRegister(BKP_DR10, 0x5555);

Flash_Update_Index = 0;
External_Flash_Address = sFLASH_Address;
External_Flash_Start_Address = sFLASH_Address;
External_Flash_Address = External_Flash_Start_Address;

/* Define the number of External Flash pages to be erased */
NbrOfPage = EXTERNAL_FLASH_BLOCK_SIZE / sFLASH_PAGESIZE;
NbrOfPage = FLASH_PagesMask(fileSize);

/* Erase the SPI Flash pages */
for (EraseCounter = 0; (EraseCounter < NbrOfPage); EraseCounter++)
{
sFLASH_EraseSector(sFLASH_Address + (sFLASH_PAGESIZE * EraseCounter));
sFLASH_EraseSector(External_Flash_Start_Address + (sFLASH_PAGESIZE * EraseCounter));
}

#endif
Expand Down Expand Up @@ -1532,11 +1546,9 @@ uint16_t FLASH_Update(uint8_t *pBuffer, uint32_t bufferSize)
/* Erase the problematic SPI Flash pages and back off the chunk index */
External_Flash_Address = ((uint32_t)(External_Flash_Address / sFLASH_PAGESIZE)) * sFLASH_PAGESIZE;
sFLASH_EraseSector(External_Flash_Address);
Flash_Update_Index = (uint16_t)((External_Flash_Address - EXTERNAL_FLASH_OTA_ADDRESS) / bufferSize);
Flash_Update_Index = (uint16_t)((External_Flash_Address - External_Flash_Start_Address) / bufferSize);
}

LED_Toggle(LED_RGB);

return Flash_Update_Index;

#endif
Expand Down