USB 功能簡(jiǎn)介
USB 功能模塊包括了USB Host,USB Device 和OTG 功能。
USB Host 目前已經(jīng)支持上的功能有:Mass Storage,UVC。
USB Device 目前已經(jīng)支持上的功能有:ADB,UAC。
OTG 主要用作Host 與Device 的切換,如當(dāng)板子通過 USB 線連接到 USB 主機(jī) (PC) 上時(shí),
此時(shí) OTG 是加載成 USB Device;若當(dāng)前板子是通過 OTG 線連接一個(gè)USB 設(shè)備,此時(shí) OTG 則加載
成 USB Host。
USB 外設(shè)特性
- Complies with USB 2.0 Specification
- Supports High-Speed (HS, 480-Mbps), Full-Speed (FS, 12-Mbps), and Low-Speed (LS, 1.5-Mbps) in Host mode
- Supports High-Speed (HS, 480 Mbps), Full-Speed (FS, 12 Mbps) in Device mode
- Supports the UTMI+ Level 3 interface. The 8-bit bidirectional data buses are used
- Supports bi-directional endpoint0 for Control transfer
- Supports up to 8 User-Configurable Endpoints for Bulk, Isochronous and Interrupt bi-directional transfers (Endpoint1, Endpoint2, Endpoint3, Endpoint4)
- Supports up to (4KB+64Bytes) FIFO for EPs (Including EP0)
- Supports High-Bandwidth Isochronous & Interrupt transfers
- Automated splitting/combining of packets for Bulk transfers
- Supports point-to-point and point-to-multipoint transfer in both Host and Peripheral mode
- Includes automatic ping capabilities
- Soft connect/disconnect function
- Performs all transaction scheduling in hardware
- Power Optimization and Power Management capabilities
- Includes interface to an external Normal DMA controller for every Eps
USB 配置介紹
SYS_CONFIG.FEX
配置說明
sys_config.fex 中主要是對(duì) OTG 功能進(jìn)行配置,各個(gè)配置的含義可如下所示:
Key
Value
[usbc0]
控制器0的配置。
usb_used:
USB使能標(biāo)志。置1,表示系統(tǒng)中USB模塊可用,置0,則表示系統(tǒng)USB禁用。
usb_port_type
USB端口的使用情況。 0: device only;1: host only;2: OTG;usb_detect_type: USB
usb_detect_mode
USB端口的檢查方式。0: 線程輪詢;1: id中斷觸發(fā)
usb_id_gpio
USB ID pin腳配置。具體請(qǐng)參考gpio配置說明。
usb_det_vbus_gpio
USB DET_VBUS pin腳配置。具體請(qǐng)參考gpio配置說明。
usb_drv_vbus_gpio
USB DRY_VBUS pin腳配置。具體請(qǐng)參考gpio配置說明。
usb_drv_vbus_type
vbus設(shè)置方式。0: 無; 1: gpio; 2: axp。
usb_det_vbus_gpio
"axp_ctrl",表示axp 提供。
usbh_driver_level
usb驅(qū)動(dòng)能力等級(jí)
usbh_irq_flag
usb中斷標(biāo)志
示例:
;--------------------------------
;--- USB0控制標(biāo)志
;--------------------------------
[usbc0]
usb_used = 1
usb_port_type = 2
usb_detect_type = 1
usb_detect_mode = 0
usb_id_gpio = port:PB04< 0 >< 0 >< default >< default >
usb_det_vbus_gpio = port:PA24< 0 >< 0 >< default >< default >
usb_drv_vbus_gpio = port:PA29< 1 >< 0 >< default >< default >
usb_drv_vbus_type = 1
usbh_driver_level = 5
usbh_irq_flag = 0
RTOS MENUCONFIG 配置說明
- 使能USB 驅(qū)動(dòng)
?> Drivers Options? > soc related device drivers ? > USB Drivers [*] USB
- 使能OTG
?> Drivers Options? > soc related device drivers ? > USB Drivers [*] USB_MANAGER
- 使能USB Host
使能完USB Host 之后,還需要選擇:OHCI 與EHCI(一共有0 和1 兩組,對(duì)于R128 來說,只需要使能USB0)。另外,還要選擇功能驅(qū)動(dòng)(Mass Storage,UVC),不然只是使能USB Host 則無法正常運(yùn)行USB Host 的功能。
USB Host 控制器驅(qū)動(dòng)配置如下:
USB Host
? > Drivers Options
? > soc related device drivers
? > USB Drivers
[*] USB_HOST
OHCI
? > Drivers Options
? > soc related device drivers
? > USB Drivers
? > USB HOST
[*] USB_OHCI_0
EHCI
? > Drivers Options
? > soc related device drivers
? > USB Drivers
? > USB HOST
[*] USB_EHCI_0
- 使能USB Device
USB Device 除了UDC 的使能之外,也需要選擇對(duì)應(yīng)的功能驅(qū)動(dòng)Gadget 以及功能驅(qū)動(dòng)對(duì)應(yīng)的上層應(yīng)用。
USB Device 控制器驅(qū)動(dòng)配置如下:
USB Device
? > Drivers Options
? > soc related device drivers
? > USB Drivers
[*] USB_DEVICE
USB Device使能dma通信
? > Drivers Options
? > soc related device drivers
? > USB Drivers
? > USB DEVICE
[*] UDC_USE_DMA
USB 源碼結(jié)構(gòu)
lichee/rtos?hal/hal/source/usb
├── common/
├── core/
├── gadget/
│ ├── function/
├── hid/
│ ├── Class/
│ ├── Client/
│ │ ├── KeyBoard/
│ │ └── Mouse/
│ ├── Include/
├── host/
├── include/
├── manager/
├── platform/
├── storage/
│ ├── Class/
│ ├── Disk/
│ ├── include/
│ └── Misc/
├── udc/
└── uvc/
├── Class/
├── drv_webcam/
│ ├── dev_cfg/
│ └── webcam_core/
├── Include/
├── Misc/
└── Webcam/
- common: USB 驅(qū)動(dòng)初始化公用文件。
- core: USB Host 驅(qū)動(dòng)框架層文件。
- gadget: USB Deivce 功能驅(qū)動(dòng)gadget 驅(qū)動(dòng)總?cè)肟谖募琭unction 則是各個(gè)功能驅(qū)動(dòng)的驅(qū)動(dòng)文件。
- hid: USB Host HID 協(xié)議及驅(qū)動(dòng)文件。
- host: USB Host 硬件控制器驅(qū)動(dòng)。
- include: USB 公用頭文件。
- manager: USB OTG 驅(qū)動(dòng)。
- platform: 不同平臺(tái)的配置文件。
- storage: USB Host Mass Storage 協(xié)議及驅(qū)動(dòng)文件。
- udc: USB Deivce 硬件控制器驅(qū)動(dòng)。
- uvc: USB Host UVC 協(xié)議及驅(qū)動(dòng)文件。
USB 常用功能說明
配置OTG 功能
OTG 功能下,需要根據(jù)USB ID 腳去進(jìn)行Device/Host 模式的切換;如果需要支持NULL 模式(既不加載Device 也不加載Host 驅(qū)動(dòng)), 那么還需要VBUS 狀態(tài)檢測(cè)引腳。
涉及到的主要改動(dòng)點(diǎn):
在sys_config.fex,修改如下配置:
usb_port_type配置為2,即OTG模式。
usb_id_gpio配置對(duì)應(yīng)的USB ID引腳。
usb_det_vbus_gpio, 需要根據(jù)實(shí)際情況進(jìn)行配置:
1.如果需要檢測(cè)VBUS狀態(tài),則按下面情況進(jìn)行配置:
配置成對(duì)應(yīng)的gpio即可。
2.如果不需要檢測(cè)VBUS狀態(tài)(缺少NULL模式)
那么直接填寫USB ID的gpio配置(也就是VBUS與ID狀態(tài)一致)。
USB OTG 驅(qū)動(dòng),會(huì)根據(jù)ID 和VBUS 的狀態(tài),自動(dòng)切換成對(duì)應(yīng)的模式。
Device
- ID 腳一般情況下為高電平,只有接入OTG 線時(shí)會(huì)拉低;
- VBUS 為1 表示micro USB 口有接入外部電源;
- 一般不會(huì)出現(xiàn)ID 為0,VBUS 為1 的情況。這表示接入OTG 線,但是還檢測(cè)到VBUS;
- 如果沒有VBUS 檢測(cè),ID 只有0 和1 的兩種情況, 也就是說要么加載device 驅(qū)動(dòng),要么加載host 驅(qū)動(dòng); 這會(huì)帶來一些影響:usb 相關(guān)時(shí)鐘一直被打開,導(dǎo)致有一定功耗,以及硬件射頻。
USB GADGET 功能配置
USB Gadget 支持眾多功能,它們的配置方法比較類似,只需要在mrtos_menuconfig 中選上對(duì)應(yīng)的Gadget 功能驅(qū)動(dòng)即可在系統(tǒng)初始化時(shí)自動(dòng)加載。與Linux 不一樣的是,RTOS 的gadget 功能配置全部hardcode 在功能驅(qū)動(dòng)里,無需像Linux 一樣需要在應(yīng)用層手動(dòng)進(jìn)行g(shù)adget 配置。
另外,目前RTOS 的USB 驅(qū)動(dòng)還不支持composite gadget,因此只能支持加載單一的gadget 功能驅(qū)動(dòng),無法同時(shí)多個(gè)功能。
ADB 功能
adb 的全稱為Android Debug Bridge,就是起到調(diào)試橋的作用。通過ADB,可以直接在PC 上通過命令行控制小機(jī)端的控制臺(tái);也可以通過ADB 進(jìn)行文件傳輸。
menuconfig 驅(qū)動(dòng)相關(guān)配置:
? > Drivers Options
? > soc related device drivers
? > USB Drivers
? > USB DEVICE
[*] DRIVERS_USB_GADGET_ADB
menuconfig ADBD 應(yīng)用相關(guān)配置:
? > System components
? > aw components
? > USB Components Support
? > USB Gadget Support
[*] adbd service
在RTOS 的USB 框架中,一旦加載了adb gadget,就會(huì)自動(dòng)啟用adbd 服務(wù),直接連上PC 就可以使用了。
adb 正常啟動(dòng)的相關(guān)log:
[usb0] insmod device driver!
adbd version:AW?V1.1.6, compiled on: Apr 11 2023 10:33:24
adbd service init successful
PC 運(yùn)行效果圖如下圖所示:
UAC 功能
UAC 全稱為USB Audio Class,USB 音頻類。
通過UAC,可以實(shí)現(xiàn)實(shí)時(shí)獲取音頻設(shè)備的音頻數(shù)據(jù),并且通過UAC 實(shí)現(xiàn)操控設(shè)備音量,采樣率,等參數(shù)。UAC 實(shí)現(xiàn)對(duì)外接音頻操作,從用戶功能來說,主要包括USB 麥克風(fēng)、USB 聲卡和其它音頻設(shè)備的功能控制和接口標(biāo)準(zhǔn)。
menuconfig 驅(qū)動(dòng)相關(guān)配置:
? > Drivers Options
? > soc related device drivers
? > USB Drivers
? > USB DEVICE
[*] DRIVERS_USB_GADGET_UAC
menuconfig UACD 應(yīng)用相關(guān)配置:
? > System components
? > aw components
? > USB Components Support
? > USB Gadget Support
[*] uacd service
? > System components
? > aw components
? > USB Components Support
? > USB Gadget Support
? > uacd audio function
[*] AudioSystem local audio
uacd 正常啟動(dòng)的相關(guān)log:
[usb0] insmod device driver!
uacd version:AW?V0.5, compiled on: Apr 27 2023 10:44:02
[UACD?INFO][u_audio_init] line:167 stream=1, rate=48000, ch=2, bits=16, audio_buf_size=192
[UACD?INFO][u_audio_init] line:167 stream=0, rate=16000, ch=2, bits=16, audio_buf_size=64
[UACD?INFO][u_audio_stop_capture] line:320
[UACD?INFO][u_audio_stop_playback] line:457
[UACD?INFO][u_audio_stop_capture] line:320
[UACD?INFO][u_audio_stop_playback] line:457
啟動(dòng)成功之后,能夠在PC 端看到新增了一個(gè)音頻輸入和輸出的設(shè)備,如下圖:
USB HOST 功能配置
接入OTG 線后,成功切換成 USB Host 的log 可參考如下:
[ehci?usb0] insmod host driver!
calibration finish, val:0x19, usbc_no:0
ehci insmod status = 1
[usbh core]: add gen_dev SW USB2.0 'Enhanced' Host Controller (EHCI) Driver
[D(rv.)] devops: register dev(sunxi_timer) ok
USB 0.0 started, EHCI 1.00
[usbh core]: adding sub dev (config #1, interface 0)
usb match id suceessfull
[hub]: usb hub probe
[hub]: 1 port detected
[usbh hub]: local power source is good
[E(rv.)] pm device sunxi_ehci0(00000000082AE1D0) has already registered
[ohci?usb0] insmod host driver!
calibration finish, val:0x19, usbc_no:0
[usbh core]: add gen_dev SW USB2.0 'Open' Host Controller (OHCI) Driver
[usbh core]: adding sub dev (config #1, interface 0)
usb match id suceessfull
[hub]: usb hub probe
[hub]: 1 port detected
[usbh hub]: local power source is good
[D(rv.)] devops: register dev(sunxi_ohci0) ok
U 盤功能
選上以下配置:
Mass Storage
? > Drivers Options
? > soc related device drivers
? > USB Drivers
? > USB HOST
[*] Mass Storage support
[*] USB CD support
等待U 盤掛載成功,可以發(fā)現(xiàn)根目錄下多了一個(gè)usb_msc 的文件夾,這個(gè)即是U 盤掛載的文件夾。可以通過該文件夾與U 盤進(jìn)行讀取/傳輸文件。
- 目前R128 只支持fat32 文件系統(tǒng)的U 盤,其他文件系統(tǒng)U 盤會(huì)掛載失敗。
- 只支持掛載單分區(qū)的U 盤,如果U 盤被分解成了多個(gè)分區(qū)的話,只能掛載上第一個(gè)分區(qū)。
接入U(xiǎn) 盤后,系統(tǒng)開始識(shí)別U 盤。成功識(shí)別到U 盤的log 信息如下:
ehci_irq: highspeed device connect
port debounce 0...
port debounce 0...
port debounce 25...
port debounce 50...
port debounce 75...
hub_port_init: udev address = 0
[hub_port_init]: new high speed USB device address 0
usb hub set new address(2)
[usbh core]: adding sub dev (config #1, interface 0)
usb match id suceessfull
mscDevProbe begin
[msc]: GetMaxLUN successful, max lun is 0
begin mscLunAdd
disk, send last lun msg.........
mscLun? >LunNo=0
mscLun? >mscDev? >MaxLun=1
BlkDev? >last_lun=1
Wrn: short transfer, urb_state(0), want_len(192), real_len(70)
Wrn: short transfer, urb_state(0), want_len(192), real_len(24)
?????????????????Disk Information?????????????????
WriteProtect = 0
MediaPresent = 1
WCE = 0
RCD = 0
capacity = 29532M, sector number = 60481536
sector_size = 512
DevNo = 0
ClassName =
DevName = SCSI_DISK_000
??????????????????????????????????????????????????
hub_port = 1
cnt = 0
Classname = DISK
DevName = SCSI_DISK_000
DeviceName = SCSI_DISK_000
Vender = TOSHIBA USB FLASH DRIVE PMAP
Product = USB FLASH DRIVE PMAP
Serial = PMAP
HubPortNo = 1
DeviceType = 2
DiskRead: block(0, 1) is adjacence max capacity(39ae000), can't use special write
mount usb mass storage successull!!
..............................................................................
[USB Disk]: Register new device, class = [DISK], dev = [SCSI_DISK_000]
..............................................................................
end mscLunAdd
mscDevScanThread end...
然后通過ls 查看usb_msc,可以看到U 盤里的文件:
c906 >ls
dev data usb_msc
c906 >ls usb_msc
System Volume Information 3.txt
USB 攝像頭
選上以下配置:
UVC
? > Drivers Options
? > soc related device drivers
? > USB Drivers
? > USB HOST
[*] USB_CAMERA
接上USB 攝像頭后,成功識(shí)別出攝像頭后會(huì)出現(xiàn)以下log:
ehci_irq: highspeed device connect
port debounce 0...
port debounce 0...
port debounce 25...
port debounce 50...
port debounce 75...
hub_port_init: udev address = 0
[hub_port_init]: new high speed USB device address 0
usb hub set new address(3)
[hub] :skipped 1 descriptor after configuration
skipped 6 descriptors after interface
skipped 1 descriptor after endpoint
skipped 26 descriptors after interface
num_ep:0
skipped 1 descriptor after endpoint
skipped 4 descriptors after interface
num_ep:0
num_ep:0
skipped 2 descriptors after interface
skipped 1 descriptor after endpoint
[usbh core]: adding sub dev (config #1, interface 0)
usb match id suceessfull
UVCDevProbe begin
Probing generic UVC device
device quirks 0x0
Found format MJPEG.
? 1920x1080 (30.0 fps)
? 1280x720 (30.0 fps)
? 640x480 (30.0 fps)
? 640x360 (30.0 fps)
? 352x288 (30.0 fps)
? 320x240 (30.0 fps)
? 320x180 (30.0 fps)
? 176x144 (30.0 fps)
? 160x120 (30.0 fps)
? 1920x1080(30.0 fps)
Found format YUV 4:2:2 (YUYV).
? 1920x1080 (5.0 fps)
? 1280x720 (10.0 fps)
? 640x480 (30.0 fps)
? 640x360 (30.0 fps)
? 352x288 (30.0 fps)
? 320x240 (30.0 fps)
? 320x180 (30.0 fps)
? 176x144 (30.0 fps)
? 160x120 (30.0 fps)
? 1920x1080 (5.0 fps)
Found UVC 1.00 device USB 2.0 Camera (0c45:6366)
num_altsetting=7
UVC device initialized.
DRV_WEBCAM_MInit
webcam plug in message...
[usbh core]: adding sub dev (config #1, interface 1)
[usbh core]: adding sub dev (config #1, interface 2)
[usbh core]: adding sub dev (config #1, interface 3)
通過log 信息能夠看到,在識(shí)別出USB 攝像頭后,會(huì)打印出該攝像頭支持的格式以及分辨率。
接著通過uvc 測(cè)試命令,對(duì)UVC 功能進(jìn)行測(cè)試:
usb uvc_test
測(cè)試命令調(diào)用完成之后,會(huì)在/data 目錄下生成5 張名為/data/source_frame_x.jpg 的圖片。通過adb pull 將圖片拉到PC 端,然后在PC 端打開圖片即可看到USB 攝像頭拍下的照片。
USB 調(diào)試方法
USB OTG 功能調(diào)試
除了OTG 的自動(dòng)切換功能,還可以進(jìn)行手動(dòng)的切換,需要使用到USB 命令。
USB Device/Host 的手動(dòng)切換方法:
輸入usb ?h 能夠看見usb 的全部命令。
- USB Device 的相關(guān)命令
usb udc {?i|?r} []
?i:指的是指定需要進(jìn)行切換的USB口。目前R128芯片只有USB0是支持Device模式的。
?r:指的是remove,注銷當(dāng)前的Device模式。
比如說將USB0切換成Device模式,則運(yùn)行:
usb udc ?i 0 - USB Host 的相關(guān)命令
usb hci {?i|?r} []
?i:指的是指定需要進(jìn)行切換的USB口。
?r:指的是remove,注銷當(dāng)前的Host模式。
比如說將USB0切換成Host模式,則運(yùn)行:
usb hci ?i 0
USB 相關(guān)工具
ADB
ADB 功能是從Android 移植過來的,設(shè)備端會(huì)運(yùn)行adbd 服務(wù),而Host 端(一般為PC) 通過adb工具進(jìn)行調(diào)試,如adb shell, adb push/pull 等。
ADB 功能說明
adb shell 功能
PC端執(zhí)行adb shell,可進(jìn)入控制臺(tái)。
PC端執(zhí)行adb shell + command, 例如adb shell ls /可以直接將結(jié)果輸出到終端。
adb push/pull 功能
推送文件到小機(jī)端:
adb push test.bin /data
從小機(jī)端拉取文件:
adb pull /data/test.bin .
adb 網(wǎng)絡(luò)連接
如果需要用此功能,需要額外進(jìn)行menuconfig 的配置,配置方法如下:
? > System components
? > aw components
? > USB Components Support
? > USB Gadget Support
[*] adb local transport
(5555) adb local transport port
adb local transport port 是用于配置端口號(hào)的,用于在adb 網(wǎng)絡(luò)連接時(shí)匹配端口的,默認(rèn)為5555。
在進(jìn)行網(wǎng)絡(luò)adb 連接之前,需要保證PC 和小機(jī)端在同一個(gè)局域網(wǎng)中,并且可以ping 通。
小機(jī)端運(yùn)行ifconfig,查看當(dāng)前小機(jī)端的IP,假設(shè)IP為192.168.1.101。
則PC端執(zhí)行adb connect 192.168.1.101建立連接,然后就可以開始執(zhí)行adb shell等命令了。
-
控制器
+關(guān)注
關(guān)注
112文章
16361瀏覽量
178051 -
OTG
+關(guān)注
關(guān)注
2文章
148瀏覽量
45430 -
RTOS
+關(guān)注
關(guān)注
22文章
813瀏覽量
119636 -
USB驅(qū)動(dòng)
+關(guān)注
關(guān)注
1文章
136瀏覽量
20197 -
VBUS
+關(guān)注
關(guān)注
0文章
11瀏覽量
5417 -
R128
+關(guān)注
關(guān)注
0文章
41瀏覽量
105
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論