项目场景:
SOC:NXP imx8mq Android 10平台移植LT8619c i2c驱动流程及debug记录
流程:
1. 仿照其他i2c设备添加8619c设备节点
相关dts文件:
./arch/arm64/boot/dts/freescale/imx8mq-evk.dts./arch/arm64/boot/dts/freescale/imx8mq-evk.dts
这里注意添加后在文件系统bus/i2c/devices里会显示1-0064而不是2-0064,因为i2c设备是从0开始计数的
同时要在iomuxc中添加对reset gpio的定义:
2. 代码移植
此部分参考厂商给的单片机代码移植,配置寄存器等搬砖体力活,略
3. 配置将新增加的驱动编译进内核
-
新建8619c/Makefile
-
新建8919c/Kconfig
-
在上一级目录drivers的Kconfig中新增
-
在drivers/Makefile中新增
-
在android_build/vendor/nxp-opensource/kernel_imx/arch/arm64/configs/imx_v8_android_defconfig中加入:
这里编译好的.o文件放在~/work/android_build/out/target/product/evk_8mq/obj/KERNEL_OBJ/drivers
遇到的问题描述:
问题1.
i2c无法调用probe函数
debug日志:
- 使用atmel的驱动不连ts情况下可以调用probe,且/sys/bus/i2c/devices中会有1-004b的设备地址
说明driver只跟dts中的信息进行匹配而不是实际硬件。 - 8619c在driver中有但devices没有,说明driver没有和dts信息匹配上
- ls -l out的img发现dts文件时间戳没有更新
- 最后改成修改./arch/arm64/boot/dts/freescale/imx8mq-evk.dts文件,编译可以解决
问题2.
Reset pin无法控制
debug日志:
- 进入sys/class/gpio/,通过echo 101>export来显示相应的gpio
- 进入后使用
echo 1 > value
echo “out” > direction
来调试gpio
调试后发现无法控制gpio,所以未获取gpio的信息 - 与mxt_ts对比,发现没有写devm_gpiod_get_optional函数
- 添加后可正常控制
问题3.
i2c无法完成读写,i2c_transfer错误码返回-6,表示未找到设备或地址
debug日志:
- 测量i2c 一直被拉低
- reset脚也一直被拉低
- 查看原理图后跳电阻更改设置相应的gpio
- 扎波形发现有其他i2c器件干扰,
在android_build/vendor/nxp-opensource/kernel_imx/arch/arm64/configs/imx_v8_android_defconfig中先将其他i2c2的设备关掉 - 波形对比STM32 i2c(011001000)与Android i2c(110010001),发现stm32 i2c使用的是写8位而Android是写7位,所以将Android i2c设备数地址改成0x32,之后正常读写
问题4.
运行驱动系统崩溃:
debug日志:
由代码得知可能是访问ONCHIP_EDID数组时出现问题,由于使用eeprom的edid所以这里先注释掉,之后再进行debug
问题5.
8619c无法正常接收到HDMI信号
debug日志:
- 由于Android在启动过程中HDMI信号是一直有的,所以问题应该不是HDMI信源的问题,首先使用STM32驱动板进行测试,观察在内核和Android启动中连接HDMI是否可以使屏正常显示。(注意这里使用的STM32驱动代码不能是带有while1循环的)
测试结果:stm32驱动的8619C可以正常显示,并与Android驱动打印相同 - 再次核对两个驱动代码,寻找问题,发现我在写Android驱动时,在wait Hsyn…这句话之后就返回了-1,(这里还不太清楚当probe方法返回-1之后内核会做什么,之后要看一下源码;)更改程序让probe正常返回0,然后再次实验
- 更新后仍然无法点亮屏幕,i2c读函数读取的数据都是正确的。而且出现新问题,写入devm_gpiod_get_optional函数时内核启动就会崩溃。调试后原来是pcie1口的蓝牙模块需要用到gpio3-5口,dts中disable即可。
- 最后发现是显示屏没有上电-,- 这种问题犯的有点尴尬啊,不过通过这个小项目是把i2c的坑都踩了一遍。。。