#ifndef _USB_DEV_DFU_H #define _USB_DEV_DFU_H #include #include #include #include #include #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 /* for board-specific config */ #include 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, \ } #define DFU_IF_DESCRIPTORS_STRUCT \ USBInterfaceDescriptor dfu_interface[DFU_NUM_IF]; #define DFU_IF_DESCRIPTORS { \ { \ .bLength = sizeof(USBInterfaceDescriptor), \ .bDescriptorType = USBGenericDescriptor_INTERFACE, \ .bInterfaceNumber = CONFIG_DFU_NUM_APP_IF, \ .bAlternateSetting = 0, \ .bNumEndpoints = 0, \ .bInterfaceClass = 0xFE, \ .bInterfaceSubClass = 0x01, \ .bInterfaceProtocol = 0x01, \ .iInterface = CONFIG_DFU_NUM_APP_STR, \ }, \ { \ .bLength = sizeof(USBInterfaceDescriptor), \ .bDescriptorType = USBGenericDescriptor_INTERFACE, \ .bInterfaceNumber = CONFIG_DFU_NUM_APP_IF+1, \ .bAlternateSetting = 0, \ .bNumEndpoints = 0, \ .bInterfaceClass = 0xFE, \ .bInterfaceSubClass = 0x01, \ .bInterfaceProtocol = 0x01, \ .iInterface = CONFIG_DFU_NUM_APP_STR+1, \ }, \ { \ .bLength = sizeof(USBInterfaceDescriptor), \ .bDescriptorType = USBGenericDescriptor_INTERFACE, \ .bInterfaceNumber = CONFIG_DFU_NUM_APP_IF+2, \ .bAlternateSetting = 0, \ .bNumEndpoints = 0, \ .bInterfaceClass = 0xFE, \ .bInterfaceSubClass = 0x01, \ .bInterfaceProtocol = 0x01, \ .iInterface = CONFIG_DFU_NUM_APP_STR+2, \ }, \ } extern const struct USBStringDescriptor USBDFU_string1; extern const struct USBStringDescriptor USBDFU_string2; extern const struct USBStringDescriptor USBDFU_string3; #define DFU_NUM_STRINGS 3 #define DFU_STRING_DESCRIPTORS \ (const unsigned char *) &USBDFU_string1, \ (const unsigned char *) &USBDFU_string2, \ (const unsigned char *) &USBDFU_string3, const struct dfu_desc dfu_cfg_descriptor; const USBDDriverDescriptors dfu_descriptors; #else /* BOARD_USB_DFU */ /* no DFU bootloader is being used */ #define DFU_NUM_IF 0 #define DFU_IF_DESCRIPTORS_STRUCT #define DFU_IF_DESCRIPTORS #define DFU_NUM_STRINGS 0 #define DFU_STRING_DESCRIPTORS #endif /* BOARD_USB_DFU */ /* The API between the core DFU handler and the board/soc specific code */ struct dfu { uint8_t status; uint32_t state; int past_manifest; unsigned int total_bytes; }; extern struct dfu dfu; /* call-backs by 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); void USBDFU_Runtime_RequestHandler(const USBGenericRequest *request); void USBDFU_DFU_RequestHandler(const USBGenericRequest *request); void USBDFU_Initialize(const USBDDriverDescriptors *pDescriptors, unsigned char *pInterfaces); #define DFU_RET_NOTHING 0 #define DFU_RET_ZLP 1 #define DFU_RET_STALL 2 #endif