一、I2C配置(硬件描述)
1.根据原理图,查找相关的i2c引脚对应的GPIO值,以GPIO10作为I2C_SDA,GPIO11作为I2C_SCL为例。
查找GPIO10与GPIO11对应的BLSP,以及检查GPIO10与GPIO11是否可以作为I2C来使用。根据文档,GPIO10对应BLSP3_1,GPIO11对应BLSP3_0。
GPIOFUNCTION
GPIO_6,GP1O_7BLSP2
GPIO_10,GOIO_11BLSP3
GPIO_14,GP1O_15BLSP4
GPIO_18,GP1O_19BLSP5
GPIO_22,GP1O_23BLSP6
GPIO_87,GP1O_88BLSP7
3.查找I2C部分BLSP3_0与BLSP3_1对应内容,包括其物理地址、reg size、中断号......
对应内容如下:
二、I2C配置(软件概述)
1.进入kernel/msm-3.18/arch/arm/boot/dts/qcom/路径下修改msm8937-pinctrl.dtsi文件
GPIO配置如下:
注意:1. MSM8917 的 pinctrl 文件为 msm8917-pinctrl.dtsi.
2. MSM8953 的 pinctrl 文件为 msm8953-pinctrl.dtsi
2.进入kernel/msm-3.18/arch/arm/boot/dts/qcom/路径下修改msm8937.dtsi文件
添加一个新的设备树节点
注意:1.红色方框中的内容需根据第三步内容进行修改
2. MSM8917 对应的文件为 msm8917.dtsi.
3. MSM8953 对应的文件为 msm8953.dtsi
3.进入kernel/msm-3.18/drivers/clk/msm路径下修改clock-gcc-8952.c文件
添加时钟节点如下图所示:
注意:1. MSM8917 对应的文件为 clock-gcc-8952.c
2. MSM8953 对应的文件为 clock-gcc-8953.c
4.编译kernel,在顶层目录下make bootimage –j12,在out目录下生成boot.img文件
路径为 LA.UM.5.6 /out/target/product/msm8937_64/boot.img
在DOS命令下,adb reboot bootloader
fastboot flash boot d:\\xxx\boot.img
若显示okay,执行 fastboot reboot。
注意:1.MSM8917 对应的路径为 LA.UM.5.6 /out/target/product/msm8937_32/boot.img
2.MSM8953 对应的路径为 LA.UM.5.6 /out/target/product/msm8953_64/boot.img
三、I2C BUS验证
配置好I2C后,我们需保证I2C BUS被注册
验证过程如下:
adb shell //-------> Get adb shell
cd /dev/
ls i2c* //--------> to list all the i2c buses
如果显示i2c-3,则表示I2C BUS已被注册
四、I2C调试检查
1、检查I2C配置的相关内容,是否存在错误,或者漏配。
2、确保SDA和SCL所配置的GPIO没有被其他设备所配置,否则硬件配置会出问题或者GPIO设置无效。
3、若I2C配置无误后,检查相关硬件问题
使用万用表测量I2C_SDA以及I2C_SCL的供电电压,如果与原理图中所示供电电压相差无几,则表示I2C供电电压没有问题。反之,则代表供电电压存在问题。
4、添加从设备
(1)、 通过设备树来注册一个从设备
如果I2C总线正常工作,我们就可以创建一个从设备驱动程序并注册到i2c总线上
我们使用st1663i触摸屏的驱动注册作为范例,引用文件:
kernel/drivers/input/touchscreen/st1663i/sitronix_i2c_touch.c
(2)、创建一个设备树节点
文件修改:
/kernel/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5.dtsi
添加一个新的设备树节点:
(3)、编译完成后,利用示波器测量I2C_SDA以及I2C_SCL波形
测试流程如下
adb root
adb remount
adb push i2c_test system/bin
adb shell
cd system/bin
chmod 777 i2c_test
./i2c_test /dev/i2c-3 0xaddr(从设备物理地址) 0(读) 0xaddr(寄存器地址)
如果I2C没有问题,所示I2C_SDA波形应为以下形式
I2C start > 0xE0 (write of 0x70) > 0x1 (reg offset ) > I2C stop > delay > I2C start > 0xE1 (read of 0x70) > > 8 bytes > I2C stop