diff options
| author | sakumisu <[email protected]> | 2021-10-25 21:20:22 +0800 |
|---|---|---|
| committer | sakumisu <[email protected]> | 2021-10-25 21:23:08 +0800 |
| commit | ff0e3530b71e221399b3299bcf0fd3d64ac2d7ff (patch) | |
| tree | 9f4f2101f865ad89ae5cdab7d3e769100d0e42e1 /class/dfu | |
| parent | 5c39134a09d197623ae8884ba41843a37d82c594 (diff) | |
add usb dfu and tmc class
Diffstat (limited to 'class/dfu')
| -rw-r--r-- | class/dfu/usbd_dfu.c | 72 | ||||
| -rw-r--r-- | class/dfu/usbd_dfu.h | 113 |
2 files changed, 185 insertions, 0 deletions
diff --git a/class/dfu/usbd_dfu.c b/class/dfu/usbd_dfu.c new file mode 100644 index 00000000..58e94f6a --- /dev/null +++ b/class/dfu/usbd_dfu.c @@ -0,0 +1,72 @@ +#include "usbd_core.h" +#include "usbd_dfu.h" + +/* Device data structure */ +struct dfu_cfg_private { + struct dfu_info info; +} usbd_dfu_cfg; + +int dfu_class_request_handler(struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + USBD_LOG_DBG("DFU Class request: " + "bRequest 0x%02x\r\n", + setup->bRequest); + + switch (setup->bRequest) { + case DFU_REQUEST_DETACH: + + break; + + case DFU_REQUEST_DNLOAD: + + break; + case DFU_REQUEST_UPLOAD: + + break; + case DFU_REQUEST_GETSTATUS: + + break; + case DFU_REQUEST_CLRSTATUS: + + break; + case DFU_REQUEST_GETSTATE: + + break; + case DFU_REQUEST_ABORT: + + break; + default: + USBD_LOG_ERR("Unhandled request 0x%02x", setup->bRequest); + break; + } + + return 0; +} + +void dfu_notify_handler(uint8_t event, void *arg) +{ + switch (event) { + case USB_EVENT_RESET: + + break; + + default: + break; + } +} + +void usbd_dfu_add_interface(usbd_class_t *class, usbd_interface_t *intf) +{ + static usbd_class_t *last_class = NULL; + + if (last_class != class) { + last_class = class; + usbd_class_register(class); + } + + intf->class_handler = dfu_class_request_handler; + intf->custom_handler = NULL; + intf->vendor_handler = NULL; + intf->notify_handler = dfu_notify_handler; + usbd_class_add_interface(class, intf); +}
\ No newline at end of file diff --git a/class/dfu/usbd_dfu.h b/class/dfu/usbd_dfu.h new file mode 100644 index 00000000..c5f7a045 --- /dev/null +++ b/class/dfu/usbd_dfu.h @@ -0,0 +1,113 @@ +/** + * @file + * @brief USB DFU Device Class public header + * + */ + +#ifndef _USBD_DFU_H_ +#define _USBD_DFU_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/**\addtogroup USB_MODULE_DFU USB DFU class + * \brief This module contains USB Device Firmware Upgrade class definitions. + * \details This module based on + * + [USB Device Firmware Upgrade Specification, Revision 1.1] + * (https://www.usb.org/sites/default/files/DFU_1.1.pdf) + * @{ */ + +/** DFU Specification release */ +#define DFU_VERSION 0x0110 + +/** DFU Class Subclass */ +#define DFU_SUBCLASS_DFU 0x01 + +/** DFU Class runtime Protocol */ +#define DFU_PROTOCOL_RUNTIME 0x01 + +/** DFU Class DFU mode Protocol */ +#define DFU_PROTOCOL_MODE 0x02 + +/** + * @brief DFU Class Specific Requests + */ +#define DFU_REQUEST_DETACH 0x00 +#define DFU_REQUEST_DNLOAD 0x01 +#define DFU_REQUEST_UPLOAD 0x02 +#define DFU_REQUEST_GETSTATUS 0x03 +#define DFU_REQUEST_CLRSTATUS 0x04 +#define DFU_REQUEST_GETSTATE 0x05 +#define DFU_REQUEST_ABORT 0x06 + +/** DFU FUNCTIONAL descriptor type */ +#define DFU_FUNC_DESC 0x21 + +/** DFU attributes DFU Functional Descriptor */ +#define DFU_ATTR_WILL_DETACH 0x08 +#define DFU_ATTR_MANIFESTATION_TOLERANT 0x04 +#define DFU_ATTR_CAN_UPLOAD 0x02 +#define DFU_ATTR_CAN_DNLOAD 0x01 + +/** bStatus values for the DFU_GETSTATUS response */ +#define DFU_STATUS_OK 0x00U +#define DFU_STATUS_ERR_TARGET 0x01U +#define DFU_STATUS_ERR_FILE 0x02U +#define DFU_STATUS_ERR_WRITE 0x03U +#define DFU_STATUS_ERR_ERASE 0x04U +#define DFU_STATUS_ERR_CHECK_ERASED 0x05U +#define DFU_STATUS_ERR_PROG 0x06U +#define DFU_STATUS_ERR_VERIFY 0x07U +#define DFU_STATUS_ERR_ADDRESS 0x08U +#define DFU_STATUS_ERR_NOTDONE 0x09U +#define DFU_STATUS_ERR_FIRMWARE 0x0AU +#define DFU_STATUS_ERR_VENDOR 0x0BU +#define DFU_STATUS_ERR_USB 0x0CU +#define DFU_STATUS_ERR_POR 0x0DU +#define DFU_STATUS_ERR_UNKNOWN 0x0EU +#define DFU_STATUS_ERR_STALLEDPKT 0x0FU + +/** bState values for the DFU_GETSTATUS response */ +#define DFU_STATE_APP_IDLE 0U +#define DFU_STATE_APP_DETACH 1U +#define DFU_STATE_DFU_IDLE 2U +#define DFU_STATE_DFU_DNLOAD_SYNC 3U +#define DFU_STATE_DFU_DNLOAD_BUSY 4U +#define DFU_STATE_DFU_DNLOAD_IDLE 5U +#define DFU_STATE_DFU_MANIFEST_SYNC 6U +#define DFU_STATE_DFU_MANIFEST 7U +#define DFU_STATE_DFU_MANIFEST_WAIT_RESET 8U +#define DFU_STATE_DFU_UPLOAD_IDLE 9U +#define DFU_STATE_DFU_ERROR 10U + +/** Run-Time Functional Descriptor */ +struct dfu_runtime_descriptor { + uint8_t bLength; /**<\brief Descriptor length in bytes.*/ + uint8_t bDescriptorType; /**<\brief DFU functional descriptor type.*/ + uint8_t bmAttributes; /**<\brief USB DFU capabilities \ref USB_DFU_CAPAB*/ + uint16_t wDetachTimeout; /**<\brief USB DFU detach timeout in ms.*/ + uint16_t wTransferSize; /**<\brief USB DFU maximum transfer block size in bytes.*/ + uint16_t bcdDFUVersion; /**<\brief USB DFU version \ref VERSION_BCD utility macro.*/ +} __packed; + +/**\brief Payload packet to response in DFU_GETSTATUS request */ +struct dfu_info { + uint8_t bStatus; /**<\brief An indication of the status resulting from the + * execution of the most recent request.*/ + uint8_t bPollTimeout; /**<\brief Minimum time (LSB) in ms, that the host should wait + * before sending a subsequent DFU_GETSTATUS request.*/ + uint16_t wPollTimeout; /**<\brief Minimum time (MSB) in ms, that the host should wait + * before sending a subsequent DFU_GETSTATUS request.*/ + uint8_t bState; /**<\brief An indication of the state that the device is going + * to enter immediately following transmission of this response.*/ + uint8_t iString; /**<\brief Index of the status string descriptor.*/ +}; + +void usbd_dfu_add_interface(usbd_class_t *class, usbd_interface_t *intf); + +#ifdef __cplusplus +} +#endif + +#endif /* _USBD_DFU_H_ */ |
