فهرست منبع

Deploying to gh-pages from @ cherry-embedded/CherryUSB@4733bde8f7475869a9bf6e1a7a52059a2ccc9ebc 🚀

sakumisu 3 هفته پیش
والد
کامیت
7d4f59660e

+ 7 - 2
_sources/api/api_config.rst.txt

@@ -19,6 +19,11 @@ CONFIG_USB_PRINTF_COLOR_ENABLE
 
 控制 log 颜色打印,默认开启
 
+CONFIG_USB_DCACHE_ENABLE
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+不使用 nocache ram 时,开启此宏以保证数据一致性。 **使用 EHCI 时,内部依旧需要使用 nocache ram**。
+
 CONFIG_USB_ALIGN_SIZE
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
@@ -126,7 +131,7 @@ rndis 与 lwip 接口的对接
 
 .. code-block:: C
 
-    #define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4
+    #define CONFIG_USBHOST_MAX_SERIAL_CLASS  4
     #define CONFIG_USBHOST_MAX_HID_CLASS     4
     #define CONFIG_USBHOST_MAX_MSC_CLASS     2
     #define CONFIG_USBHOST_MAX_AUDIO_CLASS   1
@@ -150,7 +155,7 @@ CONFIG_USBHOST_REQUEST_BUFFER_LEN
 CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-控制传输发送或者接收的超时时间,默认 1s
+控制传输发送或者接收的超时时间,默认 500 ms
 
 CONFIG_USBHOST_MSC_TIMEOUT
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

+ 129 - 110
_sources/api/api_device.rst.txt

@@ -14,8 +14,6 @@
 CORE
 -----------------
 
-.. note:: 请注意,v1.1 版本开始增加 busid 形参,其余保持不变,所以 API 说明不做更新
-
 端点结构体
 """"""""""""""""""""""""""""""""""""
 
@@ -28,7 +26,6 @@ CORE
         usbd_endpoint_callback ep_cb;
     };
 
-- **list** 端点的链表节点
 - **ep_addr** 端点地址(带方向)
 - **ep_cb** 端点完成中断回调函数。
 
@@ -58,94 +55,101 @@ CORE
 - **hid_report_descriptor** hid 报告描述符
 - **hid_report_descriptor_len** hid 报告描述符长度
 - **intf_num** 当前接口偏移
-- **ep_list** 端点的链表节点
 
 usbd_desc_register
 """"""""""""""""""""""""""""""""""""
 
-``usbd_desc_register`` 用来注册 USB 描述符,描述符种类包括:设备描述符、配置描述符(包含配置描述符、接口描述符、class 类描述符、端点描述符)、字符串描述符、设备限定描述符。
+``usbd_desc_register`` 用来注册 USB 描述符,描述符种类包括:设备描述符、配置描述符(包含配置描述符、接口描述符、class 类描述符、端点描述符)、字符串描述符、设备限定描述符,其他速度描述符,
+bos描述符,winusb 描述符。
 
 .. code-block:: C
 
-    void usbd_desc_register(const uint8_t *desc);
+    // 开启 CONFIG_USBDEV_ADVANCE_DESC
+    void usbd_desc_register(uint8_t busid, const struct usb_descriptor *desc);
 
-- **desc**  描述符的句柄
+    // 关闭 CONFIG_USBDEV_ADVANCE_DESC
+    void usbd_desc_register(uint8_t busid, const uint8_t *desc);
+    void usbd_msosv1_desc_register(uint8_t busid, struct usb_msosv1_descriptor *desc);
+    void usbd_msosv2_desc_register(uint8_t busid, struct usb_msosv2_descriptor *desc);
+    void usbd_bos_desc_register(uint8_t busid, struct usb_bos_descriptor *desc);
+    void usbd_webusb_desc_register(uint8_t busid, struct usb_webusb_descriptor *desc);
 
-.. note:: 当前 API 仅支持一种速度,如果需要更高级的速度切换功能,请开启 CONFIG_USBDEV_ADVANCE_DESC,并且包含了下面所有描述符注册功能
+- **desc**  描述符的句柄
 
+.. note:: 当前默认开启 CONFIG_USBDEV_ADVANCE_DESC,如果需要使用旧版本 API 请关闭该宏
 
-usbd_msosv1_desc_register
+usbd_add_interface
 """"""""""""""""""""""""""""""""""""
 
-``usbd_msosv1_desc_register`` 用来注册一个 WINUSB 1.0 描述符
+``usbd_add_interface`` 添加一个接口驱动。 **添加顺序必须按照描述符中接口顺序**
 
 .. code-block:: C
 
-    void usbd_msosv1_desc_register(struct usb_msosv1_descriptor *desc);
+    void usbd_add_interface(uint8_t busid, struct usbd_interface *intf);
 
-- **desc**  描述符句柄
+- **busid** USB 总线 id
+- **intf**  接口驱动句柄,通常从不同 class 的 `xxx_init_intf` 函数获取
 
-usbd_msosv2_desc_register
+usbd_add_endpoint
 """"""""""""""""""""""""""""""""""""
 
-``usbd_msosv2_desc_register`` 用来注册一个 WINUSB 2.0 描述符
+``usbd_add_endpoint`` 添加一个端点中断完成回调函数
 
 .. code-block:: C
 
-    void usbd_msosv2_desc_register(struct usb_msosv2_descriptor *desc);
+    void usbd_add_endpoint(uint8_t busid, struct usbd_endpoint *ep);
 
-- **desc**  描述符句柄
+- **busid** USB 总线 id
+- **ep**    端点句柄
 
-usbd_bos_desc_register
+usbd_initialize
 """"""""""""""""""""""""""""""""""""
 
-``usbd_bos_desc_register`` 用来注册一个 BOS 描述符, USB 2.1 版本以上必须注册
+``usbd_initialize`` 用来初始化 usb device 寄存器配置、usb 时钟、中断等,需要注意,此函数必须在注册描述符 API 最后。 **如果使用 os,必须放在线程中执行**
 
 .. code-block:: C
 
-    void usbd_bos_desc_register(struct usb_bos_descriptor *desc);
-
-- **desc**  描述符句柄
+    int usbd_initialize(uint8_t busid, uintptr_t reg_base, usbd_event_handler_t event_handler);
 
-usbd_add_interface
-""""""""""""""""""""""""""""""""""""
+- **busid** USB 总线 id
+- **reg_base** USB 设备寄存器基地址
+- **event_handler** 协议栈中断或者状态回调函数,event 事件
+- **return** 返回 0 表示成功,其他值表示失败
 
-``usbd_add_interface`` 添加一个接口驱动。 **添加顺序必须按照描述符顺序**。
+event 事件包括:
 
 .. code-block:: C
 
-    void usbd_add_interface(struct usbd_interface *intf);
-
-- **intf**  接口驱动句柄,通常从不同 class 的 `xxx_init_intf` 函数获取
-
-usbd_add_endpoint
-""""""""""""""""""""""""""""""""""""
+    USBD_EVENT_ERROR,        /** USB error reported by the controller */
+    USBD_EVENT_RESET,        /** USB reset */
+    USBD_EVENT_SOF,          /** Start of Frame received */
+    USBD_EVENT_CONNECTED,    /** USB connected*/
+    USBD_EVENT_DISCONNECTED, /** USB disconnected */
+    USBD_EVENT_SUSPEND,      /** USB connection suspended by the HOST */
+    USBD_EVENT_RESUME,       /** USB connection resumed by the HOST */
 
-``usbd_add_endpoint`` 添加一个端点中断完成回调函数。
-
-.. code-block:: C
+    /* USB DEVICE STATUS */
+    USBD_EVENT_CONFIGURED,        /** USB configuration done */
+    USBD_EVENT_SET_INTERFACE,     /** USB interface selected */
+    USBD_EVENT_SET_REMOTE_WAKEUP, /** USB set remote wakeup */
+    USBD_EVENT_CLR_REMOTE_WAKEUP, /** USB clear remote wakeup */
+    USBD_EVENT_INIT,              /** USB init done when call usbd_initialize */
+    USBD_EVENT_DEINIT,            /** USB deinit done when call usbd_deinitialize */
+    USBD_EVENT_UNKNOWN
 
-    void usbd_add_endpoint(struct usbd_endpoint *ep);;
+.. note:: 大部分 IP USBD_EVENT_CONNECTED 和 USBD_EVENT_DISCONNECTED 都支持,当前仅 HPM 芯片支持
 
-- **ep**    端点句柄
-
-usbd_initialize
+usbd_deinitialize
 """"""""""""""""""""""""""""""""""""
 
-``usbd_initialize`` 用来初始化 usb device 寄存器配置、usb 时钟、中断等,需要注意,此函数必须在所有列出的 API 最后。 **如果使用 os,必须放在线程中执行**
+``usbd_deinitialize`` 用来初始化 usb device,关闭 usb 设备时钟、中断等。
 
 .. code-block:: C
 
-    int usbd_initialize(void);
-
-usbd_event_handler
-""""""""""""""""""""""""""""""""""""
-
-``usbd_event_handler`` 是协议栈中中断或者协议栈一些状态的回调函数。大部分 IP 仅支持 USBD_EVENT_RESET 和 USBD_EVENT_CONFIGURED
+    int usbd_deinitialize(uint8_t busid);
 
-.. code-block:: C
-
-    void usbd_event_handler(uint8_t event);
+- **busid** USB 总线 id
+- **return** 返回 0 表示成功,其他值表示失败
 
 CDC ACM
 -----------------
@@ -160,8 +164,9 @@ usbd_cdc_acm_init_intf
 
 .. code-block:: C
 
-    struct usbd_interface *usbd_cdc_acm_init_intf(struct usbd_interface *intf);
+    struct usbd_interface *usbd_cdc_acm_init_intf(uint8_t busid, struct usbd_interface *intf);
 
+- **busid** USB 总线 id
 - **return**  接口句柄
 
 usbd_cdc_acm_set_line_coding
@@ -171,8 +176,9 @@ usbd_cdc_acm_set_line_coding
 
 .. code-block:: C
 
-    void usbd_cdc_acm_set_line_coding(uint8_t intf, struct cdc_line_coding *line_coding);
+    void usbd_cdc_acm_set_line_coding(uint8_t busid, uint8_t intf, struct cdc_line_coding *line_coding);
 
+- **busid** USB 总线 id
 - **intf** 控制接口号
 - **line_coding** 串口配置
 
@@ -183,8 +189,9 @@ usbd_cdc_acm_get_line_coding
 
 .. code-block:: C
 
-    void usbd_cdc_acm_get_line_coding(uint8_t intf, struct cdc_line_coding *line_coding);
+    void usbd_cdc_acm_get_line_coding(uint8_t busid, uint8_t intf, struct cdc_line_coding *line_coding);
 
+- **busid** USB 总线 id
 - **intf** 控制接口号
 - **line_coding** 串口配置
 
@@ -195,8 +202,9 @@ usbd_cdc_acm_set_dtr
 
 .. code-block:: C
 
-    void usbd_cdc_acm_set_dtr(uint8_t intf, bool dtr);
+    void usbd_cdc_acm_set_dtr(uint8_t busid, uint8_t intf, bool dtr);
 
+- **busid** USB 总线 id
 - **intf** 控制接口号
 - **dtr** dtr 为1表示拉低电平,为0表示拉高电平
 
@@ -207,8 +215,9 @@ usbd_cdc_acm_set_rts
 
 .. code-block:: C
 
-    void usbd_cdc_acm_set_rts(uint8_t intf, bool rts);
+    void usbd_cdc_acm_set_rts(uint8_t busid, uint8_t intf, bool rts);
 
+- **busid** USB 总线 id
 - **intf** 控制接口号
 - **rts** rts 为1表示拉低电平,为0表示拉高电平
 
@@ -240,8 +249,9 @@ usbd_hid_init_intf
 
 .. code-block:: C
 
-    struct usbd_interface *usbd_hid_init_intf(struct usbd_interface *intf, const uint8_t *desc, uint32_t desc_len);
+    struct usbd_interface *usbd_hid_init_intf(uint8_t busid, struct usbd_interface *intf, const uint8_t *desc, uint32_t desc_len);
 
+- **busid** USB 总线 id
 - **desc** 报告描述符
 - **desc_len** 报告描述符长度
 
@@ -260,8 +270,9 @@ usbd_msc_init_intf
 
 .. code-block:: C
 
-    struct usbd_interface *usbd_msc_init_intf(struct usbd_interface *intf, const uint8_t out_ep, const uint8_t in_ep);
+    struct usbd_interface *usbd_msc_init_intf(uint8_t busid, struct usbd_interface *intf, const uint8_t out_ep, const uint8_t in_ep);
 
+- **busid** USB 总线 id
 - **out_ep**     out 端点地址
 - **in_ep**      in 端点地址
 
@@ -272,8 +283,9 @@ usbd_msc_get_cap
 
 .. code-block:: C
 
-    void usbd_msc_get_cap(uint8_t lun, uint32_t *block_num, uint16_t *block_size);
+    void usbd_msc_get_cap(uint8_t busid, uint8_t lun, uint32_t *block_num, uint16_t *block_size);
 
+- **busid** USB 总线 id
 - **lun** 存储逻辑单元,暂时无用,默认支持一个
 - **block_num**  存储扇区个数
 - **block_size**  存储扇区大小
@@ -285,8 +297,10 @@ usbd_msc_sector_read
 
 .. code-block:: C
 
-    int usbd_msc_sector_read(uint32_t sector, uint8_t *buffer, uint32_t length);
+    int usbd_msc_sector_read(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length);
 
+- **busid** USB 总线 id
+- **lun** 存储逻辑单元,暂时无用,默认支持一个
 - **sector** 扇区偏移
 - **buffer** 存储读取的数据的指针
 - **length** 读取长度
@@ -299,8 +313,10 @@ usbd_msc_sector_write
 
 .. code-block:: C
 
-    int usbd_msc_sector_write(uint32_t sector, uint8_t *buffer, uint32_t length);
+    int usbd_msc_sector_write(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length);
 
+- **busid** USB 总线 id
+- **lun** 存储逻辑单元,暂时无用,默认支持一个
 - **sector** 扇区偏移
 - **buffer** 写入数据指针
 - **length** 写入长度
@@ -318,15 +334,21 @@ usbd_audio_init_intf
 
 .. code-block:: C
 
-    struct usbd_interface *usbd_audio_init_intf(struct usbd_interface *intf);
+    struct usbd_interface *usbd_audio_init_intf(uint8_t busid, struct usbd_interface *intf,
+                                                uint16_t uac_version,
+                                                struct audio_entity_info *table,
+                                                uint8_t num);
 
-- **class** 类的句柄
+- **busid** USB 总线 id
 - **intf**  接口句柄
+- **uac_version**  音频类版本,UAC1.0 或 UAC2.0
+- **table** 音频实体信息表
+- **num** 音频实体信息表长度
 
 usbd_audio_open
 """"""""""""""""""""""""""""""""""""
 
-``usbd_audio_open``  用来开启音频数据传输。
+``usbd_audio_open``  用来开启音频数据传输。主机发送开启命令的回调函数。
 
 .. code-block:: C
 
@@ -337,7 +359,7 @@ usbd_audio_open
 usbd_audio_close
 """"""""""""""""""""""""""""""""""""
 
-``usbd_audio_close``  用来关闭音频数据传输。
+``usbd_audio_close``  用来关闭音频数据传输。主机发送关闭命令的回调函数。
 
 .. code-block:: C
 
@@ -345,18 +367,6 @@ usbd_audio_close
 
 - **intf** 关闭的接口号
 
-usbd_audio_add_entity
-""""""""""""""""""""""""""""""""""""
-
-``usbd_audio_add_entity``  用来添加 unit 相关控制,例如 feature unit、clock source。
-
-.. code-block:: C
-
-    void usbd_audio_add_entity(uint8_t entity_id, uint16_t bDescriptorSubtype);
-
-- **entity_id** 要添加的 unit id
-- **bDescriptorSubtype** entity_id 的描述符子类型
-
 usbd_audio_set_mute
 """"""""""""""""""""""""""""""""""""
 
@@ -364,10 +374,12 @@ usbd_audio_set_mute
 
 .. code-block:: C
 
-    void usbd_audio_set_mute(uint8_t ch, uint8_t enable);
+    void usbd_audio_set_mute(uint8_t busid, uint8_t ep, uint8_t ch, bool mute);
 
+- **busid** USB 总线 id
+- **ep** 要设置静音的端点
 - **ch** 要设置静音的通道
-- **enable** 为1 表示静音,0相反
+- **mute** 为1 表示静音,0相反
 
 usbd_audio_set_volume
 """"""""""""""""""""""""""""""""""""
@@ -376,10 +388,12 @@ usbd_audio_set_volume
 
 .. code-block:: C
 
-    void usbd_audio_set_volume(uint8_t ch, float dB);
+    void usbd_audio_set_volume(uint8_t busid, uint8_t ep, uint8_t ch, int volume_db);
 
+- **busid** USB 总线 id
+- **ep** 要设置音量的端点
 - **ch** 要设置音量的通道
-- **dB** 要设置音量的分贝,其中 UAC1.0范围从 -127 ~ +127dB,UAC2.0 从 0 ~ 256dB
+- **volume_db** 要设置音量的分贝,单位 -100dB ~ 0dB
 
 usbd_audio_set_sampling_freq
 """"""""""""""""""""""""""""""""""""
@@ -388,34 +402,23 @@ usbd_audio_set_sampling_freq
 
 .. code-block:: C
 
-    void usbd_audio_set_sampling_freq(uint8_t ep_ch, uint32_t sampling_freq);
+    void usbd_audio_set_sampling_freq(uint8_t busid, uint8_t ep, uint32_t sampling_freq);
 
-- **ch** 要设置采样率的端点或者通道,UAC1.0为端点,UAC2.0 为通道
-- **dB** 要设置的采样率
+- **ep** 要设置采样率的端点
+- **sampling_freq** 要设置的采样率
 
 usbd_audio_get_sampling_freq_table
 """"""""""""""""""""""""""""""""""""
 
-``usbd_audio_get_sampling_freq_table``  用来获取支持的采样率列表,如果函数没有实现,则使用默认采样率列表。
+``usbd_audio_get_sampling_freq_table``  用来获取支持的采样率列表,如果函数没有实现,则使用默认采样率列表。 UAC2 only。
 
 .. code-block:: C
 
-    void usbd_audio_get_sampling_freq_table(uint8_t **sampling_freq_table);
+    void usbd_audio_get_sampling_freq_table(uint8_t busid, uint8_t ep, uint8_t **sampling_freq_table);
 
+- **ep** 要获取采样率的端点
 - **sampling_freq_table** 采样率列表地址,格式参考默认采样率列表
 
-usbd_audio_set_pitch
-""""""""""""""""""""""""""""""""""""
-
-``usbd_audio_set_pitch``  用来设置音频音调,仅 UAC1.0 有这功能。
-
-.. code-block:: C
-
-    void usbd_audio_set_pitch(uint8_t ep, bool enable);
-
-- **ep** 要设置音调的端点
-- **enable** 开启或关闭音调
-
 UVC
 -----------------
 
@@ -428,13 +431,15 @@ usbd_video_init_intf
 
 .. code-block:: C
 
-    struct usbd_interface *usbd_video_init_intf(struct usbd_interface *intf,
-                                             uint32_t dwFrameInterval,
-                                             uint32_t dwMaxVideoFrameSize,
-                                             uint32_t dwMaxPayloadTransferSize);
-
-- **class** 类的句柄
+    struct usbd_interface *usbd_video_init_intf(uint8_t busid, struct usbd_interface *intf,
+                                                uint32_t dwFrameInterval,
+                                                uint32_t dwMaxVideoFrameSize,
+                                                uint32_t dwMaxPayloadTransferSize);
+- **busid** USB 总线 id
 - **intf**  接口句柄
+- **dwFrameInterval** 视频帧间隔,单位 100ns
+- **dwMaxVideoFrameSize** 最大视频帧大小
+- **dwMaxPayloadTransferSize** 最大负载传输大小
 
 usbd_video_open
 """"""""""""""""""""""""""""""""""""
@@ -458,25 +463,39 @@ usbd_video_close
 
 - **intf** 关闭的接口号
 
-usbd_video_payload_fill
+usbd_video_stream_start_write
+""""""""""""""""""""""""""""""""""""
+
+``usbd_video_stream_start_write``  用来启动一帧视频数据流发送。需要搭配 `usbd_video_stream_split_transfer` 使用。
+
+.. code-block:: C
+
+    int usbd_video_stream_start_write(uint8_t busid, uint8_t ep, uint8_t *ep_buf, uint8_t *stream_buf, uint32_t stream_len, bool do_copy);
+
+- **busid** USB 总线 id
+- **ep** 视频数据端点地址
+- **ep_buf** 视频数据端点传输缓冲区
+- **stream_buf** 一帧视频数据源缓冲区
+- **stream_len** 一帧视频数据源缓冲区大小
+- **do_copy** 是否需要将 stream_buf 数据复制到 ep_buf 中,当前仅当 stream_buf 在 nocache 区域并且未开启 DCACHE_ENABLE 时该参数才为 false
+
+usbd_video_stream_split_transfer
 """"""""""""""""""""""""""""""""""""
 
-``usbd_video_payload_fill``  用来填充 mjpeg 到新的 buffer中,其中会对 mjpeg 数据按帧进行切分,切分大小由 ``dwMaxPayloadTransferSize`` 控制,并添加头部信息,当前头部字节数为 2。头部信息见 ``struct video_mjpeg_payload_header``
+``usbd_video_stream_split_transfer``  用来分割视频数据流发送。需要搭配 `usbd_video_stream_start_write` 使用。
 
 .. code-block:: C
 
-    uint32_t usbd_video_payload_fill(uint8_t *input, uint32_t input_len, uint8_t *output, uint32_t *out_len);
+    int usbd_video_stream_split_transfer(uint8_t busid, uint8_t ep);
 
-- **input** mjpeg 格式的数据包,从 FFD8~FFD9结束
-- **input_len** mjpeg数据包大小
-- **output** 输出缓冲区
-- **out_len** 输出实际要发送的长度大小
-- **return** 返回 usb 按照 ``dwMaxPayloadTransferSize`` 大小要发多少帧
+- **busid** USB 总线 id
+- **ep** 视频数据端点地址
+- **return** 返回 true 表示一帧数据发送完成,false 表示数据未发送完成
 
-DFU
+RNDIS
 -----------------
 
-PRINTER
+CDC ECM
 -----------------
 
 MTP

+ 45 - 1
_sources/api/api_host.rst.txt

@@ -264,5 +264,49 @@ HID
 MSC
 -----------------
 
+usbh_msc_scsi_init
+""""""""""""""""""""""""""""""""""""
+
+``usbh_msc_scsi_init`` 初始化 msc scsi 设备。获取 MSC 状态和容量信息。
+
+.. code-block:: C
+
+    int usbh_msc_scsi_init(struct usbh_msc *msc_class);
+
+- **msc_class**  msc 结构体句柄
+- **return**  0 表示正常其他表示错误
+
+usbh_msc_scsi_write10
+""""""""""""""""""""""""""""""""""""
+
+``usbh_msc_scsi_write10`` 向 msc 设备写数据。
+
+.. code-block:: C
+
+    int usbh_msc_scsi_write10(struct usbh_msc *msc_class, uint32_t start_sector, const uint8_t *buffer, uint32_t nsectors);
+
+- **msc_class**  msc 结构体句柄
+- **start_sector**  起始扇区
+- **buffer**  数据缓冲区指针
+- **nsectors**  要写入的扇区数
+- **return**  返回 0 表示正常其他表示错误
+
+usbh_msc_scsi_read10
+""""""""""""""""""""""""""""""""""""
+
+``usbh_msc_scsi_read10`` 从 msc 设备读数据。
+
+.. code-block:: C
+
+    int usbh_msc_scsi_read10(struct usbh_msc *msc_class, uint32_t start_sector, uint8_t *buffer, uint32_t nsectors);
+
+- **msc_class**  msc 结构体句柄
+- **start_sector**  起始扇区
+- **buffer**  数据缓冲区指针
+- **nsectors**  要读取的扇区数
+- **return**  返回 0 表示正常其他表示错误
+
 NETWORK
------------------
+-----------------
+
+已对接 lwIP 协议栈或者其他网络协议栈,使用 socket API 即可。

+ 1 - 1
_sources/demo/usbd_webusb.rst.txt

@@ -15,7 +15,7 @@ usbd_webusb
 
 .. code-block:: C
 
-USB_INTERFACE_DESCRIPTOR_INIT(USBD_WEBUSB_INTF_NUM, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00)
+    USB_INTERFACE_DESCRIPTOR_INIT(USBD_WEBUSB_INTF_NUM, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00)
 
 - 其余使用 hid 描述符,不再赘述
 - 枚举完成后,电脑右下角会弹出网页信息,点击即可打开网页

+ 19 - 1
_sources/demo/usbd_winusb.rst.txt

@@ -4,6 +4,8 @@ usbd_winusb
 本节主要介绍 winusb 驱动。winusb 是 windows 为了让用户友好的访问 USB 自定义类设备提供的一套通用驱动,其实本质就是 CDC ACM。
 WINUSB 版本根据 USB 版本分为 V1/V2 版本,V2 版本需要包含 BOS 描述符,V1 版本不需要。V2 版本需要在设备描述符中设置为 USB2.1 的版本号。
 
+.. note:: 如果使用复合设备,必须使用 V2 版本的 winusb 驱动。
+
 - V1 版本注册描述符
 
 .. code-block:: C
@@ -29,4 +31,20 @@ WINUSB 版本根据 USB 版本分为 V1/V2 版本,V2 版本需要包含 BOS 
     /* Endpoint IN 1 */
     USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP, USB_ENDPOINT_TYPE_BULK, WINUSB_EP_MPS, 0x00),
 
-- 其余操作与 CDC ACM 相同,不再赘述
+- 其余操作与 CDC ACM 相同,不再赘述
+
+在 V2 版本中,WINUSB 需要提供 WCID 描述符,有两个宏,分别是 `USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_SINGLE_DESCRIPTOR_INIT` 和 `USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_INIT`,这里需要注意,
+前者用于单 WINUSB 设备(也就是接口总数只能是1),后者用于复合设备,可以使用 1 ~ 多个 WINUSB 接口的设备。因此,即使同样是 1个 WINUSB 设备,不同情况宏的配置也是不一样的,只能说,微软工程师的脑回路就是跟正常人不一样。
+
+.. code-block:: C
+
+    const uint8_t WINUSB_WCIDDescriptor[] = {
+    #if WINUSB_NUM == 1
+        USB_MSOSV2_COMP_ID_SET_HEADER_DESCRIPTOR_INIT(10 + USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_SINGLE_DESCRIPTOR_LEN),
+        USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_SINGLE_DESCRIPTOR_INIT(),
+    #else
+        USB_MSOSV2_COMP_ID_SET_HEADER_DESCRIPTOR_INIT(10 + WINUSB_NUM * USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_LEN),
+        USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_INIT(0x00),
+        USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_INIT(0x01),
+    #endif
+    };

+ 1 - 1
_sources/demo/usbh_net.rst.txt

@@ -105,4 +105,4 @@ TCPIP_THREAD_STACKSIZE 推荐大于 1K,防止栈溢出。
     #error TCPIP_THREAD_STACKSIZE must be >= 1024
     #endif
 
-- 具体移植文章可以参考 https://club.rt-thread.org/ask/article/5cf3e9e0b2d95800.html
+- 具体移植文章可以参考开发者的一些笔记 https://club.rt-thread.org/ask/article/5cf3e9e0b2d95800.html

+ 7 - 0
_sources/quick_start/q&a.rst.txt

@@ -122,3 +122,10 @@ USB host 连接 USB 网卡问题
 ----------------------------------------------------------------
 
 表现为能识别网卡并且分配到 IP 地址,但是无法 ping 通,这是因为网卡自身需要开启自动拨号,通常需要使用 AT 口设置。具体为 EC20/ML307 等模块。
+
+
+什么时候需要开启 CONFIG_USB_DCACHE_ENABLE
+-------------------------------------------------
+
+当芯片带有 cache 功能,并且没有使用 no cache ram 时需要开启此宏以保证数据一致性。 **使用 EHCI 时,内部依旧需要使用 nocache ram**。通常,对于第三方平台或者组件,没有使用 no cache ram 宏修饰,都是使用全局变量或者 malloc 等
+操作,这部分 RAM 通常是走 cache 的,因此需要开启此宏。建议第三方平台使用时,必须开启。

+ 7 - 2
api/api_config.html

@@ -71,6 +71,7 @@
 <li class="toctree-l3"><a class="reference internal" href="#config-usb-printf">CONFIG_USB_PRINTF</a></li>
 <li class="toctree-l3"><a class="reference internal" href="#config-usb-dbg-level">CONFIG_USB_DBG_LEVEL</a></li>
 <li class="toctree-l3"><a class="reference internal" href="#config-usb-printf-color-enable">CONFIG_USB_PRINTF_COLOR_ENABLE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#config-usb-dcache-enable">CONFIG_USB_DCACHE_ENABLE</a></li>
 <li class="toctree-l3"><a class="reference internal" href="#config-usb-align-size">CONFIG_USB_ALIGN_SIZE</a></li>
 <li class="toctree-l3"><a class="reference internal" href="#usb-nocache-ram-section">USB_NOCACHE_RAM_SECTION</a></li>
 </ul>
@@ -211,6 +212,10 @@
 <h3>CONFIG_USB_PRINTF_COLOR_ENABLE<a class="headerlink" href="#config-usb-printf-color-enable" title="Link to this heading"></a></h3>
 <p>控制 log 颜色打印,默认开启</p>
 </section>
+<section id="config-usb-dcache-enable">
+<h3>CONFIG_USB_DCACHE_ENABLE<a class="headerlink" href="#config-usb-dcache-enable" title="Link to this heading"></a></h3>
+<p>不使用 nocache ram 时,开启此宏以保证数据一致性。 <strong>使用 EHCI 时,内部依旧需要使用 nocache ram</strong>。</p>
+</section>
 <section id="config-usb-align-size">
 <h3>CONFIG_USB_ALIGN_SIZE<a class="headerlink" href="#config-usb-align-size" title="Link to this heading"></a></h3>
 <p>USB buffer 的对齐大小,默认是 4。IP 在 dma 模式下可能对输入的 buffer有对齐要求,一般是4,如果是其他对齐方式,请修改此值。</p>
@@ -300,7 +305,7 @@ usbd_msc_sector_read 和 usbd_msc_sector_write 就会在线程中执行。</p>
 </pre></div>
 </div>
 <p>以下参数决定了支持的 class 数目,更改此值会影响 ram 的大小,建议根据实际情况更改。</p>
-<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="cp">#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4</span>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="cp">#define CONFIG_USBHOST_MAX_SERIAL_CLASS  4</span>
 <span class="cp">#define CONFIG_USBHOST_MAX_HID_CLASS     4</span>
 <span class="cp">#define CONFIG_USBHOST_MAX_MSC_CLASS     2</span>
 <span class="cp">#define CONFIG_USBHOST_MAX_AUDIO_CLASS   1</span>
@@ -321,7 +326,7 @@ usbd_msc_sector_read 和 usbd_msc_sector_write 就会在线程中执行。</p>
 </section>
 <section id="config-usbhost-control-transfer-timeout">
 <h3>CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT<a class="headerlink" href="#config-usbhost-control-transfer-timeout" title="Link to this heading"></a></h3>
-<p>控制传输发送或者接收的超时时间,默认 1s</p>
+<p>控制传输发送或者接收的超时时间,默认 500 ms</p>
 </section>
 <section id="config-usbhost-msc-timeout">
 <h3>CONFIG_USBHOST_MSC_TIMEOUT<a class="headerlink" href="#config-usbhost-msc-timeout" title="Link to this heading"></a></h3>

+ 141 - 120
api/api_device.html

@@ -68,13 +68,10 @@
 <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="#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-add-interface">usbd_add_interface</a></li>
 <li class="toctree-l3"><a class="reference internal" href="#usbd-add-endpoint">usbd_add_endpoint</a></li>
 <li class="toctree-l3"><a class="reference internal" href="#usbd-initialize">usbd_initialize</a></li>
-<li class="toctree-l3"><a class="reference internal" href="#usbd-event-handler">usbd_event_handler</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-deinitialize">usbd_deinitialize</a></li>
 </ul>
 </li>
 <li class="toctree-l2"><a class="reference internal" href="#cdc-acm">CDC ACM</a><ul>
@@ -101,23 +98,22 @@
 <li class="toctree-l3"><a class="reference internal" href="#usbd-audio-init-intf">usbd_audio_init_intf</a></li>
 <li class="toctree-l3"><a class="reference internal" href="#usbd-audio-open">usbd_audio_open</a></li>
 <li class="toctree-l3"><a class="reference internal" href="#usbd-audio-close">usbd_audio_close</a></li>
-<li class="toctree-l3"><a class="reference internal" href="#usbd-audio-add-entity">usbd_audio_add_entity</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-sampling-freq">usbd_audio_set_sampling_freq</a></li>
 <li class="toctree-l3"><a class="reference internal" href="#usbd-audio-get-sampling-freq-table">usbd_audio_get_sampling_freq_table</a></li>
-<li class="toctree-l3"><a class="reference internal" href="#usbd-audio-set-pitch">usbd_audio_set_pitch</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-init-intf">usbd_video_init_intf</a></li>
 <li class="toctree-l3"><a class="reference internal" href="#usbd-video-open">usbd_video_open</a></li>
 <li class="toctree-l3"><a class="reference internal" href="#usbd-video-close">usbd_video_close</a></li>
-<li class="toctree-l3"><a class="reference internal" href="#usbd-video-payload-fill">usbd_video_payload_fill</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-video-stream-start-write">usbd_video_stream_start_write</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbd-video-stream-split-transfer">usbd_video_stream_split_transfer</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="#printer">PRINTER</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#rndis">RNDIS</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#cdc-ecm">CDC ECM</a></li>
 <li class="toctree-l2"><a class="reference internal" href="#mtp">MTP</a></li>
 </ul>
 </li>
@@ -228,10 +224,6 @@
 </figure>
 <section id="core">
 <h2>CORE<a class="headerlink" href="#core" title="Link to this heading"></a></h2>
-<div class="admonition note">
-<p class="admonition-title">Note</p>
-<p>请注意,v1.1 版本开始增加 busid 形参,其余保持不变,所以 API 说明不做更新</p>
-</div>
 <section id="id2">
 <h3>端点结构体<a class="headerlink" href="#id2" title="Link to this heading"></a></h3>
 <p>端点结构体主要用于注册不同端点地址的中断完成回调函数。</p>
@@ -242,7 +234,6 @@
 </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>
@@ -273,13 +264,21 @@
 <li><p><strong>hid_report_descriptor</strong> hid 报告描述符</p></li>
 <li><p><strong>hid_report_descriptor_len</strong> hid 报告描述符长度</p></li>
 <li><p><strong>intf_num</strong> 当前接口偏移</p></li>
-<li><p><strong>ep_list</strong> 端点的链表节点</p></li>
 </ul>
 </section>
 <section id="usbd-desc-register">
 <h3>usbd_desc_register<a class="headerlink" href="#usbd-desc-register" title="Link to this heading"></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="w"> </span><span class="nf">usbd_desc_register</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">desc</span><span class="p">);</span>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_desc_register</span></code> 用来注册 USB 描述符,描述符种类包括:设备描述符、配置描述符(包含配置描述符、接口描述符、class 类描述符、端点描述符)、字符串描述符、设备限定描述符,其他速度描述符,
+bos描述符,winusb 描述符。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="c1">// 开启 CONFIG_USBDEV_ADVANCE_DESC</span>
+<span class="kt">void</span><span class="w"> </span><span class="nf">usbd_desc_register</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">usb_descriptor</span><span class="w"> </span><span class="o">*</span><span class="n">desc</span><span class="p">);</span>
+
+<span class="c1">// 关闭 CONFIG_USBDEV_ADVANCE_DESC</span>
+<span class="kt">void</span><span class="w"> </span><span class="nf">usbd_desc_register</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">desc</span><span class="p">);</span>
+<span class="kt">void</span><span class="w"> </span><span class="nf">usbd_msosv1_desc_register</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">usb_msosv1_descriptor</span><span class="w"> </span><span class="o">*</span><span class="n">desc</span><span class="p">);</span>
+<span class="kt">void</span><span class="w"> </span><span class="nf">usbd_msosv2_desc_register</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">usb_msosv2_descriptor</span><span class="w"> </span><span class="o">*</span><span class="n">desc</span><span class="p">);</span>
+<span class="kt">void</span><span class="w"> </span><span class="nf">usbd_bos_desc_register</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">usb_bos_descriptor</span><span class="w"> </span><span class="o">*</span><span class="n">desc</span><span class="p">);</span>
+<span class="kt">void</span><span class="w"> </span><span class="nf">usbd_webusb_desc_register</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">usb_webusb_descriptor</span><span class="w"> </span><span class="o">*</span><span class="n">desc</span><span class="p">);</span>
 </pre></div>
 </div>
 <ul class="simple">
@@ -287,72 +286,77 @@
 </ul>
 <div class="admonition note">
 <p class="admonition-title">Note</p>
-<p>当前 API 仅支持一种速度,如果需要更高级的速度切换功能,请开启 CONFIG_USBDEV_ADVANCE_DESC,并且包含了下面所有描述符注册功能</p>
-</div>
-</section>
-<section id="usbd-msosv1-desc-register">
-<h3>usbd_msosv1_desc_register<a class="headerlink" href="#usbd-msosv1-desc-register" title="Link to this heading"></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="w"> </span><span class="nf">usbd_msosv1_desc_register</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">usb_msosv1_descriptor</span><span class="w"> </span><span class="o">*</span><span class="n">desc</span><span class="p">);</span>
-</pre></div>
+<p>当前默认开启 CONFIG_USBDEV_ADVANCE_DESC,如果需要使用旧版本 API 请关闭该宏</p>
 </div>
-<ul class="simple">
-<li><p><strong>desc</strong>  描述符句柄</p></li>
-</ul>
-</section>
-<section id="usbd-msosv2-desc-register">
-<h3>usbd_msosv2_desc_register<a class="headerlink" href="#usbd-msosv2-desc-register" title="Link to this heading"></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="w"> </span><span class="nf">usbd_msosv2_desc_register</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">usb_msosv2_descriptor</span><span class="w"> </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>
-</section>
-<section id="usbd-bos-desc-register">
-<h3>usbd_bos_desc_register<a class="headerlink" href="#usbd-bos-desc-register" title="Link to this heading"></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="w"> </span><span class="nf">usbd_bos_desc_register</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">usb_bos_descriptor</span><span class="w"> </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>
 </section>
 <section id="usbd-add-interface">
 <h3>usbd_add_interface<a class="headerlink" href="#usbd-add-interface" title="Link to this heading"></a></h3>
-<p><code class="docutils literal notranslate"><span class="pre">usbd_add_interface</span></code> 添加一个接口驱动。 <strong>添加顺序必须按照描述符顺序</strong>。</p>
-<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">usbd_add_interface</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">usbd_interface</span><span class="w"> </span><span class="o">*</span><span class="n">intf</span><span class="p">);</span>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_add_interface</span></code> 添加一个接口驱动。 <strong>添加顺序必须按照描述符中接口顺序</strong>。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">usbd_add_interface</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">usbd_interface</span><span class="w"> </span><span class="o">*</span><span class="n">intf</span><span class="p">);</span>
 </pre></div>
 </div>
 <ul class="simple">
+<li><p><strong>busid</strong> USB 总线 id</p></li>
 <li><p><strong>intf</strong>  接口驱动句柄,通常从不同 class 的 <cite>xxx_init_intf</cite> 函数获取</p></li>
 </ul>
 </section>
 <section id="usbd-add-endpoint">
 <h3>usbd_add_endpoint<a class="headerlink" href="#usbd-add-endpoint" title="Link to this heading"></a></h3>
 <p><code class="docutils literal notranslate"><span class="pre">usbd_add_endpoint</span></code> 添加一个端点中断完成回调函数。</p>
-<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">usbd_add_endpoint</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">usbd_endpoint</span><span class="w"> </span><span class="o">*</span><span class="n">ep</span><span class="p">);;</span>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">usbd_add_endpoint</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">usbd_endpoint</span><span class="w"> </span><span class="o">*</span><span class="n">ep</span><span class="p">);</span>
 </pre></div>
 </div>
 <ul class="simple">
+<li><p><strong>busid</strong> USB 总线 id</p></li>
 <li><p><strong>ep</strong>    端点句柄</p></li>
 </ul>
 </section>
 <section id="usbd-initialize">
 <h3>usbd_initialize<a class="headerlink" href="#usbd-initialize" title="Link to this heading"></a></h3>
-<p><code class="docutils literal notranslate"><span class="pre">usbd_initialize</span></code> 用来初始化 usb device 寄存器配置、usb 时钟、中断等,需要注意,此函数必须在所有列出的 API 最后。 <strong>如果使用 os,必须放在线程中执行</strong>。</p>
-<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="nf">usbd_initialize</span><span class="p">(</span><span class="kt">void</span><span class="p">);</span>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_initialize</span></code> 用来初始化 usb device 寄存器配置、usb 时钟、中断等,需要注意,此函数必须在注册描述符 API 最后。 <strong>如果使用 os,必须放在线程中执行</strong>。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="nf">usbd_initialize</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="kt">uintptr_t</span><span class="w"> </span><span class="n">reg_base</span><span class="p">,</span><span class="w"> </span><span class="n">usbd_event_handler_t</span><span class="w"> </span><span class="n">event_handler</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>busid</strong> USB 总线 id</p></li>
+<li><p><strong>reg_base</strong> USB 设备寄存器基地址</p></li>
+<li><p><strong>event_handler</strong> 协议栈中断或者状态回调函数,event 事件</p></li>
+<li><p><strong>return</strong> 返回 0 表示成功,其他值表示失败</p></li>
+</ul>
+<p>event 事件包括:</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="n">USBD_EVENT_ERROR</span><span class="p">,</span><span class="w">        </span><span class="cm">/** USB error reported by the controller */</span>
+<span class="n">USBD_EVENT_RESET</span><span class="p">,</span><span class="w">        </span><span class="cm">/** USB reset */</span>
+<span class="n">USBD_EVENT_SOF</span><span class="p">,</span><span class="w">          </span><span class="cm">/** Start of Frame received */</span>
+<span class="n">USBD_EVENT_CONNECTED</span><span class="p">,</span><span class="w">    </span><span class="cm">/** USB connected*/</span>
+<span class="n">USBD_EVENT_DISCONNECTED</span><span class="p">,</span><span class="w"> </span><span class="cm">/** USB disconnected */</span>
+<span class="n">USBD_EVENT_SUSPEND</span><span class="p">,</span><span class="w">      </span><span class="cm">/** USB connection suspended by the HOST */</span>
+<span class="n">USBD_EVENT_RESUME</span><span class="p">,</span><span class="w">       </span><span class="cm">/** USB connection resumed by the HOST */</span>
+
+<span class="cm">/* USB DEVICE STATUS */</span>
+<span class="n">USBD_EVENT_CONFIGURED</span><span class="p">,</span><span class="w">        </span><span class="cm">/** USB configuration done */</span>
+<span class="n">USBD_EVENT_SET_INTERFACE</span><span class="p">,</span><span class="w">     </span><span class="cm">/** USB interface selected */</span>
+<span class="n">USBD_EVENT_SET_REMOTE_WAKEUP</span><span class="p">,</span><span class="w"> </span><span class="cm">/** USB set remote wakeup */</span>
+<span class="n">USBD_EVENT_CLR_REMOTE_WAKEUP</span><span class="p">,</span><span class="w"> </span><span class="cm">/** USB clear remote wakeup */</span>
+<span class="n">USBD_EVENT_INIT</span><span class="p">,</span><span class="w">              </span><span class="cm">/** USB init done when call usbd_initialize */</span>
+<span class="n">USBD_EVENT_DEINIT</span><span class="p">,</span><span class="w">            </span><span class="cm">/** USB deinit done when call usbd_deinitialize */</span>
+<span class="n">USBD_EVENT_UNKNOWN</span>
 </pre></div>
 </div>
+<div class="admonition note">
+<p class="admonition-title">Note</p>
+<p>大部分 IP USBD_EVENT_CONNECTED 和 USBD_EVENT_DISCONNECTED 都支持,当前仅 HPM 芯片支持</p>
+</div>
 </section>
-<section id="usbd-event-handler">
-<h3>usbd_event_handler<a class="headerlink" href="#usbd-event-handler" title="Link to this heading"></a></h3>
-<p><code class="docutils literal notranslate"><span class="pre">usbd_event_handler</span></code> 是协议栈中中断或者协议栈一些状态的回调函数。大部分 IP 仅支持 USBD_EVENT_RESET 和 USBD_EVENT_CONFIGURED</p>
-<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">usbd_event_handler</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">event</span><span class="p">);</span>
+<section id="usbd-deinitialize">
+<h3>usbd_deinitialize<a class="headerlink" href="#usbd-deinitialize" title="Link to this heading"></a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_deinitialize</span></code> 用来反初始化 usb device,关闭 usb 设备时钟、中断等。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="nf">usbd_deinitialize</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">);</span>
 </pre></div>
 </div>
+<ul class="simple">
+<li><p><strong>busid</strong> USB 总线 id</p></li>
+<li><p><strong>return</strong> 返回 0 表示成功,其他值表示失败</p></li>
+</ul>
 </section>
 </section>
 <section id="cdc-acm">
@@ -364,20 +368,22 @@
 <li><p><code class="docutils literal notranslate"><span class="pre">cdc_acm_class_interface_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="k">struct</span><span class="w"> </span><span class="nc">usbd_interface</span><span class="w"> </span><span class="o">*</span><span class="n">usbd_cdc_acm_init_intf</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">usbd_interface</span><span class="w"> </span><span class="o">*</span><span class="n">intf</span><span class="p">);</span>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="k">struct</span><span class="w"> </span><span class="nc">usbd_interface</span><span class="w"> </span><span class="o">*</span><span class="n">usbd_cdc_acm_init_intf</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">usbd_interface</span><span class="w"> </span><span class="o">*</span><span class="n">intf</span><span class="p">);</span>
 </pre></div>
 </div>
 <ul class="simple">
+<li><p><strong>busid</strong> USB 总线 id</p></li>
 <li><p><strong>return</strong>  接口句柄</p></li>
 </ul>
 </section>
 <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="Link to this heading"></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="w"> </span><span class="nf">usbd_cdc_acm_set_line_coding</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">intf</span><span class="p">,</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">cdc_line_coding</span><span class="w"> </span><span class="o">*</span><span class="n">line_coding</span><span class="p">);</span>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">usbd_cdc_acm_set_line_coding</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">intf</span><span class="p">,</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">cdc_line_coding</span><span class="w"> </span><span class="o">*</span><span class="n">line_coding</span><span class="p">);</span>
 </pre></div>
 </div>
 <ul class="simple">
+<li><p><strong>busid</strong> USB 总线 id</p></li>
 <li><p><strong>intf</strong> 控制接口号</p></li>
 <li><p><strong>line_coding</strong> 串口配置</p></li>
 </ul>
@@ -385,10 +391,11 @@
 <section id="usbd-cdc-acm-get-line-coding">
 <h3>usbd_cdc_acm_get_line_coding<a class="headerlink" href="#usbd-cdc-acm-get-line-coding" title="Link to this heading"></a></h3>
 <p><code class="docutils literal notranslate"><span class="pre">usbd_cdc_acm_get_line_coding</span></code> 用来获取串口进行配置,如果仅使用 USB 而不用 串口,该接口不用用户实现,使用默认。</p>
-<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">usbd_cdc_acm_get_line_coding</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">intf</span><span class="p">,</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">cdc_line_coding</span><span class="w"> </span><span class="o">*</span><span class="n">line_coding</span><span class="p">);</span>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">usbd_cdc_acm_get_line_coding</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">intf</span><span class="p">,</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">cdc_line_coding</span><span class="w"> </span><span class="o">*</span><span class="n">line_coding</span><span class="p">);</span>
 </pre></div>
 </div>
 <ul class="simple">
+<li><p><strong>busid</strong> USB 总线 id</p></li>
 <li><p><strong>intf</strong> 控制接口号</p></li>
 <li><p><strong>line_coding</strong> 串口配置</p></li>
 </ul>
@@ -396,10 +403,11 @@
 <section id="usbd-cdc-acm-set-dtr">
 <h3>usbd_cdc_acm_set_dtr<a class="headerlink" href="#usbd-cdc-acm-set-dtr" title="Link to this heading"></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="w"> </span><span class="nf">usbd_cdc_acm_set_dtr</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">intf</span><span class="p">,</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">dtr</span><span class="p">);</span>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">usbd_cdc_acm_set_dtr</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">intf</span><span class="p">,</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">dtr</span><span class="p">);</span>
 </pre></div>
 </div>
 <ul class="simple">
+<li><p><strong>busid</strong> USB 总线 id</p></li>
 <li><p><strong>intf</strong> 控制接口号</p></li>
 <li><p><strong>dtr</strong> dtr 为1表示拉低电平,为0表示拉高电平</p></li>
 </ul>
@@ -407,10 +415,11 @@
 <section id="usbd-cdc-acm-set-rts">
 <h3>usbd_cdc_acm_set_rts<a class="headerlink" href="#usbd-cdc-acm-set-rts" title="Link to this heading"></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="w"> </span><span class="nf">usbd_cdc_acm_set_rts</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">intf</span><span class="p">,</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">rts</span><span class="p">);</span>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">usbd_cdc_acm_set_rts</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">intf</span><span class="p">,</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">rts</span><span class="p">);</span>
 </pre></div>
 </div>
 <ul class="simple">
+<li><p><strong>busid</strong> USB 总线 id</p></li>
 <li><p><strong>intf</strong> 控制接口号</p></li>
 <li><p><strong>rts</strong> rts 为1表示拉低电平,为0表示拉高电平</p></li>
 </ul>
@@ -439,10 +448,11 @@
 <li><p><code class="docutils literal notranslate"><span class="pre">hid_class_interface_request_handler</span></code> 用来处理 USB HID 类的 Setup 请求。</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="k">struct</span><span class="w"> </span><span class="nc">usbd_interface</span><span class="w"> </span><span class="o">*</span><span class="n">usbd_hid_init_intf</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">usbd_interface</span><span class="w"> </span><span class="o">*</span><span class="n">intf</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">desc</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">desc_len</span><span class="p">);</span>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="k">struct</span><span class="w"> </span><span class="nc">usbd_interface</span><span class="w"> </span><span class="o">*</span><span class="n">usbd_hid_init_intf</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">usbd_interface</span><span class="w"> </span><span class="o">*</span><span class="n">intf</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">desc</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">desc_len</span><span class="p">);</span>
 </pre></div>
 </div>
 <ul class="simple">
+<li><p><strong>busid</strong> USB 总线 id</p></li>
 <li><p><strong>desc</strong> 报告描述符</p></li>
 <li><p><strong>desc_len</strong> 报告描述符长度</p></li>
 </ul>
@@ -459,10 +469,11 @@
 <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="k">struct</span><span class="w"> </span><span class="nc">usbd_interface</span><span class="w"> </span><span class="o">*</span><span class="n">usbd_msc_init_intf</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">usbd_interface</span><span class="w"> </span><span class="o">*</span><span class="n">intf</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">out_ep</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">in_ep</span><span class="p">);</span>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="k">struct</span><span class="w"> </span><span class="nc">usbd_interface</span><span class="w"> </span><span class="o">*</span><span class="n">usbd_msc_init_intf</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">usbd_interface</span><span class="w"> </span><span class="o">*</span><span class="n">intf</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">out_ep</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">in_ep</span><span class="p">);</span>
 </pre></div>
 </div>
 <ul class="simple">
+<li><p><strong>busid</strong> USB 总线 id</p></li>
 <li><p><strong>out_ep</strong>     out 端点地址</p></li>
 <li><p><strong>in_ep</strong>      in 端点地址</p></li>
 </ul>
@@ -470,10 +481,11 @@
 <section id="usbd-msc-get-cap">
 <h3>usbd_msc_get_cap<a class="headerlink" href="#usbd-msc-get-cap" title="Link to this heading"></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="w"> </span><span class="nf">usbd_msc_get_cap</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">lun</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="o">*</span><span class="n">block_num</span><span class="p">,</span><span class="w"> </span><span class="kt">uint16_t</span><span class="w"> </span><span class="o">*</span><span class="n">block_size</span><span class="p">);</span>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">usbd_msc_get_cap</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">lun</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="o">*</span><span class="n">block_num</span><span class="p">,</span><span class="w"> </span><span class="kt">uint16_t</span><span class="w"> </span><span class="o">*</span><span class="n">block_size</span><span class="p">);</span>
 </pre></div>
 </div>
 <ul class="simple">
+<li><p><strong>busid</strong> USB 总线 id</p></li>
 <li><p><strong>lun</strong> 存储逻辑单元,暂时无用,默认支持一个</p></li>
 <li><p><strong>block_num</strong>  存储扇区个数</p></li>
 <li><p><strong>block_size</strong>  存储扇区大小</p></li>
@@ -482,10 +494,12 @@
 <section id="usbd-msc-sector-read">
 <h3>usbd_msc_sector_read<a class="headerlink" href="#usbd-msc-sector-read" title="Link to this heading"></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="w"> </span><span class="nf">usbd_msc_sector_read</span><span class="p">(</span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">sector</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">buffer</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">length</span><span class="p">);</span>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="nf">usbd_msc_sector_read</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">lun</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">sector</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">buffer</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">length</span><span class="p">);</span>
 </pre></div>
 </div>
 <ul class="simple">
+<li><p><strong>busid</strong> USB 总线 id</p></li>
+<li><p><strong>lun</strong> 存储逻辑单元,暂时无用,默认支持一个</p></li>
 <li><p><strong>sector</strong> 扇区偏移</p></li>
 <li><p><strong>buffer</strong> 存储读取的数据的指针</p></li>
 <li><p><strong>length</strong> 读取长度</p></li>
@@ -494,10 +508,12 @@
 <section id="usbd-msc-sector-write">
 <h3>usbd_msc_sector_write<a class="headerlink" href="#usbd-msc-sector-write" title="Link to this heading"></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="w"> </span><span class="nf">usbd_msc_sector_write</span><span class="p">(</span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">sector</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">buffer</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">length</span><span class="p">);</span>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="nf">usbd_msc_sector_write</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">lun</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">sector</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">buffer</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">length</span><span class="p">);</span>
 </pre></div>
 </div>
 <ul class="simple">
+<li><p><strong>busid</strong> USB 总线 id</p></li>
+<li><p><strong>lun</strong> 存储逻辑单元,暂时无用,默认支持一个</p></li>
 <li><p><strong>sector</strong> 扇区偏移</p></li>
 <li><p><strong>buffer</strong> 写入数据指针</p></li>
 <li><p><strong>length</strong> 写入长度</p></li>
@@ -514,17 +530,23 @@
 <li><p><code class="docutils literal notranslate"><span class="pre">audio_class_endpoint_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="k">struct</span><span class="w"> </span><span class="nc">usbd_interface</span><span class="w"> </span><span class="o">*</span><span class="n">usbd_audio_init_intf</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">usbd_interface</span><span class="w"> </span><span class="o">*</span><span class="n">intf</span><span class="p">);</span>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="k">struct</span><span class="w"> </span><span class="nc">usbd_interface</span><span class="w"> </span><span class="o">*</span><span class="n">usbd_audio_init_intf</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">usbd_interface</span><span class="w"> </span><span class="o">*</span><span class="n">intf</span><span class="p">,</span>
+<span class="w">                                            </span><span class="kt">uint16_t</span><span class="w"> </span><span class="n">uac_version</span><span class="p">,</span>
+<span class="w">                                            </span><span class="k">struct</span><span class="w"> </span><span class="nc">audio_entity_info</span><span class="w"> </span><span class="o">*</span><span class="n">table</span><span class="p">,</span>
+<span class="w">                                            </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">num</span><span class="p">);</span>
 </pre></div>
 </div>
 <ul class="simple">
-<li><p><strong>class</strong> 类的句柄</p></li>
+<li><p><strong>busid</strong> USB 总线 id</p></li>
 <li><p><strong>intf</strong>  接口句柄</p></li>
+<li><p><strong>uac_version</strong>  音频类版本,UAC1.0 或 UAC2.0</p></li>
+<li><p><strong>table</strong> 音频实体信息表</p></li>
+<li><p><strong>num</strong> 音频实体信息表长度</p></li>
 </ul>
 </section>
 <section id="usbd-audio-open">
 <h3>usbd_audio_open<a class="headerlink" href="#usbd-audio-open" title="Link to this heading"></a></h3>
-<p><code class="docutils literal notranslate"><span class="pre">usbd_audio_open</span></code>  用来开启音频数据传输。</p>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_audio_open</span></code>  用来开启音频数据传输。主机发送开启命令的回调函数。</p>
 <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">usbd_audio_open</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">intf</span><span class="p">);</span>
 </pre></div>
 </div>
@@ -534,7 +556,7 @@
 </section>
 <section id="usbd-audio-close">
 <h3>usbd_audio_close<a class="headerlink" href="#usbd-audio-close" title="Link to this heading"></a></h3>
-<p><code class="docutils literal notranslate"><span class="pre">usbd_audio_close</span></code>  用来关闭音频数据传输。</p>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_audio_close</span></code>  用来关闭音频数据传输。主机发送关闭命令的回调函数。</p>
 <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">usbd_audio_close</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">intf</span><span class="p">);</span>
 </pre></div>
 </div>
@@ -542,71 +564,54 @@
 <li><p><strong>intf</strong> 关闭的接口号</p></li>
 </ul>
 </section>
-<section id="usbd-audio-add-entity">
-<h3>usbd_audio_add_entity<a class="headerlink" href="#usbd-audio-add-entity" title="Link to this heading"></a></h3>
-<p><code class="docutils literal notranslate"><span class="pre">usbd_audio_add_entity</span></code>  用来添加 unit 相关控制,例如 feature unit、clock source。</p>
-<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">usbd_audio_add_entity</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">entity_id</span><span class="p">,</span><span class="w"> </span><span class="kt">uint16_t</span><span class="w"> </span><span class="n">bDescriptorSubtype</span><span class="p">);</span>
-</pre></div>
-</div>
-<ul class="simple">
-<li><p><strong>entity_id</strong> 要添加的 unit id</p></li>
-<li><p><strong>bDescriptorSubtype</strong> entity_id 的描述符子类型</p></li>
-</ul>
-</section>
 <section id="usbd-audio-set-mute">
 <h3>usbd_audio_set_mute<a class="headerlink" href="#usbd-audio-set-mute" title="Link to this heading"></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="w"> </span><span class="nf">usbd_audio_set_mute</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">ch</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">enable</span><span class="p">);</span>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">usbd_audio_set_mute</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">ep</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">ch</span><span class="p">,</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">mute</span><span class="p">);</span>
 </pre></div>
 </div>
 <ul class="simple">
+<li><p><strong>busid</strong> USB 总线 id</p></li>
+<li><p><strong>ep</strong> 要设置静音的端点</p></li>
 <li><p><strong>ch</strong> 要设置静音的通道</p></li>
-<li><p><strong>enable</strong> 为1 表示静音,0相反</p></li>
+<li><p><strong>mute</strong> 为1 表示静音,0相反</p></li>
 </ul>
 </section>
 <section id="usbd-audio-set-volume">
 <h3>usbd_audio_set_volume<a class="headerlink" href="#usbd-audio-set-volume" title="Link to this heading"></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="w"> </span><span class="nf">usbd_audio_set_volume</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">ch</span><span class="p">,</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="n">dB</span><span class="p">);</span>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">usbd_audio_set_volume</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">ep</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">ch</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">volume_db</span><span class="p">);</span>
 </pre></div>
 </div>
 <ul class="simple">
+<li><p><strong>busid</strong> USB 总线 id</p></li>
+<li><p><strong>ep</strong> 要设置音量的端点</p></li>
 <li><p><strong>ch</strong> 要设置音量的通道</p></li>
-<li><p><strong>dB</strong> 要设置音量的分贝,其中 UAC1.0范围从 -127 ~ +127dB,UAC2.0 从 0 ~ 256dB</p></li>
+<li><p><strong>volume_db</strong> 要设置音量的分贝,单位 -100dB ~ 0dB</p></li>
 </ul>
 </section>
 <section id="usbd-audio-set-sampling-freq">
 <h3>usbd_audio_set_sampling_freq<a class="headerlink" href="#usbd-audio-set-sampling-freq" title="Link to this heading"></a></h3>
 <p><code class="docutils literal notranslate"><span class="pre">usbd_audio_set_sampling_freq</span></code>  用来设置设备上音频模块的采样率</p>
-<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">usbd_audio_set_sampling_freq</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">ep_ch</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">sampling_freq</span><span class="p">);</span>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">usbd_audio_set_sampling_freq</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">ep</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">sampling_freq</span><span class="p">);</span>
 </pre></div>
 </div>
 <ul class="simple">
-<li><p><strong>ch</strong> 要设置采样率的端点或者通道,UAC1.0为端点,UAC2.0 为通道</p></li>
-<li><p><strong>dB</strong> 要设置的采样率</p></li>
+<li><p><strong>ep</strong> 要设置采样率的端点</p></li>
+<li><p><strong>sampling_freq</strong> 要设置的采样率</p></li>
 </ul>
 </section>
 <section id="usbd-audio-get-sampling-freq-table">
 <h3>usbd_audio_get_sampling_freq_table<a class="headerlink" href="#usbd-audio-get-sampling-freq-table" title="Link to this heading"></a></h3>
-<p><code class="docutils literal notranslate"><span class="pre">usbd_audio_get_sampling_freq_table</span></code>  用来获取支持的采样率列表,如果函数没有实现,则使用默认采样率列表。</p>
-<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">usbd_audio_get_sampling_freq_table</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">**</span><span class="n">sampling_freq_table</span><span class="p">);</span>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_audio_get_sampling_freq_table</span></code>  用来获取支持的采样率列表,如果函数没有实现,则使用默认采样率列表。 UAC2 only。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">usbd_audio_get_sampling_freq_table</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">ep</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">**</span><span class="n">sampling_freq_table</span><span class="p">);</span>
 </pre></div>
 </div>
 <ul class="simple">
+<li><p><strong>ep</strong> 要获取采样率的端点</p></li>
 <li><p><strong>sampling_freq_table</strong> 采样率列表地址,格式参考默认采样率列表</p></li>
 </ul>
 </section>
-<section id="usbd-audio-set-pitch">
-<h3>usbd_audio_set_pitch<a class="headerlink" href="#usbd-audio-set-pitch" title="Link to this heading"></a></h3>
-<p><code class="docutils literal notranslate"><span class="pre">usbd_audio_set_pitch</span></code>  用来设置音频音调,仅 UAC1.0 有这功能。</p>
-<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">usbd_audio_set_pitch</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">ep</span><span class="p">,</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">enable</span><span class="p">);</span>
-</pre></div>
-</div>
-<ul class="simple">
-<li><p><strong>ep</strong> 要设置音调的端点</p></li>
-<li><p><strong>enable</strong> 开启或关闭音调</p></li>
-</ul>
-</section>
 </section>
 <section id="uvc">
 <h2>UVC<a class="headerlink" href="#uvc" title="Link to this heading"></a></h2>
@@ -617,15 +622,18 @@
 <li><p><code class="docutils literal notranslate"><span class="pre">video_class_interface_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="k">struct</span><span class="w"> </span><span class="nc">usbd_interface</span><span class="w"> </span><span class="o">*</span><span class="n">usbd_video_init_intf</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">usbd_interface</span><span class="w"> </span><span class="o">*</span><span class="n">intf</span><span class="p">,</span>
-<span class="w">                                         </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">dwFrameInterval</span><span class="p">,</span>
-<span class="w">                                         </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">dwMaxVideoFrameSize</span><span class="p">,</span>
-<span class="w">                                         </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">dwMaxPayloadTransferSize</span><span class="p">);</span>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="k">struct</span><span class="w"> </span><span class="nc">usbd_interface</span><span class="w"> </span><span class="o">*</span><span class="n">usbd_video_init_intf</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">usbd_interface</span><span class="w"> </span><span class="o">*</span><span class="n">intf</span><span class="p">,</span>
+<span class="w">                                            </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">dwFrameInterval</span><span class="p">,</span>
+<span class="w">                                            </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">dwMaxVideoFrameSize</span><span class="p">,</span>
+<span class="w">                                            </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">dwMaxPayloadTransferSize</span><span class="p">);</span>
 </pre></div>
 </div>
 <ul class="simple">
-<li><p><strong>class</strong> 类的句柄</p></li>
+<li><p><strong>busid</strong> USB 总线 id</p></li>
 <li><p><strong>intf</strong>  接口句柄</p></li>
+<li><p><strong>dwFrameInterval</strong> 视频帧间隔,单位 100ns</p></li>
+<li><p><strong>dwMaxVideoFrameSize</strong> 最大视频帧大小</p></li>
+<li><p><strong>dwMaxPayloadTransferSize</strong> 最大负载传输大小</p></li>
 </ul>
 </section>
 <section id="usbd-video-open">
@@ -648,26 +656,39 @@
 <li><p><strong>intf</strong> 关闭的接口号</p></li>
 </ul>
 </section>
-<section id="usbd-video-payload-fill">
-<h3>usbd_video_payload_fill<a class="headerlink" href="#usbd-video-payload-fill" title="Link to this heading"></a></h3>
-<p><code class="docutils literal notranslate"><span class="pre">usbd_video_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="w"> </span><span class="nf">usbd_video_payload_fill</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">input</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">input_len</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">output</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="o">*</span><span class="n">out_len</span><span class="p">);</span>
+<section id="usbd-video-stream-start-write">
+<h3>usbd_video_stream_start_write<a class="headerlink" href="#usbd-video-stream-start-write" title="Link to this heading"></a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_video_stream_start_write</span></code>  用来启动一帧视频数据流发送。需要搭配 <cite>usbd_video_stream_split_transfer</cite> 使用。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="nf">usbd_video_stream_start_write</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">ep</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">ep_buf</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">stream_buf</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">stream_len</span><span class="p">,</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">do_copy</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>busid</strong> USB 总线 id</p></li>
+<li><p><strong>ep</strong> 视频数据端点地址</p></li>
+<li><p><strong>ep_buf</strong> 视频数据端点传输缓冲区</p></li>
+<li><p><strong>stream_buf</strong> 一帧视频数据源缓冲区</p></li>
+<li><p><strong>stream_len</strong> 一帧视频数据源缓冲区大小</p></li>
+<li><p><strong>do_copy</strong> 是否需要将 stream_buf 数据复制到 ep_buf 中,当前仅当 stream_buf 在 nocache 区域并且未开启 DCACHE_ENABLE 时该参数才为 false</p></li>
+</ul>
+</section>
+<section id="usbd-video-stream-split-transfer">
+<h3>usbd_video_stream_split_transfer<a class="headerlink" href="#usbd-video-stream-split-transfer" title="Link to this heading"></a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbd_video_stream_split_transfer</span></code>  用来分割视频数据流发送。需要搭配 <cite>usbd_video_stream_start_write</cite> 使用。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="nf">usbd_video_stream_split_transfer</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">ep</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>
+<li><p><strong>busid</strong> USB 总线 id</p></li>
+<li><p><strong>ep</strong> 视频数据端点地址</p></li>
+<li><p><strong>return</strong> 返回 true 表示一帧数据发送完成,false 表示数据未发送完成</p></li>
 </ul>
 </section>
 </section>
-<section id="dfu">
-<h2>DFU<a class="headerlink" href="#dfu" title="Link to this heading"></a></h2>
+<section id="rndis">
+<h2>RNDIS<a class="headerlink" href="#rndis" title="Link to this heading"></a></h2>
 </section>
-<section id="printer">
-<h2>PRINTER<a class="headerlink" href="#printer" title="Link to this heading"></a></h2>
+<section id="cdc-ecm">
+<h2>CDC ECM<a class="headerlink" href="#cdc-ecm" title="Link to this heading"></a></h2>
 </section>
 <section id="mtp">
 <h2>MTP<a class="headerlink" href="#mtp" title="Link to this heading"></a></h2>

+ 46 - 1
api/api_host.html

@@ -89,7 +89,12 @@
 </ul>
 </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="#msc">MSC</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#usbh-msc-scsi-init">usbh_msc_scsi_init</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbh-msc-scsi-write10">usbh_msc_scsi_write10</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#usbh-msc-scsi-read10">usbh_msc_scsi_read10</a></li>
+</ul>
+</li>
 <li class="toctree-l2"><a class="reference internal" href="#network">NETWORK</a></li>
 </ul>
 </li>
@@ -434,9 +439,49 @@
 </section>
 <section id="msc">
 <h2>MSC<a class="headerlink" href="#msc" title="Link to this heading"></a></h2>
+<section id="usbh-msc-scsi-init">
+<h3>usbh_msc_scsi_init<a class="headerlink" href="#usbh-msc-scsi-init" title="Link to this heading"></a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbh_msc_scsi_init</span></code> 初始化 msc scsi 设备。获取 MSC 状态和容量信息。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="nf">usbh_msc_scsi_init</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">usbh_msc</span><span class="w"> </span><span class="o">*</span><span class="n">msc_class</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>msc_class</strong>  msc 结构体句柄</p></li>
+<li><p><strong>return</strong>  0 表示正常其他表示错误</p></li>
+</ul>
+</section>
+<section id="usbh-msc-scsi-write10">
+<h3>usbh_msc_scsi_write10<a class="headerlink" href="#usbh-msc-scsi-write10" title="Link to this heading"></a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbh_msc_scsi_write10</span></code> 向 msc 设备写数据。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="nf">usbh_msc_scsi_write10</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">usbh_msc</span><span class="w"> </span><span class="o">*</span><span class="n">msc_class</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">start_sector</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">buffer</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">nsectors</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>msc_class</strong>  msc 结构体句柄</p></li>
+<li><p><strong>start_sector</strong>  起始扇区</p></li>
+<li><p><strong>buffer</strong>  数据缓冲区指针</p></li>
+<li><p><strong>nsectors</strong>  要写入的扇区数</p></li>
+<li><p><strong>return</strong>  返回 0 表示正常其他表示错误</p></li>
+</ul>
+</section>
+<section id="usbh-msc-scsi-read10">
+<h3>usbh_msc_scsi_read10<a class="headerlink" href="#usbh-msc-scsi-read10" title="Link to this heading"></a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">usbh_msc_scsi_read10</span></code> 从 msc 设备读数据。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="nf">usbh_msc_scsi_read10</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">usbh_msc</span><span class="w"> </span><span class="o">*</span><span class="n">msc_class</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">start_sector</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">buffer</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">nsectors</span><span class="p">);</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><p><strong>msc_class</strong>  msc 结构体句柄</p></li>
+<li><p><strong>start_sector</strong>  起始扇区</p></li>
+<li><p><strong>buffer</strong>  数据缓冲区指针</p></li>
+<li><p><strong>nsectors</strong>  要读取的扇区数</p></li>
+<li><p><strong>return</strong>  返回 0 表示正常其他表示错误</p></li>
+</ul>
+</section>
 </section>
 <section id="network">
 <h2>NETWORK<a class="headerlink" href="#network" title="Link to this heading"></a></h2>
+<p>已对接 lwIP 协议栈或者其他网络协议栈,使用 socket API 即可。</p>
 </section>
 </section>
 

+ 1 - 2
demo/usbd_webusb.html

@@ -171,10 +171,9 @@
 <ul class="simple">
 <li><p>增加一个接口描述符用于 webusb</p></li>
 </ul>
-<div class="highlight-C notranslate"><div class="highlight"><pre><span></span>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="n">USB_INTERFACE_DESCRIPTOR_INIT</span><span class="p">(</span><span class="n">USBD_WEBUSB_INTF_NUM</span><span class="p">,</span><span class="w"> </span><span class="mh">0x00</span><span class="p">,</span><span class="w"> </span><span class="mh">0x00</span><span class="p">,</span><span class="w"> </span><span class="mh">0xff</span><span class="p">,</span><span class="w"> </span><span class="mh">0x00</span><span class="p">,</span><span class="w"> </span><span class="mh">0x00</span><span class="p">,</span><span class="w"> </span><span class="mh">0x00</span><span class="p">)</span>
 </pre></div>
 </div>
-<p>USB_INTERFACE_DESCRIPTOR_INIT(USBD_WEBUSB_INTF_NUM, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00)</p>
 <ul class="simple">
 <li><p>其余使用 hid 描述符,不再赘述</p></li>
 <li><p>枚举完成后,电脑右下角会弹出网页信息,点击即可打开网页</p></li>

+ 18 - 0
demo/usbd_winusb.html

@@ -161,6 +161,10 @@
 <h1>usbd_winusb<a class="headerlink" href="#usbd-winusb" title="Link to this heading"></a></h1>
 <p>本节主要介绍 winusb 驱动。winusb 是 windows 为了让用户友好的访问 USB 自定义类设备提供的一套通用驱动,其实本质就是 CDC ACM。
 WINUSB 版本根据 USB 版本分为 V1/V2 版本,V2 版本需要包含 BOS 描述符,V1 版本不需要。V2 版本需要在设备描述符中设置为 USB2.1 的版本号。</p>
+<div class="admonition note">
+<p class="admonition-title">Note</p>
+<p>如果使用复合设备,必须使用 V2 版本的 winusb 驱动。</p>
+</div>
 <ul class="simple">
 <li><p>V1 版本注册描述符</p></li>
 </ul>
@@ -188,6 +192,20 @@ WINUSB 版本根据 USB 版本分为 V1/V2 版本,V2 版本需要包含 BOS 
 <ul class="simple">
 <li><p>其余操作与 CDC ACM 相同,不再赘述</p></li>
 </ul>
+<p>在 V2 版本中,WINUSB 需要提供 WCID 描述符,有两个宏,分别是 <cite>USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_SINGLE_DESCRIPTOR_INIT</cite> 和 <cite>USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_INIT</cite>,这里需要注意,
+前者用于单 WINUSB 设备(也就是接口总数只能是1),后者用于复合设备,可以使用 1 ~ 多个 WINUSB 接口的设备。因此,即使同样是 1个 WINUSB 设备,不同情况宏的配置也是不一样的,只能说,微软工程师的脑回路就是跟正常人不一样。</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="k">const</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">WINUSB_WCIDDescriptor</span><span class="p">[]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span>
+<span class="cp">#if WINUSB_NUM == 1</span>
+<span class="w">    </span><span class="n">USB_MSOSV2_COMP_ID_SET_HEADER_DESCRIPTOR_INIT</span><span class="p">(</span><span class="mi">10</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_SINGLE_DESCRIPTOR_LEN</span><span class="p">),</span>
+<span class="w">    </span><span class="n">USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_SINGLE_DESCRIPTOR_INIT</span><span class="p">(),</span>
+<span class="cp">#else</span>
+<span class="w">    </span><span class="n">USB_MSOSV2_COMP_ID_SET_HEADER_DESCRIPTOR_INIT</span><span class="p">(</span><span class="mi">10</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">WINUSB_NUM</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_LEN</span><span class="p">),</span>
+<span class="w">    </span><span class="n">USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_INIT</span><span class="p">(</span><span class="mh">0x00</span><span class="p">),</span>
+<span class="w">    </span><span class="n">USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_INIT</span><span class="p">(</span><span class="mh">0x01</span><span class="p">),</span>
+<span class="cp">#endif</span>
+<span class="p">};</span>
+</pre></div>
+</div>
 </section>
 
 

+ 1 - 1
demo/usbh_net.html

@@ -256,7 +256,7 @@
 </pre></div>
 </div>
 <ul class="simple">
-<li><p>具体移植文章可以参考 <a class="reference external" href="https://club.rt-thread.org/ask/article/5cf3e9e0b2d95800.html">https://club.rt-thread.org/ask/article/5cf3e9e0b2d95800.html</a></p></li>
+<li><p>具体移植文章可以参考开发者的一些笔记 <a class="reference external" href="https://club.rt-thread.org/ask/article/5cf3e9e0b2d95800.html">https://club.rt-thread.org/ask/article/5cf3e9e0b2d95800.html</a></p></li>
 </ul>
 </section>
 

+ 6 - 0
quick_start/q&a.html

@@ -68,6 +68,7 @@
 <li class="toctree-l2"><a class="reference internal" href="#usb-host-urb-12-14">移植 usb host 出现 urb  返回 -12/-14</a></li>
 <li class="toctree-l2"><a class="reference internal" href="#usb-err-nak">USB_ERR_NAK 说明</a></li>
 <li class="toctree-l2"><a class="reference internal" href="#usb-host-usb">USB host 连接 USB 网卡问题</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#config-usb-dcache-enable">什么时候需要开启 CONFIG_USB_DCACHE_ENABLE</a></li>
 </ul>
 </li>
 <li class="toctree-l1"><a class="reference internal" href="share.html">开发者经验/开源项目分享</a></li>
@@ -283,6 +284,11 @@ DWC2 scatter/gather dma 模式下全部由硬件处理,但是不支持 split 
 <h2>USB host 连接 USB 网卡问题<a class="headerlink" href="#usb-host-usb" title="Link to this heading"></a></h2>
 <p>表现为能识别网卡并且分配到 IP 地址,但是无法 ping 通,这是因为网卡自身需要开启自动拨号,通常需要使用 AT 口设置。具体为 EC20/ML307 等模块。</p>
 </section>
+<section id="config-usb-dcache-enable">
+<h2>什么时候需要开启 CONFIG_USB_DCACHE_ENABLE<a class="headerlink" href="#config-usb-dcache-enable" title="Link to this heading"></a></h2>
+<p>当芯片带有 cache 功能,并且没有使用 no cache ram 时需要开启此宏以保证数据一致性。 <strong>使用 EHCI 时,内部依旧需要使用 nocache ram</strong>。通常,对于第三方平台或者组件,没有使用 no cache ram 宏修饰,都是使用全局变量或者 malloc 等
+操作,这部分 RAM 通常是走 cache 的,因此需要开启此宏。建议第三方平台使用时,必须开启。</p>
+</section>
 </section>
 
 

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
searchindex.js


برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است