关于nxp平台上i2c扫描不到wm8960地址的问题

最近调试imx8qxp的android11的系统上,发现了一个神奇的东西,发现调试audio的时候遇到了一个很奇怪的现象。
因为源码中是采用gpio模拟的i2c,以前是没有这种操作的。
&cm40_i2c {
#address-cells = <1>;
#size-cells = <0>;
clock-frequency = <100000>;
pinctrl-names = “default”, “gpio”;
pinctrl-0 = <&pinctrl_cm40_i2c>;
pinctrl-1 = <&pinctrl_cm40_i2c_gpio>;
scl-gpios = <&lsio_gpio1 10 GPIO_ACTIVE_HIGH>;
sda-gpios = <&lsio_gpio1 9 GPIO_ACTIVE_HIGH>;
status = “okay”;
};
可以看对应的打印log:

1|mek_8q:/ # logcat -b all | grep i2c
05-20 07:54:41.603 0 0 I : i2c /dev entries driver
05-20 07:54:42.263 0 0 I imx-lpi2c 37230000.i2c: using scl,sda for recovery
05-20 07:54:42.269 0 0 E imx-lpi2c 37230000.i2c: can't get the TX DMA channel, error -19!
05-20 07:54:42.276 0 0 E imx-lpi2c 37230000.i2c: error -ENODEV: dma setup error -19, use pio
05-20 07:54:42.290 0 0 I i2c-16 : LPI2C adapter registered
05-20 07:54:42.295 0 0 E imx-lpi2c 5a810000.i2c: can't get the TX DMA channel, error -19!
05-20 07:54:42.302 0 0 E imx-lpi2c 5a810000.i2c: error -ENODEV: dma setup error -19, use pio
05-20 07:54:42.354 0 0 I i2c-1 : LPI2C adapter registered
05-20 07:54:42.360 0 0 E imx-lpi2c 5a820000.i2c: can't get the TX DMA channel, error -19!
05-20 07:54:42.367 0 0 E imx-lpi2c 5a820000.i2c: error -ENODEV: dma setup error -19, use pio
05-20 07:54:42.505 0 0 I i2c-2 : LPI2C adapter registered
05-20 07:54:42.518 0 0 E imx-lpi2c 5a830000.i2c: can't get the TX DMA channel, error -19!
05-20 07:54:42.525 0 0 E imx-lpi2c 5a830000.i2c: error -ENODEV: dma setup error -19, use pio
05-20 07:54:42.556 0 0 I i2c-3 : LPI2C adapter registered

我的i2c驱动加载正常,log中会有一些警告,并不会导致我的驱动加载失败。 但是我在不知到为什么驱动log中会出现错误的提示,但是这并不影响我的使用,所以也没管他。

可以清楚的看到当我扫描i2c-16的时候,我会马上显示00 ~ 0F的地址,但是我的10~1F的地址中间会卡顿大概2s,此时如果有log打印则会显示在i2c总线地址的中间。
并且我的i2c-16的0x1a的地址上挂载了一个wm8960的音频芯片,我并没有扫描到对应的外设。

mek_8q:/ # i2cdetect -y 16
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
[ 83.344813] AidlLazyServiceRegistrar: Process has 0 (of 1 available) client(s) in use after notification android.apex.IApexService has clients: 0
[ 83.359267] AidlLazyServiceRegistrar: Trying to shut down the service. No clients in use for any service in process.
[ 83.371976] AidlLazyServiceRegistrar: Unregistered all clients and exiting
[ 83.383746] printk: Binder:313_2: 221 output lines suppressed due to ratelimiting
[ 83.393267] init: Service 'apexd' (pid 313) exited with status 0 oneshot service took 60.764000 seconds in background
[ 83.405248] init: Sending signal 9 to service 'apexd' (pid 313) process group...
[ 83.413305] libprocessgroup: Successfully killed process cgroup uid 0 pid 313 in 0ms
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

我试着去i2cdump对应的寄存器。但是他提示我链接超时:

mek_8q:/ # i2cdump -f -y 16 0x1a
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
i2cdump: i2c_read_byte: Connection timed out

我们通过使用示波器进行测量,发现i2c扫描到了该地址,地址也进行了ACK回复,但是没有握手完成,下面是我测量的时钟信号和数据信号。
蓝色为数据线。黄色为时钟线。可以看到对应的蓝色线条已经被拉低,处于不正常的状态。

在这里插入图片描述

这个时候我开始去查看为什么,然后并没有看出什么东西。
后面同事叫我先把驱动加载进去,如果因为wm8960的驱动是会先去判断i2c的地址的,如果没有地址,你的驱动是加载不会成的,后面我添加驱动后发现确实是ok的,我的声卡信息这些都是正常的。
我继续去扫描这个地址,依旧提示

mek_8q:/ # i2cdetect -y 16                                                     
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- UU -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --                        
mek_8q:/ # 
mek_8q:/ # 
mek_8q:/ # 
1|mek_8q:/ # i2cdump -f -y 16 0x1a                                             
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
i2cdump: i2c_read_byte: Connection timed out
00:1|mek_8q:/ # 

但是确实没有报错,我们直接通过播放器播放音乐,发现是有的。我就知道我可能进入了一个误区。
我通过regmap是可以看到对应的寄存器的,通过tinymix去修改后发现寄存器的值也是修改了的。

1|mek_8q:/ # cat  d/regmap/16-001a/registers                                   
00: 01a7
01: 01a7
02: 0178
03: 0178
04: 0000
05: 0008
06: 0000
07: 0042
08: 01c0
09: 0040
0a: 01e6
0b: 01e6
10: 0000
11: 007b
12: 0100
13: 0032
14: 0000
15: 01c3
16: 01c3
17: 01c3
18: 0044
19: 0000
1a: 0000
1b: 0000
1c: 0000
1d: 0000
20: 0100
21: 0100
22: 0150
25: 0150
26: 0000
27: 0000
28: 0178
29: 0178
2a: 0040
2b: 0000
2c: 0000
2d: 0050
2e: 0050
2f: 0000
30: 003a
31: 0037
33: 0080
34: 0008
35: 0031
36: 0026
37: 00e9

所以我们有时候不用去纠结这个i2c工具上的问题,我们用实际的东西进行判断,有就是有,没有就是没有。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永不秃头的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值