问题描述:
在调试手表项目时候碰到一个问题:
(1) 12月27号之前,audio bring up 是好的, 查看节点/proc/asound/cards , 是有注册声卡的.
(2) 12月28号, 代码合入nfc的devicetree 改动后, 手机开机卡顿.上层充斥着因为audio device 找不到服务报错.
分析:
因为暂时没有正面分析能力,仅由上层同事提醒卡顿原因是audio导致的,具体异常点一时没有从开机的dmesg log中识别出来.
问题定位:
在不能正面分析问题情况,通过修改回退,和最小修改方法, 确认问题点与nfc本身节点无关,与i2c0 的status 使能enable有关.
当i2c0 节点使能ok时候, audio无声卡注册(查看节点/proc/asound/cards 为空);当i2c0的节点disable时候, audio 的声卡又是好的.
因为audio是使用的i2c1的通路,与i2c0无关.
定位发生一个错误, 在开机没有明显i2c1报错的情况下,还是判断问题大概率是i2c0使能导致i2c1工作不正常. 在查看节点d/gpio status后,
发现i2c1的两个gpio 并没有工作在function 1的状态下.(0 : 是gpio 普通io状态;1是特殊通讯接口).
问题反反复复在驱动强度, 上下拉属性方面. 问题一直处于未解决状态.
最终解决:
这个之前定位虽然找到问题带来规律了,但是错误判断是i2c之间影响,并没有i2c0对i2c1上从设备的影响.
后续确认三色灯,sensor等同样挂载在i2c1的从设备,他们都是ok的,单单就audio异常,这就说明大概率是i2c1是ok的,是i2c0 导入引起i2c1从设备异常.
后续log再分析,发现具有如下信息:
Line 1682: [19:20:36.423]收←◆[ 35.952590] bengal-asoc-snd soc:qcom,msm-audio-apr:qcom,q6core-audio:sound: ASoC: CODEC DAI aw882xx-aif-0-34 not registered
Line 1684: [19:20:36.487]收←◆[ 36.038627] bengal-asoc-snd soc:qcom,msm-audio-apr:qcom,q6core-audio:sound: ASoC: CODEC DAI aw882xx-aif-0-34 not registered
Line 1703: [19:20:46.032]收←◆[ 45.560907] bengal-asoc-snd soc:qcom,msm-audio-apr:qcom,q6core-audio:sound: ASoC: CODEC DAI aw882xx-aif-0-34 not registered
Line 1706: [19:20:46.085]收←◆18567] bengal-asoc-snd soc:qcom,msm-audio-apr:qcom,q6core-audio:sound: ASoC: CODEC DAI aw882xx-aif-0-34 not registered
Line 1715: [19:20:46.843]收←◆[ 46.371975] bengal-asoc-snd soc:qcom,msm-audio-apr:qcom,q6core-audio:sound: ASoC: CODEC DAI aw882xx-aif-0-34 not registered
其中这个就是 声卡注册失败原因, aw882xx-aif-0-34 这个名字是基于总线排序的,当没有i2c0时候, 这里名字因为对应i2c1是第一位,所以取0 ;当有i2c0是,这时候名字就应该是1.
又因为这个命名是代码完全写死的,所以就需要在代码中修改.
struct snd_soc_dai_link_component awinic_codecs[] = {
{
.of_node = NULL,
.dai_name = "aw882xx-aif-0-34",
.name = "aw882xx_smartpa.0-0034",
},
};
改为:
truct snd_soc_dai_link_component awinic_codecs[] = {
{
.of_node = NULL,
.dai_name = "aw882xx-aif-1-34",
.name = "aw882xx_smartpa.1-0034",
},
};