DFU & SPDIF now working on SKC_SU1. Some DFU tidy

This commit is contained in:
Ross Owen
2012-11-15 17:49:51 +00:00
parent 6539766807
commit a19e328b21
4 changed files with 76 additions and 82 deletions

View File

@@ -1,6 +1,7 @@
#include <xs1.h> #include <xs1.h>
#include <platform.h> #include <platform.h>
#include <print.h> #include <print.h>
#include "devicedefines.h"
#include "xud.h" #include "xud.h"
#ifdef ARCH_G #ifdef ARCH_G
@@ -23,9 +24,13 @@ static unsigned int subPagesLeft = 0;
extern int DFU_reset_override; extern int DFU_reset_override;
void temp() { extern void DFUCustomFlashEnable();
asm(".linkset DFU_reset_override, _edp.bss"); extern void DFUCustomFlashDisable();
asm(".globl DFU_reset_override");
void temp()
{
asm(".linkset DFU_reset_override, _edp.bss");
asm(".globl DFU_reset_override");
} }
static int DFU_OpenFlash(chanend ?c_user_cmd) static int DFU_OpenFlash(chanend ?c_user_cmd)
@@ -33,38 +38,46 @@ static int DFU_OpenFlash(chanend ?c_user_cmd)
if (!DFU_flash_connected) if (!DFU_flash_connected)
{ {
unsigned int cmd_data[16]; unsigned int cmd_data[16];
HandleUserDeviceRequest(FLASH_CMD_INIT, 1, 0, cmd_data, c_user_cmd); DFUCustomFlashEnable();
HandleUserDeviceRequest(FLASH_CMD_INIT, 1, 0, cmd_data);
DFU_flash_connected = 1; DFU_flash_connected = 1;
} }
return 0; return 0;
} }
static int DFU_CloseFlash(chanend ?c_user_cmd) { static int DFU_CloseFlash(chanend ?c_user_cmd)
if (DFU_flash_connected) { {
unsigned int cmd_data[16]; if (DFU_flash_connected)
HandleUserDeviceRequest(FLASH_CMD_DEINIT, 1, 0, cmd_data, c_user_cmd); {
DFU_flash_connected = 0; unsigned int cmd_data[16];
} DFUCustomFlashDisable();
return 0; HandleUserDeviceRequest(FLASH_CMD_DEINIT, 1, 0, cmd_data);
DFU_flash_connected = 0;
}
return 0;
} }
static int DFU_Detach(unsigned int timeout, chanend ?c_user_cmd) { static int DFU_Detach(unsigned int timeout, chanend ?c_user_cmd)
if (DFU_state == STATE_APP_IDLE) { {
if (DFU_state == STATE_APP_IDLE)
{
DFU_state = STATE_APP_DETACH; DFU_state = STATE_APP_DETACH;
DFU_OpenFlash(c_user_cmd); DFU_OpenFlash(c_user_cmd);
// Setup DFU timeout value // Setup DFU timeout value
DFUResetTimeout = timeout * 100000; DFUResetTimeout = timeout * 100000;
// Start DFU reset timer // Start DFU reset timer
DFUTimer :> DFUTimerStart; DFUTimer :> DFUTimerStart;
} else { }
DFU_state = STATE_DFU_ERROR; else
} {
return 0; DFU_state = STATE_DFU_ERROR;
}
return 0;
} }
static int DFU_Dnload(unsigned int request_len, unsigned int block_num, unsigned int request_data[16], chanend ?c_user_cmd) { static int DFU_Dnload(unsigned int request_len, unsigned int block_num, unsigned int request_data[16], chanend ?c_user_cmd) {
@@ -102,12 +115,12 @@ static int DFU_Dnload(unsigned int request_len, unsigned int block_num, unsigned
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, c_user_cmd); HandleUserDeviceRequest(FLASH_CMD_WRITE_PAGE_DATA, 1, 64, subPagePad);
} }
} }
cmd_data[0] = 2; // Terminate write cmd_data[0] = 2; // Terminate write
HandleUserDeviceRequest(FLASH_CMD_WRITE_PAGE, 1, 4, cmd_data, c_user_cmd); HandleUserDeviceRequest(FLASH_CMD_WRITE_PAGE, 1, 4, cmd_data);
DFU_state = STATE_DFU_MANIFEST_SYNC; DFU_state = STATE_DFU_MANIFEST_SYNC;
} else { } else {
@@ -120,24 +133,16 @@ static int DFU_Dnload(unsigned int request_len, unsigned int block_num, unsigned
{ {
unsigned s = 0; unsigned s = 0;
#if 1
/* Flash lib does erase on add image */
// Erase flash on first block // Erase flash on first block
HandleUserDeviceRequest(FLASH_CMD_ERASE_ALL, 1, 0, cmd_data, c_user_cmd); HandleUserDeviceRequest(FLASH_CMD_ERASE_ALL, 1, 0, cmd_data);
#endif
#if 0
/* Delay should not be required. Erase now blocking call */
DFUTimer :> s;
DFUTimer when timerafter(s + 25000000) :> s; // Wait for flash erase
#endif
} }
// Program firmware, STATE_DFU_DOWNLOAD_BUSY not currently used // Program firmware, STATE_DFU_DOWNLOAD_BUSY not currently used
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, c_user_cmd); HandleUserDeviceRequest(FLASH_CMD_WRITE_PAGE, 1, 4, cmd_data);
subPagesLeft = 4; subPagesLeft = 4;
} }
@@ -145,7 +150,7 @@ 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, c_user_cmd); HandleUserDeviceRequest(FLASH_CMD_WRITE_PAGE_DATA, 1, 64, cmd_data);
subPagesLeft--; subPagesLeft--;
DFU_state = STATE_DFU_DOWNLOAD_SYNC; DFU_state = STATE_DFU_DOWNLOAD_SYNC;
@@ -188,7 +193,7 @@ static int DFU_Upload(unsigned int request_len, unsigned int block_num, unsigned
cmd_data[0] = !firstRead; cmd_data[0] = !firstRead;
// Read page // Read page
HandleUserDeviceRequest(FLASH_CMD_READ_PAGE, 0, 4, cmd_data, c_user_cmd); HandleUserDeviceRequest(FLASH_CMD_READ_PAGE, 0, 4, cmd_data);
subPagesLeft = 4; subPagesLeft = 4;
// If address out of range, terminate! // If address out of range, terminate!
@@ -201,7 +206,7 @@ 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, c_user_cmd); HandleUserDeviceRequest(FLASH_CMD_READ_PAGE_DATA, 0, 0, request_data);
subPagesLeft--; subPagesLeft--;
@@ -329,18 +334,19 @@ int DFUReportResetState(chanend ?c_user_cmd)
return inDFU; return inDFU;
} }
int XMOS_DFU_RevertFactory(chanend ?c_user_cmd) { int XMOS_DFU_RevertFactory(chanend ?c_user_cmd)
unsigned int cmd_data[16]; {
unsigned s = 0; unsigned int cmd_data[16];
unsigned s = 0;
DFU_OpenFlash(c_user_cmd); DFU_OpenFlash(c_user_cmd);
HandleUserDeviceRequest(FLASH_CMD_ERASE_ALL, 1, 0, cmd_data, c_user_cmd); HandleUserDeviceRequest(FLASH_CMD_ERASE_ALL, 1, 0, cmd_data);
DFUTimer :> s; DFUTimer :> s;
DFUTimer when timerafter(s + 25000000) :> s; // Wait for flash erase DFUTimer when timerafter(s + 25000000) :> s; // Wait for flash erase
return 0; return 0;
} }
int XMOS_DFU_SelectImage(unsigned int index, chanend ?c_user_cmd) { int XMOS_DFU_SelectImage(unsigned int index, chanend ?c_user_cmd) {
@@ -453,13 +459,13 @@ 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, c_user_cmd); HandleUserDeviceRequest(FLASH_CMD_REBOOT, 1, 0, cmd_data);
} }
else else
{ {
return 1; return 1;
} }
} }
return 0; return 0;

View File

@@ -38,6 +38,20 @@ int flash_cmd_disable_ports() {
return 0; return 0;
} }
void DFUCustomFlashEnable() __attribute__ ((weak));
void DFUCustomFlashEnable()
{
return;
}
void DFUCustomFlashDisable() __attribute__ ((weak));
void DFUCustomFlashDisable()
{
return;
}
int flash_cmd_init(void) { int flash_cmd_init(void) {
fl_BootImageInfo image; fl_BootImageInfo image;

View File

@@ -9,6 +9,5 @@
unsigned int flash_programmer(unsigned int cmd, unsigned int request_data[16]); unsigned int flash_programmer(unsigned int cmd, unsigned int request_data[16]);
int HandleUserDeviceRequest(unsigned int cmd, unsigned int to_device, int HandleUserDeviceRequest(unsigned int cmd, unsigned int to_device,
unsigned int request_size, unsigned int request_data[16], unsigned int request_size, unsigned int request_data[16]);
chanend ?c_user_cmd);

View File

@@ -47,35 +47,10 @@ unsigned int flash_programmer(unsigned int cmd, unsigned int request_data[16]) {
} }
int HandleUserDeviceRequest(unsigned int cmd, unsigned int to_device, int HandleUserDeviceRequest(unsigned int cmd, unsigned int to_device,
unsigned int request_size, unsigned int request_data[16], unsigned int request_size, unsigned int request_data[16])
chanend ?c_user_cmd) { {
unsigned int return_data_len = 0; unsigned int return_data_len = flash_programmer(cmd, request_data);
if (isnull(c_user_cmd)) {
return_data_len = flash_programmer(cmd, request_data);
} else {
int i = 0;
outuint(c_user_cmd, cmd);
outuint(c_user_cmd, request_size/4);
if (request_size) {
// Send request data to user cmd handler
for (i = 0; i < request_size/4; i++) {
outuint(c_user_cmd, request_data[i]);
}
}
return_data_len = inuint(c_user_cmd);
if (return_data_len) {
// Get response data from user cmd handler
for (i = 0; i < return_data_len/4; i++) {
request_data[i] = inuint(c_user_cmd);
}
}
}
return return_data_len; return return_data_len;
} }