MTKOTG功能总结(UVC)
因公司项⽬需要,近期⼀直在处理OTG ⽅⾯的问题。mtk 的8735 平台,android 6.0,内存3G?
先回顾总结前段时间在⼯作的所得体会及经验。
1.要实现OTG 功能,⾸选需要芯⽚⽀持,当前mtk 的8735 芯⽚是否⽀持OTG 功能?
看原理图,与硬件同事沟通得知OTG 功能在硬件这边其实是⼀个独⽴的提供5v电压独⽴给usb设备供电的功能⽽已。但在其供电前,驱动这边需要实现USB设备的识别。也就是原理图上所说的IDDIG 脚必须在芯⽚上引出。此脚是USB ID检测脚,还有个就是电源脚——在识别USB设备后,会触发此脚拉⾼,然后pmic 给USB设备提供5v电压,后⾯USB 设备开始正常⼯作。此为OTG的⼯作原理。IDDIG 脚和GPIO_OTG_DRVVBUS_PIN脚。后⾯调试过程中出现的问题和现象说明了硬件原理搞懂很重要,只有在搞懂硬件原理后,才能保证你后⾯的⼯作能正常进⾏下去。如果不明⽩OTG ⼯作的原理,是很难调试的。况且后⾯好要调试UVC 功能——USB camera 。这个必须在OTG 调通了基础上才能进⾏。在这⾥我们需要有个概念——USB的HOST 和DEVICE 。显然我的机⼦是作为HOST 端的,连接的OTG设备例如⿏标,U盘,usb camera 均作为device端。USB 还可以配置成HUB 功能,这个需要硬件来实现,我们需要先确认,我们的USB 是⽀持哪⼀种的。通常我们的机⼦USB接⼝,是当做充电接⼝和OTG主设备。
先进先出此图中的GPIO19-OTG-EN就是 GPIO_OTG_DRVVBUS_PIN脚在这⾥要说明⼀下 IDDIG脚是需要查原理图,查芯⽚信息的,⼀般是对应
⼀般是⽤CMMCLK 脚 ,我们在配置pin脚时需要知道是哪个,DRVVBUS_PIN脚是可以灵活选择的。
2.USB⼯作的⼏种模式
这个虽然后⾯做完了回头看的时候觉得跟调试OTG 没多⼤关系。但作为USB驱动调试者这些还是需要了解的。USB 按传输速度 我们知道有USB1.0 USB2.0 USB3.0 。我这个项⽬需要2.0以上。这⾥需要留意,当前config⽂件配置中是哪种!还有USB 2.0 传输速度⼜分全速模式 ,⾼速模式,两者都是USB 2.0的。这⾥会涉及到USB的配置,需要留意,由于是UVC 考虑到⼤量数据传输,是需要配置⾼速模式。
3.OTG配置相关宏
###CONFIG_MTK_MUSB_QMU_SUPPORT=y
CONFIG_USB_ARCH_HAS_EHCI=y
CONFIG_USB_COMMON=y
CONFIG_USB_OTG=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_BIG_ENDIAN_MMIO=y
CONFIG_USB_EHCI_BIG_ENDIAN_DESC=y
文化相对论CONFIG_USB_EHCI_ROOT_HUB_TT=y
CONFIG_USB_EHCI_HCD_PLATFORM=y
CONFIG_USB_OHCI_HCD=y
CONFIG_USB_OHCI_HCD_PLATFORM=y
4.UVC相关宏
CONFIG_MTK_USB_GADGET=y
CONFIG_USB_MTK_ACM_TEMP=y
##CONFIG_USB_MTK_HDRC=y
CONFIG_USB_MTK_HDRC_GADGET=y
##CONFIG_USB_MTK_HDRC_HCD=y
###CONFIG_USB_HID=y
###CONFIG_USB_ARCH_HAS_HCD=y
短小鬼故事###CONFIG_USB_DEFAULT_PERSIST=y
###CONFIG_USB_ACM=y
####CONFIG_USB_WDM=y
###CONFIG_USB_PHY=y
####CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 ####CONFIG_USB_LIBCOMPOSITE=y
###CONFIG_USB_F_ACM=y自我评价学生高中
###CONFIG_USB_U_SERIAL=y
###CONFIG_USB_F_SERIAL=y
CONFIG_MEDIA_SUPPORT=y
余罪三# Multimedia core support
CONFIG_MEDIA_CAMERA_SUPPORT=y
CONFIG_MEDIA_ANALOG_TV_SUPPORT=y
CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y
CONFIG_MEDIA_RADIO_SUPPORT=y
CONFIG_MEDIA_RC_SUPPORT=y
CONFIG_MEDIA_CONTROLLER=y
CONFIG_VIDEO_DEV=y
CONFIG_VIDEO_V4L2_SUBDEV_API=y
CONFIG_VIDEO_V4L2=y
调胃舒肝丸###CONFIG_USB_VIDEO_CLASS=y
CONFIG_USB_SUPPORT=y
CONFIG_USB_GSPCA=y
CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
5.调试过程中使⽤的⼯具及其他
在通过OTG进⾏camera显⽰时,USB传输带宽会严重制约预览显⽰效果,有时甚⾄直接⿊屏⽆法显⽰。例如我的项⽬在调试过程中使⽤UVCcamera apk 来进⾏显⽰,在低分辨率时是可以显⽰的,320x240 30fps ,但如果使⽤⾼分辨率就会出问题,直接导致⽆法显⽰,整个是⿊屏。记得最开始调试时,都怀疑camera 没连上,通过打log,发现是在预览时有带宽分辨率和预览模式的匹配等问题。整个应该是受每个usb camera 模组本⾝限制的例如有的模组MJPEG和YUYV两种都⽀持,有的仅⽀持其中⼀种,有的两种不同预览模式分辨率和帧率不同。apk在使⽤过程中,会⾸先打开camera 然后获取⽀持的分辨率列表,然后apk 会选择⼀个分辨率和预览模式进⾏设置,然后预览。在此需要多说⼀点,默认的uvc ⽀持的数据传输有两个制式MJPEG和YUYV,其中MJPEG是带压缩的,就是说如果相同分辨率和fps 如果⽤MJPEG ,那么USB传输的带宽压⼒就⼩很多,卡顿等现象就会好很多。最后
烤箱烤蛋糕将使⽤到的apk 和github上的源码路径等献上,以飨读者。整个调试过程涉及到Android 应⽤层和底层驱动,硬件原理。后⾯我司⼜调试了⼀款红外相机,跟调试UVC 没有差异,只是需要提供红外相机的apk。只要UVC调通了,红外相机应该问题不⼤,但也有卡顿等现象。这边通过给CPU加散热⽚,发现是过热导致CPU降频。另外这边怀疑是Android 系统整体性能不良导致。后续继续分析,今天先记录下前⾯的过程。
apk 我这边使⽤了两个关于UVC 的apk ⼀个是⽹上下载量很⼤的那个apk,不带源码。第⼀次使⽤时可能会出现显⽰为⿊屏,需要进⼊设置设置分辨率。
彩绳
另⼀个是github上的源码通过本地Android Studio调试后编译,形成debug版本的apk ⽅便调试,了解UVC 预览显⽰的⼀个过程。此过程其实花费不少时间,因为Android Studio 版本不同,在本机调试可能不容易编译通过需要修改gradle 相关的东西才⾏。