summaryrefslogtreecommitdiffstatshomepage
path: root/cc3200/ftp
diff options
context:
space:
mode:
authorDaniel Campora <daniel@wipy.io>2015-07-14 21:39:07 +0200
committerDaniel Campora <daniel@wipy.io>2015-07-15 14:25:28 +0200
commite955089da0e60ab7d0f2daed5cb9e775b0927fe2 (patch)
treeb14ad90be6a024a53a78fd3031f2cdbfbc3e9d84 /cc3200/ftp
parent9309e609cdbd9b28afd3645d30cad15f54b797b7 (diff)
downloadmicropython-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.c2
-rw-r--r--cc3200/ftp/updater.c68
-rw-r--r--cc3200/ftp/updater.h11
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_ */