mirror of
https://gitea.osmocom.org/sim-card/simtrace2.git
synced 2026-03-18 14:28:33 +03:00
We need to refer to g_dfu as a pointer from all code. In DFU mode, it gets assigned to the address of _g_dfu, which is placed by the linker script at the start of RAM. In runtime mode, the pointer is statically defined to point at the start of RAM. The linker script for the runtime (dfu environment) is adjusted to save the first 32 bytes for the _g_dfu structure.
131 lines
3.5 KiB
C
131 lines
3.5 KiB
C
#ifndef _USB_DEV_DFU_H
|
|
#define _USB_DEV_DFU_H
|
|
|
|
#include <stdint.h>
|
|
#include <board.h>
|
|
#include <usb/include/USBDescriptors.h>
|
|
#include <usb/include/USBDDriver.h>
|
|
|
|
#if 0
|
|
/* This is valid for CCID */
|
|
#define CONFIG_DFU_NUM_APP_IF 1
|
|
#define CONFIG_DFU_NUM_APP_STR 4
|
|
#else
|
|
/* This is valid for CDC-Serial */
|
|
#define CONFIG_DFU_NUM_APP_IF 2
|
|
#define CONFIG_DFU_NUM_APP_STR 2
|
|
#endif
|
|
|
|
struct USBStringDescriptor {
|
|
USBGenericDescriptor hdr;
|
|
unsigned short wData[];
|
|
} __attribute__((packed));
|
|
|
|
|
|
#ifdef BOARD_USB_DFU
|
|
|
|
#include <usb/common/dfu/usb_dfu.h>
|
|
|
|
/* for board-specific config */
|
|
#include <board.h>
|
|
|
|
struct dfu_desc {
|
|
USBConfigurationDescriptor ucfg;
|
|
USBInterfaceDescriptor uif[BOARD_DFU_NUM_IF];
|
|
struct usb_dfu_func_descriptor func_dfu;
|
|
} __attribute__ ((packed));
|
|
|
|
/* USB DFU functional descriptor */
|
|
#define DFU_FUNC_DESC { \
|
|
.bLength = USB_DT_DFU_SIZE, \
|
|
.bDescriptorType = USB_DT_DFU, \
|
|
.bmAttributes = USB_DFU_CAN_UPLOAD | USB_DFU_CAN_DOWNLOAD, \
|
|
.wDetachTimeOut = 0xff00, \
|
|
.wTransferSize = BOARD_DFU_PAGE_SIZE, \
|
|
.bcdDFUVersion = 0x0100, \
|
|
}
|
|
|
|
/* Number of DFU interface during runtime mode */
|
|
#define DFURT_NUM_IF 1
|
|
|
|
/* to be used by the runtime as part of its USB descriptor structure
|
|
* declaration */
|
|
#define DFURT_IF_DESCRIPTOR_STRUCT \
|
|
USBInterfaceDescriptor dfu_rt; \
|
|
struct usb_dfu_func_descriptor func_dfu;
|
|
|
|
/* to be used by the runtime as part of its USB Dsecriptor structure
|
|
* definition */
|
|
#define DFURT_IF_DESCRIPTOR(dfuIF, dfuSTR) \
|
|
.dfu_rt = { \
|
|
.bLength = sizeof(USBInterfaceDescriptor), \
|
|
.bDescriptorType = USBGenericDescriptor_INTERFACE, \
|
|
.bInterfaceNumber = dfuIF, \
|
|
.bAlternateSetting = 0, \
|
|
.bNumEndpoints = 0, \
|
|
.bInterfaceClass = 0xFE, \
|
|
.bInterfaceSubClass = 0x01, \
|
|
.bInterfaceProtocol = 0x01, \
|
|
.iInterface = dfuSTR, \
|
|
}, \
|
|
.func_dfu = DFU_FUNC_DESC \
|
|
|
|
/* provided by dfu_desc.c */
|
|
extern const struct dfu_desc dfu_cfg_descriptor;
|
|
extern const USBDDriverDescriptors dfu_descriptors;
|
|
|
|
#else /* BOARD_USB_DFU */
|
|
|
|
/* no DFU bootloader is being used */
|
|
#define DFURT_NUM_IF 0
|
|
#define DFURT_IF_DESCRIPTOR_STRUCT(a, b)
|
|
#define DFURT_IF_DESCRIPTOR
|
|
|
|
#endif /* BOARD_USB_DFU */
|
|
|
|
/* magic value we use during boot to detect if we should start in DFU
|
|
* mode or runtime mode */
|
|
#define USB_DFU_MAGIC 0xDFDFDFDF
|
|
/* RAM address for this magic value above */
|
|
#define USB_DFU_MAGIC_ADDR IRAM_ADDR
|
|
|
|
/* The API between the core DFU handler and the board/soc specific code */
|
|
|
|
struct dfudata {
|
|
uint8_t status;
|
|
uint32_t state;
|
|
int past_manifest;
|
|
unsigned int total_bytes;
|
|
};
|
|
|
|
extern struct dfudata *g_dfu;
|
|
|
|
void set_usb_serial_str(const uint8_t *serial_usbstr);
|
|
|
|
void DFURT_SwitchToDFU(void);
|
|
|
|
/* call-backs from DFU USB function driver to the board/SOC */
|
|
extern int USBDFU_handle_dnload(uint8_t altif, unsigned int offset,
|
|
uint8_t *data, unsigned int len);
|
|
extern int USBDFU_handle_upload(uint8_t altif, unsigned int offset,
|
|
uint8_t *data, unsigned int req_len);
|
|
|
|
/* function to be called at end of EP0 handler during runtime */
|
|
void USBDFU_Runtime_RequestHandler(const USBGenericRequest *request);
|
|
|
|
/* function to be called at end of EP0 handler during DFU mode */
|
|
void USBDFU_DFU_RequestHandler(const USBGenericRequest *request);
|
|
|
|
/* initialization of USB DFU driver (in DFU mode */
|
|
void USBDFU_Initialize(const USBDDriverDescriptors *pDescriptors);
|
|
|
|
/* USBD tells us to switch from DFU mode to application mode */
|
|
void USBDFU_SwitchToApp(void);
|
|
|
|
/* Return values to be used by USBDFU_handle_{dn,up}load */
|
|
#define DFU_RET_NOTHING 0
|
|
#define DFU_RET_ZLP 1
|
|
#define DFU_RET_STALL 2
|
|
|
|
#endif
|