summaryrefslogtreecommitdiffstatshomepage
path: root/cc3200/ftp/updater.c
diff options
context:
space:
mode:
Diffstat (limited to 'cc3200/ftp/updater.c')
-rw-r--r--cc3200/ftp/updater.c121
1 files changed, 121 insertions, 0 deletions
diff --git a/cc3200/ftp/updater.c b/cc3200/ftp/updater.c
new file mode 100644
index 0000000000..426d82bae7
--- /dev/null
+++ b/cc3200/ftp/updater.c
@@ -0,0 +1,121 @@
+#include <stdint.h>
+#include <stdbool.h>
+#include "std.h"
+
+#include "mpconfig.h"
+#include MICROPY_HAL_H
+#include "simplelink.h"
+#include "flc.h"
+#include "updater.h"
+#include "shamd5.h"
+#include "modwlan.h"
+#include "debug.h"
+
+/******************************************************************************
+ DEFINE PRIVATE CONSTANTS
+ ******************************************************************************/
+#define UPDATER_IMG_PATH "/SFLASH/SYS/MCUIMG.BIN"
+#define UPDATER_SRVPACK_PATH "/SFLASH/SYS/SRVPCK.UCF"
+#define UPDATER_SIGN_PATH "/SFLASH/SYS/SRVPCK.SIG"
+
+/******************************************************************************
+ DEFINE TYPES
+ ******************************************************************************/
+typedef struct {
+ char *path;
+ _i32 fhandle;
+ _u32 fsize;
+ _u32 foffset;
+} updater_data_t;
+
+/******************************************************************************
+ DECLARE PRIVATE DATA
+ ******************************************************************************/
+static updater_data_t updater_data;
+
+/******************************************************************************
+ DEFINE PUBLIC FUNCTIONS
+ ******************************************************************************/
+bool updater_check_path (void *path) {
+ // conert the path supplied to upper case
+ stoupper (path);
+ if (!strcmp(UPDATER_IMG_PATH, path)) {
+ updater_data.path = IMG_UPDATE;
+ updater_data.fsize = IMG_SIZE;
+ return true;
+ }
+ else if (!strcmp(UPDATER_SRVPACK_PATH, path)) {
+ updater_data.path = IMG_SRVPACK;
+ updater_data.fsize = SRVPACK_SIZE;
+ return true;
+ }
+ else if (!strcmp(UPDATER_SIGN_PATH, path)) {
+ updater_data.path = SRVPACK_SIGN;
+ updater_data.fsize = SIGN_SIZE;
+ return true;
+ }
+ return false;
+}
+
+bool updater_start (void) {
+ _u32 AccessModeAndMaxSize = FS_MODE_OPEN_WRITE;
+ SlFsFileInfo_t FsFileInfo;
+#ifdef USE_FREERTOS
+ xSemaphoreTake (xWlanSemaphore, portMAX_DELAY);
+#endif
+ if (0 != sl_FsGetInfo((_u8 *)updater_data.path, 0, &FsFileInfo)) {
+ // file doesn't exist, create it
+ AccessModeAndMaxSize = FS_MODE_OPEN_CREATE(updater_data.fsize, 0);
+ }
+ if (!sl_FsOpen((_u8 *)updater_data.path, AccessModeAndMaxSize, NULL, &updater_data.fhandle)) {
+ updater_data.foffset = 0;
+ return true;
+ }
+#ifdef USE_FREERTOS
+ xSemaphoreGive (xWlanSemaphore);
+#endif
+ return false;
+}
+
+bool updater_write (uint8_t *buf, uint32_t len) {
+ if (len == sl_FsWrite(updater_data.fhandle, updater_data.foffset, buf, len)) {
+ updater_data.foffset += len;
+ return true;
+ }
+ return false;
+}
+
+void updater_finnish (void) {
+ sBootInfo_t sBootInfo;
+ _i32 fhandle;
+
+ if (updater_data.fhandle > 0) {
+ // 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
+ 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
+ ASSERT (sl_FsOpen((unsigned char *)IMG_BOOT_INFO, FS_MODE_OPEN_WRITE, NULL, &fhandle) == 0);
+ }
+ else {
+ _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;
+ 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);
+ }
+ }
+ updater_data.fhandle = -1;
+#ifdef USE_FREERTOS
+ xSemaphoreGive (xWlanSemaphore);
+#endif
+}