资讯详情

关于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工具上的问题,我们用实际的东西进行判断,有就是有,没有就是没有。

标签: 007b2ln传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台