全志科技
直播中

王艳

7年用户 1232经验值
私信 关注
[问答]

讲述一些常见的I2C通信正常报错现象及其解决办法

  • 当在dts中配置了一些i2c设备,并且在kernel_menuconfig中也选上对应的驱动,但是实际硬件中并没有连接真实的硬件,这就会导致在系统启动时,会有不少的I2C报错打印出来。
      这里以一款触摸屏为例:

系统启动时触摸屏驱动会多次地使用I2C向触摸屏模块进行通信,但是由于实际硬件没有连接触摸屏,通信是一定会失败的,因此就会打印一大堆通信失败的字眼。这些其实都是正常的,并不会影响到系统正常加载。

常见的I2C通信正常报错有哪些呢?怎样去解决?

回帖(2)

宁兴琴

2021-12-29 10:00:46
解决办法:
如果不想要看到这么多错误的打印的话,可以尝试以下几种办法:
(1)可以修改系统启动时的打印等级,通过命令“cconfigs”跳转到方案的配置目录,然后找到文件env*.cfg(这里*指的是内核版本,若是4.9内核,则配置文件名为env-4.9.cfg,在4.9以前版本的内核中都是这样命名的。只有在5.4内核中,是直接命名为env.cfg)。然后修改参数loglevel,将其值改为0,那么就可以减少很多内核打印了。

(2)在触摸屏代码中,在probe函数中初始化一些资源后,尽快地调用I2C去读取触摸屏的一些ID号或者是版本号,若读取失败后,就立即退出驱动加载。没必要继续进行其他设置相关的I2C通信。
2、使用i2c-detect工具检索某个I2C总线哪些地址存在设备时,出现很多错误通信的log信息,可能会令人误以为该I2C总线是有问题的。如下图所示:

上图命令i2cdetect -y 2的作用是:检索I2C2总线上所有的I2C设备。这里的打印其实都是正常的,检索是通过cpu主动向全部I2C地址读写数据来检测的。可能硬件上一根I2C总线就连接了一个I2C设备,只会占用一个I2C设备地址,那么其他地址都是为空的。自然而然地,与这些空的设备地址通信肯定是失败的,因此也一定会有错误的打印打出来。
举报

王桂荣

2021-12-29 10:00:51
解决办法:
(1)减少系统内核打印等级,进入内核打印等级修改节点“printk”的目录:
cd /proc/sys/kernel
ls
cat printk
echo 2 > printk
一般内核打印等级为4,当输入到printk的值小于4时,即可把大于等于4的打印等级全部关闭。
(2)使用adb去调试:
内核打印是通过串口打印出来的,若通过u***连接开发板,通过adb调试进入系统调试界面,adb是不能接收串口打印的,因此自然地看不到内核错误打印。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分