From 8dc3a08c0f1d0b9b52b9170d53bbd8438342884f Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Thu, 15 Nov 2012 18:18:02 +0000 Subject: [PATCH] DFU cleanup. Removed extra layer of indirection --- module_dfu/src/dfu.xc | 243 ++++++++++++++++------------- module_dfu/src/flash_interface.c | 72 ++++----- module_dfu/src/flash_programmer.h | 13 -- module_dfu/src/flash_programmer.xc | 57 ------- 4 files changed, 166 insertions(+), 219 deletions(-) delete mode 100755 module_dfu/src/flash_programmer.h delete mode 100755 module_dfu/src/flash_programmer.xc diff --git a/module_dfu/src/dfu.xc b/module_dfu/src/dfu.xc index ff658565..f157dd05 100644 --- a/module_dfu/src/dfu.xc +++ b/module_dfu/src/dfu.xc @@ -11,7 +11,7 @@ #endif #include "dfu_types.h" -#include "flash_programmer.h" +#include "flash_interface.h" static int DFU_state = STATE_APP_IDLE; static int DFU_status = DFU_OK; @@ -39,7 +39,8 @@ static int DFU_OpenFlash(chanend ?c_user_cmd) { unsigned int cmd_data[16]; DFUCustomFlashEnable(); - HandleUserDeviceRequest(FLASH_CMD_INIT, 1, 0, cmd_data); + //HandleUserDeviceRequest(FLASH_CMD_INIT, 1, 0, cmd_data); + flash_cmd_init(); DFU_flash_connected = 1; } @@ -52,7 +53,8 @@ static int DFU_CloseFlash(chanend ?c_user_cmd) { unsigned int cmd_data[16]; DFUCustomFlashDisable(); - HandleUserDeviceRequest(FLASH_CMD_DEINIT, 1, 0, cmd_data); + //HandleUserDeviceRequest(FLASH_CMD_DEINIT, 1, 0, cmd_data); + flash_cmd_deinit(); DFU_flash_connected = 0; } return 0; @@ -114,13 +116,16 @@ static int DFU_Dnload(unsigned int request_len, unsigned int block_num, unsigned unsigned int cmd_data[16]; if (subPagesLeft) { unsigned int subPagePad[16] = {0}; - for (i = 0; i < subPagesLeft; i++) { - HandleUserDeviceRequest(FLASH_CMD_WRITE_PAGE_DATA, 1, 64, subPagePad); + for (i = 0; i < subPagesLeft; i++) + { + //HandleUserDeviceRequest(FLASH_CMD_WRITE_PAGE_DATA, 1, 64, subPagePad); + flash_cmd_write_page_data((subPagePad, unsigned char[64])); } } cmd_data[0] = 2; // Terminate write - HandleUserDeviceRequest(FLASH_CMD_WRITE_PAGE, 1, 4, cmd_data); + //HandleUserDeviceRequest(FLASH_CMD_WRITE_PAGE, 1, 4, cmd_data); + flash_cmd_write_page((cmd_data, unsigned char[])); DFU_state = STATE_DFU_MANIFEST_SYNC; } else { @@ -134,7 +139,9 @@ static int DFU_Dnload(unsigned int request_len, unsigned int block_num, unsigned unsigned s = 0; // Erase flash on first block - HandleUserDeviceRequest(FLASH_CMD_ERASE_ALL, 1, 0, cmd_data); + //HandleUserDeviceRequest(FLASH_CMD_ERASE_ALL, 1, 0, cmd_data); + flash_cmd_erase_all(); + } @@ -142,7 +149,8 @@ static int DFU_Dnload(unsigned int request_len, unsigned int block_num, unsigned if (!(block_num % 4)) { cmd_data[0] = !fromDfuIdle; // 0 for first page, 1 for other pages. - HandleUserDeviceRequest(FLASH_CMD_WRITE_PAGE, 1, 4, cmd_data); + //HandleUserDeviceRequest(FLASH_CMD_WRITE_PAGE, 1, 4, cmd_data); + flash_cmd_write_page((cmd_data, unsigned char[64])); subPagesLeft = 4; } @@ -150,7 +158,8 @@ static int DFU_Dnload(unsigned int request_len, unsigned int block_num, unsigned cmd_data[i] = request_data[i]; } - HandleUserDeviceRequest(FLASH_CMD_WRITE_PAGE_DATA, 1, 64, cmd_data); + //HandleUserDeviceRequest(FLASH_CMD_WRITE_PAGE_DATA, 1, 64, cmd_data); + flash_cmd_write_page_data((cmd_data, unsigned char[64])); subPagesLeft--; DFU_state = STATE_DFU_DOWNLOAD_SYNC; @@ -160,120 +169,136 @@ static int DFU_Dnload(unsigned int request_len, unsigned int block_num, unsigned } -static int DFU_Upload(unsigned int request_len, unsigned int block_num, unsigned int request_data[16], chanend ?c_user_cmd) { - unsigned int cmd_data[16]; - unsigned int firstRead = 0; +static int DFU_Upload(unsigned int request_len, unsigned int block_num, unsigned int request_data[16], chanend ?c_user_cmd) +{ + unsigned int cmd_data[16]; + unsigned int firstRead = 0; - // Start at flash address 0 - // Keep reading flash pages until read_page returns 1 (address out of range) - // Return terminating upload packet at this point + // Start at flash address 0 + // Keep reading flash pages until read_page returns 1 (address out of range) + // Return terminating upload packet at this point - DFU_OpenFlash(c_user_cmd); + DFU_OpenFlash(c_user_cmd); - switch (DFU_state) { - case STATE_DFU_IDLE: - case STATE_DFU_UPLOAD_IDLE: - break; - default: - DFU_state = STATE_DFU_ERROR; - return 0; - } - - //printintln(request_len); - - if ((DFU_state == STATE_DFU_IDLE) && (request_len == 0)) { - DFU_state = STATE_DFU_ERROR; - return 0; - } else if (DFU_state == STATE_DFU_IDLE) { - firstRead = 1; - subPagesLeft = 0; - } - - if (!subPagesLeft) { - cmd_data[0] = !firstRead; - - // Read page - HandleUserDeviceRequest(FLASH_CMD_READ_PAGE, 0, 4, cmd_data); - subPagesLeft = 4; - - // If address out of range, terminate! - if (cmd_data[0] == 1) { - subPagesLeft = 0; - // Back to idle state, upload complete - DFU_state = STATE_DFU_IDLE; - return 0; + switch (DFU_state) + { + case STATE_DFU_IDLE: + case STATE_DFU_UPLOAD_IDLE: + break; + default: + DFU_state = STATE_DFU_ERROR; + return 0; } - } - // Read page data - HandleUserDeviceRequest(FLASH_CMD_READ_PAGE_DATA, 0, 0, request_data); + if ((DFU_state == STATE_DFU_IDLE) && (request_len == 0)) + { + DFU_state = STATE_DFU_ERROR; + return 0; + } + else if (DFU_state == STATE_DFU_IDLE) + { + firstRead = 1; + subPagesLeft = 0; + } - subPagesLeft--; + if (!subPagesLeft) + { + cmd_data[0] = !firstRead; - DFU_state = STATE_DFU_UPLOAD_IDLE; + // Read page + // HandleUserDeviceRequest(FLASH_CMD_READ_PAGE, 0, 4, cmd_data); + flash_cmd_read_page((cmd_data, unsigned char[64])); + subPagesLeft = 4; - return 64; + // If address out of range, terminate! + if (cmd_data[0] == 1) + { + subPagesLeft = 0; + // Back to idle state, upload complete + DFU_state = STATE_DFU_IDLE; + return 0; + } + } + + // Read page data + // HandleUserDeviceRequest(FLASH_CMD_READ_PAGE_DATA, 0, 0, request_data); + flash_cmd_write_page_data((request_data, unsigned char[64])); + + subPagesLeft--; + + DFU_state = STATE_DFU_UPLOAD_IDLE; + + return 64; } -static int DFU_GetStatus(unsigned int request_len, unsigned int request_data[16], chanend ?c_user_cmd) { - unsigned int timeout = 0; +static int DFU_GetStatus(unsigned int request_len, unsigned int request_data[16], chanend ?c_user_cmd) +{ + unsigned int timeout = 0; - request_data[0] = timeout << 8 | (unsigned char)DFU_status; + request_data[0] = timeout << 8 | (unsigned char)DFU_status; - switch (DFU_state) { - case STATE_DFU_MANIFEST: - case STATE_DFU_MANIFEST_WAIT_RESET: - DFU_state = STATE_DFU_ERROR; - break; - case STATE_DFU_DOWNLOAD_BUSY: - // If download completes -> DFU_DOWNLOAD_SYNC - // Currently all transactions are synchronous so no busy state - break; - case STATE_DFU_DOWNLOAD_SYNC: - DFU_state = STATE_DFU_DOWNLOAD_IDLE; - break; - case STATE_DFU_MANIFEST_SYNC: - // Check if complete here - DFU_state = STATE_DFU_IDLE; - break; - default: - break; - } + switch (DFU_state) + { + case STATE_DFU_MANIFEST: + case STATE_DFU_MANIFEST_WAIT_RESET: + DFU_state = STATE_DFU_ERROR; + break; + case STATE_DFU_DOWNLOAD_BUSY: + // If download completes -> DFU_DOWNLOAD_SYNC + // Currently all transactions are synchronous so no busy state + break; + case STATE_DFU_DOWNLOAD_SYNC: + DFU_state = STATE_DFU_DOWNLOAD_IDLE; + break; + case STATE_DFU_MANIFEST_SYNC: + // Check if complete here + DFU_state = STATE_DFU_IDLE; + break; + default: + break; + } - request_data[1] = DFU_state; + request_data[1] = DFU_state; - return 6; + return 6; } -static int DFU_ClrStatus(void) { - if (DFU_state == STATE_DFU_ERROR) { +static int DFU_ClrStatus(void) +{ + if (DFU_state == STATE_DFU_ERROR) + { + DFU_state = STATE_DFU_IDLE; + } + else + { + DFU_state = STATE_DFU_ERROR; + } + return 0; +} + +static int DFU_GetState(unsigned int request_len, unsigned int request_data[16], chanend ?c_user_cmd) +{ + + request_data[0] = DFU_state; + + switch (DFU_state) + { + case STATE_DFU_DOWNLOAD_BUSY: + case STATE_DFU_MANIFEST: + case STATE_DFU_MANIFEST_WAIT_RESET: + DFU_state = STATE_DFU_ERROR; + break; + default: + break; + } + + return 1; +} + +static int DFU_Abort(void) +{ DFU_state = STATE_DFU_IDLE; - } else { - DFU_state = STATE_DFU_ERROR; - } - return 0; -} - -static int DFU_GetState(unsigned int request_len, unsigned int request_data[16], chanend ?c_user_cmd) { - - request_data[0] = DFU_state; - - switch (DFU_state) { - case STATE_DFU_DOWNLOAD_BUSY: - case STATE_DFU_MANIFEST: - case STATE_DFU_MANIFEST_WAIT_RESET: - DFU_state = STATE_DFU_ERROR; - break; - default: - break; - } - - return 1; -} - -static int DFU_Abort(void) { - DFU_state = STATE_DFU_IDLE; - return 0; + return 0; } // Tell the DFU state machine that a USB reset has occured @@ -341,7 +366,8 @@ int XMOS_DFU_RevertFactory(chanend ?c_user_cmd) DFU_OpenFlash(c_user_cmd); - HandleUserDeviceRequest(FLASH_CMD_ERASE_ALL, 1, 0, cmd_data); + //HandleUserDeviceRequest(FLASH_CMD_ERASE_ALL, 1, 0, cmd_data); + flash_cmd_erase_all(); DFUTimer :> s; DFUTimer when timerafter(s + 25000000) :> s; // Wait for flash erase @@ -460,7 +486,8 @@ int DFUDeviceRequests(XUD_ep ep0_out, XUD_ep &?ep0_in, SetupPacket &sp, chanend if (!user_reset) { unsigned int cmd_data[16]; - HandleUserDeviceRequest(FLASH_CMD_REBOOT, 1, 0, cmd_data); + //HandleUserDeviceRequest(FLASH_CMD_REBOOT, 1, 0, cmd_data); + flash_cmd_reboot(); } else { diff --git a/module_dfu/src/flash_interface.c b/module_dfu/src/flash_interface.c index 02905d60..3cccf96d 100755 --- a/module_dfu/src/flash_interface.c +++ b/module_dfu/src/flash_interface.c @@ -44,7 +44,6 @@ void DFUCustomFlashEnable() return; } - void DFUCustomFlashDisable() __attribute__ ((weak)); void DFUCustomFlashDisable() { @@ -52,40 +51,46 @@ void DFUCustomFlashDisable() } -int flash_cmd_init(void) { - fl_BootImageInfo image; +int flash_cmd_init(void) +{ + fl_BootImageInfo image; - if (!flash_device_open) { - if (flash_cmd_enable_ports()); - flash_device_open = 1; - } + if (!flash_device_open) + { + if (flash_cmd_enable_ports()) + flash_device_open = 1; + } - if (!flash_device_open) - return 0; + if (!flash_device_open) + return 0; - // Disable flash protection - fl_setProtection(0); + // Disable flash protection + fl_setProtection(0); - if (fl_getFactoryImage(&image) != 0) { - return 0; - } - factory_image = image; + if (fl_getFactoryImage(&image) != 0) + { + return 0; + } + + factory_image = image; - if (fl_getNextBootImage(&image) == 0) { - upgrade_image_valid = 1; - upgrade_image = image; - } + if (fl_getNextBootImage(&image) == 0) + { + upgrade_image_valid = 1; + upgrade_image = image; + } - return 0; + return 0; } -int flash_cmd_deinit(void) { - if (!flash_device_open) - return 0; +int flash_cmd_deinit(void) +{ + if (!flash_device_open) + return 0; - flash_cmd_disable_ports(); - flash_device_open = 0; - return 0; + flash_cmd_disable_ports(); + flash_device_open = 0; + return 0; } int flash_cmd_read_page(unsigned char *data) { @@ -114,21 +119,6 @@ int flash_cmd_read_page_data(unsigned char *data) { return 64; } -#if 0 -static int roundUpToSectorBoundary(unsigned address) -{ - unsigned curAddress = 0; - unsigned numSectors = fl_getNumSectors(); - unsigned i; - for (i = 0; i < numSectors; i++) { - curAddress += fl_getSectorSize(i); - if (curAddress >= address) - return curAddress; - } - return address; -} -#endif - static void begin_write() { int result; diff --git a/module_dfu/src/flash_programmer.h b/module_dfu/src/flash_programmer.h deleted file mode 100755 index b681de4a..00000000 --- a/module_dfu/src/flash_programmer.h +++ /dev/null @@ -1,13 +0,0 @@ -#define FLASH_CMD_WRITE_PAGE 0xf1 -#define FLASH_CMD_READ_PAGE 0xf2 -#define FLASH_CMD_WRITE_PAGE_DATA 0xf3 -#define FLASH_CMD_READ_PAGE_DATA 0xf4 -#define FLASH_CMD_ERASE_ALL 0xf5 -#define FLASH_CMD_REBOOT 0xf6 -#define FLASH_CMD_INIT 0xf7 -#define FLASH_CMD_DEINIT 0xf8 - -unsigned int flash_programmer(unsigned int cmd, unsigned int request_data[16]); -int HandleUserDeviceRequest(unsigned int cmd, unsigned int to_device, - unsigned int request_size, unsigned int request_data[16]); - diff --git a/module_dfu/src/flash_programmer.xc b/module_dfu/src/flash_programmer.xc deleted file mode 100755 index d72478dc..00000000 --- a/module_dfu/src/flash_programmer.xc +++ /dev/null @@ -1,57 +0,0 @@ -#include -#include -#include "flash_interface.h" -#include "flash_programmer.h" - -unsigned int flash_programmer(unsigned int cmd, unsigned int request_data[16]) { - unsigned int return_data_len = 0; - - switch (cmd) { - case FLASH_CMD_WRITE_PAGE: - return_data_len = flash_cmd_write_page((request_data, unsigned char[64])); - break; - - case FLASH_CMD_READ_PAGE: - return_data_len = flash_cmd_read_page((request_data, unsigned char[64])); - break; - - case FLASH_CMD_WRITE_PAGE_DATA: - return_data_len = flash_cmd_write_page_data((request_data, unsigned char[64])); - break; - - case FLASH_CMD_READ_PAGE_DATA: - return_data_len = flash_cmd_read_page_data((request_data, unsigned char[64])); - break; - - case FLASH_CMD_ERASE_ALL: - return_data_len = flash_cmd_erase_all(); - break; - - case FLASH_CMD_REBOOT: - return_data_len = flash_cmd_reboot(); - break; - - case FLASH_CMD_INIT: - return_data_len = flash_cmd_init(); - break; - - case FLASH_CMD_DEINIT: - return_data_len = flash_cmd_deinit(); - break; - - default: - break; - } - - return return_data_len; -} - -int HandleUserDeviceRequest(unsigned int cmd, unsigned int to_device, - unsigned int request_size, unsigned int request_data[16]) -{ - - unsigned int return_data_len = flash_programmer(cmd, request_data); - - return return_data_len; -} -