mirror of
https://gitea.osmocom.org/sim-card/simtrace2.git
synced 2026-03-16 21:28:33 +03:00
DFU: add DFU application
this adds the DFU as application, allowing to flash the bootloader. a USB DFU alternative is added to flash the bootloader partition. when the DFU is started as bootloader, the partition/alternative to flash the bootloader is marked as "not available", and ineffective. the same happens for the application partition when DFU is started as application. this distinction is make at compile time, not at runtime, because of size restrictions (the bootloader was already close to the 16 kB limit). *_dfu_flash.bin should not be mixed with *_dfu_dfu.bin. *_dfu_dfu.bin should be flashed as application using the already existing DFU bootloader. once this images is started (as application), the *_dfu_flash.bin should be flashed as bootloader using the DFU application. once the DFU bootloader has been flashed, soft resetting (not re-powering) will cause the bootloader to start, allowing to flash the application with a normal image (e.g. not DFU), replacing the DFU application. this switch to DFU only happens after downloading (e.g. flashing). it is planned to have the DFU application erase itself after flashing, but this is currently not implemented. Change-Id: Ic273bb593a7669111b0219fe301d7897419167c8
This commit is contained in:
@@ -1171,12 +1171,19 @@ void USBD_IrqHandler(void)
|
||||
/* if we are currently in the DFU bootloader, and we are beyond
|
||||
* the MANIFEST stage, we shall switch to the normal
|
||||
* application */
|
||||
if (g_dfu->past_manifest)
|
||||
if (g_dfu->past_manifest) {
|
||||
#if defined(ENVIRONMENT_flash)
|
||||
USBDFU_SwitchToApp();
|
||||
#elif defined(ENVIRONMENT_dfu)
|
||||
USBDFU_SwitchToDFU();
|
||||
#endif
|
||||
}
|
||||
|
||||
#else
|
||||
/* if we are currently in the main application, and we are in
|
||||
* appDETACH state, switch into the DFU bootloader */
|
||||
if (g_dfu->state == DFU_STATE_appDETACH)
|
||||
* appDETACH state or past downloading, switch into the DFU bootloader.
|
||||
*/
|
||||
if (g_dfu->state == DFU_STATE_appDETACH || g_dfu->state == DFU_STATE_dfuMANIFEST)
|
||||
DFURT_SwitchToDFU();
|
||||
#endif /* APPLICATION_dfu */
|
||||
#endif /* BOARD_USB_DFU */
|
||||
|
||||
@@ -124,6 +124,9 @@ void USBDFU_Initialize(const USBDDriverDescriptors *pDescriptors);
|
||||
/* USBD tells us to switch from DFU mode to application mode */
|
||||
void USBDFU_SwitchToApp(void);
|
||||
|
||||
/* USBD tells us to switch from to DFU mode */
|
||||
void USBDFU_SwitchToDFU(void);
|
||||
|
||||
/* Return values to be used by USBDFU_handle_{dn,up}load */
|
||||
#define DFU_RET_NOTHING 0
|
||||
#define DFU_RET_ZLP 1
|
||||
|
||||
@@ -19,9 +19,10 @@ enum {
|
||||
STR_MANUF = 1,
|
||||
STR_PROD,
|
||||
STR_CONFIG,
|
||||
// strings for the first alternate interface (e.g. DFU)
|
||||
_STR_FIRST_ALT,
|
||||
// serial string
|
||||
STR_SERIAL = (_STR_FIRST_ALT+BOARD_DFU_NUM_IF),
|
||||
STR_SERIAL = (_STR_FIRST_ALT + BOARD_DFU_NUM_IF),
|
||||
// version string (on additional interface)
|
||||
VERSION_CONF_STR,
|
||||
VERSION_STR,
|
||||
@@ -29,6 +30,25 @@ enum {
|
||||
STRING_DESC_CNT,
|
||||
};
|
||||
|
||||
/* string used to replace one of both DFU flash partition atlsettings */
|
||||
static const unsigned char usb_string_notavailable[] = {
|
||||
USBStringDescriptor_LENGTH(13),
|
||||
USBGenericDescriptor_STRING,
|
||||
USBStringDescriptor_UNICODE('n'),
|
||||
USBStringDescriptor_UNICODE('o'),
|
||||
USBStringDescriptor_UNICODE('t'),
|
||||
USBStringDescriptor_UNICODE(' '),
|
||||
USBStringDescriptor_UNICODE('a'),
|
||||
USBStringDescriptor_UNICODE('v'),
|
||||
USBStringDescriptor_UNICODE('a'),
|
||||
USBStringDescriptor_UNICODE('i'),
|
||||
USBStringDescriptor_UNICODE('l'),
|
||||
USBStringDescriptor_UNICODE('a'),
|
||||
USBStringDescriptor_UNICODE('b'),
|
||||
USBStringDescriptor_UNICODE('l'),
|
||||
USBStringDescriptor_UNICODE('e'),
|
||||
};
|
||||
|
||||
/* USB string for the serial (using 128-bit device ID) */
|
||||
static unsigned char usb_string_serial[] = {
|
||||
USBStringDescriptor_LENGTH(32),
|
||||
@@ -121,7 +141,7 @@ static const USBDeviceDescriptor fsDevice = {
|
||||
.bNumEndpoints = 0, \
|
||||
.bInterfaceClass = 0xfe, \
|
||||
.bInterfaceSubClass = 1, \
|
||||
.iInterface = (_STR_FIRST_ALT+ALT), \
|
||||
.iInterface = (_STR_FIRST_ALT + ALT), \
|
||||
.bInterfaceProtocol = 2, \
|
||||
}
|
||||
|
||||
@@ -180,6 +200,11 @@ void set_usb_serial_str(void)
|
||||
for (i = 0; i < ARRAY_SIZE(usb_strings) && i < ARRAY_SIZE(usb_strings_extended); i++) {
|
||||
usb_strings_extended[i] = usb_strings[i];
|
||||
}
|
||||
#if defined(ENVIRONMENT_dfu)
|
||||
usb_strings_extended[_STR_FIRST_ALT + 1] = usb_string_notavailable;
|
||||
#elif defined(ENVIRONMENT_flash)
|
||||
usb_strings_extended[_STR_FIRST_ALT + 2] = usb_string_notavailable;
|
||||
#endif
|
||||
usb_strings_extended[STR_SERIAL] = usb_string_serial;
|
||||
usb_strings_extended[VERSION_CONF_STR] = usb_string_version_conf;
|
||||
usb_strings_extended[VERSION_STR] = usb_string_version;
|
||||
|
||||
@@ -43,7 +43,7 @@ static unsigned char if_altsettings[1];
|
||||
|
||||
/** structure containing the DFU state and magic value to know if DFU or application should be started */
|
||||
__dfudata struct dfudata _g_dfu = {
|
||||
.state = DFU_STATE_appIDLE,
|
||||
.state = DFU_STATE_dfuIDLE,
|
||||
.past_manifest = 0,
|
||||
.total_bytes = 0,
|
||||
};
|
||||
@@ -463,7 +463,20 @@ void USBDFU_SwitchToApp(void)
|
||||
/* make sure the MAGIC is not set to enter DFU again */
|
||||
g_dfu->magic = 0;
|
||||
|
||||
printf("switching to app\r\n");
|
||||
/* disconnect from USB to ensure re-enumeration */
|
||||
USBD_Disconnect();
|
||||
|
||||
/* disable any interrupts during transition */
|
||||
__disable_irq();
|
||||
|
||||
/* Tell the hybrid to execute FTL JUMP! */
|
||||
NVIC_SystemReset();
|
||||
}
|
||||
|
||||
void USBDFU_SwitchToDFU(void)
|
||||
{
|
||||
/* make sure the MAGIC is not set to enter DFU again */
|
||||
g_dfu->magic = USB_DFU_MAGIC;
|
||||
|
||||
/* disconnect from USB to ensure re-enumeration */
|
||||
USBD_Disconnect();
|
||||
|
||||
Reference in New Issue
Block a user