forked from PAWPAW-Mirror/lib_xua
DFU & SPDIF now working on SKC_SU1. Some DFU tidy
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user