天天看点

Hi3516d平台的usb功能调试记录

Hi3516d平台的usb功能调试记录

其他平台类似,但与海思sdk版本和内核版本有关,相关配置位置和形式不一样。hi3516av100内核版本为3.4.35

一、USB用作从机device

  1. 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:指定交叉编译工具

  1. usb文件存储(u盘)

用作u盘时,把上面gadget中的“Mass Storage Gadget”改成“File-backed Storage Gadget (DEPRECATED)”即可,

生成的驱动文件为“g_file_storage.ko”,该部分建议以模块形式编译,然后手动加载,因为要制定存储介质,加载的时候制定对应参数。详细使用参考海思《外围设备驱动 操作指南.pdf》。

驱动加载后可以在电脑中识别为U盘,但操作U盘还需要做其他配置(没有测试验证)。

  1. uvc设备端

作为uvc设备是内核配置如下:

  1. 多媒体配置

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是双向的;但实际验证行不通,为此做了如下修改尝试:

  1. VC复用ep0
  2. VC为空
  3. 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.