在全志平台上进行I2C调试时,我们可能会遇到各种问题。以下是我在调试过程中的一些笔记和经验分享,希望对你有所帮助。
在全志平台上使用I2C时,需要注意以下几点:
1. I2C工具的移植。
在全志平台上,默认情况下,并没有提供i2cdetect等工具,需要自己移植。移植的步骤如下:
- 下载i2c-tools源码包,并解压。
- 放到android external目录 , 执行 mmm external/i2c-tools-4.2/。
- 什么 你告诉你是linux系统 , 那就改下makefile 做交叉编译就可以拿到这些文件了。
2. I2C节点的配置。
在全志平台上,每个I2C控制器都有一个对应的节点,如i2c0
、i2c1
、i2c2
等。每个节点都有一个属性twi_id
,用来指定该节点使用哪个I2C控制器。例如,如果twi_id = <3>
,则该节点使用i2c3
控制器。此外,每个节点还需要配置其所连接的从设备的地址和驱动名,如gt9xx@5d
等。这些配置信息可以写在设备树(DTS)文件或者系统配置(sys_config)文件中。如果配置正确,那么在系统启动后,就可以在/sys/class/i2c-adapter/i2c-3/3-005d
等目录下看到相应的设备文件。
3. I2C功能的复用。
由于全志平台的引脚有限,很多引脚都有多种功能,需要通过复用(muxing)来选择。例如,PI0和PI1引脚可以作为I2C3的SCL和SDA信号线,也可以作为普通GPIO。要想使用I2C3功能,就需要将PI0和PI1引脚的功能设置为3(即TWI3)。这个功能设置可以在DTS文件或者sys_config文件中指定,也可以通过修改内核参数来实现。例如,在/proc/sys/debug/sunxi_pinctrl
目录下有一个文件function
,可以用来读取或者修改引脚的功能。如果想将PI0引脚的功能设置为3(即TWI3),可以执行以下命令:
echo PI0 3 > function
如果想查看PI0引脚的当前功能,可以执行以下命令:
如果输出结果是:
130|a40-p1:/ # mount -t debugfs debug /proc/sys/debug # 挂载 debugfs 文件系统 130|a40-p1:/ # cd /proc/sys/debug/sunxi_pinctrl # 进入全志的引脚控制目录 130|a40-p1:/proc/sys/debug/sunxi_pinctrl # mount -t debugfs debug /proc/sys/debug 130|a40-p1:/proc/sys/debug/sunxi_pinctrl # cat sunxi_pin_configure pin[PI1] funciton: 3 pin[PI1] data: 1 pin[PI1] dlevel: 1 pin[PI1] pull: 0 a40-p1:/proc/sys/debug/sunxi_pinctrl # cat sunxi_pin_configure pin[PI0] funciton: 1 pin[PI0] data: 0 pin[PI0] dlevel: 1 pin[PI0] pull: 0 a40-p1:/proc/sys/debug/sunxi_pinctrl # echo PI0 3 > function a40-p1:/proc/sys/debug/sunxi_pinctrl # cat sunxi_pin_configure pin[PI0] funciton: 3 pin[PI0] data: 0 pin[PI0] dlevel: 1 pin[PI0] pull: 0
那么说明PI0引脚已经设置为TWI3功能。
4. I2C设备的检测。
如果想要测试I2C设备是否正常工作,可以使用一些工具来进行检测。例如,在Linux系统中,有一个工具叫做i2cdetect,它可以扫描指定的I2C总线上的所有从设备地址,并显示出来。例如,如果想要扫描i2c3总线上的所有从设备地址,可以执行以下命令:
i2cdetect -ya 3
如果输出结果类似于: 如果是UU说明被占用 , 如果是比如5d , 说明检测到 但是没用driver用。
130|xxx-p1:/proc/sys/debug/sunxi_pinctrl # i2cdetect -ya 3 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- UU -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
如果输出这个内容
1|a40-p1:/ # i2cdetect -y 1 i2cdetect -y 1 Error: Could not open file `/dev/i2c-1' or `/dev/i2c/1': No such file or directory 1|a40-p1:/ # i2cdetect -y 2 i2cdetect -y 2 Error: Could not open file `/dev/i2c-2' or `/dev/i2c/2': No such file or directory 1|a40-p1:/ # i2cdetect -y 3 i2cdetect -y 3 Error: Could not open file `/dev/i2c-3' or `/dev/i2c/3': No such file or directory
提示无法打开/dev/i2c-1
或/dev/i2c/1
文件。这可能是因为我们的系统中没有I2C总线1,或者I2C总线1没有正确地配置。
linux/drivers/i2c/Makefile 有个CONFIG_I2C_CHARDEV=y
宏需要打开。
以上没问题那么说明i2c3总线上有一个从设备,其地址是0x5d,即gt9xx触摸屏。如果输出结果中没有显示任何从设备地址,那么可能有以下几种原因:
- I2C节点的配置错误。例如,twi_id指定的I2C控制器和实际连接的不一致,或者从设备的地址和驱动名写错了。
- I2C功能的复用错误。例如,I2C信号线所对应的引脚的功能没有设置为TWI,而是设置为了其他功能,导致信号无法传输。
- I2C硬件的连接错误。例如,I2C信号线没有正确地连接到从设备的SCL和SDA引脚上,或者信号线有断路、短路等问题,导致信号干扰或者丢失。
如果遇到这些问题,可以通过检查DTS文件、sys_config文件、内核参数、引脚功能、硬件连接等方式来排查和解决。
以上就是我对全志I2C调试笔记的一些补充和注释,希望对你有帮助。如果你还有其他问题欢迎留言。