瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。
【公众号】迅为电子
【粉丝群】258811263(加群获取驱动文档+例程)
【视频观看】嵌入式学习之Linux驱动(第十五篇 I2C_全新升级)_基于RK3568
【购买链接】迅为RK3568开发板瑞芯微Linux安卓鸿蒙ARM核心板人工智能AI主板
第170章 I2C client代码编写(设备树)
在前面的章节中也提到过,I2C实验使用的外设为MIPI屏幕的FT5X06触摸芯片,而在默认提供的源码中已经选中了对应的驱动并添加了相应的设备树,这会给后续的实验带来影响,所以在编写I2C client代码之前需要取消默认的FT5X06驱动和相应的设备树。
在本章节中首先会对设备树中的I2C节点进行分析,然后在第2小节中取消内核中默认的FT5X06的驱动,最后在第3小节从0编写FT5X06的设备树节点。
170.1 I2C设备树分析
在rk3568.dtsi设备树中有关于I2C0、I2C1、I2C2、I2C3、I2C4、I2C5的设备树节点,由于实验要用到的硬件I2C为I2C1所以这里只列举出了I2C1的设备树节点,具体如下所示:
i2c1: i2c@fe5a0000 {
compatible = "rockchip,rk3399-i2c";
reg = <0x0 0xfe5a0000 0x0 0x1000>;
clocks = <&cru CLK_I2C1>, <&cru PCLK_I2C1>;
clock-names = "i2c", "pclk";
interrupts = <GIC_SPI 47 IRQ_TYPE_LEVEL_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&i2c1_xfer>;
#address-cells = <1>;
#size-cells = <0>;
status = "disabled";
};
i2c1: i2c@fe5a0000节点代表I2C1控制器,如果I2C外设挂载到了I2C1上,就可以直接在I2C1 控制器的节点下添加I2C外设的子节点,FT5X06的设备树节点就在kernel/arch/arm64/boot/dts/rockchip/topeet_rk3568_lcds.dtsi中,具体如下所示:
&i2c1 {
status = "okay";
ft5x061:ft5x06@38 {
status = "disabled";
compatible = "edt,edt-ft5306";
reg = <0x38>;
touch-gpio = <&gpio3 RK_PA5 IRQ_TYPE_EDGE_RISING>;
interrupt-parent = <&gpio3>;
interrupts = <RK_PA5 IRQ_TYPE_LEVEL_LOW>;
reset-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_LOW>;
touchscreen-size-x = <800>;
touchscreen-size-y = <1280>;
touch_type = <1>;
};
};
该节点向I2C1控制器节点追加了FT5X06触摸芯片相关的节点,追加之后的节点内容如下所示:
i2c1: i2c@fe5a0000 {
compatible = "rockchip,rk3399-i2c";
reg = <0x0 0xfe5a0000 0x0 0x1000>;
clocks = <&cru CLK_I2C1>, <&cru PCLK_I2C1>;
clock-names = "i2c", "pclk";
interrupts = <GIC_SPI 47 IRQ_TYPE_LEVEL_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&i2c1_xfer>;
#address-cells = <1>;
#size-cells = <0>;
status = "disabled";
ft5x061:ft5x06@38 {
status = "disabled";
compatible = "edt,edt-ft5306";
reg = <0x38>;
touch-gpio = <&gpio3 RK_PA5 IRQ_TYPE_EDGE_RISING>;
interrupt-parent = <&gpio3>;
interrupts = <RK_PA5 IRQ_TYPE_LEVEL_LOW>;
reset-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_LOW>;
touchscreen-size-x = <800>;
touchscreen-size-y = <1280>;
touch_type = <1>;
};
};
这里只是以FT5X06为例进行的讲解,如果想要适配其他的外设或者使用其他的I2C控制器只需要使用同样的方式进行追加即可。
170.2 取消FT5X06驱动和设备树
由于在默认的内核配置文件和设备树中已经添加了FT5X06,而后面我们会重新编写一个FT5X06触摸驱动以及对应的设备树节点,所以需要在内核文件中取消FT5X06驱动的勾选,并在设备树中将FT5X06的节点设置为disabled,具体操作步骤如下。
首先来到Linux sdk的根目录如下图所示:
然后使用以下命令修改内核默认配置文件,找到FT5X06如下图所示:
vim kernel/arch/arm64/configs/rockchip_linux_defconfig
然后在最前面使用#对该行内容进行注释,注释完成如下图所示:
保存退出之后回到主目录,然后继续修改与MIPI触摸相关的设备树,首先使用以下命令确保使能的屏幕为MIPI屏幕,如下图所示:
vim kernel/arch/arm64/boot/dts/rockchip/topeet_screen_choose.dtsi
然后使用以下命令打开topeet_rk3568_lcds.dtsi设备树,找到MIPI屏幕的FT5X06的节点并设置为disabled,设置完成如下图所示:
vim kernel/arch/arm64/boot/dts/rockchip/topeet_rk3568_lcds.dtsi
然后保存退出,至此,关于设备树和内核配置文件的修改就完成了,会在下个小节中从0开始编写FT5X06的设备树节点。
170.3 从0开始编写FT5X06 client
在上个小节中已经取消了内核以及设备树中FT5X06相关的部分,在本小节将会从0开始编写FT5X06的设备树节点。
首先来到Linux SDK的根目录下,如下图所示:
然后使用以下命令进入topeet_rk3568_lcds.dtsi设备树文件,对i2c1节点追加以下内容:
vim kernel/arch/arm64/boot/dts/rockchip/topeet_rk3568_lcds.dtsi
&i2c1 {
status = "okay";
myft5x06: my-ft5x06@38 {
compatible = "my-ft5x06";
reg = <0x38>;
};
};
关于追加的设备树节点描述如下所示:
(1)&i2c1: 表示对I2C控制器1进行引用。
(2)status = "okay";: 表示启用I2C控制器1。
(3)myft5x06: my-ft5x06@38 {: 定义了一个设备节点,命名为myft5x06。my-ft5x06@38表示这个设备的I2C地址为0x38。
(4)compatible = "my-ft5x06";: 这个属性用于标识设备的类型,这里表示这是一个名为"my-ft5x06"的设备。
(5)reg = <0x38>;: 这个属性定义了设备在I2C总线上的地址,这里为0x38。
修改完成的设备树如下所示:
然后保存退出,重新编译内核,得到boot.img镜像,为了方便迅为已经将编译好的内核镜像放到了“iTOP-3568开发板\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动程序\101_i2c_01\04_编译好的内核镜像”目录下。
将boot.img烧写进开发板之后,使用以下命令进入I2C1控制器节点,如下图所示:
cd /proc/device-tree/i2c@fe5a0000/
可以看到myft5x06节点被成功添加,当然现在的FT5X06节点还很简单,在后面的章节中会继续完善FT5X06节点。