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.