0. 背景
此问题是SDM660平台,~/android_9/LA.UM.7.2.r1,出现的,准确的描述如下:
- 关机状态下micro usb通过OTG连接USB Camera
- 开机
- USB Camera不识别
这个项目比较特别,有两个micro usb端口,他们是通过虚拟地址映射的固定地址,模块上的micro 端口地址是c20,开发板上的micro端口的地址是a80.这个提前说下,后面我实际debug的过程中,最开始忽略了这个事实。
1. 合代码
话说俺之前没搞过USB Camera,然后就去合代码。
全删全编,compare替换,然后QFIL烧版本一波到位,问别人借了USB Camera,然后开机点骁龙相机,结果如下:
额,可能我少合了代码了吧,中午吃饭的时候问了下别的大佬,大佬说我可能少合了代码,然后给了我
一个链接。
全删全编,替换烧录,打开骁龙相机结果如下:
( 吃瓜群众,你特么一张一模一样的照片发三次是啥意思)
于是我抱住大佬的大腿(艺术加工),求他帮我看看log:
大佬就差不多这个表情看着我,然后说:你是不是在逗我,USB camera 根本不要合代码,本来就好的啊? 然后我又问了另一个大佬,大佬说这个要么用骁龙点亮,要么就是用第三方的APK。
2. USB Camera本身是不是好的?
后来确认了USB Camera是用第三方 APK测试的,那么我首先要排查 USB Camera本身有没有问题。
于是我把USB camera插我电脑上,我电脑是windows 7。。
发现不识别,于是我怀疑给我的USB Camera是坏的,我说呢,挂不得怎么也打不开。。
去质问的时候,我就被喷了,因为在windows 10上是可以识别的…
彳亍口巴,至少证明USB Camera本身是好的。
因为开机之后插入USB Camera是识别的,所以大佬建议我用万用表量下开机时候的VBUS电压。
VBUS一直0.17V,但是开机插拔一下就能识别了,VBUS是5.01V .
然后尝试了下U盘, 发现U盘也不识别mmp.然后就进入下一阶段。
3. 分析U盘关机插入,开机为啥不识别
目前的分析思路是那个VBUS的电,要找到电没供上的原因,鉴于U盘的表现和USB Camera一样,把U盘的问题解决了,那么没准usb camera问题就迎刃而解了。
3.1 代码里面加log
dwc3-msm.c和extcon-usb-gpio.c代码里面也加上debug 以及相关log
[ 12.205860] nigulasi>>>>>>>>>>>>id=0,func=usb_extcon_detect_cable
// 0说明中断产生,usb id 被拉低
[ 12.205868] nigulasi>>>>>>>>>>>>>>>>>>>>>>>>>>usb_extcon_probe
[ 12.214878] hw perfevents: enabled with armv8_pmuv3 PMU driver, 7 counters available
我们发现中断产生了,usb id也被拉低了,但是咋出了问题还是不知道;
3.2 尝试冷启动
参考这个链接:
https://blog.youkuaiyun.com/Special_Lin/article/details/9383885?utm_source=blogxgwz7
修改还是没有效果;
3.3 C20设备树里面加供电
修改还是没有效果。(备注,这里改c20是因为从log里面看它走到了,但是忘了这个项目有两个micro usb的接口,c20以及a80,所以显然修改是无效的。)
3.4 查看config 配置
我们直接看out目录的生成文件:
vim out/target/product/sdm660_64/obj/KERNEL_OBJ/.config
kernel/msm-4.4/arch/arm64/configs/sdm660_defconfig
于是在这个config文件里面配置上这些,卧槽还是没有效果 。
3.5 一点小突破
在抓到的开机串口log中,检索start_host ,我们发现一个开机识别的 log跑了两次,一次不识别,一次识别;判断方法是根据地址来看的。
此处补充说明1:这个不识别的c20的log是一定会走的,是模块上的micro usb端口,这里只能看出type-c接口走了,a80(开发板上的micro接口对应地址)没log.
这里补充说明一下这个内核报错的概念:
开机不识别的 log,地址都是异常的,而且只跑一次,最关键的是这个打印没有出来,说明
电没有上上去,这个也与最开始我们用万用表量VBUS 没有电压相符合。
后来在kernel/msm-4.4/drivers/regulator/core.c里面也加了log ,还追了
kernel\msm-4.9\drivers\regulator\core.c
kernel\msm-4.9\drivers\base\class.c
没看出来啥。
这个一搞就一天过去了,目前就发现电不对。
3.6 曙光
仔细看log,检索:extcon-usb-gpio
[ 16.360122] nigulasi,code=extcon-usb-gpio.c,>>>>>>>>>>>>id=0,func=usb_extcon_detect_cable
[ 16.362667] nigulasi,code=extcon-usb-gpio.c,>>>>>>>>>>>>>>>>>>>>>>>>>>usb_extcon_probe
16s,触发中断,(to host),但是那个回调函数dwc3_msm_id_notifier没有注册,即下面的 log没有打印,
检索 :msm-dwc3
[ 18.030349] msm-dwc3 a800000.ssusb: USB core frequency = 133333333
[ 18.031046] msm-dwc3 a800000.ssusb: setting lpm_to_suspend_delay to zero.
[ 18.032459] msm-dwc3 a800000.ssusb: missing TCSR memory resource
但是USB驱动注册的地方在18s才出来,前面就开始回调了,所以出了问题。所以我们想改的就是:先加载USB驱动,然后在加载extcon驱动。
3.7 最终解决
可以看下下面这个参考链接,讲了驱动优先级,
https://blog.youkuaiyun.com/ffmxnjm/article/details/71713670
在内核源代码中,platform设备的初始化(注册)用arch_initcall调用,它的initcall的level为3;
而驱动的注册用module_init调用,即device_initcall(),它的initcall的level为6
LA.UM.7.2.r1\kernel\msm-4.4\drivers\extcon\extcon-usb-gpio.c
把驱动优先级修改一下,即可,问题得到解决;
修改完,之后,这个时间就对上了,然后开机能能识别U盘了。
总结:此问题表面上看是Camera问题,实际上是USB 问题
备注: 此问题除了这样修改驱动优先级,还有两种解决方法,待有空再更新;
感谢阅读,OVER!