diff options
author | Daniel Campora <daniel@wipy.io> | 2015-07-14 21:39:07 +0200 |
---|---|---|
committer | Daniel Campora <daniel@wipy.io> | 2015-07-15 14:25:28 +0200 |
commit | e955089da0e60ab7d0f2daed5cb9e775b0927fe2 (patch) | |
tree | b14ad90be6a024a53a78fd3031f2cdbfbc3e9d84 /cc3200/ftp | |
parent | 9309e609cdbd9b28afd3645d30cad15f54b797b7 (diff) | |
download | micropython-e955089da0e60ab7d0f2daed5cb9e775b0927fe2.tar.gz micropython-e955089da0e60ab7d0f2daed5cb9e775b0927fe2.zip |
cc3200: Implement new OTA mechanism with 2 firmware update slots.
Diffstat (limited to 'cc3200/ftp')
-rw-r--r-- | cc3200/ftp/ftp.c | 2 | ||||
-rw-r--r-- | cc3200/ftp/updater.c | 68 | ||||
-rw-r--r-- | cc3200/ftp/updater.h | 11 |
3 files changed, 64 insertions, 17 deletions
diff --git a/cc3200/ftp/ftp.c b/cc3200/ftp/ftp.c index 2aba00d539..651cd1ef90 100644 --- a/cc3200/ftp/ftp.c +++ b/cc3200/ftp/ftp.c @@ -764,6 +764,8 @@ static void ftp_process_cmd (void) { ftp_send_reply(150, NULL); } else { + // to unlock the updater + updater_finnish(); ftp_data.state = E_FTP_STE_END_TRANSFER; ftp_send_reply(550, NULL); } diff --git a/cc3200/ftp/updater.c b/cc3200/ftp/updater.c index 974b2f72d7..2f983b16c6 100644 --- a/cc3200/ftp/updater.c +++ b/cc3200/ftp/updater.c @@ -37,6 +37,7 @@ #include "modnetwork.h" #include "modwlan.h" #include "debug.h" +#include "osi.h" /****************************************************************************** DEFINE PRIVATE CONSTANTS @@ -61,15 +62,37 @@ typedef struct { /****************************************************************************** DECLARE PRIVATE DATA ******************************************************************************/ -static updater_data_t updater_data; +static updater_data_t updater_data = { .path = NULL, .fhandle = -1, .fsize = 0, .foffset = 0 }; +static OsiLockObj_t updater_LockObj; +static sBootInfo_t sBootInfo; /****************************************************************************** DEFINE PUBLIC FUNCTIONS ******************************************************************************/ +__attribute__ ((section (".boot"))) +void updater_pre_init (void) { + // create the updater lock + ASSERT(OSI_OK == sl_LockObjCreate(&updater_LockObj, "UpdaterLock")); +} + bool updater_check_path (void *path) { + sl_LockObjLock (&updater_LockObj, SL_OS_WAIT_FOREVER); if (!strcmp(UPDATER_IMG_PATH, path)) { - updater_data.path = IMG_UPDATE; updater_data.fsize = IMG_SIZE; + updater_data.path = IMG_UPDATE1; +// the launchxl doesn't have enough flash space for 2 user update images +#ifdef WIPY + // check which one should be the next active image + _i32 fhandle; + if (!sl_FsOpen((unsigned char *)IMG_BOOT_INFO, FS_MODE_OPEN_READ, NULL, &fhandle)) { + ASSERT (sizeof(sBootInfo_t) == sl_FsRead(fhandle, 0, (unsigned char *)&sBootInfo, sizeof(sBootInfo_t))); + sl_FsClose(fhandle, 0, 0, 0); + if ((sBootInfo.Status == IMG_STATUS_CHECK && sBootInfo.ActiveImg == IMG_ACT_UPDATE2) || + sBootInfo.ActiveImg == IMG_ACT_UPDATE1) { + updater_data.path = IMG_UPDATE2; + } + } +#endif } else if (!strcmp(UPDATER_SRVPACK_PATH, path)) { updater_data.path = IMG_SRVPACK; updater_data.fsize = SRVPACK_SIZE; @@ -86,6 +109,7 @@ bool updater_check_path (void *path) { updater_data.path = KEY_FILE; updater_data.fsize = CA_KEY_SIZE; } else { + sl_LockObjUnlock (&updater_LockObj); return false; } return true; @@ -106,7 +130,6 @@ bool updater_start (void) { result = true; } sl_LockObjUnlock (&wlan_LockObj); - return result; } @@ -124,35 +147,56 @@ bool updater_write (uint8_t *buf, uint32_t len) { } void updater_finnish (void) { - sBootInfo_t sBootInfo; _i32 fhandle; if (updater_data.fhandle > 0) { sl_LockObjLock (&wlan_LockObj, SL_OS_WAIT_FOREVER); // close the file being updated sl_FsClose(updater_data.fhandle, NULL, NULL, 0); - - if (!strcmp (IMG_UPDATE, updater_data.path)) { - // open the boot info file for reading +#ifdef WIPY + // if we still have an image pending for verification, leave the boot info as it is + if (!strncmp(IMG_PREFIX, updater_data.path, strlen(IMG_PREFIX)) && sBootInfo.Status != IMG_STATUS_CHECK) { +#else + if (!strncmp(IMG_PREFIX, updater_data.path, strlen(IMG_PREFIX))) { +#endif +#ifdef DEBUG if (!sl_FsOpen((unsigned char *)IMG_BOOT_INFO, FS_MODE_OPEN_READ, NULL, &fhandle)) { + ASSERT (sizeof(sBootInfo_t) == sl_FsRead(fhandle, 0, (unsigned char *)&sBootInfo, sizeof(sBootInfo_t))); sl_FsClose(fhandle, 0, 0, 0); - // open the file for writing +#endif + // open the boot info file for writing ASSERT (sl_FsOpen((unsigned char *)IMG_BOOT_INFO, FS_MODE_OPEN_WRITE, NULL, &fhandle) == 0); +#ifdef DEBUG } else { + // the boot info file doesn't exist yet _u32 BootInfoCreateFlag = _FS_FILE_OPEN_FLAG_COMMIT | _FS_FILE_PUBLIC_WRITE | _FS_FILE_PUBLIC_READ; ASSERT (sl_FsOpen ((unsigned char *)IMG_BOOT_INFO, FS_MODE_OPEN_CREATE((2 * sizeof(sBootInfo_t)), BootInfoCreateFlag), NULL, &fhandle) == 0); } - - // write the new boot info - sBootInfo.ActiveImg = IMG_ACT_UPDATE; +#endif + + // save the new boot info +#ifdef WIPY + sBootInfo.PrevImg = sBootInfo.ActiveImg; + if (sBootInfo.ActiveImg == IMG_ACT_UPDATE1) { + sBootInfo.ActiveImg = IMG_ACT_UPDATE2; + } else { + sBootInfo.ActiveImg = IMG_ACT_UPDATE1; + } +// the launchxl doesn't have enough flash space for 2 user updates +#else + sBootInfo.PrevImg = IMG_ACT_FACTORY; + sBootInfo.ActiveImg = IMG_ACT_UPDATE1; +#endif sBootInfo.Status = IMG_STATUS_CHECK; ASSERT (sizeof(sBootInfo_t) == sl_FsWrite(fhandle, 0, (unsigned char *)&sBootInfo, sizeof(sBootInfo_t))); sl_FsClose(fhandle, 0, 0, 0); } sl_LockObjUnlock (&wlan_LockObj); + updater_data.fhandle = -1; } - updater_data.fhandle = -1; + sl_LockObjUnlock (&updater_LockObj); } + diff --git a/cc3200/ftp/updater.h b/cc3200/ftp/updater.h index 518d76c4c7..b581d0fc8a 100644 --- a/cc3200/ftp/updater.h +++ b/cc3200/ftp/updater.h @@ -28,10 +28,11 @@ #ifndef UPDATER_H_ #define UPDATER_H_ -bool updater_check_path (void *path); -bool updater_start (void); -bool updater_write (uint8_t *buf, uint32_t len); -void updater_finnish (void); -bool updater_verify (uint8_t *rbuff, uint8_t *hasbuff); +extern void updater_pre_init (void); +extern bool updater_check_path (void *path); +extern bool updater_start (void); +extern bool updater_write (uint8_t *buf, uint32_t len); +extern void updater_finnish (void); +extern bool updater_verify (uint8_t *rbuff, uint8_t *hasbuff); #endif /* UPDATER_H_ */ |