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 <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,7 +24,11 @@ static unsigned int subPagesLeft = 0;
|
|||||||
|
|
||||||
extern int DFU_reset_override;
|
extern int DFU_reset_override;
|
||||||
|
|
||||||
void temp() {
|
extern void DFUCustomFlashEnable();
|
||||||
|
extern void DFUCustomFlashDisable();
|
||||||
|
|
||||||
|
void temp()
|
||||||
|
{
|
||||||
asm(".linkset DFU_reset_override, _edp.bss");
|
asm(".linkset DFU_reset_override, _edp.bss");
|
||||||
asm(".globl DFU_reset_override");
|
asm(".globl DFU_reset_override");
|
||||||
}
|
}
|
||||||
@@ -33,24 +38,30 @@ 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) {
|
{
|
||||||
|
if (DFU_flash_connected)
|
||||||
|
{
|
||||||
unsigned int cmd_data[16];
|
unsigned int cmd_data[16];
|
||||||
HandleUserDeviceRequest(FLASH_CMD_DEINIT, 1, 0, cmd_data, c_user_cmd);
|
DFUCustomFlashDisable();
|
||||||
|
HandleUserDeviceRequest(FLASH_CMD_DEINIT, 1, 0, cmd_data);
|
||||||
DFU_flash_connected = 0;
|
DFU_flash_connected = 0;
|
||||||
}
|
}
|
||||||
return 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;
|
||||||
|
|
||||||
@@ -61,7 +72,9 @@ static int DFU_Detach(unsigned int timeout, chanend ?c_user_cmd) {
|
|||||||
|
|
||||||
// Start DFU reset timer
|
// Start DFU reset timer
|
||||||
DFUTimer :> DFUTimerStart;
|
DFUTimer :> DFUTimerStart;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
DFU_state = STATE_DFU_ERROR;
|
DFU_state = STATE_DFU_ERROR;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@@ -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,13 +334,14 @@ 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 int cmd_data[16];
|
||||||
unsigned s = 0;
|
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
|
||||||
@@ -454,7 +460,7 @@ 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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user