Rockchip-Plattformreferenz für das RK RT-Thread SDK mit den in der Quelle aufgeführten Chips einschließlich RK2108/RK2118. Unterstützung konkreter ArmSoM-Platinen ist unbestätigt; keine Hardwarevalidierung. Vor Anpassung SoC, SDK/BSP, RT-Thread-Version, Controller, IOMUX, Verdrahtung und Spannungsdomänen prüfen. Befehle und Testergebnisse stammen aus der Quelle, nicht aus ArmSoM-Messungen; keine Hardware- oder Flash-Operationen wurden ausgeführt. Nur das chinesische Original liegt vor; alle vier Sprachen verwenden dessen Abbildungen.
RK-KF-YF-106 · V1.3.0
| SoC | RT-Thread |
|---|---|
| RK2108 / RK625 / RK1808 / RK3308 / RK3358 / RK3568 | 3.1.x+ |
| RK2118 / RK3506 | 4.1.x |
1. Rockchip-MCU-USB
Unterstützt High-Speed mit Full-Speed-/Low-Speed-Kompatibilität, Controller-DMA und Device/OTG je nach Datenblatt. Tabelle 1 zeigt MCU-USB-Funktionen.
| Chip | Controller | Mode | Rate | Transfer |
|---|---|---|---|---|
| RK2108 | DWC2 | Device only | HS/FS; no LS | DMA |
| RK2118 | DWC2 | OTG (Device/Host) | Device HS/FS; Host HS/FS/LS | DMA |
| RK625 | DWC2 | OTG (Device/Host) | Device HS/FS; Host HS/FS/LS | DMA |
Hinweis:
- Device/Host-Wechsel derzeit nur statisch per menuconfig.
- Device standardmäßig High-Speed; Begrenzung auf Full-Speed siehe Geschwindigkeitskonfiguration.
- Für AP-Chips wie RK3308/RK3568 siehe Rockchip_Developer_Guide_USB_CN.
2. Softwareentwicklung
2.1 USB-Quellcodepfade
Die USB-Komponente rt-thread/components/drivers/usb abstrahiert USB2.0 und unterstützt Host/Device. Portierungsschnittstellen binden BSP-HCD (Host Controller Driver) und PCD (Peripheral Controller Driver) direkt an RT-Thread an. Framework-Pfade:
components/drivers/usb/usbdevice/core /* USB Device 核心代码,实现 Device 协议栈 */
components/drivers/usb/usbdevice/class /* USB Device 设备类驱动 */
components/drivers/usb/usbhost/core /* USB Host 核心代码,实现 Host 协议栈 */
components/drivers/usb/usbhost/class /* USB Host 设备类驱动 */
USB-Anpassungspfade, RT-Thread v3.1.x:
bsp/rockchip/common/drivers/drv_usbd.c /* RT-Thread 与 HAL USB Device DWC2 控制 器驱动之间的适配层 */
bsp/rockchip/common/drivers/drv_usbh.c /* RT-Thread 与 HAL USB Host DWC2 控制器 驱动之间的适配层 */
bsp/rockchip/common/drivers/drv_usbhost.c /* RT-Thread 与 HAL USB Host EHCI&OHCI 控制器驱动之间的适配层 */
RT-Thread v4.1.x:
bsp/rockchip/common/drivers/drv_usbd.c /* RT-Thread 与 HAL USB Device DWC2 控制 器驱动之间的适配层 */
bsp/rockchip/common/drivers/drv_usbotgh.c /* RT-Thread 与 HAL USB Host DWC2 控制器 驱动之间的适配层 */
bsp/rockchip/common/drivers/drv_usbhost.c /* RT-Thread 与 HAL USB Host EHCI&OHCI 控制器驱动之间的适配层 */
Unterstützte USB-Device-Klassen:
- CDC-ACM (Communication Device Class — Abstract Control Model), virtuelle serielle Schnittstelle.
- CDC-ECM (Communication Device Class — Ethernet Networking Control Model), USB-Ethernet.
- HID (Human Interface Device): Keyboard/Mouse/General HID/Mediakeyboard.
- MStorage (Mass Storage).
- RNDIS (Remote Network Driver Interface Specification).
- WINUSB (Windows USB), Microsofts generisches USB.
USB-Host-Klassen:
- MStorage (Mass Storage).
- HUB: Basistreiber vorhanden, Funktion in Erprobung.
- HID: Basistreiber vorhanden, Funktion in Erprobung.
2.2 USB-Architektur
Basiert auf RT-Threads I/O-Gerätemodell. Von oben: I/O-Verwaltung, RTT-USB-Komponente, RTT/HAL-Anpassung, HAL-USB-Controllertreiber.

Abbildung des chinesischen Originals (p.7)
Abbildung 1. Anwendungen greifen über I/O-Verwaltung auf Klassentreiber zu und tauschen Daten/Steuerung mit dem Controller aus. I/O-Verwaltung kapselt Klassen mit Standardschnittstellen. RTT USB implementiert Host-/Device-Stacks und Klassen; Klassen nutzen USB Core, der Stack den Adapter. Dieser konfiguriert Rockchip-Hardware, initialisiert per HAL und kapselt HAL als RTT-Funktionen. HAL implementiert Low-Level-Lesen/-Schreiben und unterstützt verschiedene RTOS. Die Quelle verweist zusätzlich auf den RT-Thread-Forenüberblick “USB组件之USB device框架简单概览”.
2.3 USB-Konfiguration
2.3.1 USB-Device-Konfiguration
Device kann eine Schnittstelle oder mehrere als Composite Device anbieten. Mit RT_USB_DEVICE_COMPOSITE aktivieren.
RT-Thread Components --->
Device Drivers --->
Using USB --->
[ ] Using USB host
[*] Using USB device
(4096) usb thread stack size
(0x2207) USB Vendor ID
(0x0007) USB Product ID
[ ] Enable composite device
Device type (Using custom class by register interface) --->
Hinweis:
- Laut Quelle ist 0x2207 Rockchips eindeutige USB-IF-VID, nicht auf andere Hersteller übertragbar. Für Entwicklung/Debugging; ein zu zertifizierendes Produkt muss eine eigene VID über USB-IF-Mitgliedschaft beziehen.
- Product ID 0x0007; als 0x00XX anpassen, oberes Byte null gegen Maskrom-/Loader-Konflikte.
- CDC/MSC/HID/WINUSB/UAC1 nach Bedarf wählen.
- Enable composite device für Kombinationen wie MSC + CDC-ACM; bei Einzelfunktion unnötig.
- Device vor allem für MCU RK2108/RK2118/RK625.
2.3.2 USB-Host-Konfiguration
Host unterstützt derzeit Mass Storage; HUB/HID in Entwicklung. Mass-Storage-Konfiguration:
RT-Thread Components --->
Device Drivers --->
Using USB --->
[*] Using USB host
[*] Enable Udisk Drivers
(/) Udisk mount dir
[ ] Enable HID Drivers
[ ] Using USB device
(4096) usb thread stack size
Host-Anpassung konfigurieren:
RT-Thread rockchip common drivers --->
RT-Thread rockchip USB Host driver --->
[ ] DWC2 HCD Support
[ ] EHCI HCD Support
[ ] OHCI HCD Support
Hinweis:
- Host für MCU/AP. DWC2 oder EHCI + OHCI nach Controller wählen.
- Wegen Adaptergrenzen Using USB host und Using USB device nicht gleichzeitig aktivieren; sonst Fehlfunktion.
2.4 USB Device erzeugen/registrieren
rt_device_register() registriert den Controller in RT-Thread-I/O. Nur Klassen wie HID/MStorage greifen darauf zu, nicht Anwendungen direkt. Klassen können eigene Geräte registrieren; etwa erzeugt components/drivers/usb/usbdevice/class/hid.c hidd per rt_device_register. Erzeugung/Registrierung erfolgt in bsp/rockchip/common/drivers/drv_usbd.c, siehe Abbildung 2.

Abbildung des chinesischen Originals (p.9)
API-/Ablauftext der Abbildung (Originalnamen/Nummerierung; kein ausführbarer Code)
rt_device_register("usbd")
rt_usb_device_init()
rt_usbd_core_init() -> USB message queue / USB device thread
rt_usbd_device_new() -> udevice / cfg_list
rt_device_find("usbd")
rt_usbd_device_set_controller()
rt_usbd_config_new()
rt_usbd_function_create() -> Uclass from class_list (hid_class)
rt_usbd_config_add_function()
rt_usbd_device_set_descriptor()
rt_usbd_device_add_config() -> udevice->cfg_list
rt_device_init()
usb_pcd_init()
Abbildung 2. list_device zeigt USB Device:
msh />list_device
device type ref count
-------- -------------------- ----------
usbd USB Slave Device 0
2.5 USB Host erzeugen/registrieren
Host registriert per rt_device_register(). Ein USBHub-Thread überwacht Ports und enumeriert bei Änderungen. Eine Klassentreiberliste verwaltet Treiber. Adapter: DWC2/EHCI/OHCI, Pfade oben. Abbildung 3 zeigt DWC2.

Abbildung des chinesischen Originals (p.10)
API-/Ablauftext der Abbildung (Originalnamen/Nummerierung; kein ausführbarer Code)
rt_device_register("usbh")
rt_usb_host_init()
rt_usbh_hub_init()
rt_usbh_class_driver_init()
drv = rt_usbh_class_driver_storage()
rt_usbh_class_driver_register()
rt_device_init()
usb_hcd_init()
Abbildung 3. EHCI/OHCI nutzen bsp/rockchip/common/drivers/drv_usbhost.c mit weitgehend gleichem Ablauf. list_device zeigt Host-Geräte:
msh />list_device
device type ref count
-------- -------------------- ----------
usbh USB Host Bus 0
2.6 USB-Device-Beispiele
2.6.1 Geräteverwaltungsschnittstellen
Anwendungen greifen über RT-Thread-I/O-APIs auf USB zu (Tabelle 2):
| Funktion | Beschreibung |
|---|---|
| rt_device_find() | USB finden |
| rt_device_open() | USB öffnen |
| rt_device_read() | USB lesen |
| rt_device_write() | USB schreiben |
| rt_device_control() | USB steuern |
2.6.2 HID-Beispiel
HID unterstützt Keyboard, Mouse, General HID und mediakeyboard. Nach Bedarf wählen. Beispiel RK2108 USB HID Keyboard: scons –menuconfig, HID auswählen.
RT-Thread Components --->
Device Drivers --->
Using USB --->
[ ] Using USB host
[*] Using USB device
(4096) usb thread stack size
(0x2207) USB Vendor ID
(0x0007) USB Product ID
[ ] Enable composite device
Device type (Enable to use device as HID device) --->
[*] Use to HID device as Keyboard
(1) Number of Keyboard(max 3)
[ ] Use to HID device as Mouse
[ ] Use to HID device as General HID device
[ ] Use to HID device as media keyboard
list_device zeigt das HID-Zeichengerät:
msh />list_device
device type ref count
-------- -------------------- ----------
hidd Character Device 0
HID-Erzeugung/-Registrierung:

Abbildung des chinesischen Originals (p.12)
API-/Ablauftext der Abbildung (Originalnamen/Nummerierung; kein ausführbarer Code)
rt_usbd_class_register(hid_class)
rt_device_register("usbd")
rt_usb_device_init()
rt_usbd_function_create() -> rt_usbd_function_hid_create()
rt_usbd_function_new()
rt_usbd_interface_new()
rt_usbd_endpoint_new()
rt_device_register("hidg")
rt_usbd_config_add_function()
rt_usbd_device_set_descriptor()
rt_usbd_device_add_config()
rt_device_init()
usb_pcd_init()
Abbildung 4. HID-Anwendungszugriff:

Abbildung des chinesischen Originals (p.13)
API-/Ablauftext der Abbildung (Originalnamen/Nummerierung; kein ausführbarer Code)
rt_device_find("hidd") -> rt_device_open()
function_enable -> rt_usbd_io_request()
rt_usbd_ep_read_prepare() -> usb_ep_read_prepare()
rt_usbd_ep_out_handler() -> rt_usbd_event_signal() -> usbd_thread
_data_notify() -> _ep_out_handler() -> hid_mq -> hid_thread -> HID_Report_Received()
rt_device_Read -> _hid_read()
rt_device_write -> _hid_write() -> rt_usbd_io_request()
rt_usbd_ep_write() -> usb_ep_write()
Abbildung 5. Referenzen: RT-Thread/IoT_Board-USB-Maus; RT-Thread RK2108 HID. Optimierung: Reportdeskriptor und INT-FIFO begrenzen standardmäßig auf 64 bytes mit geringem Durchsatz. FIFO-Konfiguration auf 1024 bytes je Übertragung anpassen; RK2108-Beispiel unten.
diff --git a/bsp/rockchip/rk2108/board/common/board_base.c b/bsp/rockchip/rk2108/board/common/board_base.c
index 79cc20854..a494d7528 100644
--- a/bsp/rockchip/rk2108/board/common/board_base.c
+++ b/bsp/rockchip/rk2108/board/common/board_base.c
@@ -484,8 +484,8 @@ RT_WEAK struct ep_id g_usb_ep_pool[] =
{ 0x2, USB_EP_ATTR_BULK, USB_DIR_OUT, 512, ID_UNASSIGNED },
{ 0x3, USB_EP_ATTR_ISOC, USB_DIR_IN, 1024, ID_UNASSIGNED },
{ 0x4, USB_EP_ATTR_ISOC, USB_DIR_OUT, 512, ID_UNASSIGNED },
- { 0x5, USB_EP_ATTR_INT, USB_DIR_IN, 64, ID_UNASSIGNED },
- { 0x6, USB_EP_ATTR_INT, USB_DIR_OUT, 64, ID_UNASSIGNED },
+ { 0x5, USB_EP_ATTR_INT, USB_DIR_IN, 1024, ID_UNASSIGNED },
+ { 0x6, USB_EP_ATTR_INT, USB_DIR_OUT, 1024, ID_UNASSIGNED },
{ 0xFF, USB_EP_ATTR_TYPE_MASK, USB_DIR_MASK, 0, ID_ASSIGNED },
};
#endif
diff --git a/components/drivers/include/drivers/usb_common.h b/components/drivers/include/drivers/usb_common.h
index d16b42ea7..2370cdc88 100644
--- a/components/drivers/include/drivers/usb_common.h
+++ b/components/drivers/include/drivers/usb_common.h
@@ -508,7 +508,7 @@ typedef struct uhid_descriptor* uhid_desc_t;
struct hid_report
{
rt_uint8_t report_id;
- rt_uint8_t report[63];
+ ALIGN(32) rt_uint8_t report[1024];
rt_uint8_t size;
};
typedef struct hid_report* hid_report_t;
diff --git a/components/drivers/usb/usbdevice/class/hid.c b/components/drivers/usb/usbdevice/class/hid.c
index f0e75178b..fdb12001e 100644
--- a/components/drivers/usb/usbdevice/class/hid.c
+++ b/components/drivers/usb/usbdevice/class/hid.c
@@ -194,14 +194,14 @@ const rt_uint8_t _report_desc[]=
COLLECTION(1), 0x01,
REPORT_ID(1), HID_REPORT_ID_GENERAL,
- REPORT_COUNT(1), RT_USB_DEVICE_HID_GENERAL_IN_REPORT_LENGTH,
+ REPORT_COUNT(2), 0xff, 0x03,
USAGE(1), 0x03,
REPORT_SIZE(1), 0x08,
LOGICAL_MINIMUM(1), 0x00,
LOGICAL_MAXIMUM(1), 0xFF,
INPUT(1), 0x02,
- REPORT_COUNT(1), RT_USB_DEVICE_HID_GENERAL_OUT_REPORT_LENGTH,
+ REPORT_COUNT(2), 0xff, 0x03,
USAGE(1), 0x04,
REPORT_SIZE(1), 0x08,
LOGICAL_MINIMUM(1), 0x00,
@@ -347,7 +347,7 @@ const static struct uhid_comm_descriptor _hid_comm_desc =
USB_DESC_TYPE_ENDPOINT,
USB_DYNAMIC | USB_DIR_IN,
USB_EP_ATTR_INT,
- 0x40,
+ 1024,
0x01,
},
@@ -357,7 +357,7 @@ const static struct uhid_comm_descriptor _hid_comm_desc =
USB_DESC_TYPE_ENDPOINT,
USB_DYNAMIC | USB_DIR_OUT,
USB_EP_ATTR_INT,
- 0x40,
+ 1024,
0x01,
},
};
@@ -607,7 +607,7 @@ static rt_size_t _hid_write(rt_device_t dev, rt_off_t pos, const void *buffer, r
rt_memcpy((void *)report.report,(void *)buffer,size);
report.size = size;
hiddev->ep_in->request.buffer = (void *)&report;
- hiddev->ep_in->request.size = (size+1) > 64 ? 64 : size+1;
+ hiddev->ep_in->request.size = (size+1) > MAX_REPORT_SIZE ? MAX_REPORT_SIZE : size+1;
hiddev->ep_in->request.req_type = UIO_REQUEST_WRITE;
rt_usbd_io_request(hiddev->func->device, hiddev->ep_in, &hiddev->ep_in->request);
return size;
diff --git a/components/drivers/usb/usbdevice/class/hid.h b/components/drivers/usb/usbdevice/class/hid.h
index 4d0f314a1..ea9938220 100644
--- a/components/drivers/usb/usbdevice/class/hid.h
+++ b/components/drivers/usb/usbdevice/class/hid.h
@@ -34,8 +34,8 @@ extern "C" {
#define USB_HID_REQ_SET_IDLE 0x0a
#define USB_HID_REQ_SET_PROTOCOL 0x0b
-#define MAX_REPORT_SIZE 64
-#define HID_RX_BUFSIZE 64
+#define MAX_REPORT_SIZE 1024
+#define HID_RX_BUFSIZE 1024
/* HID Report Types */
#define HID_REPORT_INPUT 0x01
2.6.3 ADB-Beispiel
RT-Thread bietet ADBD (Android Debug Bridge daemon) für PC-Dateiübertragung/Shell über USB/TCPIP. USB ADB nutzt WINUSB; ADBD greift auf /dev/winusb zu. Dokumentation: https://packages.rt-thread.org/detail.html?package=adbd ; Quellen: https://github.com/heyuanjie87/adbd . USB auf custom class stellen, da WINUSB in packages/adbd-latest/core/adbusb.c implementiert ist. Empfohlene Product ID 0x0006 entspricht Rockchip AP ADB und vermeidet manuelle PC-Treiberinstallation.
RT-Thread Components --->
Device Drivers --->
Using USB --->
-*- Using USB device
(4096) usb thread stack size
(0x2207) USB Vendor ID
(0x0006) USB Product ID
[ ] Enable composite device
Device type (Using custom class by register interface) --->
(X) Using custom class by register interface
ADBD-Onlinepakete konfigurieren:
[*] Enable RT-Thread online packages --->
RT-Thread online packages --->
tools packages --->
[*] ADBD: Android Debug Bridge daemon implementation in RT-Thread --
->
[ ] Using TCPIP transfer
[*] Using USB transfer
(1280) Set transfer thread stack size
[*] Enable Shell service
[*] Enable File service
(2304) Set file service thread stack size
(2000) Set file service receive timeout(ms)
[ ] Enable external MOD
[ ] Enable ADB service discover
Version (latest) --->
Using TCPIP transfer deaktivieren, sonst nutzt ADBD standardmäßig TCPIP statt USB. Benötigtes POSIX konfigurieren:
RT_USING_LEGACY [=y]
RT_USING_DFS [=y]
DFS_USING_POSIX [=y]
RT_USING_POSIX_FS [=y]
RT_USING_POSIX_DEVIO [=y]
RT_USING_POSIX_STDIO [=y]
RT_USING_POSIX_POLL [=y]
RT_USING_POSIX_SELECT [=y]
RT_USING_POSIX_SOCKET [=y]
Dateisystem für ADB push/pull nach MSC-Mounttabellenabschnitt konfigurieren. Speichern, verlassen und ADBD-Onlinepakete herunterladen.
RK2118-SDK-Beispiel:
~/rt-thread/bsp/rockchip/rk2118$ source ~/.env/env.sh
~/rt-thread/bsp/rockchip/rk2118$ pkgs --update
[Use Gitee server - auto decision based on IP location]
Cloning into '/home/wlf/rt-thread/bsp/rockchip/rk2118/packages/adbd-latest'...
remote: Enumerating objects: 42, done.
remote: Counting objects: 100% (42/42), done.
remote: Compressing objects: 100% (39/39), done.
remote: Total 42 (delta 2), reused 37 (delta 2), pack-reused 0
Receiving objects: 100% (42/42), 10.13 MiB | 1.74 MiB/s, done.
Resolving deltas: 100% (2/2), done.
==============================> ADBD latest is downloaded successfully.
/home/wlf/rt-thread/bsp/rockchip/rk2118/packages/adbd-latest
==============================> adbd update done
Operation completed successfully.
ADBD-Paketquellen an Rockchip anpassen:
diff --git a/core/adbusb.c b/core/adbusb.c
index 29455d0..034e9bb 100644
--- a/core/adbusb.c
+++ b/core/adbusb.c
@@ -232,7 +232,7 @@ static rt_err_t _ep_out_handler(ufunction_t func, rt_size_t size)
static rt_err_t _ep_in_handler(ufunction_t func, rt_size_t size)
{
winusb_device_t wd = (winusb_device_t)func->user_data;
- wd->wrcnt -= size;
+ wd->wrcnt -= wd->ep_in->request.size;
rt_wqueue_wakeup(&(wd->wq), (void *)POLLOUT);
return RT_EOK;
@@ -284,13 +284,12 @@ static rt_err_t _interface_handler(ufunction_t func, ureq_t setup)
return RT_EOK;
}
-#ifdef RT_USING_POSIX
static int _ep_alloc_request(uep_t ep)
{
int size;
size = EP_MAXPACKET(ep);
- ep->buffer = rt_malloc(size);
+ ep->buffer = rt_malloc_align(RT_ALIGN(size, USB_DMA_ALIGN_SIZE),
USB_DMA_ALIGN_SIZE);
if (!ep->buffer)
return -1;
@@ -300,7 +299,6 @@ static int _ep_alloc_request(uep_t ep)
return 0;
}
-#endif
static rt_err_t _function_enable(ufunction_t func)
{
@@ -316,7 +314,7 @@ static rt_err_t _function_enable(ufunction_t func)
return -1;
if (_ep_alloc_request(wd->ep_in) != 0)
{
- rt_free(wd->ep_out->buffer);
+ rt_free_align(wd->ep_out->buffer);
return -1;
}
_readreq(func, wd);
@@ -331,8 +329,8 @@ static rt_err_t _function_disable(ufunction_t func)
RT_ASSERT(func != RT_NULL);
wd = func->user_data;
- rt_free(wd->ep_out->buffer);
- rt_free(wd->ep_in->buffer);
+ rt_free_align(wd->ep_out->buffer);
+ rt_free_align(wd->ep_in->buffer);
wd->ep_out->buffer = 0;
wd->ep_in->buffer = 0;
diff --git a/services/shell_service.c b/services/shell_service.c
index 6252942..80e6cb0 100644
--- a/services/shell_service.c
+++ b/services/shell_service.c
@@ -344,6 +344,7 @@ static bool send_ready(struct shell_ext *ext, char *args)
extern int libc_stdio_set_console(const char* device_name, int mode);
extern int libc_stdio_get_console(void);
+extern int ioctl(int fildes, int cmd, ...);
static int _shell_open(struct adb_service *ser, char *args)
{
winusb und Dateisystem mit list_device und mount prüfen.
msh />list_device
device type ref count
-------- -------------------- ----------
winusb Miscellaneous Device 0
usbd USB Slave Device 0
root Block Device 1
snor MTD Device 0
fspi0 Character Device 0
i2c0 I2C Bus 0
pin Pin Device 0
uart0 Character Device 2
msh />mount
filesystem device mountpoint
---------- ------ ----------
devfs (NULL) /dev
elm root /
PC-ADB-Werkzeuge/-Treiber liegen in adbd-latest/tools. adb push/pull und adb shell werden unterstützt; Shell-Einstieg schaltet die Konsole von UART auf USB.
2.6.4 MSC-Beispiel
MSC (Mass Storage Class) stellt das Gerät am PC als USB-Wechseldatenträger dar. RK2108-Beispiel: scons –menuconfig, Mass Storage device wählen.
RT-Thread Components --->
Device Drivers --->
Using USB --->
[*] Using USB device
(4096) usb thread stack size
(0x2207) USB Vendor ID
(0x0007) USB Product ID
[ ] Enable composite device
Device type (Enable to use device as Mass Storage device) --
->
(root) msc class disk name
(4096) msc buffer length
Hinweis:
- msc class disk name manuell auf root setzen.
- CONFIG_RT_USING_DFS_MNTTABLE aktivieren.
- Größeres msc buffer length verbessert meist Durchsatz; Bereich 512–65536. MSC benötigt eine automatische Mounttabelle; sonst kann Enumeration funktionieren, Lesen/Schreiben aber scheitern. SDK unterstützt Littlefs und FAT/EXFAT. Dateisystem in menuconfig aktivieren und Platinen-mnt.c anlegen. Beispiel:
RT_USING_DFS [=y] #文件系统总开关 DFS_FILESYSTEMS_MAX [=2] #最大允许的挂载节点数目(即分区数目),因为devfs要占用一个,所以这 个值要>=(需要挂载的物理分区+1) DFS_FILESYSTEM_TYPES_MAX [=2] #最大允许的文件系统数目,支持elmfat和devfs,所以是2 DFS_FD_MAX [=16] #最大可同时操作的文件句柄
RT_USING_DFS_MNTTABLE [=y] #启用自动挂载表
RT_USING_DFS_ELMFAT [=y] #启用elmfat文件系统,兼容fat文件系统
RT_USING_DFS_DEVFS [=y] #启用设备文件系统,可以通过文件接口访问设备驱动
RT_DFS_ELM_MAX_SECTOR_SIZE [=4096] # 设置扇区大小为4096,以兼容底层spi flash的擦除块大 小
RK2108-EVB-Referenz: bsp/rockchip/rk2108/board/rk2108d_evb/mnt.c
#ifdef RT_USING_DFS_MNTTABLE
#include <dfs_fs.h>
#define PARTITION_ROOT "root"
/********************* Private Variable Definition ***************************/
/** @defgroup MNT_Private_Variable Private Variable
* @{
*/
/**
* @brief Config mount table of filesystem
* @attention The mount_table must be terminated with NULL, and the partition's
name
* must be the same as above.
*/
const struct dfs_mount_tbl mount_table[] =
{
{PARTITION_ROOT, "/", "elm", 0, 0},
#if defined(RT_USING_LITTLEFS) && defined(RT_USING_SPINAND)
{"spinand0", "/nand", "lfs", 0, 0},
#elif defined(RT_USING_SDIO0) && defined(RT_SDCARD_MOUNT_POINT)
{"sd0", RT_SDCARD_MOUNT_POINT, "elm", 0, 0},
#endif
{0}
};
#endif
Struktur dfs_mount_tbl:
/* mount table */
struct dfs_mount_tbl
{
const char *device_name; /* 设备节点名 */
const char *path; /* 挂载点目录 */
const char *filesystemtype; /* 文件系统名字(elm对应fat) */
unsigned long rwflag; /* rw(1为读写,0为只读,elm不支持这个标识,填0) */
const void *data; /* 文件系统私有数据(elm不支持,填0) */
};
MSC-Betrieb:
Nach Start ohne PC ist root lokal les-/schreibbar eingehängt. Bei USB-Verbindung hängt der Treiber lokal aus; das Gerät kann nicht zugreifen, der PC sieht das USB-Laufwerk. Beim Trennen hängt der Treiber root aus und wieder lokal ein.
2.6.5 UAC1-Beispiel
UAC (USB Audio Class) macht das Gerät zur externen Soundkarte. SDK unterstützt nur V1.0, nicht V2.0. v3.1.x-Konfiguration:
RT-Thread Components --->
Device Drivers --->
Using USB --->
[ ] Using USB host
[*] Using USB device
(4096) usb thread stack size
(0x2207) USB Vendor ID
(0x0019) USB Product ID
[ ] Enable composite device
Device type (Enable to use device as UAC1 device) --->
(es8388p) uac1 playback card name
(pdmc) uac1 capture card name
[ ] Enable to use pll compensation for clock synchronization
UAC1-Konfiguration, RT-Thread v4.1.x:
RT-Thread Components --->
Device Drivers --->
Using USB --->
[ ] Using USB host
[*] Using USB device
(4096) usb thread stack size
(0x2207) USB Vendor ID
(0x0019) USB Product ID
[ ] Enable composite device
Device type (Enable to use device as UAC1 device) --->
(es8388p) uac1 playback card name
(pdmc) uac1 capture card name
[ ] Enable to poll ep first transfer status
UAC1 + HID Composite (RT-Thread v4.1.x). Hinweise:
- Bei UAC1 VAD deaktivieren: # CONFIG_RT_USING_VAD is not set.
- RT_USB_AUDIO_P_NAME muss zum Wiedergabegerät passen; Hardware beachten, RK2108-Referenz es8388p.
- RT_USB_AUDIO_C_NAME muss zum Aufnahmegerät passen; RK2108-Referenz pdmc.
- RT_USB_AUDIO_PLL_COMPENSATION passt den Gerätetakt bei Wiedergabe dynamisch an. Unterschiedliche Host-SOF-/I2S-Takte verursachen overrun/underrun. Kompensation passt die Verarbeitung unabhängig von Windows/Linux/MAC OS an die Host-Rate an. SoC-spezifische Taktsoftware ist erforderlich und eventuell hardwarebegrenzt; derzeit vor allem RK2108.
- RT_USB_AUDIO_USING_EP_POLL erkennt Streamstart per HAL-Polling statt Interrupt. Für UAC1 + HID standardmäßig empfohlen gegen hostabhängige Interruptstürme. Polling erhöht Latenz: EP_STATUS_POLL_INTERVAL_MS standardmäßig 5ms; bei Bedarf anpassen.
- v3.1.x hat standardmäßig kein Polling; Patch https://redmine.rock-chips.com/attachments/1217535 . Fehlendes Wiedergabegerät erlaubt Enumeration ohne Ton; fehlendes Aufnahmegerät verursacht fault. Vor UAC1 Sound per list_device prüfen. Hier nennt die Quelle es8311p/pdmc (oben es8388p). Falls fehlend Audio in menuconfig aktivieren.
msh />list_device
device type ref count
------- -------------------- ----------
es8311c Sound Device 0
es8311p Sound Device 1
audpwmp Sound Device 0
pdmc Sound Device 0
adcc Sound Device 0
usbd USB Slave Device 0
root Block Device 1
snor MTD Device 0
pwm0 Miscellaneous Device 0
dmac0 Miscellaneous Device 0
i2c0 I2C Bus 0
pin Miscellaneous Device 0
uart2 Character Device 0
uart0 Character Device 2
2.6.6 UVC-Beispiel
UVC dient als USB-Videoaufnahmegerät. Rockchip RT-Thread implementiert UVC 1.1, MJPEG/YUYV und bis zu drei Composite-Kanäle. Grenzen:
- Nur BULK, kein ISOC.
- Nur RK625.
UVC-Konfiguration:
RT-Thread Components --->
Device Drivers --->
Using USB --->
[*] Using USB device
(4096) usb thread stack size
(0x2207) USB Vendor ID
(0x0007) USB Product ID
[*] Enable composite device
[*] Enable to use device as UVC device
[*] Use to UVC device as RGB
[ ] Use to UVC device as DEPTH
[ ] Use to UVC device as IR
(10240) uvc device max buffer length
Hinweis:
- RGB/DEPTH/IR nach Hardware konfigurieren. RK625: RGB UVC; RK625 + RK1608: drei Kanäle.
- uvc device max buffer length: 4K–16K. UVC basiert auf USB Framework mit Thread, Treiber, Pufferverwaltung und Ausnahmebehandlung:

Abbildung des chinesischen Originals (p.23)
Abbildung 6. UVC-Architektur.
Jeder Kanal besitzt einen VC/VS-Thread. Der Treiber definiert Deskriptoren/Auflösungen, verwaltet Pufferzustände, plant Videoübertragungen und behandelt Ausnahmen. Thread/Treiber kommunizieren per OS Event, UVC/USB per USB IO. Gerät verbinden, Camera in Host-Vorschau öffnen und UART-Logs nach Initialisierung prüfen:
[...1...]
INF: uvc(1) set format fcc 1196444237 width 640 height 480
VIDEO_OPEN(1)
INF: uvc(1) open camera device...
Open camera id width height 1 640 480
[...2...]
INF: uvc(1) buffer(0) addr 0x2006787c
INF: uvc(1) buffer(1) addr 0x2006987c
INF: uvc(1) buffer(2) addr 0x2006b87c
INF: uvc(1) buffer(3) addr 0x2006d87c
INF: uvc(1) mjpeg header addr 0x20087c00
INF: uvc(1) buffer size 8064
[...]
[...3...]
VIDEO_CLOSE(1)
INF: uvc(1) close camera device...
Close camera id 1
close rgb success
[...]
[...4...]
uvc(1) buffer: (0-1) (1-1) (2-1) (3-2)
ERR: uvc(1) buffer overflow irq 0x000100f0
Log 1: FCC, Breite/Höhe. Log 2: Ringpufferzahl, Adressen/Größen, bei MJPEG zusätzlich Headerpuffer. Danach starten Sensordaten Planung/Host-Transfer. Log 3: Host schließt Camera. Log 4: AMCAP/GUVCView senden beim Beenden eventuell nur EP Halt statt CloseCamera. Dies löst UVC Buffer Overflow aus; der Manager schließt den Kanal und stoppt USB.
2.6.7 WINUSB-Beispiel
WINUSB ist Windows’ generischer USB-Treiber für Bulk ohne separate Treiberinstallation. Konfiguration:
RT-Thread Components --->
Device Drivers --->
Using USB --->
[ ] Using USB host
[*] Using USB device
(4096) usb thread stack size
(0x2207) USB Vendor ID
(0x0007) USB Product ID
[ ] Enable composite device
Device type (Enable to use device as winusb device) --->
({6860DC3C-C05F-4807-8807-1CA861CC1D66}) Guid for winusb
(16384) winusb transfer length
list_device zeigt WINUSB:
msh />list_device
device type ref count
-------- -------------------- ----------
winusb Miscellaneous Device 0
usbd USB Slave Device 0
Rockchip-PC-Testdemo: https://redmine.rock-chips.com/attachments/1213728
2.6.8 CDC_VCOM-Beispiel
CDC_VCOM implementiert einen virtuellen USB-Port nach CDC-ACM zum Host-Senden/Empfangen. Konfiguration:
RT-Thread Components --->
Device Drivers --->
Using USB --->
[ ] Using USB host
[*] Using USB device
(4096) usb thread stack size
(0x2207) USB Vendor ID
(0x0007) USB Product ID
[ ] Enable composite device
Device type (Enable to use device as CDC device) --->
(512) virtual com thread stack size
(128) virtual com rx buffer size
[ ] Enable to use dma for vcom tx
(32021919830108) serial number of virtual co
(14) serial number length of virtual com
(1000) tx timeout(ticks) of virtual com
RT-Thread-3.1.x-Änderungen für USB system console:
diff --git a/components/libc/compilers/newlib/libc.c b/components/libc/compilers/newlib/libc.c
index 2234c36f98..07ba2bafeb 100644
--- a/components/libc/compilers/newlib/libc.c
+++ b/components/libc/compilers/newlib/libc.c
@@ -23,6 +23,7 @@ int _EXFUN(putenv,(char *__string));
int libc_system_init(void)
{
+ rt_console_set_device("vcom");
#if defined(RT_USING_DFS) & defined(RT_USING_DFS_DEVFS) & defined(RT_USING_CONSOLE)
rt_device_t dev_console;
@@ -47,4 +48,4 @@ int libc_system_init(void)
return 0;
}
-INIT_COMPONENT_EXPORT(libc_system_init);
+INIT_APP_EXPORT(libc_system_init);
USB system console unter RT-Thread 4.1.x benötigt POSIX:
RT_USING_POSIX_FS [=y]
RT_USING_POSIX_DEVIO [=y]
RT_USING_POSIX_STDIO [=y]
diff --git a/components/libc/posix/io/stdio/libc.c b/components/libc/posix/io/stdio/libc.c
index cc891574f3..b12e24610b 100644
--- a/components/libc/posix/io/stdio/libc.c
+++ b/components/libc/posix/io/stdio/libc.c
@@ -20,6 +20,7 @@
int libc_system_init(void)
{
+ rt_console_set_device("vcom");
#ifdef RT_USING_POSIX_STDIO
rt_device_t dev_console;
@@ -31,7 +32,8 @@ int libc_system_init(void)
#endif /* RT_USING_POSIX_STDIO */
return 0;
}
-INIT_COMPONENT_EXPORT(libc_system_init);
+INIT_APP_EXPORT(libc_system_init);
CDC_VCOM-Kompatibilität: Rockchip empfängt Host-Daten, kann aber nicht korrekt zurücksenden. Lösung:
Subject: [PATCH] [COMPONENTS]: drivers: usb: cdc_vcom: Fix connected state
The current cdc vcom driver depends the setup wValue of
the request CDC_SET_CONTROL_LINE_STATE to set the connected
state. Refer to CDC Spec V1.2 Chapter 6.3.12 SetControlLineState,
the Bit0 of the wValue is used to indicates to DCE if DTE
(Data Terminal Equipment, for example, a Personal Computer)
is present or not. However, some DTE always set the Bit0 of
the wValue to 0, this cause cdc vcom failed to send message to
DTE. This patch ignores the Bit0 of wValue, and set the
connected state to true directly if it receives the request
CDC_SET_CONTROL_LINE_STATE.
diff --git a/components/drivers/usb/usbdevice/class/cdc_vcom.c b/components/drivers/usb/usbdevice/class/cdc_vcom.c
index df5e03f54c..e201742747 100644
--- a/components/drivers/usb/usbdevice/class/cdc_vcom.c
+++ b/components/drivers/usb/usbdevice/class/cdc_vcom.c
@@ -463,7 +463,7 @@ static rt_err_t _interface_handler(ufunction_t func, ureq_t setup)
_cdc_get_line_coding(func->device, setup);
break;
case CDC_SET_CONTROL_LINE_STATE:
- data->connected = (setup->wValue & 0x01) > 0?RT_TRUE:RT_FALSE;
+ data->connected = RT_TRUE;
RT_DEBUG_LOG(RT_DEBUG_USB, ("vcom state:%d \n", data->connected));
dcd_ep0_send_status(func->device->dcd);
break;
2.6.9 Device-Geschwindigkeit
Standard ist High speed. Für erzwungenes Full speed, etwa UAC, #define RT_USING_USBD_SPEED_FULL setzen.
2.6.10 Endpunkt-FIFO-Konfiguration
FIFOs sind Controllerressourcen: Alle Rx-Endpunkte teilen RxFIFO, jeder Tx hat eigenes TxFIFO. Konfiguration im DWC2-Device-Adapter und Boardcode. RK2118: rt-thread/bsp/rockchip/rk2118/board/common/board_base.c, g_usb_ep_pool für gleichzeitig 2 BULK, 2 ISOC, 2 INT. Andere Composite-Geräte entsprechend Anzahl/Typ anpassen.
#ifdef RT_USING_USB_DEVICE
RT_WEAK struct ep_id g_usb_ep_pool[] =
{
{ 0x0, USB_EP_ATTR_CONTROL, USB_DIR_INOUT, 64, ID_ASSIGNED },
{ 0x1, USB_EP_ATTR_BULK, USB_DIR_IN, 1024, ID_UNASSIGNED },
{ 0x2, USB_EP_ATTR_BULK, USB_DIR_OUT, 512, ID_UNASSIGNED },
{ 0x3, USB_EP_ATTR_ISOC, USB_DIR_IN, 1024, ID_UNASSIGNED },
{ 0x4, USB_EP_ATTR_ISOC, USB_DIR_OUT, 512, ID_UNASSIGNED },
{ 0x5, USB_EP_ATTR_INT, USB_DIR_IN, 64, ID_UNASSIGNED },
{ 0x6, USB_EP_ATTR_INT, USB_DIR_OUT, 64, ID_UNASSIGNED },
{ 0xFF, USB_EP_ATTR_TYPE_MASK, USB_DIR_MASK, 0, ID_ASSIGNED },
};
#endif
HAL-FIFO: rt-thread/bsp/rockchip/common/drivers/drv_usbd.c. HAL_PCDEx_SetRxFiFo setzt RxFIFO, HAL_PCDEx_SetTxFiFo TxFIFO; beide in 4-Byte-Einheiten.
static void usb_pcd_lowlevel_hw_init(struct PCD_HANDLE *pcd)
{
uint8_t i;
/* Initialize Low Level Driver */
HAL_PCD_Init(pcd);
#ifndef RT_USB_DEVICE_UVC
HAL_PCDEx_SetRxFiFo(pcd, 0x118);
#else
/*
* Set smaller RxFiFo for 3 * UVC interfaces, then
* it can assign enough TxFiFo size (1024 Bytes)
* for each UVC streaming IN endpoint to get higher
* performance.
*/
HAL_PCDEx_SetRxFiFo(pcd, 0x8C);
#endif
/* Set TxFIFOs according to the g_usb_ep_pool array */
for (i = 0; i < pcd->cfg.epNum + 1; i++)
{
if (g_usb_ep_pool[i].addr == 0xFF)
break;
if (g_usb_ep_pool[i].dir == USB_DIR_IN || g_usb_ep_pool[i].dir ==
USB_DIR_INOUT)
HAL_PCDEx_SetTxFiFo(pcd, g_usb_ep_pool[i].addr,
(g_usb_ep_pool[i].maxpacket >> 2));
}
HAL_PCD_Start(pcd);
}
2.6.11 VBUS-Erkennung
Drei Verfahren:
- GPIO: USB_VBUS_PIN; RK2118 evb, rt-thread/bsp/rockchip/rk2118/board/evb/board.h.
- PMIC: RT_USING_USB_PMIC_VBUS; RK2108 recording_pen, rt-thread/bsp/rockchip/rk2108/board/recording_pen_v10/board.h.
- USB PHY: RT_USING_BVALID_IRQ; RK2118 iotest, rt-thread/bsp/rockchip/rk2118/board/iotest/board.h.
2.7 USB-Host-Beispiele
2.7.1 Host-MSC-Beispiel
Host-MSC-Komponente konfigurieren:
RT-Thread Components --->
Device Drivers --->
Using USB --->
[*] Using USB host
[*] Enable Udisk Drivers
(/) Udisk mount dir (NEW)
[ ] Enable HID Drivers (NEW)
[ ] Using USB device
(4096) usb thread stack size
Host-Adapter nach tatsächlichem Controller und RT-Thread-Version konfigurieren. v3.1.x:
RT-Thread rockchip common drivers --->
RT-Thread rockchip USB Host driver --->
[ ] DWC2 HCD Support
[ ] EHCI HCD Support
[ ] OHCI HCD Support
Hinweis:
- DWC2 HCD Support wählt den DWC2-Adapter.
- EHCI HCD Support und OHCI HCD Support wählen USB2-Host-EHCI/OHCI.
Ab v4.1.x liegt die Adapterkonfiguration statt im allgemeinen Plattformtreiber im Chiptreiber, um mehrere Host-Ports gleichzeitig zu unterstützen. RK3506 mit OTG0/1 als Hosts:
RT-Thread rockchip RK3506 drivers --->
Enable USB HOST --->
[*] Enable USB OTG HOST
[*] Enable USB OTG0 HOST
[*] Enable USB OTG1 HOST
Für MSC erforderliche Dateisystemkonfiguration:
RT-Thread Components --->
[*] DFS: device virtual file system ----
[*] Enable elm-chan fatfs
elm-chan's FatFs, Generic FAT Filesystem Module --->
RT-Thread unterstützt derzeit nur FAT-32-USB-Laufwerke. Cache-Konfiguration:
RT-Thread rockchip common drivers --->
[*] Enable cache
Host-MSC-Registrierung/Enumeration:

Abbildung des chinesischen Originals (p.31)
API-/Ablauftext der Abbildung (Originalnamen/Nummerierung; kein ausführbarer Code)
rt_device_register("usbh")
rt_usb_host_init()
rt_usbh_hub_init()
rt_usbh_class_driver_init()
rt_usbh_class_driver_register()
rt_device_init()
usb_hcd_init()
rt_usbh_hub_port_change()
rt_usbh_alloc_instance()
rt_usbh_hub_get_port_status()
rt_usbh_attach_instance()
rt_usbh_class_driver_find()
rt_usbh_class_driver_enable()
Abbildung 7. MSC-Anwendungszugriff:

Abbildung des chinesischen Originals (p.31)
API-/Ablauftext der Abbildung (Originalnamen/Nummerierung; kein ausführbarer Code)
open()
read() -> dfs_file_read() -> dfs_elm_read() -> f_read() -> disk_read()
-> rt_device_read() -> rt_udisk_read() -> rt_usb_hcd_pipe_xfer() -> drv_pipe_xfer()
write() -> dfs_file_write() -> dfs_elm_write() -> f_write() -> disk_write()
-> rt_device_write() -> rt_udisk_write() -> rt_usb_hcd_pipe_xfer() -> drv_pipe_xfer()
Abbildung 8. Anwendungszugriff auf MSC.
2.7.2 Host-VBUS-Steuerung
VBUS-5V-Ausgabe lässt sich per GPIO steuern. Entsprechendes GPIOBANK_PIN im Boardheader ergänzen.
- USB2.0-OTG-Host-VBUS-GPIO: RK3506 EVB1, bsp/rockchip/rk3506-32/board/evb1/board.h.
#define USB_OTG_HOST0_VBUS_PIN BANK_PIN(GPIO_BANK1, 20)
#define USB_OTG_HOST1_VBUS_PIN BANK_PIN(GPIO_BANK1, 24)
- USB2.0-Host-VBUS-GPIO: RK3568 EVB1, bsp/rockchip/rk3568-32/board/rk3568_evb1/board.h.
#define USB_HOST_VBUS_PIN BANK_PIN(GPIO_BANK0, 6)
