DFU cleanup. Removed extra layer of indirection

This commit is contained in:
Ross Owen
2012-11-15 18:18:02 +00:00
parent a19e328b21
commit 8dc3a08c0f
4 changed files with 166 additions and 219 deletions

View File

@@ -11,7 +11,7 @@
#endif #endif
#include "dfu_types.h" #include "dfu_types.h"
#include "flash_programmer.h" #include "flash_interface.h"
static int DFU_state = STATE_APP_IDLE; static int DFU_state = STATE_APP_IDLE;
static int DFU_status = DFU_OK; static int DFU_status = DFU_OK;
@@ -39,7 +39,8 @@ static int DFU_OpenFlash(chanend ?c_user_cmd)
{ {
unsigned int cmd_data[16]; unsigned int cmd_data[16];
DFUCustomFlashEnable(); DFUCustomFlashEnable();
HandleUserDeviceRequest(FLASH_CMD_INIT, 1, 0, cmd_data); //HandleUserDeviceRequest(FLASH_CMD_INIT, 1, 0, cmd_data);
flash_cmd_init();
DFU_flash_connected = 1; DFU_flash_connected = 1;
} }
@@ -52,7 +53,8 @@ static int DFU_CloseFlash(chanend ?c_user_cmd)
{ {
unsigned int cmd_data[16]; unsigned int cmd_data[16];
DFUCustomFlashDisable(); DFUCustomFlashDisable();
HandleUserDeviceRequest(FLASH_CMD_DEINIT, 1, 0, cmd_data); //HandleUserDeviceRequest(FLASH_CMD_DEINIT, 1, 0, cmd_data);
flash_cmd_deinit();
DFU_flash_connected = 0; DFU_flash_connected = 0;
} }
return 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]; unsigned int cmd_data[16];
if (subPagesLeft) { if (subPagesLeft) {
unsigned int subPagePad[16] = {0}; unsigned int subPagePad[16] = {0};
for (i = 0; i < subPagesLeft; i++) { for (i = 0; i < subPagesLeft; i++)
HandleUserDeviceRequest(FLASH_CMD_WRITE_PAGE_DATA, 1, 64, subPagePad); {
//HandleUserDeviceRequest(FLASH_CMD_WRITE_PAGE_DATA, 1, 64, subPagePad);
flash_cmd_write_page_data((subPagePad, unsigned char[64]));
} }
} }
cmd_data[0] = 2; // Terminate write 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; DFU_state = STATE_DFU_MANIFEST_SYNC;
} else { } else {
@@ -134,7 +139,9 @@ static int DFU_Dnload(unsigned int request_len, unsigned int block_num, unsigned
unsigned s = 0; unsigned s = 0;
// Erase flash on first block // 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)) if (!(block_num % 4))
{ {
cmd_data[0] = !fromDfuIdle; // 0 for first page, 1 for other pages. 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; 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]; 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--; subPagesLeft--;
DFU_state = STATE_DFU_DOWNLOAD_SYNC; DFU_state = STATE_DFU_DOWNLOAD_SYNC;
@@ -160,7 +169,8 @@ 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) { 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 cmd_data[16];
unsigned int firstRead = 0; unsigned int firstRead = 0;
@@ -170,7 +180,8 @@ static int DFU_Upload(unsigned int request_len, unsigned int block_num, unsigned
DFU_OpenFlash(c_user_cmd); DFU_OpenFlash(c_user_cmd);
switch (DFU_state) { switch (DFU_state)
{
case STATE_DFU_IDLE: case STATE_DFU_IDLE:
case STATE_DFU_UPLOAD_IDLE: case STATE_DFU_UPLOAD_IDLE:
break; break;
@@ -179,25 +190,29 @@ static int DFU_Upload(unsigned int request_len, unsigned int block_num, unsigned
return 0; return 0;
} }
//printintln(request_len); if ((DFU_state == STATE_DFU_IDLE) && (request_len == 0))
{
if ((DFU_state == STATE_DFU_IDLE) && (request_len == 0)) {
DFU_state = STATE_DFU_ERROR; DFU_state = STATE_DFU_ERROR;
return 0; return 0;
} else if (DFU_state == STATE_DFU_IDLE) { }
else if (DFU_state == STATE_DFU_IDLE)
{
firstRead = 1; firstRead = 1;
subPagesLeft = 0; subPagesLeft = 0;
} }
if (!subPagesLeft) { if (!subPagesLeft)
{
cmd_data[0] = !firstRead; cmd_data[0] = !firstRead;
// Read page // Read page
HandleUserDeviceRequest(FLASH_CMD_READ_PAGE, 0, 4, cmd_data); // HandleUserDeviceRequest(FLASH_CMD_READ_PAGE, 0, 4, cmd_data);
flash_cmd_read_page((cmd_data, unsigned char[64]));
subPagesLeft = 4; subPagesLeft = 4;
// If address out of range, terminate! // If address out of range, terminate!
if (cmd_data[0] == 1) { if (cmd_data[0] == 1)
{
subPagesLeft = 0; subPagesLeft = 0;
// Back to idle state, upload complete // Back to idle state, upload complete
DFU_state = STATE_DFU_IDLE; DFU_state = STATE_DFU_IDLE;
@@ -206,7 +221,8 @@ static int DFU_Upload(unsigned int request_len, unsigned int block_num, unsigned
} }
// Read page data // Read page data
HandleUserDeviceRequest(FLASH_CMD_READ_PAGE_DATA, 0, 0, request_data); // HandleUserDeviceRequest(FLASH_CMD_READ_PAGE_DATA, 0, 0, request_data);
flash_cmd_write_page_data((request_data, unsigned char[64]));
subPagesLeft--; subPagesLeft--;
@@ -215,12 +231,14 @@ static int DFU_Upload(unsigned int request_len, unsigned int block_num, unsigned
return 64; return 64;
} }
static int DFU_GetStatus(unsigned int request_len, unsigned int request_data[16], chanend ?c_user_cmd) { static int DFU_GetStatus(unsigned int request_len, unsigned int request_data[16], chanend ?c_user_cmd)
{
unsigned int timeout = 0; 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) { switch (DFU_state)
{
case STATE_DFU_MANIFEST: case STATE_DFU_MANIFEST:
case STATE_DFU_MANIFEST_WAIT_RESET: case STATE_DFU_MANIFEST_WAIT_RESET:
DFU_state = STATE_DFU_ERROR; DFU_state = STATE_DFU_ERROR;
@@ -245,20 +263,26 @@ static int DFU_GetStatus(unsigned int request_len, unsigned int request_data[16]
return 6; return 6;
} }
static int DFU_ClrStatus(void) { static int DFU_ClrStatus(void)
if (DFU_state == STATE_DFU_ERROR) { {
if (DFU_state == STATE_DFU_ERROR)
{
DFU_state = STATE_DFU_IDLE; DFU_state = STATE_DFU_IDLE;
} else { }
else
{
DFU_state = STATE_DFU_ERROR; DFU_state = STATE_DFU_ERROR;
} }
return 0; return 0;
} }
static int DFU_GetState(unsigned int request_len, unsigned int request_data[16], chanend ?c_user_cmd) { static int DFU_GetState(unsigned int request_len, unsigned int request_data[16], chanend ?c_user_cmd)
{
request_data[0] = DFU_state; request_data[0] = DFU_state;
switch (DFU_state) { switch (DFU_state)
{
case STATE_DFU_DOWNLOAD_BUSY: case STATE_DFU_DOWNLOAD_BUSY:
case STATE_DFU_MANIFEST: case STATE_DFU_MANIFEST:
case STATE_DFU_MANIFEST_WAIT_RESET: case STATE_DFU_MANIFEST_WAIT_RESET:
@@ -271,7 +295,8 @@ static int DFU_GetState(unsigned int request_len, unsigned int request_data[16],
return 1; return 1;
} }
static int DFU_Abort(void) { static int DFU_Abort(void)
{
DFU_state = STATE_DFU_IDLE; DFU_state = STATE_DFU_IDLE;
return 0; return 0;
} }
@@ -341,7 +366,8 @@ int XMOS_DFU_RevertFactory(chanend ?c_user_cmd)
DFU_OpenFlash(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 :> s;
DFUTimer when timerafter(s + 25000000) :> s; // Wait for flash erase 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) if (!user_reset)
{ {
unsigned int cmd_data[16]; 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 else
{ {

View File

@@ -44,7 +44,6 @@ void DFUCustomFlashEnable()
return; return;
} }
void DFUCustomFlashDisable() __attribute__ ((weak)); void DFUCustomFlashDisable() __attribute__ ((weak));
void DFUCustomFlashDisable() void DFUCustomFlashDisable()
{ {
@@ -52,11 +51,13 @@ void DFUCustomFlashDisable()
} }
int flash_cmd_init(void) { int flash_cmd_init(void)
{
fl_BootImageInfo image; fl_BootImageInfo image;
if (!flash_device_open) { if (!flash_device_open)
if (flash_cmd_enable_ports()); {
if (flash_cmd_enable_ports())
flash_device_open = 1; flash_device_open = 1;
} }
@@ -66,12 +67,15 @@ int flash_cmd_init(void) {
// Disable flash protection // Disable flash protection
fl_setProtection(0); fl_setProtection(0);
if (fl_getFactoryImage(&image) != 0) { if (fl_getFactoryImage(&image) != 0)
{
return 0; return 0;
} }
factory_image = image; factory_image = image;
if (fl_getNextBootImage(&image) == 0) { if (fl_getNextBootImage(&image) == 0)
{
upgrade_image_valid = 1; upgrade_image_valid = 1;
upgrade_image = image; upgrade_image = image;
} }
@@ -79,7 +83,8 @@ int flash_cmd_init(void) {
return 0; return 0;
} }
int flash_cmd_deinit(void) { int flash_cmd_deinit(void)
{
if (!flash_device_open) if (!flash_device_open)
return 0; return 0;
@@ -114,21 +119,6 @@ int flash_cmd_read_page_data(unsigned char *data) {
return 64; 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() static void begin_write()
{ {
int result; int result;

View File

@@ -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]);

View File

@@ -1,57 +0,0 @@
#include <xs1.h>
#include <print.h>
#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;
}