Hi3516d平台的usb功能調試記錄
其他平台類似,但與海思sdk版本和核心版本有關,相關配置位置和形式不一樣。hi3516av100核心版本為3.4.35
一、USB用作從機device
- usb大容量存儲
作為大容量儲存設備時核心配置如下:
1)啟用海思DMA(預設開啟)
Device Drivers --->
<*> Hisilicon DMAC Controller support
2)usb配置
Device Drivers --->
[*] USB support --->
<*> Support for Host-side USB
[*] hiusb2.0 usb device support --->
<*> hisilicon highspeed device controller version 3.00a driver
<*> USB Mass Storage support
<*> USB Gadget Support --->
<M> USB Peripheral Controller
<*> USB Gadget Drivers (Mass Storage Gadget) --->
其他配置使用預設即可,建議使用DMA模式。編譯後,可以檢視核心啟動資訊(或dmesg檢視):
console [ttyAMA0] enabled
uart:1: ttyAMA1 at MMIO 0x20090000 (irq = 41) is a PL011 rev2
bio: create slab <bio-0> at 0
SCSI subsystem initialized
... ...
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
... ...
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
dwc_otg: version 3.00a 10-AUG-2012
Core Release: 3.10a
Setting default values for core params
Using Buffer DMA mode
Periodic Transfer Interrupt Enhancement - disabled
Multiprocessor Interrupt Enhancement - disabled
OTG VER PARAM: 0, OTG VER FLAG: 0
Dedicated Tx FIFOs mode
g_mass_storage gadget: Mass Storage Function, version: 2009/09/11
g_mass_storage gadget: Number of LUNs=1
lun0: LUN: removable file: (no medium)
g_mass_storage gadget: Mass Storage Gadget, version: 2009/09/11
g_mass_storage gadget: userspace failed to provide iSerialNumber
g_mass_storage gadget: g_mass_storage ready
主要有usb核心驅動、otg驅動、大容量存儲驅動
此時接入電腦USB,可以在電腦的裝置管理器中檢視到“USB大容量儲存設備”,運作正常。
如果電腦仍沒有識别到裝置插入的話,檢查usb順序是否有問題;檢查外設控制寄存器MISC_CTRL30配置是否正确[bit31] 0 -- host,1 -- device
說明:上面配置中将驅動編譯進核心,也可以編譯成子產品.ko檔案,然後加載。
編譯過一次核心之後,編譯成子產品時可以通過指令單獨編譯:
make -C /home/wigewige/linux-3.4.y M=/home/wigewige/linux-3.4.y/drivers/usb/gadget ARCH=arm CROSS_COMPILE=arm-hisiv300-linux-
-C:指定.config檔案路徑
M:指定要編譯的子產品路徑
ARCH:指定交叉編譯工具
- usb檔案存儲(u盤)
用作u盤時,把上面gadget中的“Mass Storage Gadget”改成“File-backed Storage Gadget (DEPRECATED)”即可,
生成的驅動檔案為“g_file_storage.ko”,該部分建議以子產品形式編譯,然後手動加載,因為要制定存儲媒體,加載的時候制定對應參數。詳細使用參考海思《外圍裝置驅動 操作指南.pdf》。
驅動加載後可以在電腦中識别為U盤,但操作U盤還需要做其他配置(沒有測試驗證)。
- uvc裝置端
作為uvc裝置是核心配置如下:
- 多媒體配置
Device Drivers --->
<*> Multimedia support --->
[*] Media Controller API (EXPERIMENTAL)
<*> Video For Linux
[*] V4L2 sub-device userspace API (EXPERIMENTAL)
[*] Video capture adapters (NEW) --->
[*] V4L USB devices (NEW) --->
<*> USB Video Class (UVC)
[*] UVC input events device support (NEW)
<*> CPiA2 Video For Linux
[*] V4L platform devices --->
<*> SoC camera support
<*> platform camera support
2)usb配置
Device Drivers --->
[*] USB support --->
<*> Support for Host-side USB
[*] USB announce new devices
[*] USB device class-devices (DEPRECATED)
[*] hiusb2.0 usb device support --->
<*> hisilicon highspeed device controller version 3.00a driver
<*> USB Gadget Support --->
<M> USB Peripheral Controller
<*> USB Gadget Drivers (USB Webcam Gadget) --->
其他配置使用預設即可,建議使用DMA模式。
可以根據實際情況選擇編譯進核心或子產品。編譯成子產品則有以下子產品:
dwc_otg.ko
g_webcam.ko
uvcvideo.ko
videobuf2-core.ko
videobuf2-memops.ko
videobuf2-vmalloc.ko
videodev.ko
手動加載驅動時如果有報錯可以通過dmesg檢視,一般出錯的原因是有依賴關系,加載順序不正确導緻的。加載順序如下:
insmod dwc_otg.ko
insmod videobuf2-core.ko
insmod videobuf2-memops.ko
insmod videobuf2-vmalloc.ko
insmod videodev.ko
insmod uvcvideo.ko
insmod g_webcam.ko
編譯進核心的子產品或手動加載的子產品,在核心啟動後通過指令可以檢視:ls /sys/module/
檢視裝置資訊:cat /proc/devices
檢視usb裝置資訊:lsusb 或 lsusb -v
如果驅動加載成功且沒有報錯的話,在電腦端應該能識别到UVC camera。但由于3516av100可用的usb 端點數量有限,g_webcam加載時報錯:
g_webcam gadget: uvc_function_bind
g_webcam gadget: Unable to allocate streaming EP
himm 0x10080044 ---> 0x00000024
himm 0x10080048 ---> 0x2288C8D4
讀取硬體配置寄存器GHWCFG1和GHWCFG2,可以檢視到除了ep0(雙向)之外,隻有兩個可用端點,一個in一個out。Usb協定中ep0為必備端點,上電即可使用,而其他端點需要通過ep0和主機建立連接配接時進行配置,配置後才可以使用。UVC協定中需要使用兩個IN ep,一個用作視訊控制VC,一個用作視訊流VS,是以在加載該驅動時擷取ep失敗,在綁定uvc功能子產品時報的錯。(海思方面答複是3516av100不支援)
注意:驅動本身最大支援到16個端點(含ep0),但是實際可用的受限于硬體,通過讀取寄存器擷取到可用端點總數和in/out端點數。
理論上可以複用ep0作為uvc的VC端點,因為ep0是雙向的;但實際驗證行不通,為此做了如下修改嘗試:
- VC複用ep0
- VC為空
- VC和VS共用端點
主要修改f_uvd.c中uvc_function_bind函數。
上面的修改均行不通,修改後再host對裝置進行配置時,setup報錯。
實際檢視代碼,關于uvc的描述符中定義了uvc控制類和uvc視訊流類:uvc_control_cls和uvc_fs_streaming_cls,還有一個uvc_hs_streaming_cls類。
如果要修改還需要對uvc協定和驅動代碼深入的了解,時間有限,沒有深入去了解。
二、USB用作主機host
作為大容量儲存設備時核心配置如下:
Device Drivers --->
[*] USB support --->
<*> Support for Host-side USB
[*] USB announce new devices
[*] hiusb2.0 usb host support --->
<*> hisilicon highspeed device controller version 3.00a driver
[*] hisilicon usb host controller support
[*] hiusb-ehci usb host device support
[*] hiusb-ohci usb host device support
其他配置使用預設即可,建議使用DMA模式。
注意:用作主機時沒有實際驗證,如有問題還需要檢查其他配置。另外,3516av200和3519的sdk中加入了主從自動切換的驅動,在gadget中配置。核心版本為3.18.20.