代码案例:
参考硬件原理图,板子引出了2个I2C接口,分别是I2C0和I2C7.
现在开始添加代码。
在aosp\hikey-linaro\arch\arm64\boot\dts\hisilicon\hi3660.dtsi中配置I2C0,这样就可以编进kernel。
i2c0: i2c@FFD71000 {
compatible = "snps,designware-i2c";
reg = <0x0 0xFFD71000 0x0 0x1000>;
interrupts = <0 118 4>;
#address-cells = <1>;
#size-cells = <0>;
clock-frequency = <400000>;
clocks = <&crg_ctrl HI3660_CLK_GATE_I2C0>;
resets = <&iomcu_rst HI3660_RST_I2C0>;
pinctrl-names = "default";
pinctrl-0 = <&i2c0_pmx_func &i2c0_cfg_func>;
status = "ok";
TSL2561_i2c: TSL2561_i2c@29 {
compatible = "tsl,TSL2561_i2c";
reg = <0x29>;
status = "ok";
};
};
因为I2C2和I2C7是复用的,所以如果要使用I2C7,请注意要把I2C2 disable掉。
i2c2: i2c@FFD73000 {
compatible = "snps,designware-i2c";
reg = <0x0 0xFFD73000 0x0 0x1000>;
interrupts = <0 120 4>;
#address-cells = <1>;
#size-cells = <0>;
clock-frequency = <400000>;
clocks = <&crg_ctrl HI3660_CLK_GATE_I2C2>;
resets = <&iomcu_rst HI3660_RST_I2C2>;
pinctrl-names = "default";
pinctrl-0 = <&i2c2_pmx_func &i2c2_cfg_func>;
status = "disabled";
};
将参考代码放到aosp\hikey-linaro\drivers目录下,然后配置此目录下的kconfig文件和Makefile。
Kconfig中添加
source "drivers/sl2561_hikey/Kconfig"
Makefile中添加
obj-$(CONFIG_TSL2561) += tsl2561_hikey/
最后在Z:\aosp\hikey-linaro\arch\arm64\configs\hikey960_defconfig中添加对应的宏。
CONFIG_TSL2561=y
到此代码的添加已经结束。
接下来就是编译,按照编译教程所述,先编译kernel,然后将kernel生成的image.gz和dtb文件重命名并放入aosp中,最后全编aosp。编译完成后烧录image即可。
最后来验证一下,开机进入adb,正常情况会在如下路径下生成对应的节点,然后cat data,就会出现数据。
*******************************************************************************
i2c error 问题总结:
i2c的ack是作为从设备向主设备回馈的直观表现,也是从设备向控制端发送的回应,现总结ack error可能出现的原因如下:
1.i2c的pin硬件上的连接是否出现问题,比如scl和sda接反了
2.从设备是否正常连接到了控制端,一般来说scl和sda默认是高电平,查看是否正常
3.从设备的地址是否取值正确
4.从设备连接成功但是从设备处于异常状态,如busy或者锁死状态,需要解除这些状态
5.从设备供电是否正常
6.从设备是否使能
7.特殊从设备需要设置到写使能模式
*******************************************************************************
Working