فهرست منبع

fix(usbh_serial): fix serial iobuffer size, remove length limit of write

Signed-off-by: sakumisu <1203593632@qq.com>
sakumisu 3 هفته پیش
والد
کامیت
a6ffbd3600
4فایلهای تغییر یافته به همراه12 افزوده شده و 7 حذف شده
  1. 2 2
      class/serial/usbh_serial.c
  2. 2 2
      class/serial/usbh_serial.h
  3. 1 1
      demo/usb_host.c
  4. 7 2
      docs/source/api/api_host.rst

+ 2 - 2
class/serial/usbh_serial.c

@@ -21,7 +21,7 @@ static struct usbh_serial g_serial_class[CONFIG_USBHOST_MAX_SERIAL_CLASS];
 static uint32_t g_devinuse = 0;
 static uint32_t g_cdcacm_devinuse = 0;
 
-USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_serial_iobuffer[CONFIG_USBHOST_MAX_SERIAL_CLASS][USB_ALIGN_UP((USBH_SERIAL_INT_NOCACHE_OFFSET + USBH_SERIAL_INT_NOCACHE_SIZE), CONFIG_USB_ALIGN_SIZE)];
+USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_serial_iobuffer[CONFIG_USBHOST_MAX_SERIAL_CLASS][USB_ALIGN_UP((USBH_SERIAL_RX2_NOCACHE_OFFSET + USBH_SERIAL_RX2_NOCACHE_SIZE), CONFIG_USB_ALIGN_SIZE)];
 
 /* refer to cherryrb */
 static int usbh_serial_ringbuffer_init(usbh_serial_ringbuf_t *rb, void *pool, uint32_t size)
@@ -540,7 +540,7 @@ int usbh_serial_write(struct usbh_serial *serial, const void *buffer, uint32_t b
 
     urb = &serial->bulkout_urb;
 
-    usbh_bulk_urb_fill(urb, serial->hport, serial->bulkout, (uint8_t *)buffer, serial->line_coding.dwDTERate ? MIN(buflen, serial->bulkout->wMaxPacketSize) : buflen, 0xffffffff, NULL, NULL);
+    usbh_bulk_urb_fill(urb, serial->hport, serial->bulkout, (uint8_t *)buffer, buflen, 0xffffffff, NULL, NULL);
     ret = usbh_submit_urb(urb);
     if (ret == 0) {
         ret = urb->actual_length;

+ 2 - 2
class/serial/usbh_serial.h

@@ -9,10 +9,10 @@
 
 #include "usb_cdc.h"
 
-#define USBH_SERIAL_CTRL_NOCACHE_SIZE   32
 #define USBH_SERIAL_CTRL_NOCACHE_OFFSET 0
-#define USBH_SERIAL_INT_NOCACHE_SIZE    32
+#define USBH_SERIAL_CTRL_NOCACHE_SIZE   32
 #define USBH_SERIAL_INT_NOCACHE_OFFSET  USB_ALIGN_UP(USBH_SERIAL_CTRL_NOCACHE_SIZE, CONFIG_USB_ALIGN_SIZE)
+#define USBH_SERIAL_INT_NOCACHE_SIZE    32
 #define USBH_SERIAL_RX_NOCACHE_OFFSET   USB_ALIGN_UP((USBH_SERIAL_INT_NOCACHE_OFFSET + USBH_SERIAL_INT_NOCACHE_SIZE), CONFIG_USB_ALIGN_SIZE)
 #define USBH_SERIAL_RX_NOCACHE_SIZE     512
 #define USBH_SERIAL_RX2_NOCACHE_OFFSET  USB_ALIGN_UP((USBH_SERIAL_RX_NOCACHE_OFFSET + USBH_SERIAL_RX_NOCACHE_SIZE), CONFIG_USB_ALIGN_SIZE)

+ 1 - 1
demo/usb_host.c

@@ -21,7 +21,7 @@ volatile uint32_t serial_tx_bytes = 0;
 volatile uint32_t serial_rx_bytes = 0;
 volatile bool serial_is_opened = false;
 
-USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t serial_tx_buffer[64];
+USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t serial_tx_buffer[SERIAL_TEST_LEN];
 uint8_t serial_rx_data[SERIAL_TEST_LEN];
 
 #ifdef CONFIG_TEST_USBH_CDC_SPEED

+ 7 - 2
docs/source/api/api_host.rst

@@ -206,10 +206,10 @@ usbh_serial_write
 
 - **serial**  serial 结构体句柄
 - **buffer**  数据缓冲区指针
-- **buflen**  要写入的数据长度,如果是 USB2TTL 设备,一次最高 wMaxPacketSize
+- **buflen**  要写入的数据长度
 - **return**  实际写入的数据长度或者错误码
 
-.. note:: 有无设置波特率都可以使用该 API,当未设置波特率时,长度无限制,如果设置了波特率则为 wMaxPacketSize
+.. note:: 如果没有开启 CONFIG_USB_DCACHE_ENABLE,则 buffer 需要是 nocache区域,否则需要是对齐到 CONFIG_USB_ALIGN_SIZE 的区域
 
 usbh_serial_read
 """"""""""""""""""""""""""""""""""""
@@ -225,6 +225,8 @@ usbh_serial_read
 - **buflen**  要读取的最大数据长度
 - **return**  实际读取的数据长度或者错误码
 
+.. note::  由于内部使用了 ringbuffer,对于用户的 buffer 属性没有限制。
+
 usbh_serial_cdc_write_async
 """"""""""""""""""""""""""""""""""""
 
@@ -241,6 +243,8 @@ usbh_serial_cdc_write_async
 - **arg**  回调函数参数
 - **return**  0 表示正常其他表示错误
 
+.. note:: 如果没有开启 CONFIG_USB_DCACHE_ENABLE,则 buffer 需要是 nocache区域,否则需要是对齐到 CONFIG_USB_ALIGN_SIZE 的区域。
+
 usbh_serial_cdc_read_async
 """"""""""""""""""""""""""""""""""""
 
@@ -257,6 +261,7 @@ usbh_serial_cdc_read_async
 - **arg**  回调函数参数
 - **return**  0 表示正常其他表示错误
 
+.. note:: 如果没有开启 CONFIG_USB_DCACHE_ENABLE,则 buffer 需要是 nocache区域,否则需要是对齐到 CONFIG_USB_ALIGN_SIZE 的区域。
 
 HID
 -----------------