[Linux Camera Driver] 关机插入USB Camera,开机之后不识别问题分析解决

本文记录了解决SDM660平台上关机状态下通过OTG连接的USBCamera无法识别的问题,涉及代码合入、USBCamera验证、VBUS电压检查、驱动优先级调整等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0. 背景

此问题是SDM660平台,~/android_9/LA.UM.7.2.r1,出现的,准确的描述如下:

  1. 关机状态下micro usb通过OTG连接USB Camera
  2. 开机
  3. 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!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值