summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2022-02-26 11:50:33 +0800
committersakumisu <[email protected]>2022-02-26 16:16:19 +0800
commitf81506ce818f00daa149c7a4c1671438e7732822 (patch)
treed095d610edd4855c85623fe673c89fcc036ff992
parentad12809f00e5775d6da63637a5872396bf3492bb (diff)
update device and host api
-rw-r--r--docs/_build/doctrees/api/api_device.doctreebin4062 -> 79397 bytes
-rw-r--r--docs/_build/doctrees/api/api_host.doctreebin4060 -> 16858 bytes
-rw-r--r--docs/_build/doctrees/environment.picklebin57831 -> 79020 bytes
-rw-r--r--docs/_build/html/_sources/api/api_device.rst.txt487
-rw-r--r--docs/_build/html/_sources/api/api_host.rst.txt153
-rw-r--r--docs/_build/html/api/api_device.html524
-rw-r--r--docs/_build/html/api/api_host.html173
-rw-r--r--docs/_build/html/objects.invbin2053 -> 2504 bytes
-rw-r--r--docs/_build/html/searchindex.js2
-rw-r--r--docs/api/api_device.rst487
-rw-r--r--docs/api/api_host.rst153
11 files changed, 1904 insertions, 75 deletions
diff --git a/docs/_build/doctrees/api/api_device.doctree b/docs/_build/doctrees/api/api_device.doctree
index 9a442e80..930bb750 100644
--- a/docs/_build/doctrees/api/api_device.doctree
+++ b/docs/_build/doctrees/api/api_device.doctree
Binary files differ
diff --git a/docs/_build/doctrees/api/api_host.doctree b/docs/_build/doctrees/api/api_host.doctree
index 093ab676..ae881d44 100644
--- a/docs/_build/doctrees/api/api_host.doctree
+++ b/docs/_build/doctrees/api/api_host.doctree
Binary files differ
diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle
index 34fde38f..85b9129e 100644
--- a/docs/_build/doctrees/environment.pickle
+++ b/docs/_build/doctrees/environment.pickle
Binary files differ
diff --git a/docs/_build/html/_sources/api/api_device.rst.txt b/docs/_build/html/_sources/api/api_device.rst.txt
index 3dc13a29..71e10514 100644
--- a/docs/_build/html/_sources/api/api_device.rst.txt
+++ b/docs/_build/html/_sources/api/api_device.rst.txt
@@ -1,26 +1,497 @@
设备协议栈
=========================
-设备 CORE
+CORE
-----------------
-设备 CDC
+端点结构体
+""""""""""""""""""""""""""""""""""""
+
+端点结构体主要用于注册不同端点地址的中断完成回调函数。
+
+.. code-block:: C
+
+ typedef struct usbd_endpoint {
+ usb_slist_t list;
+ uint8_t ep_addr;
+ usbd_endpoint_callback ep_cb;
+ } usbd_endpoint_t;
+
+- **list** 端点的链表节点
+- **ep_addr** 端点地址(带方向)
+- **ep_cb** 端点中断回调函数
+
+接口结构体
+""""""""""""""""""""""""""""""""""""
+
+接口结构体主要用于注册不同类设备除了标准设备请求外的其他请求,包括类设备请求、厂商设备请求和自定义设备请求。以及协议栈中的相关通知回调函数。
+
+.. code-block:: C
+
+ typedef struct usbd_interface {
+ usb_slist_t list;
+ /** Handler for USB Class specific commands*/
+ usbd_request_handler class_handler;
+ /** Handler for USB Vendor specific commands */
+ usbd_request_handler vendor_handler;
+ /** Handler for USB custom specific commands */
+ usbd_request_handler custom_handler;
+ /** Handler for USB event notify commands */
+ usbd_notify_handler notify_handler;
+ uint8_t intf_num;
+ usb_slist_t ep_list;
+ } usbd_interface_t;
+
+- **list** 接口的链表节点
+- **class_handler** class setup 请求回调函数
+- **vendor_handler** vendor setup 请求回调函数
+- **custom_handler** custom setup 请求回调函数
+- **notify_handler** 中断标志、协议栈相关状态回调函数
+- **intf_num** 当前接口偏移
+- **ep_list** 端点的链表节点
+
+类结构体
+""""""""""""""""""""""""""""""""""""
+
+类结构体主要用于挂载接口链表。后期可能会删除,因为这个部分跟接口其实是有关系的。
+
+.. code-block:: C
+
+ typedef struct usbd_class {
+ usb_slist_t list;
+ const char *name;
+ usb_slist_t intf_list;
+ } usbd_class_t;
+
+- **list** 类的链表节点
+- **name** 类的名称
+- **intf_list** 接口的链表节点
+
+usbd_event_notify_handler
+""""""""""""""""""""""""""""""""""""
+
+``usbd_event_notify_handler`` 是 USB 中断中的核心,用于处理不同的中断标志。包括复位、端点0 IN/OUT/SETUP、其他端点 IN/OUT 、SUSPEND、RESUME、SOF 中断等等。用户需要在 porting 接口中的 USB中断中调用该接口。
+
+.. code-block:: C
+
+ void usbd_event_notify_handler(uint8_t event, void *arg);
+
+- **event** 中断事件
+- **arg** 端点号
+
+其中 ``event`` 有如下类型:
+
+.. code-block:: C
+
+ enum usbd_event_type {
+ /** USB error reported by the controller */
+ USBD_EVENT_ERROR,
+ /** USB reset */
+ USBD_EVENT_RESET,
+ /** Start of Frame received */
+ USBD_EVENT_SOF,
+ /** USB connection established, hardware enumeration is completed */
+ USBD_EVENT_CONNECTED,
+ /** USB configuration done */
+ USBD_EVENT_CONFIGURED,
+ /** USB connection suspended by the HOST */
+ USBD_EVENT_SUSPEND,
+ /** USB connection lost */
+ USBD_EVENT_DISCONNECTED,
+ /** USB connection resumed by the HOST */
+ USBD_EVENT_RESUME,
+
+ /** USB interface selected */
+ USBD_EVENT_SET_INTERFACE,
+ /** USB interface selected */
+ USBD_EVENT_SET_REMOTE_WAKEUP,
+ /** USB interface selected */
+ USBD_EVENT_CLEAR_REMOTE_WAKEUP,
+ /** Set Feature ENDPOINT_HALT received */
+ USBD_EVENT_SET_HALT,
+ /** Clear Feature ENDPOINT_HALT received */
+ USBD_EVENT_CLEAR_HALT,
+ /** setup packet received */
+ USBD_EVENT_SETUP_NOTIFY,
+ /** ep0 in packet received */
+ USBD_EVENT_EP0_IN_NOTIFY,
+ /** ep0 out packet received */
+ USBD_EVENT_EP0_OUT_NOTIFY,
+ /** ep in packet except ep0 received */
+ USBD_EVENT_EP_IN_NOTIFY,
+ /** ep out packet except ep0 received */
+ USBD_EVENT_EP_OUT_NOTIFY,
+ /** Initial USB connection status */
+ USBD_EVENT_UNKNOWN
+ };
+
+usbd_desc_register
+""""""""""""""""""""""""""""""""""""
+
+``usbd_desc_register`` 用来注册 USB 描述符,描述符种类包括:设备描述符、配置描述符(包含配置描述符、接口描述符、class 类描述符、端点描述符)、字符串描述符、设备限定描述符。
+
+.. code-block:: C
+
+ void usbd_desc_register(const uint8_t *desc);
+
+- **desc** 描述符的句柄
+
+usbd_msosv1_desc_register
+""""""""""""""""""""""""""""""""""""
+
+``usbd_msosv1_desc_register`` 用来注册一个 WINUSB 1.0 描述符。
+
+.. code-block:: C
+
+ void usbd_msosv1_desc_register(struct usb_msosv1_descriptor *desc);
+
+- **desc** 描述符句柄
+
+usbd_msosv2_desc_register
+""""""""""""""""""""""""""""""""""""
+
+``usbd_msosv2_desc_register`` 用来注册一个 WINUSB 2.0 描述符。
+
+.. code-block:: C
+
+ void usbd_msosv2_desc_register(struct usb_msosv2_descriptor *desc);
+
+- **desc** 描述符句柄
+
+usbd_bos_desc_register
+""""""""""""""""""""""""""""""""""""
+
+``usbd_bos_desc_register`` 用来注册一个 BOS 描述符, USB 2.1 版本以上必须注册。
+
+.. code-block:: C
+
+ void usbd_bos_desc_register(struct usb_bos_descriptor *desc);
+
+- **desc** 描述符句柄
+
+usbd_class_register
+""""""""""""""""""""""""""""""""""""
+
+``usbd_class_register`` 用来注册一个 class,该 class 中的接口链表成员,用于后续挂载多个接口。
+
+.. code-block:: C
+
+ void usbd_class_register(usbd_class_t *devclass);
+
+- **devclass** USB 设备类的句柄
+
+usbd_class_add_interface
+""""""""""""""""""""""""""""""""""""
+
+``usbd_class_add_interface`` 用来给 USB 设备类增加接口,并将接口信息挂载在类的链表上。
+
+.. code-block:: C
+
+ void usbd_class_add_interface(usbd_class_t *devclass, usbd_interface_t *intf);
+
+- **devclass** USB 设备类的句柄
+- **intf** USB 设备接口的句柄
+
+**usbd_interface_add_endpoint**
+""""""""""""""""""""""""""""""""""""
+
+``usbd_interface_add_endpoint`` 用来给 USB 接口增加端点,并将端点信息挂载在接口的链表上。
+
+.. code-block:: C
+
+ void usbd_interface_add_endpoint(usbd_interface_t *intf, usbd_endpoint_t *ep);
+
+
+- **intf** USB 设备接口的句柄
+- **ep** USB 设备端点的句柄
+
+**usb_device_is_configured**
+""""""""""""""""""""""""""""""""""""
+
+``usb_device_is_configured`` 用来检查 USB 设备是否被配置(枚举)。
+
+.. code-block:: C
+
+ bool usb_device_is_configured(void);
+
+- **return** 配置状态, 0 表示未配置, 1 表示配置成功
+
+CDC ACM
-----------------
-设备 HID
+usbd_cdc_add_acm_interface
+""""""""""""""""""""""""""""""""""""
+
+``usbd_cdc_add_acm_interface`` 用来给 USB CDC ACM 类添加接口,并实现该接口相关的函数:
+
+- ``cdc_acm_class_request_handler`` 用来处理 USB CDC ACM 类 Setup 请求。
+- ``cdc_notify_handler`` 用来处理 USB CDC 其他中断回调函数。
+
+.. code-block:: C
+
+ void usbd_cdc_add_acm_interface(usbd_class_t *devclass, usbd_interface_t *intf);
+
+- **devclass** 类的句柄
+- **intf** 接口句柄
+
+usbd_cdc_acm_set_line_coding
+""""""""""""""""""""""""""""""""""""
+
+``usbd_cdc_acm_set_line_coding`` 用来对串口进行配置,如果仅使用 USB 而不用 串口,该接口不用用户实现,使用默认。
+
+.. code-block:: C
+
+ void usbd_cdc_acm_set_line_coding(uint32_t baudrate, uint8_t databits, uint8_t parity, uint8_t stopbits);
+
+- **baudrate** 波特率
+- **databits** 数据位
+- **parity** 校验位
+- **stopbits** 停止位
+
+usbd_cdc_acm_set_dtr
+""""""""""""""""""""""""""""""""""""
+
+``usbd_cdc_acm_set_dtr`` 用来控制串口 DTR 。如果仅使用 USB 而不用 串口,该接口不用用户实现,使用默认。
+
+.. code-block:: C
+
+ void usbd_cdc_acm_set_dtr(bool dtr);
+
+- **dtr** dtr 为1表示拉低电平,为0表示拉高电平
+
+usbd_cdc_acm_set_rts
+""""""""""""""""""""""""""""""""""""
+
+``usbd_cdc_acm_set_rts`` 用来控制串口 RTS 。如果仅使用 USB 而不用 串口,该接口不用用户实现,使用默认。
+
+.. code-block:: C
+
+ void usbd_cdc_acm_set_rts(bool rts);
+
+- **rts** rts 为1表示拉低电平,为0表示拉高电平
+
+HID
-----------------
-设备 MSC
+usbd_hid_add_interface
+""""""""""""""""""""""""""""""""""""
+
+``usbd_hid_add_interface`` 用来给 USB HID 类添加接口,并实现该接口相关的函数:
+
+- ``hid_class_request_handler`` 用来处理 USB HID 类的 Setup 请求。
+- ``hid_custom_request_handler`` 用来处理 USB HID 获取报告描述符请求。
+- ``hid_notify_handler`` 用来处理 USB HID 其他中断回调函数。
+
+.. code-block:: C
+
+ void usbd_hid_add_interface(usbd_class_t *devclass, usbd_interface_t *intf);
+
+- **devclass** 类的句柄
+- **intf** 接口句柄
+
+usbd_hid_report_descriptor_register
+""""""""""""""""""""""""""""""""""""""""""""
+
+``usbd_hid_report_descriptor_register`` 用来注册 hid 报告描述符。
+
+.. code-block:: C
+
+ void usbd_hid_report_descriptor_register(uint8_t intf_num, const uint8_t *desc, uint32_t desc_len);
+
+- **intf_num** 当前 hid 报告描述符所在接口偏移
+- **desc** 报告描述符
+- **desc_len** 报告描述符长度
+
+usbd_hid_set_request_callback
+""""""""""""""""""""""""""""""""""""
+
+``usbd_hid_set_request_callback`` 用来注册 hid 类请求命令的回调函数。
+
+.. code-block:: C
+
+ void usbd_hid_set_request_callback( uint8_t intf_num,
+ uint8_t (*get_report_callback)(uint8_t report_id, uint8_t report_type),
+ void (*set_report_callback)(uint8_t report_id, uint8_t report_type, uint8_t *report, uint8_t report_len),
+ uint8_t (*get_idle_callback)(uint8_t report_id),
+ void (*set_idle_callback)(uint8_t report_id, uint8_t duration),
+ void (*set_protocol_callback)(uint8_t protocol),
+ uint8_t (*get_protocol_callback)(void));
+
+- **intf_num** 当前 hid 报告描述符所在接口偏移
+- **get_report_callback** get report命令处理回调函数
+- **set_report_callback** set report命令处理回调函数
+- **get_idle_callback** get idle命令处理回调函数
+- **set_idle_callback** set idle命令处理回调函数
+- **set_protocol_callback** set protocol命令处理回调函数
+- **get_protocol_callback** get protocol命令处理回调函数
+
+MSC
-----------------
-设备 AUDIO
+usbd_msc_class_init
+""""""""""""""""""""""""""""""""""""
+``usbd_msc_class_init`` 用来给 MSC 类添加接口,并实现该接口相关函数,并且注册端点回调函数。(因为 msc bot 协议是固定的,所以不需要用于实现,因此端点回调函数自然不需要用户实现)。
+
+- ``msc_storage_class_request_handler`` 用于处理 USB MSC Setup 中断请求。
+- ``msc_storage_notify_handler`` 用于实现 USB MSC 其他中断回调函数。
+
+- ``mass_storage_bulk_out`` 用于处理 USB MSC 端点 out 中断。
+- ``mass_storage_bulk_in`` 用于处理 USB MSC 端点 in 中断。
+
+.. code-block:: C
+
+ void usbd_msc_class_init(uint8_t out_ep, uint8_t in_ep);
+
+- **out_ep** out 端点地址
+- **in_ep** in 端点地址
+
+usbd_msc_get_cap
+""""""""""""""""""""""""""""""""""""
+
+``usbd_msc_get_cap`` 用来获取存储器的 lun、扇区个数和每个扇区大小。用户必须实现该函数。
+
+.. code-block:: C
+
+ void usbd_msc_get_cap(uint8_t lun, uint32_t *block_num, uint16_t *block_size);
+
+- **lun** 存储逻辑单元,暂时无用,默认支持一个
+- **block_num** 存储扇区个数
+- **block_size** 存储扇区大小
+
+usbd_msc_sector_read
+""""""""""""""""""""""""""""""""""""
+
+``usbd_msc_sector_read`` 用来对存储器某个扇区开始的地址进行数据读取。用户必须实现该函数。
+
+.. code-block:: C
+
+ int usbd_msc_sector_read(uint32_t sector, uint8_t *buffer, uint32_t length);
+
+- **sector** 扇区偏移
+- **buffer** 存储读取的数据的指针
+- **length** 读取长度
+
+
+usbd_msc_sector_write
+""""""""""""""""""""""""""""""""""""
+
+``usbd_msc_sector_write`` 用来对存储器某个扇区开始写入数据。用户必须实现该函数。
+
+.. code-block:: C
+
+ int usbd_msc_sector_write(uint32_t sector, uint8_t *buffer, uint32_t length);
+
+- **sector** 扇区偏移
+- **buffer** 写入数据指针
+- **length** 写入长度
+
+UAC
-----------------
-设备 VIDEO
+usbd_audio_add_interface
+""""""""""""""""""""""""""""""""""""
+``usbd_audio_add_interface`` 用来给 USB Audio 类添加接口,并实现该接口相关的函数:
+
+- ``audio_class_request_handler`` 用于处理 USB Audio Setup 中断请求。
+- ``audio_notify_handler`` 用于实现 USB Audio 其他中断回调函数。
+
+.. code-block:: C
+
+ void usbd_audio_add_interface(usbd_class_t *devclass, usbd_interface_t *intf);
+
+- **class** 类的句柄
+- **intf** 接口句柄
+
+usbd_audio_set_mute
+""""""""""""""""""""""""""""""""""""
+
+``usbd_audio_set_mute`` 用来设置静音。
+
+.. code-block:: C
+
+ void usbd_audio_set_mute(uint8_t mute);
+
+- **mute** 为1 表示静音,0相反
+
+usbd_audio_set_volume
+""""""""""""""""""""""""""""""""""""
+
+``usbd_audio_set_volume`` 用来设置音量。
+
+.. code-block:: C
+
+ void usbd_audio_set_volume(uint8_t vol);
+
+- **vol** 音量,从 0-100
+
+usbd_audio_set_interface_callback
+""""""""""""""""""""""""""""""""""""
+
+``usbd_audio_set_interface_callback`` 用来开关音频数据传输。
+
+.. code-block:: C
+
+ void usbd_audio_set_interface_callback(uint8_t value);
+
+- **value** 为1 表示开启 stream 传输,为0 相反
+
+UVC
-----------------
-设备 DFU
+usbd_video_add_interface
+""""""""""""""""""""""""""""""""""""
+``usbd_video_add_interface`` 用来给 USB Video 类添加接口,并实现该接口相关的函数:
+
+- ``video_class_request_handler`` 用于处理 USB Video Setup 中断请求。
+- ``video_notify_handler`` 用于实现 USB Video 其他中断回调函数。
+
+.. code-block:: C
+
+ void usbd_video_add_interface(usbd_class_t *devclass, usbd_interface_t *intf);
+
+- **class** 类的句柄
+- **intf** 接口句柄
+
+usbd_video_probe_and_commit_controls_init
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+``usbd_video_probe_and_commit_controls_init`` 用来开关视频数据传输。
+
+.. code-block:: C
+
+ void usbd_video_probe_and_commit_controls_init(uint32_t dwFrameInterval, uint32_t dwMaxVideoFrameSize, uint32_t dwMaxPayloadTransferSize);
+
+- **value** 为1 表示开启 stream 传输,为0 相反
+
+usbd_video_mjpeg_payload_fill
+""""""""""""""""""""""""""""""""""""
+
+``usbd_video_mjpeg_payload_fill`` 用来填充 mjpeg 到新的 buffer中,其中会对 mjpeg 数据按帧进行切分,切分大小由 ``dwMaxPayloadTransferSize`` 控制,并添加头部信息,当前头部字节数为 2。头部信息见 ``struct video_mjpeg_payload_header``
+
+.. code-block:: C
+
+ uint32_t usbd_video_mjpeg_payload_fill(uint8_t *input, uint32_t input_len, uint8_t *output, uint32_t *out_len);
+
+- **input** mjpeg 格式的数据包,从 FFD8~FFD9结束
+- **input_len** mjpeg数据包大小
+- **output** 输出缓冲区
+- **out_len** 输出实际要发送的长度大小
+- **return** 返回 usb 按照 ``dwMaxPayloadTransferSize`` 大小要发多少帧
+
+usbd_video_mjpeg_payload_header_toggle
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+``usbd_video_mjpeg_payload_header_toggle`` 用来对每一帧图像数据要发送时进行翻转,并保持到一帧图像数据发送完成。
+
+.. code-block:: C
+
+ void usbd_video_mjpeg_payload_header_toggle(uint8_t *output, uint32_t packets);
+
+- **output** 要翻转的 usb 缓冲区,该缓冲区是 ``usbd_video_mjpeg_payload_fill`` 中的 ``output``
+- **packets** USB 发送的帧个数
+
+DFU
-----------------
-设备 PORTING
+PORTING
----------------- \ No newline at end of file
diff --git a/docs/_build/html/_sources/api/api_host.rst.txt b/docs/_build/html/_sources/api/api_host.rst.txt
index 428ffe08..fdee2c18 100644
--- a/docs/_build/html/_sources/api/api_host.rst.txt
+++ b/docs/_build/html/_sources/api/api_host.rst.txt
@@ -1,26 +1,161 @@
主机协议栈
=========================
-主机 CORE
+CORE
-----------------
-主机 CDC
------------------
+CLASS 驱动信息结构体
+""""""""""""""""""""""""""""""""""""
+
+.. code-block:: C
+
+ struct usbh_class_info {
+ uint8_t class; /* Base device class code */
+ uint8_t subclass; /* Sub-class, depends on base class. Eg. */
+ uint8_t protocol; /* Protocol, depends on base class. Eg. */
+ uint16_t vid; /* Vendor ID (for vendor/product specific devices) */
+ uint16_t pid; /* Product ID (for vendor/product specific devices) */
+ const struct usbh_class_driver *class_driver;
+ };
+
+端点结构体
+""""""""""""""""""""""""""""""""""""
+
+.. code-block:: C
+
+ typedef struct usbh_endpoint {
+ struct usb_endpoint_descriptor ep_desc;
+ } usbh_endpoint_t;
+
+接口结构体
+""""""""""""""""""""""""""""""""""""
+
+.. code-block:: C
+
+ typedef struct usbh_interface {
+ struct usb_interface_descriptor intf_desc;
+ struct usbh_endpoint ep[CONFIG_USBHOST_EP_NUM];
+ char devname[CONFIG_USBHOST_DEV_NAMELEN];
+ struct usbh_class_driver *class_driver;
+ void *priv;
+ } usbh_interface_t;
+
+
+配置结构体
+""""""""""""""""""""""""""""""""""""
+
+.. code-block:: C
+
+ typedef struct usbh_configuration {
+ struct usb_configuration_descriptor config_desc;
+ struct usbh_interface intf[CONFIG_USBHOST_INTF_NUM];
+ } usbh_configuration_t;
+
+hubport 结构体
+""""""""""""""""""""""""""""""""""""
+
+.. code-block:: C
+
+ typedef struct usbh_hubport {
+ bool connected; /* True: device connected; false: disconnected */
+ bool port_change; /* True: port changed; false: port do not change */
+ uint8_t port; /* Hub port index */
+ uint8_t dev_addr; /* device address */
+ uint8_t speed; /* device speed */
+ usbh_epinfo_t ep0; /* control ep info */
+ struct usb_device_descriptor device_desc;
+ struct usbh_configuration config;
+ #if 0
+ uint8_t* config_desc;
+ #endif
+ struct usb_setup_packet *setup;
+ struct usbh_hub *parent; /*if NULL, is roothub*/
+ } usbh_hubport_t;
+
+hub 结构体
+""""""""""""""""""""""""""""""""""""
+
+.. code-block:: C
+
+ typedef struct usbh_hub {
+ usb_slist_t list;
+ uint8_t index; /* Hub index */
+ uint8_t nports; /* Hub port number */
+ uint8_t dev_addr; /* Hub device address */
+ usbh_epinfo_t intin;
+ uint8_t *int_buffer;
+ struct hub_port_status *port_status;
+ struct usb_hub_descriptor hub_desc;
+ struct usbh_hubport child[CONFIG_USBHOST_EHPORTS];
+ struct usbh_hubport *parent; /* Parent hub port */
+ struct usb_work work;
+ } usbh_hub_t;
+
+usbh_event_notify_handler
+""""""""""""""""""""""""""""""""""""
+
+``usbh_event_notify_handler`` 是 USB 中断中的核心,用于处理不同的中断标志。包括复位、端点0 IN/OUT/SETUP、其他端点 IN/OUT 、SUSPEND、RESUME、SOF 中断等等。用于需要在 porting 接口中的 USB中断中调用该接口。
+
+.. code-block:: C
+
+ void usbh_event_notify_handler(uint8_t event, uint8_t rhport);
+
+- **event** 中断事件
+- **rhport** roothub 端口号
+
+其中 ``event`` 有如下类型:
+
+.. code-block:: C
+
+ enum usbh_event_type {
+ USBH_EVENT_ATTACHED,
+ USBH_EVENT_REMOVED,
+ };
+
+usbh_initialize
+""""""""""""""""""""""""""""""""""""
+
+``usbh_initialize`` 用来初始化 usb 主机协议栈,包括:创建插拔检测用的信号量和枚举线程、高低工作队列、初始化 roothub端点0 配置,初始化 usb 主机控制器。
+
+.. code-block:: C
+
+ int usbh_initialize(void);
+
+usbh_find_class_instance
+""""""""""""""""""""""""""""""""""""
+
+``usbh_find_class_instance`` 根据注册的 class 名称查找对应的 class 结构体句柄。
+
+.. code-block:: C
+
+ void *usbh_find_class_instance(const char *devname);
+
+- **devname** class 名称
+- **return** class 结构体句柄
+
+lsusb
+""""""""""""""""""""""""""""""""""""
+
+``lsusb`` 用来查看和操作 hub 上的设备信息。需要借助 shell 插件使用。
+
+.. code-block:: C
+
+ int lsusb(int argc, char **argv);
-主机 HID
+CDC ACM
-----------------
-主机 MSC
+HID
-----------------
-主机 AUDIO
+MSC
-----------------
-主机 VIDEO
+UAC
-----------------
-主机 DFU
+UVC
-----------------
-主机 PORTING
+PORTING
----------------- \ No newline at end of file
diff --git a/docs/_build/html/api/api_device.html b/docs/_build/html/api/api_device.html
index e6d8c8ec..27db12b0 100644
--- a/docs/_build/html/api/api_device.html
+++ b/docs/_build/html/api/api_device.html
@@ -105,14 +105,57 @@
<p class="caption"><span class="caption-text">API 手册</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#">设备协议栈</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="#core">设备 CORE</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#cdc">设备 CDC</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#hid">设备 HID</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#msc">设备 MSC</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#audio">设备 AUDIO</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#video">设备 VIDEO</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#dfu">设备 DFU</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#porting">设备 PORTING</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#core">CORE</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#id2">端点结构体</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#id3">接口结构体</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#id4">类结构体</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-event-notify-handler">usbd_event_notify_handler</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-desc-register">usbd_desc_register</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-msosv1-desc-register">usbd_msosv1_desc_register</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-msosv2-desc-register">usbd_msosv2_desc_register</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-bos-desc-register">usbd_bos_desc_register</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-class-register">usbd_class_register</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-class-add-interface">usbd_class_add_interface</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-interface-add-endpoint"><strong>usbd_interface_add_endpoint</strong></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usb-device-is-configured"><strong>usb_device_is_configured</strong></a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="#cdc-acm">CDC ACM</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-cdc-add-acm-interface">usbd_cdc_add_acm_interface</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-cdc-acm-set-line-coding">usbd_cdc_acm_set_line_coding</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-cdc-acm-set-dtr">usbd_cdc_acm_set_dtr</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-cdc-acm-set-rts">usbd_cdc_acm_set_rts</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="#hid">HID</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-hid-add-interface">usbd_hid_add_interface</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-hid-report-descriptor-register">usbd_hid_report_descriptor_register</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-hid-set-request-callback">usbd_hid_set_request_callback</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="#msc">MSC</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-msc-class-init">usbd_msc_class_init</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-msc-get-cap">usbd_msc_get_cap</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-msc-sector-read">usbd_msc_sector_read</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-msc-sector-write">usbd_msc_sector_write</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="#uac">UAC</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-audio-add-interface">usbd_audio_add_interface</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-audio-set-mute">usbd_audio_set_mute</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-audio-set-volume">usbd_audio_set_volume</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-audio-set-interface-callback">usbd_audio_set_interface_callback</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="#uvc">UVC</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-video-add-interface">usbd_video_add_interface</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-video-probe-and-commit-controls-init">usbd_video_probe_and_commit_controls_init</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-video-mjpeg-payload-fill">usbd_video_mjpeg_payload_fill</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-video-mjpeg-payload-header-toggle">usbd_video_mjpeg_payload_header_toggle</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="#dfu">DFU</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#porting">PORTING</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="api_host.html">主机协议栈</a></li>
@@ -209,28 +252,471 @@
<div class="section" id="id1">
<h1>设备协议栈<a class="headerlink" href="#id1" title="永久链接至标题">¶</a></h1>
<div class="section" id="core">
-<h2>设备 CORE<a class="headerlink" href="#core" title="永久链接至标题">¶</a></h2>
+<h2>CORE<a class="headerlink" href="#core" title="永久链接至标题">¶</a></h2>
+<div class="section" id="id2">
+<h3>端点结构体<a class="headerlink" href="#id2" title="永久链接至标题">¶</a></h3>
+<p>端点结构体主要用于注册不同端点地址的中断完成回调函数。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="k">typedef</span> <span class="k">struct</span> <span class="nc">usbd_endpoint</span> <span class="p">{</span>
+ <span class="n">usb_slist_t</span> <span class="n">list</span><span class="p">;</span>
+ <span class="kt">uint8_t</span> <span class="n">ep_addr</span><span class="p">;</span>
+ <span class="n">usbd_endpoint_callback</span> <span class="n">ep_cb</span><span class="p">;</span>
+<span class="p">}</span> <span class="n">usbd_endpoint_t</span><span class="p">;</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>list</strong> 端点的链表节点</p></li>
+<li><p><strong>ep_addr</strong> 端点地址(带方向)</p></li>
+<li><p><strong>ep_cb</strong> 端点中断回调函数</p></li>
+</ul>
+</div>
+<div class="section" id="id3">
+<h3>接口结构体<a class="headerlink" href="#id3" title="永久链接至标题">¶</a></h3>
+<p>接口结构体主要用于注册不同类设备除了标准设备请求外的其他请求,包括类设备请求、厂商设备请求和自定义设备请求。以及协议栈中的相关通知回调函数。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="k">typedef</span> <span class="k">struct</span> <span class="nc">usbd_interface</span> <span class="p">{</span>
+ <span class="n">usb_slist_t</span> <span class="n">list</span><span class="p">;</span>
+ <span class="cm">/** Handler for USB Class specific commands*/</span>
+ <span class="n">usbd_request_handler</span> <span class="n">class_handler</span><span class="p">;</span>
+ <span class="cm">/** Handler for USB Vendor specific commands */</span>
+ <span class="n">usbd_request_handler</span> <span class="n">vendor_handler</span><span class="p">;</span>
+ <span class="cm">/** Handler for USB custom specific commands */</span>
+ <span class="n">usbd_request_handler</span> <span class="n">custom_handler</span><span class="p">;</span>
+ <span class="cm">/** Handler for USB event notify commands */</span>
+ <span class="n">usbd_notify_handler</span> <span class="n">notify_handler</span><span class="p">;</span>
+ <span class="kt">uint8_t</span> <span class="n">intf_num</span><span class="p">;</span>
+ <span class="n">usb_slist_t</span> <span class="n">ep_list</span><span class="p">;</span>
+<span class="p">}</span> <span class="n">usbd_interface_t</span><span class="p">;</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>list</strong> 接口的链表节点</p></li>
+<li><p><strong>class_handler</strong> class setup 请求回调函数</p></li>
+<li><p><strong>vendor_handler</strong> vendor setup 请求回调函数</p></li>
+<li><p><strong>custom_handler</strong> custom setup 请求回调函数</p></li>
+<li><p><strong>notify_handler</strong> 中断标志、协议栈相关状态回调函数</p></li>
+<li><p><strong>intf_num</strong> 当前接口偏移</p></li>
+<li><p><strong>ep_list</strong> 端点的链表节点</p></li>
+</ul>
+</div>
+<div class="section" id="id4">
+<h3>类结构体<a class="headerlink" href="#id4" title="永久链接至标题">¶</a></h3>
+<p>类结构体主要用于挂载接口链表。后期可能会删除,因为这个部分跟接口其实是有关系的。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="k">typedef</span> <span class="k">struct</span> <span class="nc">usbd_class</span> <span class="p">{</span>
+ <span class="n">usb_slist_t</span> <span class="n">list</span><span class="p">;</span>
+ <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">name</span><span class="p">;</span>
+ <span class="n">usb_slist_t</span> <span class="n">intf_list</span><span class="p">;</span>
+<span class="p">}</span> <span class="n">usbd_class_t</span><span class="p">;</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>list</strong> 类的链表节点</p></li>
+<li><p><strong>name</strong> 类的名称</p></li>
+<li><p><strong>intf_list</strong> 接口的链表节点</p></li>
+</ul>
+</div>
+<div class="section" id="usbd-event-notify-handler">
+<h3>usbd_event_notify_handler<a class="headerlink" href="#usbd-event-notify-handler" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_event_notify_handler</span></code> 是 USB 中断中的核心,用于处理不同的中断标志。包括复位、端点0 IN/OUT/SETUP、其他端点 IN/OUT 、SUSPEND、RESUME、SOF 中断等等。用户需要在 porting 接口中的 USB中断中调用该接口。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_event_notify_handler</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="n">event</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span><span class="n">arg</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>event</strong> 中断事件</p></li>
+<li><p><strong>arg</strong> 端点号</p></li>
+</ul>
+<p>其中 <code class="docutils literal notranslate"><span class="pre">event</span></code> 有如下类型:</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="k">enum</span> <span class="n">usbd_event_type</span> <span class="p">{</span>
+ <span class="cm">/** USB error reported by the controller */</span>
+ <span class="n">USBD_EVENT_ERROR</span><span class="p">,</span>
+ <span class="cm">/** USB reset */</span>
+ <span class="n">USBD_EVENT_RESET</span><span class="p">,</span>
+ <span class="cm">/** Start of Frame received */</span>
+ <span class="n">USBD_EVENT_SOF</span><span class="p">,</span>
+ <span class="cm">/** USB connection established, hardware enumeration is completed */</span>
+ <span class="n">USBD_EVENT_CONNECTED</span><span class="p">,</span>
+ <span class="cm">/** USB configuration done */</span>
+ <span class="n">USBD_EVENT_CONFIGURED</span><span class="p">,</span>
+ <span class="cm">/** USB connection suspended by the HOST */</span>
+ <span class="n">USBD_EVENT_SUSPEND</span><span class="p">,</span>
+ <span class="cm">/** USB connection lost */</span>
+ <span class="n">USBD_EVENT_DISCONNECTED</span><span class="p">,</span>
+ <span class="cm">/** USB connection resumed by the HOST */</span>
+ <span class="n">USBD_EVENT_RESUME</span><span class="p">,</span>
+
+ <span class="cm">/** USB interface selected */</span>
+ <span class="n">USBD_EVENT_SET_INTERFACE</span><span class="p">,</span>
+ <span class="cm">/** USB interface selected */</span>
+ <span class="n">USBD_EVENT_SET_REMOTE_WAKEUP</span><span class="p">,</span>
+ <span class="cm">/** USB interface selected */</span>
+ <span class="n">USBD_EVENT_CLEAR_REMOTE_WAKEUP</span><span class="p">,</span>
+ <span class="cm">/** Set Feature ENDPOINT_HALT received */</span>
+ <span class="n">USBD_EVENT_SET_HALT</span><span class="p">,</span>
+ <span class="cm">/** Clear Feature ENDPOINT_HALT received */</span>
+ <span class="n">USBD_EVENT_CLEAR_HALT</span><span class="p">,</span>
+ <span class="cm">/** setup packet received */</span>
+ <span class="n">USBD_EVENT_SETUP_NOTIFY</span><span class="p">,</span>
+ <span class="cm">/** ep0 in packet received */</span>
+ <span class="n">USBD_EVENT_EP0_IN_NOTIFY</span><span class="p">,</span>
+ <span class="cm">/** ep0 out packet received */</span>
+ <span class="n">USBD_EVENT_EP0_OUT_NOTIFY</span><span class="p">,</span>
+ <span class="cm">/** ep in packet except ep0 received */</span>
+ <span class="n">USBD_EVENT_EP_IN_NOTIFY</span><span class="p">,</span>
+ <span class="cm">/** ep out packet except ep0 received */</span>
+ <span class="n">USBD_EVENT_EP_OUT_NOTIFY</span><span class="p">,</span>
+ <span class="cm">/** Initial USB connection status */</span>
+ <span class="n">USBD_EVENT_UNKNOWN</span>
+<span class="p">};</span>
+</pre></div>
+</div>
+</div>
+<div class="section" id="usbd-desc-register">
+<h3>usbd_desc_register<a class="headerlink" href="#usbd-desc-register" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_desc_register</span></code> 用来注册 USB 描述符,描述符种类包括:设备描述符、配置描述符(包含配置描述符、接口描述符、class 类描述符、端点描述符)、字符串描述符、设备限定描述符。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_desc_register</span><span class="p">(</span><span class="k">const</span> <span class="kt">uint8_t</span> <span class="o">*</span><span class="n">desc</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>desc</strong> 描述符的句柄</p></li>
+</ul>
+</div>
+<div class="section" id="usbd-msosv1-desc-register">
+<h3>usbd_msosv1_desc_register<a class="headerlink" href="#usbd-msosv1-desc-register" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_msosv1_desc_register</span></code> 用来注册一个 WINUSB 1.0 描述符。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_msosv1_desc_register</span><span class="p">(</span><span class="k">struct</span> <span class="nc">usb_msosv1_descriptor</span> <span class="o">*</span><span class="n">desc</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>desc</strong> 描述符句柄</p></li>
+</ul>
+</div>
+<div class="section" id="usbd-msosv2-desc-register">
+<h3>usbd_msosv2_desc_register<a class="headerlink" href="#usbd-msosv2-desc-register" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_msosv2_desc_register</span></code> 用来注册一个 WINUSB 2.0 描述符。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_msosv2_desc_register</span><span class="p">(</span><span class="k">struct</span> <span class="nc">usb_msosv2_descriptor</span> <span class="o">*</span><span class="n">desc</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>desc</strong> 描述符句柄</p></li>
+</ul>
+</div>
+<div class="section" id="usbd-bos-desc-register">
+<h3>usbd_bos_desc_register<a class="headerlink" href="#usbd-bos-desc-register" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_bos_desc_register</span></code> 用来注册一个 BOS 描述符, USB 2.1 版本以上必须注册。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_bos_desc_register</span><span class="p">(</span><span class="k">struct</span> <span class="nc">usb_bos_descriptor</span> <span class="o">*</span><span class="n">desc</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>desc</strong> 描述符句柄</p></li>
+</ul>
+</div>
+<div class="section" id="usbd-class-register">
+<h3>usbd_class_register<a class="headerlink" href="#usbd-class-register" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_class_register</span></code> 用来注册一个 class,该 class 中的接口链表成员,用于后续挂载多个接口。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_class_register</span><span class="p">(</span><span class="n">usbd_class_t</span> <span class="o">*</span><span class="n">devclass</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>devclass</strong> USB 设备类的句柄</p></li>
+</ul>
+</div>
+<div class="section" id="usbd-class-add-interface">
+<h3>usbd_class_add_interface<a class="headerlink" href="#usbd-class-add-interface" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_class_add_interface</span></code> 用来给 USB 设备类增加接口,并将接口信息挂载在类的链表上。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_class_add_interface</span><span class="p">(</span><span class="n">usbd_class_t</span> <span class="o">*</span><span class="n">devclass</span><span class="p">,</span> <span class="n">usbd_interface_t</span> <span class="o">*</span><span class="n">intf</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>devclass</strong> USB 设备类的句柄</p></li>
+<li><p><strong>intf</strong> USB 设备接口的句柄</p></li>
+</ul>
+</div>
+<div class="section" id="usbd-interface-add-endpoint">
+<h3><strong>usbd_interface_add_endpoint</strong><a class="headerlink" href="#usbd-interface-add-endpoint" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_interface_add_endpoint</span></code> 用来给 USB 接口增加端点,并将端点信息挂载在接口的链表上。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_interface_add_endpoint</span><span class="p">(</span><span class="n">usbd_interface_t</span> <span class="o">*</span><span class="n">intf</span><span class="p">,</span> <span class="n">usbd_endpoint_t</span> <span class="o">*</span><span class="n">ep</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>intf</strong> USB 设备接口的句柄</p></li>
+<li><p><strong>ep</strong> USB 设备端点的句柄</p></li>
+</ul>
+</div>
+<div class="section" id="usb-device-is-configured">
+<h3><strong>usb_device_is_configured</strong><a class="headerlink" href="#usb-device-is-configured" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usb_device_is_configured</span></code> 用来检查 USB 设备是否被配置(枚举)。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">bool</span> <span class="nf">usb_device_is_configured</span><span class="p">(</span><span class="kt">void</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>return</strong> 配置状态, 0 表示未配置, 1 表示配置成功</p></li>
+</ul>
+</div>
+</div>
+<div class="section" id="cdc-acm">
+<h2>CDC ACM<a class="headerlink" href="#cdc-acm" title="永久链接至标题">¶</a></h2>
+<div class="section" id="usbd-cdc-add-acm-interface">
+<h3>usbd_cdc_add_acm_interface<a class="headerlink" href="#usbd-cdc-add-acm-interface" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_cdc_add_acm_interface</span></code> 用来给 USB CDC ACM 类添加接口,并实现该接口相关的函数:</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">cdc_acm_class_request_handler</span></code> 用来处理 USB CDC ACM 类 Setup 请求。</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">cdc_notify_handler</span></code> 用来处理 USB CDC 其他中断回调函数。</p></li>
+</ul>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_cdc_add_acm_interface</span><span class="p">(</span><span class="n">usbd_class_t</span> <span class="o">*</span><span class="n">devclass</span><span class="p">,</span> <span class="n">usbd_interface_t</span> <span class="o">*</span><span class="n">intf</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>devclass</strong> 类的句柄</p></li>
+<li><p><strong>intf</strong> 接口句柄</p></li>
+</ul>
+</div>
+<div class="section" id="usbd-cdc-acm-set-line-coding">
+<h3>usbd_cdc_acm_set_line_coding<a class="headerlink" href="#usbd-cdc-acm-set-line-coding" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_cdc_acm_set_line_coding</span></code> 用来对串口进行配置,如果仅使用 USB 而不用 串口,该接口不用用户实现,使用默认。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_cdc_acm_set_line_coding</span><span class="p">(</span><span class="kt">uint32_t</span> <span class="n">baudrate</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">databits</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">parity</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">stopbits</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>baudrate</strong> 波特率</p></li>
+<li><p><strong>databits</strong> 数据位</p></li>
+<li><p><strong>parity</strong> 校验位</p></li>
+<li><p><strong>stopbits</strong> 停止位</p></li>
+</ul>
+</div>
+<div class="section" id="usbd-cdc-acm-set-dtr">
+<h3>usbd_cdc_acm_set_dtr<a class="headerlink" href="#usbd-cdc-acm-set-dtr" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_cdc_acm_set_dtr</span></code> 用来控制串口 DTR 。如果仅使用 USB 而不用 串口,该接口不用用户实现,使用默认。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_cdc_acm_set_dtr</span><span class="p">(</span><span class="kt">bool</span> <span class="n">dtr</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>dtr</strong> dtr 为1表示拉低电平,为0表示拉高电平</p></li>
+</ul>
+</div>
+<div class="section" id="usbd-cdc-acm-set-rts">
+<h3>usbd_cdc_acm_set_rts<a class="headerlink" href="#usbd-cdc-acm-set-rts" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_cdc_acm_set_rts</span></code> 用来控制串口 RTS 。如果仅使用 USB 而不用 串口,该接口不用用户实现,使用默认。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_cdc_acm_set_rts</span><span class="p">(</span><span class="kt">bool</span> <span class="n">rts</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>rts</strong> rts 为1表示拉低电平,为0表示拉高电平</p></li>
+</ul>
</div>
-<div class="section" id="cdc">
-<h2>设备 CDC<a class="headerlink" href="#cdc" title="永久链接至标题">¶</a></h2>
</div>
<div class="section" id="hid">
-<h2>设备 HID<a class="headerlink" href="#hid" title="永久链接至标题">¶</a></h2>
+<h2>HID<a class="headerlink" href="#hid" title="永久链接至标题">¶</a></h2>
+<div class="section" id="usbd-hid-add-interface">
+<h3>usbd_hid_add_interface<a class="headerlink" href="#usbd-hid-add-interface" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_hid_add_interface</span></code> 用来给 USB HID 类添加接口,并实现该接口相关的函数:</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">hid_class_request_handler</span></code> 用来处理 USB HID 类的 Setup 请求。</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">hid_custom_request_handler</span></code> 用来处理 USB HID 获取报告描述符请求。</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">hid_notify_handler</span></code> 用来处理 USB HID 其他中断回调函数。</p></li>
+</ul>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_hid_add_interface</span><span class="p">(</span><span class="n">usbd_class_t</span> <span class="o">*</span><span class="n">devclass</span><span class="p">,</span> <span class="n">usbd_interface_t</span> <span class="o">*</span><span class="n">intf</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>devclass</strong> 类的句柄</p></li>
+<li><p><strong>intf</strong> 接口句柄</p></li>
+</ul>
+</div>
+<div class="section" id="usbd-hid-report-descriptor-register">
+<h3>usbd_hid_report_descriptor_register<a class="headerlink" href="#usbd-hid-report-descriptor-register" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_hid_report_descriptor_register</span></code> 用来注册 hid 报告描述符。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_hid_report_descriptor_register</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="n">intf_num</span><span class="p">,</span> <span class="k">const</span> <span class="kt">uint8_t</span> <span class="o">*</span><span class="n">desc</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">desc_len</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>intf_num</strong> 当前 hid 报告描述符所在接口偏移</p></li>
+<li><p><strong>desc</strong> 报告描述符</p></li>
+<li><p><strong>desc_len</strong> 报告描述符长度</p></li>
+</ul>
+</div>
+<div class="section" id="usbd-hid-set-request-callback">
+<h3>usbd_hid_set_request_callback<a class="headerlink" href="#usbd-hid-set-request-callback" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_hid_set_request_callback</span></code> 用来注册 hid 类请求命令的回调函数。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_hid_set_request_callback</span><span class="p">(</span> <span class="kt">uint8_t</span> <span class="n">intf_num</span><span class="p">,</span>
+ <span class="kt">uint8_t</span> <span class="p">(</span><span class="o">*</span><span class="n">get_report_callback</span><span class="p">)(</span><span class="kt">uint8_t</span> <span class="n">report_id</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">report_type</span><span class="p">),</span>
+ <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">set_report_callback</span><span class="p">)(</span><span class="kt">uint8_t</span> <span class="n">report_id</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">report_type</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="o">*</span><span class="n">report</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">report_len</span><span class="p">),</span>
+ <span class="kt">uint8_t</span> <span class="p">(</span><span class="o">*</span><span class="n">get_idle_callback</span><span class="p">)(</span><span class="kt">uint8_t</span> <span class="n">report_id</span><span class="p">),</span>
+ <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">set_idle_callback</span><span class="p">)(</span><span class="kt">uint8_t</span> <span class="n">report_id</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">duration</span><span class="p">),</span>
+ <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">set_protocol_callback</span><span class="p">)(</span><span class="kt">uint8_t</span> <span class="n">protocol</span><span class="p">),</span>
+ <span class="kt">uint8_t</span> <span class="p">(</span><span class="o">*</span><span class="n">get_protocol_callback</span><span class="p">)(</span><span class="kt">void</span><span class="p">));</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>intf_num</strong> 当前 hid 报告描述符所在接口偏移</p></li>
+<li><p><strong>get_report_callback</strong> get report命令处理回调函数</p></li>
+<li><p><strong>set_report_callback</strong> set report命令处理回调函数</p></li>
+<li><p><strong>get_idle_callback</strong> get idle命令处理回调函数</p></li>
+<li><p><strong>set_idle_callback</strong> set idle命令处理回调函数</p></li>
+<li><p><strong>set_protocol_callback</strong> set protocol命令处理回调函数</p></li>
+<li><p><strong>get_protocol_callback</strong> get protocol命令处理回调函数</p></li>
+</ul>
+</div>
</div>
<div class="section" id="msc">
-<h2>设备 MSC<a class="headerlink" href="#msc" title="永久链接至标题">¶</a></h2>
+<h2>MSC<a class="headerlink" href="#msc" title="永久链接至标题">¶</a></h2>
+<div class="section" id="usbd-msc-class-init">
+<h3>usbd_msc_class_init<a class="headerlink" href="#usbd-msc-class-init" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_msc_class_init</span></code> 用来给 MSC 类添加接口,并实现该接口相关函数,并且注册端点回调函数。(因为 msc bot 协议是固定的,所以不需要用于实现,因此端点回调函数自然不需要用户实现)。</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">msc_storage_class_request_handler</span></code> 用于处理 USB MSC Setup 中断请求。</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">msc_storage_notify_handler</span></code> 用于实现 USB MSC 其他中断回调函数。</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">mass_storage_bulk_out</span></code> 用于处理 USB MSC 端点 out 中断。</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">mass_storage_bulk_in</span></code> 用于处理 USB MSC 端点 in 中断。</p></li>
+</ul>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_msc_class_init</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="n">out_ep</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">in_ep</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>out_ep</strong> out 端点地址</p></li>
+<li><p><strong>in_ep</strong> in 端点地址</p></li>
+</ul>
+</div>
+<div class="section" id="usbd-msc-get-cap">
+<h3>usbd_msc_get_cap<a class="headerlink" href="#usbd-msc-get-cap" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_msc_get_cap</span></code> 用来获取存储器的 lun、扇区个数和每个扇区大小。用户必须实现该函数。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_msc_get_cap</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="n">lun</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="o">*</span><span class="n">block_num</span><span class="p">,</span> <span class="kt">uint16_t</span> <span class="o">*</span><span class="n">block_size</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>lun</strong> 存储逻辑单元,暂时无用,默认支持一个</p></li>
+<li><p><strong>block_num</strong> 存储扇区个数</p></li>
+<li><p><strong>block_size</strong> 存储扇区大小</p></li>
+</ul>
+</div>
+<div class="section" id="usbd-msc-sector-read">
+<h3>usbd_msc_sector_read<a class="headerlink" href="#usbd-msc-sector-read" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_msc_sector_read</span></code> 用来对存储器某个扇区开始的地址进行数据读取。用户必须实现该函数。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span> <span class="nf">usbd_msc_sector_read</span><span class="p">(</span><span class="kt">uint32_t</span> <span class="n">sector</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="o">*</span><span class="n">buffer</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">length</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>sector</strong> 扇区偏移</p></li>
+<li><p><strong>buffer</strong> 存储读取的数据的指针</p></li>
+<li><p><strong>length</strong> 读取长度</p></li>
+</ul>
+</div>
+<div class="section" id="usbd-msc-sector-write">
+<h3>usbd_msc_sector_write<a class="headerlink" href="#usbd-msc-sector-write" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_msc_sector_write</span></code> 用来对存储器某个扇区开始写入数据。用户必须实现该函数。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span> <span class="nf">usbd_msc_sector_write</span><span class="p">(</span><span class="kt">uint32_t</span> <span class="n">sector</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="o">*</span><span class="n">buffer</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">length</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>sector</strong> 扇区偏移</p></li>
+<li><p><strong>buffer</strong> 写入数据指针</p></li>
+<li><p><strong>length</strong> 写入长度</p></li>
+</ul>
+</div>
+</div>
+<div class="section" id="uac">
+<h2>UAC<a class="headerlink" href="#uac" title="永久链接至标题">¶</a></h2>
+<div class="section" id="usbd-audio-add-interface">
+<h3>usbd_audio_add_interface<a class="headerlink" href="#usbd-audio-add-interface" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_audio_add_interface</span></code> 用来给 USB Audio 类添加接口,并实现该接口相关的函数:</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">audio_class_request_handler</span></code> 用于处理 USB Audio Setup 中断请求。</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">audio_notify_handler</span></code> 用于实现 USB Audio 其他中断回调函数。</p></li>
+</ul>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_audio_add_interface</span><span class="p">(</span><span class="n">usbd_class_t</span> <span class="o">*</span><span class="n">devclass</span><span class="p">,</span> <span class="n">usbd_interface_t</span> <span class="o">*</span><span class="n">intf</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>class</strong> 类的句柄</p></li>
+<li><p><strong>intf</strong> 接口句柄</p></li>
+</ul>
+</div>
+<div class="section" id="usbd-audio-set-mute">
+<h3>usbd_audio_set_mute<a class="headerlink" href="#usbd-audio-set-mute" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_audio_set_mute</span></code> 用来设置静音。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_audio_set_mute</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="n">mute</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>mute</strong> 为1 表示静音,0相反</p></li>
+</ul>
+</div>
+<div class="section" id="usbd-audio-set-volume">
+<h3>usbd_audio_set_volume<a class="headerlink" href="#usbd-audio-set-volume" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_audio_set_volume</span></code> 用来设置音量。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_audio_set_volume</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="n">vol</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>vol</strong> 音量,从 0-100</p></li>
+</ul>
+</div>
+<div class="section" id="usbd-audio-set-interface-callback">
+<h3>usbd_audio_set_interface_callback<a class="headerlink" href="#usbd-audio-set-interface-callback" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_audio_set_interface_callback</span></code> 用来开关音频数据传输。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_audio_set_interface_callback</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="n">value</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>value</strong> 为1 表示开启 stream 传输,为0 相反</p></li>
+</ul>
+</div>
+</div>
+<div class="section" id="uvc">
+<h2>UVC<a class="headerlink" href="#uvc" title="永久链接至标题">¶</a></h2>
+<div class="section" id="usbd-video-add-interface">
+<h3>usbd_video_add_interface<a class="headerlink" href="#usbd-video-add-interface" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_video_add_interface</span></code> 用来给 USB Video 类添加接口,并实现该接口相关的函数:</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">video_class_request_handler</span></code> 用于处理 USB Video Setup 中断请求。</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">video_notify_handler</span></code> 用于实现 USB Video 其他中断回调函数。</p></li>
+</ul>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_video_add_interface</span><span class="p">(</span><span class="n">usbd_class_t</span> <span class="o">*</span><span class="n">devclass</span><span class="p">,</span> <span class="n">usbd_interface_t</span> <span class="o">*</span><span class="n">intf</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>class</strong> 类的句柄</p></li>
+<li><p><strong>intf</strong> 接口句柄</p></li>
+</ul>
+</div>
+<div class="section" id="usbd-video-probe-and-commit-controls-init">
+<h3>usbd_video_probe_and_commit_controls_init<a class="headerlink" href="#usbd-video-probe-and-commit-controls-init" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_video_probe_and_commit_controls_init</span></code> 用来开关视频数据传输。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_video_probe_and_commit_controls_init</span><span class="p">(</span><span class="kt">uint32_t</span> <span class="n">dwFrameInterval</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">dwMaxVideoFrameSize</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">dwMaxPayloadTransferSize</span><span class="p">);</span>
+</pre></div>
</div>
-<div class="section" id="audio">
-<h2>设备 AUDIO<a class="headerlink" href="#audio" title="永久链接至标题">¶</a></h2>
+<ul class="simple">
+<li><p><strong>value</strong> 为1 表示开启 stream 传输,为0 相反</p></li>
+</ul>
+</div>
+<div class="section" id="usbd-video-mjpeg-payload-fill">
+<h3>usbd_video_mjpeg_payload_fill<a class="headerlink" href="#usbd-video-mjpeg-payload-fill" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_video_mjpeg_payload_fill</span></code> 用来填充 mjpeg 到新的 buffer中,其中会对 mjpeg 数据按帧进行切分,切分大小由 <code class="docutils literal notranslate"><span class="pre">dwMaxPayloadTransferSize</span></code> 控制,并添加头部信息,当前头部字节数为 2。头部信息见 <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">video_mjpeg_payload_header</span></code></p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">uint32_t</span> <span class="nf">usbd_video_mjpeg_payload_fill</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="o">*</span><span class="n">input</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">input_len</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="o">*</span><span class="n">output</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="o">*</span><span class="n">out_len</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>input</strong> mjpeg 格式的数据包,从 FFD8~FFD9结束</p></li>
+<li><p><strong>input_len</strong> mjpeg数据包大小</p></li>
+<li><p><strong>output</strong> 输出缓冲区</p></li>
+<li><p><strong>out_len</strong> 输出实际要发送的长度大小</p></li>
+<li><p><strong>return</strong> 返回 usb 按照 <code class="docutils literal notranslate"><span class="pre">dwMaxPayloadTransferSize</span></code> 大小要发多少帧</p></li>
+</ul>
+</div>
+<div class="section" id="usbd-video-mjpeg-payload-header-toggle">
+<h3>usbd_video_mjpeg_payload_header_toggle<a class="headerlink" href="#usbd-video-mjpeg-payload-header-toggle" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_video_mjpeg_payload_header_toggle</span></code> 用来对每一帧图像数据要发送时进行翻转,并保持到一帧图像数据发送完成。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_video_mjpeg_payload_header_toggle</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="o">*</span><span class="n">output</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">packets</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>output</strong> 要翻转的 usb 缓冲区,该缓冲区是 <code class="docutils literal notranslate"><span class="pre">usbd_video_mjpeg_payload_fill</span></code> 中的 <code class="docutils literal notranslate"><span class="pre">output</span></code></p></li>
+<li><p><strong>packets</strong> USB 发送的帧个数</p></li>
+</ul>
</div>
-<div class="section" id="video">
-<h2>设备 VIDEO<a class="headerlink" href="#video" title="永久链接至标题">¶</a></h2>
</div>
<div class="section" id="dfu">
-<h2>设备 DFU<a class="headerlink" href="#dfu" title="永久链接至标题">¶</a></h2>
+<h2>DFU<a class="headerlink" href="#dfu" title="永久链接至标题">¶</a></h2>
</div>
<div class="section" id="porting">
-<h2>设备 PORTING<a class="headerlink" href="#porting" title="永久链接至标题">¶</a></h2>
+<h2>PORTING<a class="headerlink" href="#porting" title="永久链接至标题">¶</a></h2>
</div>
</div>
diff --git a/docs/_build/html/api/api_host.html b/docs/_build/html/api/api_host.html
index fd989b32..905a7065 100644
--- a/docs/_build/html/api/api_host.html
+++ b/docs/_build/html/api/api_host.html
@@ -106,14 +106,25 @@
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="api_device.html">设备协议栈</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">主机协议栈</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="#core">主机 CORE</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#cdc">主机 CDC</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#hid">主机 HID</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#msc">主机 MSC</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#audio">主机 AUDIO</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#video">主机 VIDEO</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#dfu">主机 DFU</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#porting">主机 PORTING</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#core">CORE</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#class">CLASS 驱动信息结构体</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#id2">端点结构体</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#id3">接口结构体</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#id4">配置结构体</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#hubport">hubport 结构体</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#hub">hub 结构体</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbh-event-notify-handler">usbh_event_notify_handler</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbh-initialize">usbh_initialize</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbh-find-class-instance">usbh_find_class_instance</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#lsusb">lsusb</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="#cdc-acm">CDC ACM</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#hid">HID</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#msc">MSC</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#uac">UAC</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#uvc">UVC</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#porting">PORTING</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="api_common.html">其他</a></li>
@@ -209,28 +220,148 @@
<div class="section" id="id1">
<h1>主机协议栈<a class="headerlink" href="#id1" title="永久链接至标题">¶</a></h1>
<div class="section" id="core">
-<h2>主机 CORE<a class="headerlink" href="#core" title="永久链接至标题">¶</a></h2>
+<h2>CORE<a class="headerlink" href="#core" title="永久链接至标题">¶</a></h2>
+<div class="section" id="class">
+<h3>CLASS 驱动信息结构体<a class="headerlink" href="#class" title="永久链接至标题">¶</a></h3>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="k">struct</span> <span class="nc">usbh_class_info</span> <span class="p">{</span>
+ <span class="kt">uint8_t</span> <span class="n">class</span><span class="p">;</span> <span class="cm">/* Base device class code */</span>
+ <span class="kt">uint8_t</span> <span class="n">subclass</span><span class="p">;</span> <span class="cm">/* Sub-class, depends on base class. Eg. */</span>
+ <span class="kt">uint8_t</span> <span class="n">protocol</span><span class="p">;</span> <span class="cm">/* Protocol, depends on base class. Eg. */</span>
+ <span class="kt">uint16_t</span> <span class="n">vid</span><span class="p">;</span> <span class="cm">/* Vendor ID (for vendor/product specific devices) */</span>
+ <span class="kt">uint16_t</span> <span class="n">pid</span><span class="p">;</span> <span class="cm">/* Product ID (for vendor/product specific devices) */</span>
+ <span class="k">const</span> <span class="k">struct</span> <span class="nc">usbh_class_driver</span> <span class="o">*</span><span class="n">class_driver</span><span class="p">;</span>
+<span class="p">};</span>
+</pre></div>
+</div>
+</div>
+<div class="section" id="id2">
+<h3>端点结构体<a class="headerlink" href="#id2" title="永久链接至标题">¶</a></h3>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="k">typedef</span> <span class="k">struct</span> <span class="nc">usbh_endpoint</span> <span class="p">{</span>
+ <span class="k">struct</span> <span class="nc">usb_endpoint_descriptor</span> <span class="n">ep_desc</span><span class="p">;</span>
+<span class="p">}</span> <span class="n">usbh_endpoint_t</span><span class="p">;</span>
+</pre></div>
+</div>
+</div>
+<div class="section" id="id3">
+<h3>接口结构体<a class="headerlink" href="#id3" title="永久链接至标题">¶</a></h3>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="k">typedef</span> <span class="k">struct</span> <span class="nc">usbh_interface</span> <span class="p">{</span>
+ <span class="k">struct</span> <span class="nc">usb_interface_descriptor</span> <span class="n">intf_desc</span><span class="p">;</span>
+ <span class="k">struct</span> <span class="nc">usbh_endpoint</span> <span class="n">ep</span><span class="p">[</span><span class="n">CONFIG_USBHOST_EP_NUM</span><span class="p">];</span>
+ <span class="kt">char</span> <span class="n">devname</span><span class="p">[</span><span class="n">CONFIG_USBHOST_DEV_NAMELEN</span><span class="p">];</span>
+ <span class="k">struct</span> <span class="nc">usbh_class_driver</span> <span class="o">*</span><span class="n">class_driver</span><span class="p">;</span>
+ <span class="kt">void</span> <span class="o">*</span><span class="n">priv</span><span class="p">;</span>
+<span class="p">}</span> <span class="n">usbh_interface_t</span><span class="p">;</span>
+</pre></div>
+</div>
+</div>
+<div class="section" id="id4">
+<h3>配置结构体<a class="headerlink" href="#id4" title="永久链接至标题">¶</a></h3>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="k">typedef</span> <span class="k">struct</span> <span class="nc">usbh_configuration</span> <span class="p">{</span>
+ <span class="k">struct</span> <span class="nc">usb_configuration_descriptor</span> <span class="n">config_desc</span><span class="p">;</span>
+ <span class="k">struct</span> <span class="nc">usbh_interface</span> <span class="n">intf</span><span class="p">[</span><span class="n">CONFIG_USBHOST_INTF_NUM</span><span class="p">];</span>
+<span class="p">}</span> <span class="n">usbh_configuration_t</span><span class="p">;</span>
+</pre></div>
+</div>
+</div>
+<div class="section" id="hubport">
+<h3>hubport 结构体<a class="headerlink" href="#hubport" title="永久链接至标题">¶</a></h3>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="k">typedef</span> <span class="k">struct</span> <span class="nc">usbh_hubport</span> <span class="p">{</span>
+ <span class="kt">bool</span> <span class="n">connected</span><span class="p">;</span> <span class="cm">/* True: device connected; false: disconnected */</span>
+ <span class="kt">bool</span> <span class="n">port_change</span><span class="p">;</span> <span class="cm">/* True: port changed; false: port do not change */</span>
+ <span class="kt">uint8_t</span> <span class="n">port</span><span class="p">;</span> <span class="cm">/* Hub port index */</span>
+ <span class="kt">uint8_t</span> <span class="n">dev_addr</span><span class="p">;</span> <span class="cm">/* device address */</span>
+ <span class="kt">uint8_t</span> <span class="n">speed</span><span class="p">;</span> <span class="cm">/* device speed */</span>
+ <span class="n">usbh_epinfo_t</span> <span class="n">ep0</span><span class="p">;</span> <span class="cm">/* control ep info */</span>
+ <span class="k">struct</span> <span class="nc">usb_device_descriptor</span> <span class="n">device_desc</span><span class="p">;</span>
+ <span class="k">struct</span> <span class="nc">usbh_configuration</span> <span class="n">config</span><span class="p">;</span>
+<span class="cp">#if 0</span><span class="c"></span>
+<span class="c"> uint8_t* config_desc;</span>
+<span class="cp">#endif</span>
+ <span class="k">struct</span> <span class="nc">usb_setup_packet</span> <span class="o">*</span><span class="n">setup</span><span class="p">;</span>
+ <span class="k">struct</span> <span class="nc">usbh_hub</span> <span class="o">*</span><span class="n">parent</span><span class="p">;</span> <span class="cm">/*if NULL, is roothub*/</span>
+<span class="p">}</span> <span class="n">usbh_hubport_t</span><span class="p">;</span>
+</pre></div>
+</div>
+</div>
+<div class="section" id="hub">
+<h3>hub 结构体<a class="headerlink" href="#hub" title="永久链接至标题">¶</a></h3>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="k">typedef</span> <span class="k">struct</span> <span class="nc">usbh_hub</span> <span class="p">{</span>
+ <span class="n">usb_slist_t</span> <span class="n">list</span><span class="p">;</span>
+ <span class="kt">uint8_t</span> <span class="n">index</span><span class="p">;</span> <span class="cm">/* Hub index */</span>
+ <span class="kt">uint8_t</span> <span class="n">nports</span><span class="p">;</span> <span class="cm">/* Hub port number */</span>
+ <span class="kt">uint8_t</span> <span class="n">dev_addr</span><span class="p">;</span> <span class="cm">/* Hub device address */</span>
+ <span class="n">usbh_epinfo_t</span> <span class="n">intin</span><span class="p">;</span>
+ <span class="kt">uint8_t</span> <span class="o">*</span><span class="n">int_buffer</span><span class="p">;</span>
+ <span class="k">struct</span> <span class="nc">hub_port_status</span> <span class="o">*</span><span class="n">port_status</span><span class="p">;</span>
+ <span class="k">struct</span> <span class="nc">usb_hub_descriptor</span> <span class="n">hub_desc</span><span class="p">;</span>
+ <span class="k">struct</span> <span class="nc">usbh_hubport</span> <span class="n">child</span><span class="p">[</span><span class="n">CONFIG_USBHOST_EHPORTS</span><span class="p">];</span>
+ <span class="k">struct</span> <span class="nc">usbh_hubport</span> <span class="o">*</span><span class="n">parent</span><span class="p">;</span> <span class="cm">/* Parent hub port */</span>
+ <span class="k">struct</span> <span class="nc">usb_work</span> <span class="n">work</span><span class="p">;</span>
+<span class="p">}</span> <span class="n">usbh_hub_t</span><span class="p">;</span>
+</pre></div>
+</div>
</div>
-<div class="section" id="cdc">
-<h2>主机 CDC<a class="headerlink" href="#cdc" title="永久链接至标题">¶</a></h2>
+<div class="section" id="usbh-event-notify-handler">
+<h3>usbh_event_notify_handler<a class="headerlink" href="#usbh-event-notify-handler" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbh_event_notify_handler</span></code> 是 USB 中断中的核心,用于处理不同的中断标志。包括复位、端点0 IN/OUT/SETUP、其他端点 IN/OUT 、SUSPEND、RESUME、SOF 中断等等。用于需要在 porting 接口中的 USB中断中调用该接口。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbh_event_notify_handler</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="n">event</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">rhport</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>event</strong> 中断事件</p></li>
+<li><p><strong>rhport</strong> roothub 端口号</p></li>
+</ul>
+<p>其中 <code class="docutils literal notranslate"><span class="pre">event</span></code> 有如下类型:</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="k">enum</span> <span class="n">usbh_event_type</span> <span class="p">{</span>
+ <span class="n">USBH_EVENT_ATTACHED</span><span class="p">,</span>
+ <span class="n">USBH_EVENT_REMOVED</span><span class="p">,</span>
+<span class="p">};</span>
+</pre></div>
+</div>
+</div>
+<div class="section" id="usbh-initialize">
+<h3>usbh_initialize<a class="headerlink" href="#usbh-initialize" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbh_initialize</span></code> 用来初始化 usb 主机协议栈,包括:创建插拔检测用的信号量和枚举线程、高低工作队列、初始化 roothub端点0 配置,初始化 usb 主机控制器。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span> <span class="nf">usbh_initialize</span><span class="p">(</span><span class="kt">void</span><span class="p">);</span>
+</pre></div>
+</div>
+</div>
+<div class="section" id="usbh-find-class-instance">
+<h3>usbh_find_class_instance<a class="headerlink" href="#usbh-find-class-instance" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbh_find_class_instance</span></code> 根据注册的 class 名称查找对应的 class 结构体句柄。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="o">*</span><span class="nf">usbh_find_class_instance</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">devname</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>devname</strong> class 名称</p></li>
+<li><p><strong>return</strong> class 结构体句柄</p></li>
+</ul>
+</div>
+<div class="section" id="lsusb">
+<h3>lsusb<a class="headerlink" href="#lsusb" title="永久链接至标题">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">lsusb</span></code> 用来查看和操作 hub 上的设备信息。需要借助 shell 插件使用。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span> <span class="nf">lsusb</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">**</span><span class="n">argv</span><span class="p">);</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="cdc-acm">
+<h2>CDC ACM<a class="headerlink" href="#cdc-acm" title="永久链接至标题">¶</a></h2>
</div>
<div class="section" id="hid">
-<h2>主机 HID<a class="headerlink" href="#hid" title="永久链接至标题">¶</a></h2>
+<h2>HID<a class="headerlink" href="#hid" title="永久链接至标题">¶</a></h2>
</div>
<div class="section" id="msc">
-<h2>主机 MSC<a class="headerlink" href="#msc" title="永久链接至标题">¶</a></h2>
-</div>
-<div class="section" id="audio">
-<h2>主机 AUDIO<a class="headerlink" href="#audio" title="永久链接至标题">¶</a></h2>
+<h2>MSC<a class="headerlink" href="#msc" title="永久链接至标题">¶</a></h2>
</div>
-<div class="section" id="video">
-<h2>主机 VIDEO<a class="headerlink" href="#video" title="永久链接至标题">¶</a></h2>
+<div class="section" id="uac">
+<h2>UAC<a class="headerlink" href="#uac" title="永久链接至标题">¶</a></h2>
</div>
-<div class="section" id="dfu">
-<h2>主机 DFU<a class="headerlink" href="#dfu" title="永久链接至标题">¶</a></h2>
+<div class="section" id="uvc">
+<h2>UVC<a class="headerlink" href="#uvc" title="永久链接至标题">¶</a></h2>
</div>
<div class="section" id="porting">
-<h2>主机 PORTING<a class="headerlink" href="#porting" title="永久链接至标题">¶</a></h2>
+<h2>PORTING<a class="headerlink" href="#porting" title="永久链接至标题">¶</a></h2>
</div>
</div>
diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv
index d11a5453..05693add 100644
--- a/docs/_build/html/objects.inv
+++ b/docs/_build/html/objects.inv
Binary files differ
diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js
index ac990277..874684af 100644
--- a/docs/_build/html/searchindex.js
+++ b/docs/_build/html/searchindex.js
@@ -1 +1 @@
-Search.setIndex({docnames:["api/api_common","api/api_device","api/api_host","class/class_audio","class/class_cdc","class/class_hid","class/class_msc","class/class_video","class/winusb","demo/daplink","demo/mouse_keyboard","demo/msc_boot","demo/speaker_mic","demo/usb2uart","demo/video","index","porting","quick_start/bl702","quick_start/ch32v307","quick_start/rt-thread/rt-thread","quick_start/rt-thread/rt-thread_zh","quick_start/stm32f429","usb/usb_basic","usb/usb_desc","usb/usb_enum","usb/usb_request"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,sphinx:56},filenames:["api\\api_common.rst","api\\api_device.rst","api\\api_host.rst","class\\class_audio.rst","class\\class_cdc.rst","class\\class_hid.rst","class\\class_msc.rst","class\\class_video.rst","class\\winusb.rst","demo\\daplink.rst","demo\\mouse_keyboard.rst","demo\\msc_boot.rst","demo\\speaker_mic.rst","demo\\usb2uart.rst","demo\\video.rst","index.rst","porting.rst","quick_start\\bl702.rst","quick_start\\ch32v307.rst","quick_start\\rt-thread\\rt-thread.md","quick_start\\rt-thread\\rt-thread_zh.md","quick_start\\stm32f429.rst","usb\\usb_basic.rst","usb\\usb_desc.rst","usb\\usb_enum.rst","usb\\usb_request.rst"],objects:{},objnames:{},objtypes:{},terms:{"0x31":[19,20],"0x32":[19,20],"0x33":[19,20],"0x34":[19,20],"0x35":[19,20],"0x81":[19,20],"10":[19,20],"48mhz":[19,20],"500":[19,20],"class":[19,20],"for":[19,20],"function":19,"if":19,"in":19,"int":[19,20],"null":[19,20],"void":[19,20],"while":[19,20],"with":[19,20],__hal_rcc_usb_clk_en:[19,20],abov:19,acm:[19,20],also:19,and:[19,20],as:19,audio:[19,20],bl702:15,board:[19,20],bootload:15,bsp:[19,20],by:19,call:19,callback:19,can:19,cdc:[15,20],cdc_init:[19,20],ch32v307:15,cherryusb:[19,20],clock:[19,20],code:[19,20],config:[19,20],configur:[19,20],connect:[19,20],copi:19,cubemx_config:[19,20],daplink:15,data_buff:[19,20],dc:19,defin:20,demo:15,descriptor:19,devic:15,dfu:[19,20],directori:19,embed:[19,20],enabl:[19,20],endpoint:19,english:20,exampl:[19,20],extern:[19,20],file:19,firstli:19,follow:19,free:20,from:19,fs:[19,20],fsdev:20,gener:[19,20],get_pin:20,global:20,go:19,hal:[19,20],hal_nvic_enableirq:[19,20],hal_nvic_setprior:[19,20],hal_pcd_mspinit:[19,20],have:19,hc:20,hcd:20,hid:[15,19,20],host:15,how:19,hs:[19,20],hub:[19,20],implement:19,includ:20,init:[19,20],interfac:19,interrupt:[19,20],into:19,ioc:[19,20],ip:[19,20],irq:19,is:19,it:19,know:19,kprintf:19,latest:[19,20],led0:20,led0_pin:20,level:19,libc:20,like:19,list:19,ll:20,low:19,main:[19,20],malloc:20,manag:19,menuconfig:20,mode:[19,20],modifi:19,msc:[15,19,20],mx:19,name:19,need:19,note:19,now:19,nvic:[19,20],onli:20,onlin:[19,20],open:19,option:[19,20],or:19,otg:[19,20],output:20,packag:20,path:19,pcd:19,pdf:22,peripher:[19,20],ph10:20,pin:20,pin_high:20,pin_low:20,pin_mode_output:20,pleas:19,port:20,portabl:[19,20],printf:[19,20],problem:19,project:19,provid:19,refer:19,regist:19,rt:15,rt_pin_mod:20,rt_pin_writ:20,rt_thread_mdelai:[19,20],rtdevic:20,rtthread:20,same:19,see:19,select:19,seri:19,set:[19,20],should:19,so:19,some:19,specif:19,speed:[19,20],stack:[19,20],stdio:20,step:19,stm32:15,stm32cubemx:[19,20],stm32f0:[19,20],stm32f1:[19,20],stm32f3:[19,20],stm32f429:15,stm32f4:[19,20],stm32f4xx_hal:20,stm32f7:[19,20],stm32h7:20,suffix:19,synopsi:[19,20],system:[19,20],systemclock:[19,20],that:19,the:[19,20],then:19,thi:19,thread:15,tini:[19,20],to:[19,20],two:19,uac:15,uint8_t:[19,20],usb2:22,usb_dc_init:[19,20],usb_dc_low_level_init:[19,20],usb_lp_can1_rx0_irqn:[19,20],usbd_ep_writ:[19,20],usbh_cor:20,usbh_initi:20,util:19,uvc:15,v2:15,version:[19,20],video:20,we:19,winusb:15,xxx:20,you:19,your:19},titles:["\u5176\u4ed6","\u8bbe\u5907\u534f\u8bae\u6808","\u4e3b\u673a\u534f\u8bae\u6808","UAC","CDC","HID","MSC","UVC","WINUSB","DAPLINK V2.0\u8c03\u8bd5\u5668","\u952e\u76d8\u4e0e\u9f20\u6807","U\u76d8\u5236\u4f5c BootLoader","USB \u53cc\u901a\u9053\u626c\u58f0\u5668\u548c\u9ea6\u514b\u98ce","USB \u8f6c\u4e32\u53e3","USB \u6444\u50cf\u5934","CherryUSB \u4f7f\u7528\u6307\u5357","Porting \u7f16\u5199\u8bf4\u660e","\u57fa\u4e8e BL702 \u5f00\u53d1\u6307\u5357","\u57fa\u4e8e CH32V307 \u5f00\u53d1\u6307\u5357","RT-Thread based Software Package Development Guide","\u57fa\u4e8e RT-Thread \u8f6f\u4ef6\u5305\u5f00\u53d1\u6307\u5357","\u57fa\u4e8e STM32F429 \u5f00\u53d1\u6307\u5357","USB \u57fa\u672c\u6982\u5ff5","USB \u63cf\u8ff0\u7b26","USB \u679a\u4e3e","USB \u8bbe\u5907\u8bf7\u6c42"],titleterms:{"class":15,"in":22,api:15,audio:[1,2],base:19,bl702:17,bootload:11,cdc:[1,2,4,19],ch32v307:18,cherryusb:15,core:[1,2],crc:22,daplink:9,demo:[19,20],demonstr:19,develop:19,devic:[19,20],dfu:[1,2],guid:19,hid:[1,2,5],host:20,manual:19,msc:[1,2,6],on:19,out:22,packag:19,platform:19,port:[1,2,15,16],rt:[19,20],setup:22,softwar:19,stm32:[19,20],stm32f429:21,thread:[19,20],uac:3,usb:[12,13,14,15,19,20,22,23,24,25],use:19,uvc:7,v2:9,video:[1,2,19],winusb:8}}) \ No newline at end of file
+Search.setIndex({docnames:["api/api_common","api/api_device","api/api_host","class/class_audio","class/class_cdc","class/class_hid","class/class_msc","class/class_video","class/winusb","demo/daplink","demo/mouse_keyboard","demo/msc_boot","demo/speaker_mic","demo/usb2uart","demo/video","index","porting","quick_start/bl702","quick_start/ch32v307","quick_start/rt-thread/rt-thread","quick_start/rt-thread/rt-thread_zh","quick_start/stm32f429","usb/usb_basic","usb/usb_desc","usb/usb_enum","usb/usb_request"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,sphinx:56},filenames:["api\\api_common.rst","api\\api_device.rst","api\\api_host.rst","class\\class_audio.rst","class\\class_cdc.rst","class\\class_hid.rst","class\\class_msc.rst","class\\class_video.rst","class\\winusb.rst","demo\\daplink.rst","demo\\mouse_keyboard.rst","demo\\msc_boot.rst","demo\\speaker_mic.rst","demo\\usb2uart.rst","demo\\video.rst","index.rst","porting.rst","quick_start\\bl702.rst","quick_start\\ch32v307.rst","quick_start\\rt-thread\\rt-thread.md","quick_start\\rt-thread\\rt-thread_zh.md","quick_start\\stm32f429.rst","usb\\usb_basic.rst","usb\\usb_desc.rst","usb\\usb_enum.rst","usb\\usb_request.rst"],objects:{},objnames:{},objtypes:{},terms:{"0x31":[19,20],"0x32":[19,20],"0x33":[19,20],"0x34":[19,20],"0x35":[19,20],"0x81":[19,20],"10":[19,20],"100":1,"48mhz":[19,20],"500":[19,20],"char":[1,2],"class":[1,19,20],"const":[1,2],"do":2,"enum":[1,2],"for":[1,2,19,20],"function":19,"if":[2,19],"in":[1,2,19],"int":[1,2,19,20],"null":[2,19,20],"return":[1,2],"true":2,"void":[1,2,19,20],"while":[19,20],"with":[19,20],__hal_rcc_usb_clk_en:[19,20],abov:19,acm:[19,20],address:2,also:19,and:[19,20],arg:1,argc:2,argv:2,as:19,audio:[1,19,20],audio_class_request_handl:1,audio_notify_handl:1,base:2,baudrat:1,bl702:15,block_num:1,block_siz:1,board:[19,20],bool:[1,2],bootload:15,bos:1,bot:1,bsp:[19,20],buffer:1,by:[1,19],call:19,callback:19,can:19,cdc:[15,20],cdc_acm_class_request_handl:1,cdc_init:[19,20],cdc_notify_handl:1,ch32v307:15,chang:2,cherryusb:[19,20],child:2,class_driv:2,class_handl:1,clear:1,clock:[19,20],code:[2,19,20],command:1,complet:1,config:[2,19,20],config_desc:2,config_usbhost_dev_namelen:2,config_usbhost_ehport:2,config_usbhost_ep_num:2,config_usbhost_intf_num:2,configur:[1,19,20],connect:[1,2,19,20],control:[1,2],copi:19,cubemx_config:[19,20],custom:1,custom_handl:1,daplink:15,data_buff:[19,20],databit:1,dc:19,defin:20,demo:15,depend:2,desc:1,desc_len:1,descriptor:19,dev_addr:2,devclass:1,devic:[2,15],device_desc:2,devnam:2,dfu:[19,20],directori:19,disconnect:2,done:1,dtr:1,durat:1,dwframeinterv:1,dwmaxpayloadtransfers:1,dwmaxvideoframes:1,eg:2,embed:[19,20],enabl:[19,20],endif:2,endpoint:19,endpoint_halt:1,english:20,enumer:1,ep0:[1,2],ep:[1,2],ep_addr:1,ep_cb:1,ep_desc:2,ep_list:1,error:1,establish:1,event:[1,2],exampl:[19,20],except:1,extern:[19,20],fals:2,featur:1,ffd8:1,ffd9:1,file:19,firstli:19,follow:19,frame:1,free:20,from:19,fs:[19,20],fsdev:20,gener:[19,20],get:1,get_idle_callback:1,get_pin:20,get_protocol_callback:1,get_report_callback:1,global:20,go:19,hal:[19,20],hal_nvic_enableirq:[19,20],hal_nvic_setprior:[19,20],hal_pcd_mspinit:[19,20],handler:1,hardwar:1,have:19,hc:20,hcd:20,hid:[15,19,20],hid_class_request_handl:1,hid_custom_request_handl:1,hid_notify_handl:1,host:[1,15],how:19,hs:[19,20],hub:[19,20],hub_desc:2,hub_port_statu:2,id:2,idl:1,implement:19,in_ep:1,includ:20,index:2,info:2,init:[19,20],initi:1,input:1,input_len:1,int_buff:2,interfac:[1,19],interrupt:[19,20],intf:[1,2],intf_desc:2,intf_list:1,intf_num:1,intin:2,into:19,ioc:[19,20],ip:[19,20],irq:19,is:[1,2,19],it:19,know:19,kprintf:19,latest:[19,20],led0:20,led0_pin:20,length:1,level:19,libc:20,like:19,list:[1,2,19],ll:20,lost:1,low:19,lun:1,main:[19,20],malloc:20,manag:19,mass_storage_bulk_in:1,mass_storage_bulk_out:1,menuconfig:20,mjpeg:1,mode:[19,20],modifi:19,msc:[15,19,20],msc_storage_class_request_handl:1,msc_storage_notify_handl:1,mute:1,mx:19,name:[1,19],need:19,not:2,note:19,notifi:1,notify_handl:1,now:19,nport:2,number:2,nvic:[19,20],of:1,on:2,onli:20,onlin:[19,20],open:19,option:[19,20],or:19,otg:[19,20],out:[1,2],out_ep:1,out_len:1,output:[1,20],packag:20,packet:1,parent:2,pariti:1,path:19,pcd:19,pdf:22,peripher:[19,20],ph10:20,pid:2,pin:20,pin_high:20,pin_low:20,pin_mode_output:20,pleas:19,port:20,port_chang:2,port_statu:2,portabl:[19,20],printf:[19,20],priv:2,problem:19,product:2,project:19,protocol:[1,2],provid:19,receiv:1,refer:19,regist:19,report:1,report_id:1,report_len:1,report_typ:1,reset:1,resum:[1,2],rhport:2,roothub:2,rt:15,rt_pin_mod:20,rt_pin_writ:20,rt_thread_mdelai:[19,20],rtdevic:20,rts:1,rtthread:20,same:19,sector:1,see:19,select:[1,19],seri:19,set:[1,19,20],set_idle_callback:1,set_protocol_callback:1,set_report_callback:1,setup:[1,2],shell:2,should:19,so:19,sof:[1,2],some:19,specif:[1,2,19],speed:[2,19,20],stack:[19,20],start:1,statu:1,stdio:20,step:19,stm32:15,stm32cubemx:[19,20],stm32f0:[19,20],stm32f1:[19,20],stm32f3:[19,20],stm32f429:15,stm32f4:[19,20],stm32f4xx_hal:20,stm32f7:[19,20],stm32h7:20,stopbit:1,stream:1,struct:[1,2],sub:2,subclass:2,suffix:19,suspend:[1,2],synopsi:[19,20],system:[19,20],systemclock:[19,20],that:19,the:[1,19,20],then:19,thi:19,thread:15,tini:[19,20],to:[19,20],two:19,typedef:[1,2],uac:15,uint16_t:[1,2],uint32_t:1,uint8_t:[1,2,19,20],usb2:22,usb:[1,2],usb_bos_descriptor:1,usb_configuration_descriptor:2,usb_dc_init:[19,20],usb_dc_low_level_init:[19,20],usb_device_descriptor:2,usb_endpoint_descriptor:2,usb_hub_descriptor:2,usb_interface_descriptor:2,usb_lp_can1_rx0_irqn:[19,20],usb_msosv1_descriptor:1,usb_msosv2_descriptor:1,usb_setup_packet:2,usb_slist_t:[1,2],usb_work:2,usbd_class:1,usbd_class_t:1,usbd_endpoint:1,usbd_endpoint_callback:1,usbd_endpoint_t:1,usbd_ep_writ:[19,20],usbd_event_clear_halt:1,usbd_event_clear_remote_wakeup:1,usbd_event_configur:1,usbd_event_connect:1,usbd_event_disconnect:1,usbd_event_ep0_in_notifi:1,usbd_event_ep0_out_notifi:1,usbd_event_ep_in_notifi:1,usbd_event_ep_out_notifi:1,usbd_event_error:1,usbd_event_reset:1,usbd_event_resum:1,usbd_event_set_halt:1,usbd_event_set_interfac:1,usbd_event_set_remote_wakeup:1,usbd_event_setup_notifi:1,usbd_event_sof:1,usbd_event_suspend:1,usbd_event_typ:1,usbd_event_unknown:1,usbd_interfac:1,usbd_interface_t:1,usbd_notify_handl:1,usbd_request_handl:1,usbh_class_driv:2,usbh_class_info:2,usbh_configur:2,usbh_configuration_t:2,usbh_cor:20,usbh_endpoint:2,usbh_endpoint_t:2,usbh_epinfo_t:2,usbh_event_attach:2,usbh_event_remov:2,usbh_event_typ:2,usbh_hub:2,usbh_hub_t:2,usbh_hubport:2,usbh_hubport_t:2,usbh_initi:20,usbh_interfac:2,usbh_interface_t:2,util:19,uvc:15,v2:15,valu:1,vendor:[1,2],vendor_handl:1,version:[19,20],vid:2,video:[1,20],video_class_request_handl:1,video_mjpeg_payload_head:1,video_notify_handl:1,vol:1,we:19,winusb:[1,15],work:2,xxx:20,you:19,your:19},titles:["\u5176\u4ed6","\u8bbe\u5907\u534f\u8bae\u6808","\u4e3b\u673a\u534f\u8bae\u6808","UAC","CDC","HID","MSC","UVC","WINUSB","DAPLINK V2.0\u8c03\u8bd5\u5668","\u952e\u76d8\u4e0e\u9f20\u6807","U\u76d8\u5236\u4f5c BootLoader","USB \u53cc\u901a\u9053\u626c\u58f0\u5668\u548c\u9ea6\u514b\u98ce","USB \u8f6c\u4e32\u53e3","USB \u6444\u50cf\u5934","CherryUSB \u4f7f\u7528\u6307\u5357","Porting \u7f16\u5199\u8bf4\u660e","\u57fa\u4e8e BL702 \u5f00\u53d1\u6307\u5357","\u57fa\u4e8e CH32V307 \u5f00\u53d1\u6307\u5357","RT-Thread based Software Package Development Guide","\u57fa\u4e8e RT-Thread \u8f6f\u4ef6\u5305\u5f00\u53d1\u6307\u5357","\u57fa\u4e8e STM32F429 \u5f00\u53d1\u6307\u5357","USB \u57fa\u672c\u6982\u5ff5","USB \u63cf\u8ff0\u7b26","USB \u679a\u4e3e","USB \u8bbe\u5907\u8bf7\u6c42"],titleterms:{"class":[2,15],"in":22,acm:[1,2],api:15,base:19,bl702:17,bootload:11,cdc:[1,2,4,19],ch32v307:18,cherryusb:15,core:[1,2],crc:22,daplink:9,demo:[19,20],demonstr:19,develop:19,devic:[19,20],dfu:1,guid:19,hid:[1,2,5],host:20,hub:2,hubport:2,lsusb:2,manual:19,msc:[1,2,6],on:19,out:22,packag:19,platform:19,port:[1,2,15,16],rt:[19,20],setup:22,softwar:19,stm32:[19,20],stm32f429:21,thread:[19,20],uac:[1,2,3],usb:[12,13,14,15,19,20,22,23,24,25],usb_device_is_configur:1,usbd_audio_add_interfac:1,usbd_audio_set_interface_callback:1,usbd_audio_set_mut:1,usbd_audio_set_volum:1,usbd_bos_desc_regist:1,usbd_cdc_acm_set_dtr:1,usbd_cdc_acm_set_line_cod:1,usbd_cdc_acm_set_rt:1,usbd_cdc_add_acm_interfac:1,usbd_class_add_interfac:1,usbd_class_regist:1,usbd_desc_regist:1,usbd_event_notify_handl:1,usbd_hid_add_interfac:1,usbd_hid_report_descriptor_regist:1,usbd_hid_set_request_callback:1,usbd_interface_add_endpoint:1,usbd_msc_class_init:1,usbd_msc_get_cap:1,usbd_msc_sector_read:1,usbd_msc_sector_writ:1,usbd_msosv1_desc_regist:1,usbd_msosv2_desc_regist:1,usbd_video_add_interfac:1,usbd_video_mjpeg_payload_fil:1,usbd_video_mjpeg_payload_header_toggl:1,usbd_video_probe_and_commit_controls_init:1,usbh_event_notify_handl:2,usbh_find_class_inst:2,usbh_initi:2,use:19,uvc:[1,2,7],v2:9,video:19,winusb:8}}) \ No newline at end of file
diff --git a/docs/api/api_device.rst b/docs/api/api_device.rst
index 3dc13a29..71e10514 100644
--- a/docs/api/api_device.rst
+++ b/docs/api/api_device.rst
@@ -1,26 +1,497 @@
设备协议栈
=========================
-设备 CORE
+CORE
-----------------
-设备 CDC
+端点结构体
+""""""""""""""""""""""""""""""""""""
+
+端点结构体主要用于注册不同端点地址的中断完成回调函数。
+
+.. code-block:: C
+
+ typedef struct usbd_endpoint {
+ usb_slist_t list;
+ uint8_t ep_addr;
+ usbd_endpoint_callback ep_cb;
+ } usbd_endpoint_t;
+
+- **list** 端点的链表节点
+- **ep_addr** 端点地址(带方向)
+- **ep_cb** 端点中断回调函数
+
+接口结构体
+""""""""""""""""""""""""""""""""""""
+
+接口结构体主要用于注册不同类设备除了标准设备请求外的其他请求,包括类设备请求、厂商设备请求和自定义设备请求。以及协议栈中的相关通知回调函数。
+
+.. code-block:: C
+
+ typedef struct usbd_interface {
+ usb_slist_t list;
+ /** Handler for USB Class specific commands*/
+ usbd_request_handler class_handler;
+ /** Handler for USB Vendor specific commands */
+ usbd_request_handler vendor_handler;
+ /** Handler for USB custom specific commands */
+ usbd_request_handler custom_handler;
+ /** Handler for USB event notify commands */
+ usbd_notify_handler notify_handler;
+ uint8_t intf_num;
+ usb_slist_t ep_list;
+ } usbd_interface_t;
+
+- **list** 接口的链表节点
+- **class_handler** class setup 请求回调函数
+- **vendor_handler** vendor setup 请求回调函数
+- **custom_handler** custom setup 请求回调函数
+- **notify_handler** 中断标志、协议栈相关状态回调函数
+- **intf_num** 当前接口偏移
+- **ep_list** 端点的链表节点
+
+类结构体
+""""""""""""""""""""""""""""""""""""
+
+类结构体主要用于挂载接口链表。后期可能会删除,因为这个部分跟接口其实是有关系的。
+
+.. code-block:: C
+
+ typedef struct usbd_class {
+ usb_slist_t list;
+ const char *name;
+ usb_slist_t intf_list;
+ } usbd_class_t;
+
+- **list** 类的链表节点
+- **name** 类的名称
+- **intf_list** 接口的链表节点
+
+usbd_event_notify_handler
+""""""""""""""""""""""""""""""""""""
+
+``usbd_event_notify_handler`` 是 USB 中断中的核心,用于处理不同的中断标志。包括复位、端点0 IN/OUT/SETUP、其他端点 IN/OUT 、SUSPEND、RESUME、SOF 中断等等。用户需要在 porting 接口中的 USB中断中调用该接口。
+
+.. code-block:: C
+
+ void usbd_event_notify_handler(uint8_t event, void *arg);
+
+- **event** 中断事件
+- **arg** 端点号
+
+其中 ``event`` 有如下类型:
+
+.. code-block:: C
+
+ enum usbd_event_type {
+ /** USB error reported by the controller */
+ USBD_EVENT_ERROR,
+ /** USB reset */
+ USBD_EVENT_RESET,
+ /** Start of Frame received */
+ USBD_EVENT_SOF,
+ /** USB connection established, hardware enumeration is completed */
+ USBD_EVENT_CONNECTED,
+ /** USB configuration done */
+ USBD_EVENT_CONFIGURED,
+ /** USB connection suspended by the HOST */
+ USBD_EVENT_SUSPEND,
+ /** USB connection lost */
+ USBD_EVENT_DISCONNECTED,
+ /** USB connection resumed by the HOST */
+ USBD_EVENT_RESUME,
+
+ /** USB interface selected */
+ USBD_EVENT_SET_INTERFACE,
+ /** USB interface selected */
+ USBD_EVENT_SET_REMOTE_WAKEUP,
+ /** USB interface selected */
+ USBD_EVENT_CLEAR_REMOTE_WAKEUP,
+ /** Set Feature ENDPOINT_HALT received */
+ USBD_EVENT_SET_HALT,
+ /** Clear Feature ENDPOINT_HALT received */
+ USBD_EVENT_CLEAR_HALT,
+ /** setup packet received */
+ USBD_EVENT_SETUP_NOTIFY,
+ /** ep0 in packet received */
+ USBD_EVENT_EP0_IN_NOTIFY,
+ /** ep0 out packet received */
+ USBD_EVENT_EP0_OUT_NOTIFY,
+ /** ep in packet except ep0 received */
+ USBD_EVENT_EP_IN_NOTIFY,
+ /** ep out packet except ep0 received */
+ USBD_EVENT_EP_OUT_NOTIFY,
+ /** Initial USB connection status */
+ USBD_EVENT_UNKNOWN
+ };
+
+usbd_desc_register
+""""""""""""""""""""""""""""""""""""
+
+``usbd_desc_register`` 用来注册 USB 描述符,描述符种类包括:设备描述符、配置描述符(包含配置描述符、接口描述符、class 类描述符、端点描述符)、字符串描述符、设备限定描述符。
+
+.. code-block:: C
+
+ void usbd_desc_register(const uint8_t *desc);
+
+- **desc** 描述符的句柄
+
+usbd_msosv1_desc_register
+""""""""""""""""""""""""""""""""""""
+
+``usbd_msosv1_desc_register`` 用来注册一个 WINUSB 1.0 描述符。
+
+.. code-block:: C
+
+ void usbd_msosv1_desc_register(struct usb_msosv1_descriptor *desc);
+
+- **desc** 描述符句柄
+
+usbd_msosv2_desc_register
+""""""""""""""""""""""""""""""""""""
+
+``usbd_msosv2_desc_register`` 用来注册一个 WINUSB 2.0 描述符。
+
+.. code-block:: C
+
+ void usbd_msosv2_desc_register(struct usb_msosv2_descriptor *desc);
+
+- **desc** 描述符句柄
+
+usbd_bos_desc_register
+""""""""""""""""""""""""""""""""""""
+
+``usbd_bos_desc_register`` 用来注册一个 BOS 描述符, USB 2.1 版本以上必须注册。
+
+.. code-block:: C
+
+ void usbd_bos_desc_register(struct usb_bos_descriptor *desc);
+
+- **desc** 描述符句柄
+
+usbd_class_register
+""""""""""""""""""""""""""""""""""""
+
+``usbd_class_register`` 用来注册一个 class,该 class 中的接口链表成员,用于后续挂载多个接口。
+
+.. code-block:: C
+
+ void usbd_class_register(usbd_class_t *devclass);
+
+- **devclass** USB 设备类的句柄
+
+usbd_class_add_interface
+""""""""""""""""""""""""""""""""""""
+
+``usbd_class_add_interface`` 用来给 USB 设备类增加接口,并将接口信息挂载在类的链表上。
+
+.. code-block:: C
+
+ void usbd_class_add_interface(usbd_class_t *devclass, usbd_interface_t *intf);
+
+- **devclass** USB 设备类的句柄
+- **intf** USB 设备接口的句柄
+
+**usbd_interface_add_endpoint**
+""""""""""""""""""""""""""""""""""""
+
+``usbd_interface_add_endpoint`` 用来给 USB 接口增加端点,并将端点信息挂载在接口的链表上。
+
+.. code-block:: C
+
+ void usbd_interface_add_endpoint(usbd_interface_t *intf, usbd_endpoint_t *ep);
+
+
+- **intf** USB 设备接口的句柄
+- **ep** USB 设备端点的句柄
+
+**usb_device_is_configured**
+""""""""""""""""""""""""""""""""""""
+
+``usb_device_is_configured`` 用来检查 USB 设备是否被配置(枚举)。
+
+.. code-block:: C
+
+ bool usb_device_is_configured(void);
+
+- **return** 配置状态, 0 表示未配置, 1 表示配置成功
+
+CDC ACM
-----------------
-设备 HID
+usbd_cdc_add_acm_interface
+""""""""""""""""""""""""""""""""""""
+
+``usbd_cdc_add_acm_interface`` 用来给 USB CDC ACM 类添加接口,并实现该接口相关的函数:
+
+- ``cdc_acm_class_request_handler`` 用来处理 USB CDC ACM 类 Setup 请求。
+- ``cdc_notify_handler`` 用来处理 USB CDC 其他中断回调函数。
+
+.. code-block:: C
+
+ void usbd_cdc_add_acm_interface(usbd_class_t *devclass, usbd_interface_t *intf);
+
+- **devclass** 类的句柄
+- **intf** 接口句柄
+
+usbd_cdc_acm_set_line_coding
+""""""""""""""""""""""""""""""""""""
+
+``usbd_cdc_acm_set_line_coding`` 用来对串口进行配置,如果仅使用 USB 而不用 串口,该接口不用用户实现,使用默认。
+
+.. code-block:: C
+
+ void usbd_cdc_acm_set_line_coding(uint32_t baudrate, uint8_t databits, uint8_t parity, uint8_t stopbits);
+
+- **baudrate** 波特率
+- **databits** 数据位
+- **parity** 校验位
+- **stopbits** 停止位
+
+usbd_cdc_acm_set_dtr
+""""""""""""""""""""""""""""""""""""
+
+``usbd_cdc_acm_set_dtr`` 用来控制串口 DTR 。如果仅使用 USB 而不用 串口,该接口不用用户实现,使用默认。
+
+.. code-block:: C
+
+ void usbd_cdc_acm_set_dtr(bool dtr);
+
+- **dtr** dtr 为1表示拉低电平,为0表示拉高电平
+
+usbd_cdc_acm_set_rts
+""""""""""""""""""""""""""""""""""""
+
+``usbd_cdc_acm_set_rts`` 用来控制串口 RTS 。如果仅使用 USB 而不用 串口,该接口不用用户实现,使用默认。
+
+.. code-block:: C
+
+ void usbd_cdc_acm_set_rts(bool rts);
+
+- **rts** rts 为1表示拉低电平,为0表示拉高电平
+
+HID
-----------------
-设备 MSC
+usbd_hid_add_interface
+""""""""""""""""""""""""""""""""""""
+
+``usbd_hid_add_interface`` 用来给 USB HID 类添加接口,并实现该接口相关的函数:
+
+- ``hid_class_request_handler`` 用来处理 USB HID 类的 Setup 请求。
+- ``hid_custom_request_handler`` 用来处理 USB HID 获取报告描述符请求。
+- ``hid_notify_handler`` 用来处理 USB HID 其他中断回调函数。
+
+.. code-block:: C
+
+ void usbd_hid_add_interface(usbd_class_t *devclass, usbd_interface_t *intf);
+
+- **devclass** 类的句柄
+- **intf** 接口句柄
+
+usbd_hid_report_descriptor_register
+""""""""""""""""""""""""""""""""""""""""""""
+
+``usbd_hid_report_descriptor_register`` 用来注册 hid 报告描述符。
+
+.. code-block:: C
+
+ void usbd_hid_report_descriptor_register(uint8_t intf_num, const uint8_t *desc, uint32_t desc_len);
+
+- **intf_num** 当前 hid 报告描述符所在接口偏移
+- **desc** 报告描述符
+- **desc_len** 报告描述符长度
+
+usbd_hid_set_request_callback
+""""""""""""""""""""""""""""""""""""
+
+``usbd_hid_set_request_callback`` 用来注册 hid 类请求命令的回调函数。
+
+.. code-block:: C
+
+ void usbd_hid_set_request_callback( uint8_t intf_num,
+ uint8_t (*get_report_callback)(uint8_t report_id, uint8_t report_type),
+ void (*set_report_callback)(uint8_t report_id, uint8_t report_type, uint8_t *report, uint8_t report_len),
+ uint8_t (*get_idle_callback)(uint8_t report_id),
+ void (*set_idle_callback)(uint8_t report_id, uint8_t duration),
+ void (*set_protocol_callback)(uint8_t protocol),
+ uint8_t (*get_protocol_callback)(void));
+
+- **intf_num** 当前 hid 报告描述符所在接口偏移
+- **get_report_callback** get report命令处理回调函数
+- **set_report_callback** set report命令处理回调函数
+- **get_idle_callback** get idle命令处理回调函数
+- **set_idle_callback** set idle命令处理回调函数
+- **set_protocol_callback** set protocol命令处理回调函数
+- **get_protocol_callback** get protocol命令处理回调函数
+
+MSC
-----------------
-设备 AUDIO
+usbd_msc_class_init
+""""""""""""""""""""""""""""""""""""
+``usbd_msc_class_init`` 用来给 MSC 类添加接口,并实现该接口相关函数,并且注册端点回调函数。(因为 msc bot 协议是固定的,所以不需要用于实现,因此端点回调函数自然不需要用户实现)。
+
+- ``msc_storage_class_request_handler`` 用于处理 USB MSC Setup 中断请求。
+- ``msc_storage_notify_handler`` 用于实现 USB MSC 其他中断回调函数。
+
+- ``mass_storage_bulk_out`` 用于处理 USB MSC 端点 out 中断。
+- ``mass_storage_bulk_in`` 用于处理 USB MSC 端点 in 中断。
+
+.. code-block:: C
+
+ void usbd_msc_class_init(uint8_t out_ep, uint8_t in_ep);
+
+- **out_ep** out 端点地址
+- **in_ep** in 端点地址
+
+usbd_msc_get_cap
+""""""""""""""""""""""""""""""""""""
+
+``usbd_msc_get_cap`` 用来获取存储器的 lun、扇区个数和每个扇区大小。用户必须实现该函数。
+
+.. code-block:: C
+
+ void usbd_msc_get_cap(uint8_t lun, uint32_t *block_num, uint16_t *block_size);
+
+- **lun** 存储逻辑单元,暂时无用,默认支持一个
+- **block_num** 存储扇区个数
+- **block_size** 存储扇区大小
+
+usbd_msc_sector_read
+""""""""""""""""""""""""""""""""""""
+
+``usbd_msc_sector_read`` 用来对存储器某个扇区开始的地址进行数据读取。用户必须实现该函数。
+
+.. code-block:: C
+
+ int usbd_msc_sector_read(uint32_t sector, uint8_t *buffer, uint32_t length);
+
+- **sector** 扇区偏移
+- **buffer** 存储读取的数据的指针
+- **length** 读取长度
+
+
+usbd_msc_sector_write
+""""""""""""""""""""""""""""""""""""
+
+``usbd_msc_sector_write`` 用来对存储器某个扇区开始写入数据。用户必须实现该函数。
+
+.. code-block:: C
+
+ int usbd_msc_sector_write(uint32_t sector, uint8_t *buffer, uint32_t length);
+
+- **sector** 扇区偏移
+- **buffer** 写入数据指针
+- **length** 写入长度
+
+UAC
-----------------
-设备 VIDEO
+usbd_audio_add_interface
+""""""""""""""""""""""""""""""""""""
+``usbd_audio_add_interface`` 用来给 USB Audio 类添加接口,并实现该接口相关的函数:
+
+- ``audio_class_request_handler`` 用于处理 USB Audio Setup 中断请求。
+- ``audio_notify_handler`` 用于实现 USB Audio 其他中断回调函数。
+
+.. code-block:: C
+
+ void usbd_audio_add_interface(usbd_class_t *devclass, usbd_interface_t *intf);
+
+- **class** 类的句柄
+- **intf** 接口句柄
+
+usbd_audio_set_mute
+""""""""""""""""""""""""""""""""""""
+
+``usbd_audio_set_mute`` 用来设置静音。
+
+.. code-block:: C
+
+ void usbd_audio_set_mute(uint8_t mute);
+
+- **mute** 为1 表示静音,0相反
+
+usbd_audio_set_volume
+""""""""""""""""""""""""""""""""""""
+
+``usbd_audio_set_volume`` 用来设置音量。
+
+.. code-block:: C
+
+ void usbd_audio_set_volume(uint8_t vol);
+
+- **vol** 音量,从 0-100
+
+usbd_audio_set_interface_callback
+""""""""""""""""""""""""""""""""""""
+
+``usbd_audio_set_interface_callback`` 用来开关音频数据传输。
+
+.. code-block:: C
+
+ void usbd_audio_set_interface_callback(uint8_t value);
+
+- **value** 为1 表示开启 stream 传输,为0 相反
+
+UVC
-----------------
-设备 DFU
+usbd_video_add_interface
+""""""""""""""""""""""""""""""""""""
+``usbd_video_add_interface`` 用来给 USB Video 类添加接口,并实现该接口相关的函数:
+
+- ``video_class_request_handler`` 用于处理 USB Video Setup 中断请求。
+- ``video_notify_handler`` 用于实现 USB Video 其他中断回调函数。
+
+.. code-block:: C
+
+ void usbd_video_add_interface(usbd_class_t *devclass, usbd_interface_t *intf);
+
+- **class** 类的句柄
+- **intf** 接口句柄
+
+usbd_video_probe_and_commit_controls_init
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+``usbd_video_probe_and_commit_controls_init`` 用来开关视频数据传输。
+
+.. code-block:: C
+
+ void usbd_video_probe_and_commit_controls_init(uint32_t dwFrameInterval, uint32_t dwMaxVideoFrameSize, uint32_t dwMaxPayloadTransferSize);
+
+- **value** 为1 表示开启 stream 传输,为0 相反
+
+usbd_video_mjpeg_payload_fill
+""""""""""""""""""""""""""""""""""""
+
+``usbd_video_mjpeg_payload_fill`` 用来填充 mjpeg 到新的 buffer中,其中会对 mjpeg 数据按帧进行切分,切分大小由 ``dwMaxPayloadTransferSize`` 控制,并添加头部信息,当前头部字节数为 2。头部信息见 ``struct video_mjpeg_payload_header``
+
+.. code-block:: C
+
+ uint32_t usbd_video_mjpeg_payload_fill(uint8_t *input, uint32_t input_len, uint8_t *output, uint32_t *out_len);
+
+- **input** mjpeg 格式的数据包,从 FFD8~FFD9结束
+- **input_len** mjpeg数据包大小
+- **output** 输出缓冲区
+- **out_len** 输出实际要发送的长度大小
+- **return** 返回 usb 按照 ``dwMaxPayloadTransferSize`` 大小要发多少帧
+
+usbd_video_mjpeg_payload_header_toggle
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+``usbd_video_mjpeg_payload_header_toggle`` 用来对每一帧图像数据要发送时进行翻转,并保持到一帧图像数据发送完成。
+
+.. code-block:: C
+
+ void usbd_video_mjpeg_payload_header_toggle(uint8_t *output, uint32_t packets);
+
+- **output** 要翻转的 usb 缓冲区,该缓冲区是 ``usbd_video_mjpeg_payload_fill`` 中的 ``output``
+- **packets** USB 发送的帧个数
+
+DFU
-----------------
-设备 PORTING
+PORTING
----------------- \ No newline at end of file
diff --git a/docs/api/api_host.rst b/docs/api/api_host.rst
index 428ffe08..fdee2c18 100644
--- a/docs/api/api_host.rst
+++ b/docs/api/api_host.rst
@@ -1,26 +1,161 @@
主机协议栈
=========================
-主机 CORE
+CORE
-----------------
-主机 CDC
------------------
+CLASS 驱动信息结构体
+""""""""""""""""""""""""""""""""""""
+
+.. code-block:: C
+
+ struct usbh_class_info {
+ uint8_t class; /* Base device class code */
+ uint8_t subclass; /* Sub-class, depends on base class. Eg. */
+ uint8_t protocol; /* Protocol, depends on base class. Eg. */
+ uint16_t vid; /* Vendor ID (for vendor/product specific devices) */
+ uint16_t pid; /* Product ID (for vendor/product specific devices) */
+ const struct usbh_class_driver *class_driver;
+ };
+
+端点结构体
+""""""""""""""""""""""""""""""""""""
+
+.. code-block:: C
+
+ typedef struct usbh_endpoint {
+ struct usb_endpoint_descriptor ep_desc;
+ } usbh_endpoint_t;
+
+接口结构体
+""""""""""""""""""""""""""""""""""""
+
+.. code-block:: C
+
+ typedef struct usbh_interface {
+ struct usb_interface_descriptor intf_desc;
+ struct usbh_endpoint ep[CONFIG_USBHOST_EP_NUM];
+ char devname[CONFIG_USBHOST_DEV_NAMELEN];
+ struct usbh_class_driver *class_driver;
+ void *priv;
+ } usbh_interface_t;
+
+
+配置结构体
+""""""""""""""""""""""""""""""""""""
+
+.. code-block:: C
+
+ typedef struct usbh_configuration {
+ struct usb_configuration_descriptor config_desc;
+ struct usbh_interface intf[CONFIG_USBHOST_INTF_NUM];
+ } usbh_configuration_t;
+
+hubport 结构体
+""""""""""""""""""""""""""""""""""""
+
+.. code-block:: C
+
+ typedef struct usbh_hubport {
+ bool connected; /* True: device connected; false: disconnected */
+ bool port_change; /* True: port changed; false: port do not change */
+ uint8_t port; /* Hub port index */
+ uint8_t dev_addr; /* device address */
+ uint8_t speed; /* device speed */
+ usbh_epinfo_t ep0; /* control ep info */
+ struct usb_device_descriptor device_desc;
+ struct usbh_configuration config;
+ #if 0
+ uint8_t* config_desc;
+ #endif
+ struct usb_setup_packet *setup;
+ struct usbh_hub *parent; /*if NULL, is roothub*/
+ } usbh_hubport_t;
+
+hub 结构体
+""""""""""""""""""""""""""""""""""""
+
+.. code-block:: C
+
+ typedef struct usbh_hub {
+ usb_slist_t list;
+ uint8_t index; /* Hub index */
+ uint8_t nports; /* Hub port number */
+ uint8_t dev_addr; /* Hub device address */
+ usbh_epinfo_t intin;
+ uint8_t *int_buffer;
+ struct hub_port_status *port_status;
+ struct usb_hub_descriptor hub_desc;
+ struct usbh_hubport child[CONFIG_USBHOST_EHPORTS];
+ struct usbh_hubport *parent; /* Parent hub port */
+ struct usb_work work;
+ } usbh_hub_t;
+
+usbh_event_notify_handler
+""""""""""""""""""""""""""""""""""""
+
+``usbh_event_notify_handler`` 是 USB 中断中的核心,用于处理不同的中断标志。包括复位、端点0 IN/OUT/SETUP、其他端点 IN/OUT 、SUSPEND、RESUME、SOF 中断等等。用于需要在 porting 接口中的 USB中断中调用该接口。
+
+.. code-block:: C
+
+ void usbh_event_notify_handler(uint8_t event, uint8_t rhport);
+
+- **event** 中断事件
+- **rhport** roothub 端口号
+
+其中 ``event`` 有如下类型:
+
+.. code-block:: C
+
+ enum usbh_event_type {
+ USBH_EVENT_ATTACHED,
+ USBH_EVENT_REMOVED,
+ };
+
+usbh_initialize
+""""""""""""""""""""""""""""""""""""
+
+``usbh_initialize`` 用来初始化 usb 主机协议栈,包括:创建插拔检测用的信号量和枚举线程、高低工作队列、初始化 roothub端点0 配置,初始化 usb 主机控制器。
+
+.. code-block:: C
+
+ int usbh_initialize(void);
+
+usbh_find_class_instance
+""""""""""""""""""""""""""""""""""""
+
+``usbh_find_class_instance`` 根据注册的 class 名称查找对应的 class 结构体句柄。
+
+.. code-block:: C
+
+ void *usbh_find_class_instance(const char *devname);
+
+- **devname** class 名称
+- **return** class 结构体句柄
+
+lsusb
+""""""""""""""""""""""""""""""""""""
+
+``lsusb`` 用来查看和操作 hub 上的设备信息。需要借助 shell 插件使用。
+
+.. code-block:: C
+
+ int lsusb(int argc, char **argv);
-主机 HID
+CDC ACM
-----------------
-主机 MSC
+HID
-----------------
-主机 AUDIO
+MSC
-----------------
-主机 VIDEO
+UAC
-----------------
-主机 DFU
+UVC
-----------------
-主机 PORTING
+PORTING
----------------- \ No newline at end of file