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 <platform.h>
#include <print.h>
#include "devicedefines.h"
#include "xud.h"
#ifdef ARCH_G
@@ -23,9 +24,13 @@ static unsigned int subPagesLeft = 0;
extern int DFU_reset_override;
void temp() {
asm(".linkset DFU_reset_override, _edp.bss");
asm(".globl DFU_reset_override");
extern void DFUCustomFlashEnable();
extern void DFUCustomFlashDisable();
void temp()
{
asm(".linkset DFU_reset_override, _edp.bss");
asm(".globl DFU_reset_override");
}
static int DFU_OpenFlash(chanend ?c_user_cmd)
@@ -33,38 +38,46 @@ static int DFU_OpenFlash(chanend ?c_user_cmd)
if (!DFU_flash_connected)
{
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;
}
return 0;
}
static int DFU_CloseFlash(chanend ?c_user_cmd) {
if (DFU_flash_connected) {
unsigned int cmd_data[16];
HandleUserDeviceRequest(FLASH_CMD_DEINIT, 1, 0, cmd_data, c_user_cmd);
DFU_flash_connected = 0;
}
return 0;
static int DFU_CloseFlash(chanend ?c_user_cmd)
{
if (DFU_flash_connected)
{
unsigned int cmd_data[16];
DFUCustomFlashDisable();
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) {
if (DFU_state == STATE_APP_IDLE) {
static int DFU_Detach(unsigned int timeout, chanend ?c_user_cmd)
{
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
DFUResetTimeout = timeout * 100000;
// Setup DFU timeout value
DFUResetTimeout = timeout * 100000;
// Start DFU reset timer
DFUTimer :> DFUTimerStart;
} else {
DFU_state = STATE_DFU_ERROR;
}
return 0;
// Start DFU reset timer
DFUTimer :> DFUTimerStart;
}
else
{
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) {
@@ -102,12 +115,12 @@ static int DFU_Dnload(unsigned int request_len, unsigned int block_num, unsigned
if (subPagesLeft) {
unsigned int subPagePad[16] = {0};
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
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;
} else {
@@ -120,24 +133,16 @@ static int DFU_Dnload(unsigned int request_len, unsigned int block_num, unsigned
{
unsigned s = 0;
#if 1
/* Flash lib does erase on add image */
// Erase flash on first block
HandleUserDeviceRequest(FLASH_CMD_ERASE_ALL, 1, 0, cmd_data, c_user_cmd);
#endif
HandleUserDeviceRequest(FLASH_CMD_ERASE_ALL, 1, 0, cmd_data);
#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
if (!(block_num % 4)) {
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, c_user_cmd);
HandleUserDeviceRequest(FLASH_CMD_WRITE_PAGE, 1, 4, cmd_data);
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];
}
HandleUserDeviceRequest(FLASH_CMD_WRITE_PAGE_DATA, 1, 64, cmd_data, c_user_cmd);
HandleUserDeviceRequest(FLASH_CMD_WRITE_PAGE_DATA, 1, 64, cmd_data);
subPagesLeft--;
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;
// 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;
// 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
HandleUserDeviceRequest(FLASH_CMD_READ_PAGE_DATA, 0, 0, request_data, c_user_cmd);
HandleUserDeviceRequest(FLASH_CMD_READ_PAGE_DATA, 0, 0, request_data);
subPagesLeft--;
@@ -329,18 +334,19 @@ int DFUReportResetState(chanend ?c_user_cmd)
return inDFU;
}
int XMOS_DFU_RevertFactory(chanend ?c_user_cmd) {
unsigned int cmd_data[16];
unsigned s = 0;
int XMOS_DFU_RevertFactory(chanend ?c_user_cmd)
{
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 when timerafter(s + 25000000) :> s; // Wait for flash erase
DFUTimer :> s;
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) {
@@ -453,13 +459,13 @@ 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, c_user_cmd);
}
unsigned int cmd_data[16];
HandleUserDeviceRequest(FLASH_CMD_REBOOT, 1, 0, cmd_data);
}
else
{
return 1;
}
}
}
return 0;