mirror of
https://gitea.osmocom.org/sim-card/simtrace2.git
synced 2026-03-17 05:38:33 +03:00
DFU: towards a more complete implementation
* we now actually route the EP0 control requests in DFU mode to the correct handler (weak linker symbols are tricky) * we now actually call code to read/write data from/to RAM/FLASH
This commit is contained in:
@@ -4,19 +4,105 @@
|
||||
#include "usb/common/dfu/usb_dfu.h"
|
||||
#include "manifest.h"
|
||||
|
||||
#define ALTIF_RAM 0
|
||||
#define ALTIF_FLASH 1
|
||||
|
||||
unsigned int g_unique_id[4];
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Callbacks
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
#if 0
|
||||
void USBDDriverCallbacks_ConfigurationChanged(uint8_t cfgnum)
|
||||
#define RAM_ADDR(offset) (IRAM_ADDR + BOARD_DFU_RAM_SIZE + offset)
|
||||
#define FLASH_ADDR(offset) (IFLASH_ADDR + BOARD_DFU_BOOT_SIZE + offset)
|
||||
|
||||
#define IFLASH_END ((uint8_t *)IFLASH_ADDR + IFLASH_SIZE)
|
||||
#define IRAM_END ((uint8_t *)IRAM_ADDR + IRAM_SIZE)
|
||||
|
||||
/* incoming call-back: Host has transfered 'len' bytes (stored at
|
||||
* 'data'), which we shall write to 'offset' into the partition
|
||||
* associated with 'altif'. Guaranted to be les than
|
||||
* BOARD_DFU_PAGE_SIZE */
|
||||
int USBDFU_handle_dnload(uint8_t altif, unsigned int offset,
|
||||
uint8_t *data, unsigned int len)
|
||||
{
|
||||
TRACE_INFO_WP("cfgChanged%d ", cfgnum);
|
||||
simtrace_config = cfgnum;
|
||||
uint32_t addr;
|
||||
int rc;
|
||||
|
||||
printf("dnload(altif=%u, offset=%u, len=%u\n\r", altif, offset, len);
|
||||
|
||||
switch (altif) {
|
||||
case ALTIF_RAM:
|
||||
addr = RAM_ADDR(offset);
|
||||
if (addr > IRAM_ADDR + IRAM_SIZE) {
|
||||
g_dfu.state = DFU_STATE_dfuERROR;
|
||||
g_dfu.status = DFU_STATUS_errADDRESS;
|
||||
return DFU_RET_STALL;
|
||||
}
|
||||
memcpy((void *)addr, data, len);
|
||||
return DFU_RET_ZLP;
|
||||
case ALTIF_FLASH:
|
||||
addr = FLASH_ADDR(offset);
|
||||
if (addr > IFLASH_ADDR + IFLASH_SIZE) {
|
||||
g_dfu.state = DFU_STATE_dfuERROR;
|
||||
g_dfu.status = DFU_STATUS_errADDRESS;
|
||||
return DFU_RET_STALL;
|
||||
}
|
||||
rc = FLASHD_Write(addr, data, len);
|
||||
if (rc != 0) {
|
||||
/* FIXME: set error codes */
|
||||
return DFU_RET_STALL;
|
||||
}
|
||||
return DFU_RET_ZLP;
|
||||
default:
|
||||
/* FIXME: set error codes */
|
||||
TRACE_ERROR("DFU download for unknown AltIf %d\n\r", altif);
|
||||
return DFU_RET_STALL;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* incoming call-back: Host has requested to read back 'req_len' bytes
|
||||
* starting from 'offset' of the firmware * associated with partition
|
||||
* 'altif' */
|
||||
int USBDFU_handle_upload(uint8_t altif, unsigned int offset,
|
||||
uint8_t *data, unsigned int req_len)
|
||||
{
|
||||
uint32_t addr;
|
||||
|
||||
printf("upload(altif=%u, offset=%u, len=%u)", altif, offset, req_len);
|
||||
|
||||
switch (altif) {
|
||||
case ALTIF_RAM:
|
||||
addr = RAM_ADDR(offset);
|
||||
if (addr > IRAM_ADDR + IRAM_SIZE) {
|
||||
g_dfu.state = DFU_STATE_dfuERROR;
|
||||
g_dfu.status = DFU_STATUS_errADDRESS;
|
||||
return -1;
|
||||
}
|
||||
if ((uint8_t *)addr + req_len > IRAM_END)
|
||||
req_len = IRAM_END - (uint8_t *)addr;
|
||||
memcpy(data, (void *)addr, req_len);
|
||||
break;
|
||||
case ALTIF_FLASH:
|
||||
addr = FLASH_ADDR(offset);
|
||||
if (addr > IFLASH_ADDR + IFLASH_SIZE) {
|
||||
g_dfu.state = DFU_STATE_dfuERROR;
|
||||
g_dfu.status = DFU_STATUS_errADDRESS;
|
||||
return -1;
|
||||
}
|
||||
if ((uint8_t *)addr + req_len > IFLASH_END)
|
||||
req_len = IFLASH_END - (uint8_t *)addr;
|
||||
memcpy(data, (void *)addr, req_len);
|
||||
break;
|
||||
default:
|
||||
TRACE_ERROR("DFU upload for unknown AltIf %d\n\r", altif);
|
||||
/* FIXME: set error codes */
|
||||
return -1;
|
||||
}
|
||||
printf("=%u\r\n", req_len);
|
||||
return req_len;
|
||||
}
|
||||
|
||||
|
||||
/* returns '1' in case we should break any endless loop */
|
||||
static void check_exec_dbg_cmd(void)
|
||||
@@ -70,7 +156,7 @@ extern int main(void)
|
||||
|
||||
while (USBD_GetState() < USBD_STATE_CONFIGURED) {
|
||||
check_exec_dbg_cmd();
|
||||
#if 0
|
||||
#if 1
|
||||
if (i >= MAX_USB_ITER * 3) {
|
||||
TRACE_ERROR("Resetting board (USB could "
|
||||
"not be configured)\r\n");
|
||||
|
||||
Reference in New Issue
Block a user