hi3798mv200调控gt911遇见的几个无法解决的问题

1)首先第一个问题是gt911的从机地址每次上电都会随机在5d和14之间随机变化,不受我设备树所填的属性影响。我在内核中添加了几处打印,我自己编写的设备树节点属性是通过i2c_probe匹配到了,没有动其他的代码,不知道为什么gt911的从机地址会每次上电都自动随机变化,打印信息如下:
·下图是设备树中GT911节点reg属性修改为0x15后内核打印,可以看到是匹配成功了:

img

但是在arm平台通过i2c-tools扫描到的却是5d,感觉好像和我设备树没有关联一样;

img

2)第二个问题是i2c_transfer发送信息函数执行失败;内核打印开看报错提示是-6;通过查询得知是没有这个设备或地址;但可以通过i2c-tools的i2cdetect扫描到i2c的设备地址,很奇怪。又因为gt911的寄存器地址是16位的,暂时没有搞明白i2c-tools的i2ctransfer可执行程序的命令行用法,所以判断不了这个i2c-tools扫描到的从机地址是否可以读写:打印信息如下:
下图中good开头是我添加的打印信息;Goodix是系统打印:

img


下图是goodix部分驱动代码:

img


下图是通过i2c-tools扫描到的gt911从机地址(0x5d或者0x14):

img

求有经验或者明白问题可能出在哪儿的牛人解惑;

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:

针对第一个问题,GT911从机地址每次上电随机变化的问题,可能是由于以下原因:

1. 设备树中的reg属性设置错误,没有正确匹配到GT911设备。

2. GT911芯片本身就存在从机地址随机变化的问题。

针对第一个可能的原因,可以检查设备树中的reg属性是否正确设置为GT911的从机地址。可以尝试在设备树中添加“compatible”属性,将其设置为“goodix,gt911”,看是否能够正确匹配到GT911设备。另外,也可以查看内核代码,确认是否正确处理了设备树中的reg属性。

针对第二个可能的原因,可以参考GT911的相关文档,查看是否存在从机地址随机变化的问题,并尝试寻找解决方案。


针对第二个问题,i2c_transfer发送信息函数执行失败的原因可能有多种,可以尝试以下方法进行排查:

1. 检查i2c_transfer函数的参数设置是否正确,特别是从机地址是否正确。
2. 检查i2c驱动是否正确加载,并且设备节点是否正确创建。
3. 检查GT911芯片是否正确连接到i2c总线上,特别是SDA和SCL线是否连接正确。
4. 检查i2c总线上是否存在其他设备占用了GT911的从机地址。
5. 检查i2c总线的电气特性是否满足GT911芯片的要求,例如时钟频率、上拉电阻等。

针对GT911芯片的寄存器地址是16位的问题,可以参考GT911的相关文档,了解其寄存器映射表,并根据需要设置正确的寄存器地址和数据。可以尝试使用i2c-tools中的i2cdump命令,读取GT911芯片的寄存器值,确认i2c-tools是否可以正确读写GT911芯片。

注:如果以上检查都没有问题,您可以尝试使用i2c-tools中的i2ctransfer工具来测试GT911芯片的读写功能。具体来说,您可以使用以下命令来测试:

sudo i2ctransfer -y <i2c-bus> w<address> <register> <value>

如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

以下内容部分参考ChatGPT模型:
针对你的问题,我有一些思路可以给你参考:

1)关于从机地址随机变化的问题,可能是由于i2c设备的电源管理导致的。你可以在设备树中添加电源控制节点,并在驱动中处理电源状态变化的情况。另外,你可以尝试在驱动中添加一些延时等待的代码,确保设备已经完全启动后再进行操作。

2)关于i2c_transfer发送信息函数执行失败的问题,可能是由于设备地址不正确或者传输的数据格式有误。你可以在驱动中添加一些打印信息,用来跟踪i2c传输过程中的细节。另外,你可以尝试使用i2c-tools的i2cget和i2cset命令来手动读写设备的寄存器,以确定设备地址和数据格式是否正确。

希望以上思路对你有所帮助。如果还有其它问题,欢迎继续提问。
如果我的建议对您有帮助、请点击采纳、祝您生活愉快

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
针对您的两个问题,我给出以下参考答案:

1)从机地址随机变化的问题

首先,我建议您检查一下设备树中关于GT911节点的配置是否正确,包括从机地址是否已经正确设置为0x15。如果这一点没有问题,您可以尝试通过以下方式解决:

在设备树中,打开对应I2C控制器的status属性,将其设置为"okay",表示设备树正确识别了这个I2C控制器。如果这个属性为"disabled",会导致该I2C控制器无法工作。

检查一下I2C控制器的时钟频率是否准确。如果时钟频率不准确,可能会导致通信失败或者无法识别设备。

在驱动程序中,可以通过debug打印来确认GT911的从机地址是否被正确地读取。如果读取到的地址不一致或者不正确,可以检查驱动程序中关于从机地址的代码实现是否正确,或者是否和设备树属性匹配。

2)i2c_transfer发送失败的问题

首先,您可以确认一下函数返回错误码的情况下的具体原因,可以通过errno变量来获取。常见的错误码包括:EIO(通信受干扰或设备无响应)、ENOMEM(内存不足)、ENXIO(没有这个设备或地址)等。

另外,可以检查驱动程序中关于i2c_transfer的代码实现是否正确,是否正确地指定了相关参数(从机地址、寄存器地址、数据等)。

最后,您可以尝试使用i2c-tools提供的i2cgeti2cset命令来验证GT911的从机地址是否可以读写。这两个命令可以以不同的方式读取和写入寄存器数据,具体用法可以通过man i2cgetman i2cset来查看。

希望以上建议能够帮助您解决问题,如果还有疑问,请随时追问,我会尽力帮助您。
如果我的回答解决了您的问题,请采纳!

有无用过hi3798mv200或者一个系列的其他ic的牛人,他的i2c控制器是哪个呀,我在芯片手册中没有发现hi3798的i2c总线控制器;

img

img