#ifndef _USB_DFU_H #define _USB_DFU_H /* USB Device Firmware Update Implementation for OpenPCD * (C) 2006 by Harald Welte * * Protocol definitions for USB DFU * * This ought to be compliant to the USB DFU Spec 1.0 as available from * http://www.usb.org/developers/devclass_docs/usbdfu10.pdf * */ #include #define USB_DFU_CLASS 0xfe #define USB_DT_DFU 0x21 struct usb_dfu_func_descriptor { uint8_t bLength; uint8_t bDescriptorType; uint8_t bmAttributes; #define USB_DFU_CAN_DOWNLOAD (1 << 0) #define USB_DFU_CAN_UPLOAD (1 << 1) #define USB_DFU_MANIFEST_TOL (1 << 2) #define USB_DFU_WILL_DETACH (1 << 3) uint16_t wDetachTimeOut; uint16_t wTransferSize; uint16_t bcdDFUVersion; } __attribute__((packed)); #define USB_DT_DFU_SIZE 9 /* DFU class-specific requests (Section 3, DFU Rev 1.1) */ enum usb_dfu_req { USB_DFU_DETACH, USB_DFU_DNLOAD, USB_DFU_UPLOAD, USB_DFU_GETSTATUS, USB_DFU_CLRSTATUS, USB_DFU_GETSTATE, USB_DFU_ABORT, }; struct dfu_status { uint8_t bStatus; uint8_t bwPollTimeout[3]; uint8_t bState; uint8_t iString; } __attribute__((packed)); enum usb_dfu_status { DFU_STATUS_OK = 0x00, DFU_STATUS_errTARGET = 0x01, DFU_STATUS_errFILE = 0x02, DFU_STATUS_errWRITE = 0x03, DFU_STATUS_errERASE = 0x04, DFU_STATUS_errCHECK_ERASED = 0x05, DFU_STATUS_errPROG = 0x06, DFU_STATUS_errVERIFY = 0x07, DFU_STATUS_errADDRESS = 0x08, DFU_STATUS_errNOTDONE = 0x09, DFU_STATUS_errFIRMWARE = 0x0a, DFU_STATUS_errVENDOR = 0x0b, DFU_STATUS_errUSBR = 0x0c, DFU_STATUS_errPOR = 0x0d, DFU_STATUS_errUNKNOWN = 0x0e, DFU_STATUS_errSTALLEDPKT = 0x0f, }; enum dfu_state { DFU_STATE_appIDLE = 0, DFU_STATE_appDETACH = 1, DFU_STATE_dfuIDLE = 2, DFU_STATE_dfuDNLOAD_SYNC = 3, DFU_STATE_dfuDNBUSY = 4, DFU_STATE_dfuDNLOAD_IDLE = 5, DFU_STATE_dfuMANIFEST_SYNC = 6, DFU_STATE_dfuMANIFEST = 7, DFU_STATE_dfuMANIFEST_WAIT_RST = 8, DFU_STATE_dfuUPLOAD_IDLE = 9, DFU_STATE_dfuERROR = 10, }; #endif /* _USB_DFU_H */