一. 简介
打开 AP3216C的硬件原理图,我这里打开 "IMX6ULL_ALPHA_V2.2(底板原理图).pdf",如下:
I2C是有两根线,一个是 SCL为时钟线,一个是SDA为数据线。
上图可以看出,AP3216C使用的 I2C1控制器,除了 I2C的这两条线外,还有一个AP_INT接口,这是个中断接口。本实验不用这个中断功能。
在硬件原理图中搜索 "I2C1_SCL"与 "I2C1_SDA"这两个接口,对应连接芯片的哪个PIN:
可以看出, "I2C1_SCL"使用的 UART4_TXD这个pin, "I2C1_SDA"使用的 UART4_RXD这个pin。
接下来就是找到这两个PIN,向设备树中添加 AP3216C设备的设备节点信息。
具体就是将这两个PIN配置为I2C功能,配置这两个PIN的器属性值,设置一些设备节点信息(例如,最重要的是 compatile属性)。
三. 向设备树添加 I2C设备(AP3216C)的设备节点信息
打开ubuntu系统,通过vscode 打开系统下 之前使用的内核源码(NXP官方提供)工程。
注意:这里开发板使用的Nand_flash版的ALPHA开发板,所以,对应的设备树文件(源文件)为 imx6ull-alientek-nand.dts。
1. 查看 i2c1 控制器节点
设备树文件 imx6ull-alientek-nand.dts有调用到 imx6ull-14x14-evk-gpmi-weim.dts文件,这两个文件中都没有 i2c设备节点,继续追溯到 imx6ull-14x14-evk.dts设备树文件。i2c1 设备节点就在 imx6ull-14x14-evk.dts 设备树文件中。
注意: imx6ull.dtsi设备树文件是 NXP官方编写的,虽然这里也有 i2c设备节点,不能在这个设备树文件中进行更改。
在 imx6ull-14x14-evk.dts设备树文件中查找到 i2c1控制器节点。
2. 向设备树添加 I2C设备(AP3216C)的设备节点信息
(1) 首先,添加按键的 pinctrl 节点
pinctrl_i2c1: i2c1grp {
fsl,pins = <
MX6UL_PAD_UART4_TX_DATA__I2C1_SCL 0x4001b8b0
MX6UL_PAD_UART4_RX_DATA__I2C1_SDA 0x4001b8b0
>;
};
(2) 其次,在 i2c1 节点追加 ap3216c 子节点
&i2c1 {
clock-frequency = <100000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c1>;
status = "okay";
mag3110@0e {
compatible = "fsl,mag3110";
reg = <0x0e>;
position = <2>;
};
fxls8471@1e {
compatible = "fsl,fxls8471";
reg = <0x1e>;
position = <0>;
interrupt-parent = <&gpio5>;
interrupts = <0 8>;
};
};
第 7~11 行,mag3110 是个磁力计,NXP 官方的 EVK 开发板上接了 mag3110,因此 NXP 在 i2c1 节点下添加了 mag3110 这个子节点。正点原子的 I.MX6U-ALPHA 开发板上没有用到 mag3110。
&i2c1 {
clock-frequency = <100000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c1>;
status = "okay";
ap3216c@1e {
compatible = "alientek,ap3216c";
reg = <0x1e>;
};
};
3. 编译设备树文件
打开终端进入 内核源码的根目录下,输入如下命令编译设备树文件:
make dtbs
这里可以编译生成新的设备树文件 mx6ull-alientek-nand.dtb(适用于Nand-Flash版ALPHA开发板)。接下来将设备树文件运行到开发板上,测试 设备节点是否添加好。