Android 10平台移植LT8619c i2c驱动

项目场景:

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日志:

  1. 使用atmel的驱动不连ts情况下可以调用probe,且/sys/bus/i2c/devices中会有1-004b的设备地址
    说明driver只跟dts中的信息进行匹配而不是实际硬件。
  2. 8619c在driver中有但devices没有,说明driver没有和dts信息匹配上
  3. ls -l out的img发现dts文件时间戳没有更新
  4. 最后改成修改./arch/arm64/boot/dts/freescale/imx8mq-evk.dts文件,编译可以解决

问题2.

 Reset pin无法控制

debug日志:

  1. 进入sys/class/gpio/,通过echo 101>export来显示相应的gpio
  2. 进入后使用
    echo 1 > value
    echo “out” > direction
    来调试gpio
    调试后发现无法控制gpio,所以未获取gpio的信息
  3. 与mxt_ts对比,发现没有写devm_gpiod_get_optional函数
    在这里插入图片描述
  4. 添加后可正常控制

问题3.

  i2c无法完成读写,i2c_transfer错误码返回-6,表示未找到设备或地址

debug日志:

  1. 测量i2c 一直被拉低
  2. reset脚也一直被拉低
  3. 查看原理图后跳电阻更改设置相应的gpio
  4. 扎波形发现有其他i2c器件干扰,
    在android_build/vendor/nxp-opensource/kernel_imx/arch/arm64/configs/imx_v8_android_defconfig中先将其他i2c2的设备关掉
  5. 波形对比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日志:

  1. 由于Android在启动过程中HDMI信号是一直有的,所以问题应该不是HDMI信源的问题,首先使用STM32驱动板进行测试,观察在内核和Android启动中连接HDMI是否可以使屏正常显示。(注意这里使用的STM32驱动代码不能是带有while1循环的)
    测试结果:stm32驱动的8619C可以正常显示,并与Android驱动打印相同
  2. 再次核对两个驱动代码,寻找问题,发现我在写Android驱动时,在wait Hsyn…这句话之后就返回了-1,(这里还不太清楚当probe方法返回-1之后内核会做什么,之后要看一下源码;)更改程序让probe正常返回0,然后再次实验
  3. 更新后仍然无法点亮屏幕,i2c读函数读取的数据都是正确的。而且出现新问题,写入devm_gpiod_get_optional函数时内核启动就会崩溃。调试后原来是pcie1口的蓝牙模块需要用到gpio3-5口,dts中disable即可。
  4. 最后发现是显示屏没有上电-,- 这种问题犯的有点尴尬啊,不过通过这个小项目是把i2c的坑都踩了一遍。。。
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值