该文章仅供参考,编写人不对任何实验设备、人员及测量结果负责!!!
0 引言
文章主要介绍King3399(ubuntu文件系统)风扇控制(GPIO),涉及king-rk3399.dts设备树修改,驱动模块上电自启用
1 散热硬件分析
king3399板载CPU冷却部分由主动散热(风扇)与被动散热(散热槽铝)两个部分组成,若是之前有刷过官方提供的ubuntu镜像应该知道,系统上电就会启动主动散热功能,而对于我们自己编译官方SDK生成的镜像在启动后却并不能自启动该功能,当板子在相对密闭环境或是热天工作时,将会带来安全隐患,本文以此为切入点,学习设备树相关知识
cdrom_king3399_new\03-硬件文档\King3399底板-硬件规格书_20180105.pdf
首先可以在上述网盘路径文档中看到第13号接口为风扇(FAN),且仅有这一个功能输出,接口由PIN1与PIN2组成,显然这两只引脚并非由CPU直接控制
cdrom_king3399_new\03-硬件文档\底板硬件资料\KING3399-20180713 位号图.pdf
cdrom_king3399_new\03-硬件文档\底板硬件资料\KING3399-20180712 原理图.pdf
cdrom_king3399_new\03-硬件文档\芯片手册\Rockchip RK3399 Datasheet V1.0-20160504.pdf
通过上述三个文档可知,第13号接口的元器件位号为J8,在原理图中可以看到J8实际由GPIO1_C2控制通断,在CPU数据手册中可以看到该引脚的可复用功能以及基本电气特性
在没有看数据手册之前,本人一直以为主动散热功能引脚使用的是PWM实现,类似于台式机主板上的风扇,会根据CPU温度调节转速,但king3399该功能并未如此复杂,仅仅是利用一个三极管控制风扇启停
了解上述硬件实现过程后便可着手修改设备树,不同板子该功能引脚可能不同,切记不要上电后盲目控制某个引脚的状态,另外该板子标号为18的接口为空闲接口,可进行输入、输出、ADC、IIC测试,由于引脚间距为2.0mm规格,本人手边无匹配母针,不便使用该接口测试
1 设备树修改
cdrom_king3399_new\02-软件文档\荣品文档\源码文件路径.xlsx
在网盘上述路径中可以找到板子设备树文件的路径如下
/home/username/ws/sdk/kernel/arch/arm64/boot/dts/rockchip/king-rk3399.dts
然实际路径应如下所示
/home/username/ws/sdk/kernel/arch/arm64/boot/dts/rockchip/rk3399/king-rk3399.dts
除此之外这里还涉及到以下两个设备树文件
/home/username/ws/sdk/kernel/arch/arm64/boot/dts/rockchip/rk3399/rp-rk3399-board.dtsi
/home/username/ws/sdk/kernel/arch/arm64/boot/dts/rockchip/rk3399.dtsi
这里需要理清这三个设备树之间的关系,以king3399为例,该开发板由两个主要部分组成:核心板与底板,这三个文件大致可以(并不准确)理解为rk3399.dtsi描述的是CPU,rp-rk3399-board.dtsi描述的是核心板,king-rk3399.dts描述的是底板,理清三者之间的关系后就能够知道如何修改设备树文件
对于一个成熟的产品,例如king3399,其硬件电路已经定版输出,那么其设备树通常不会进行变动,除了像本文第1小节提到的第18号接口外,其他功能已经固化,也即相关引脚功能已确定,不再做变动
这里我们修改FAN控制引脚,能够预知修改结果或者修改结果可控,则可对该控制引脚功能进行改动,上面提到king-rk3399.dts描述的是底板,而我们最终实现的功能(FAN)也是从底板引出,因此需要修改的设备树为king-rk3399.dts
打开king-rk3399.dts并做如下修改
- 禁用原FAN功能逻辑
status = "disabled"
fan_gpio_control { compatible = "fan_gpio_control"; gpio-pin = <&gpio1 RK_PC2 GPIO_ACTIVE_HIGH>; temperature-device = "cpu-thermal"; temp-on = <60000>; time = <10000>; status = "disabled"; }; // 注:原FAN功能逻辑涉及文件如下 // /home/username/ws/sdk/kernel/drivers/rongpin/rp_fan_power.c // /home/username/ws/sdk/buildroot/output/rockchip_rk3399/build/linux-headers-custom/drivers/rongpin/rp_fan_power.c // /home/username/ws/sdk/buildroot/output/rockchip_rk3399_recovery/build/linux-headers-custom/drivers/rongpin/rp_fan_power.c
- 在根节点下添加fan_test子节点
fan_test: fan_test { status = "okay"; compatible="rockchip,rk3399"; fan-gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_HIGH>; pinctrl-names = "default"; pinctrl-0 = <&fan_test_pin>; };
- 在pinctrl子系统中配置FAN引脚
&pinctrl{ fan_test{ fan_test_pin:fan_test_pin{ rockchip,pins=<1 RK_PC2 RK_FUNC_GPIO &pcfg_pull_none>; }; }; };
对king-rk3399.dts完成上述修改后便可重新编译内核,在/home/username/ws/sdk/
目录下执行./build.sh kernel
,大约2分钟完成编译,可在/home/username/ws/sdk/rockdev
目录下查看生成的boot.img,将该文件(其他文件若无改动可只单独烧录boot.img)烧录到king3399并重启
修改后的king-rk3399.dts可在文末仓库链接中获取
2 编译FAN驱动模块
在ubuntu主机/home/username/ws/
目录下创建myfan文件夹,并在该文件夹内创建fan_test.c、fan_app.c与Makefile文件,程序参考的《[野火]《嵌入式Linux驱动开发实战指南—基于LubanCat RK系列板卡》_20240727.pdf(第 11 章 Pinctrl 子系统和 GPIO 子系统)》
编写完fan_test.c、fan_app.c与Makefile文件后在/home/username/ws/myfan/
目录下执行make指令,若无报错可在该目录下生成fan_test.ko与fan_app两个文件,使用scp将这两个文件传到开发板子的lib/modules/x.xx.xxx
下并加载模块,此时可以看到风扇启动,在该目录执行sudo ./fan_app 0
关闭风扇,若想再次启用可以执行sudo ./fan_app 1
3 开机自启动FAN
回顾我们写这篇文章的出发点:系统上电时主动冷却功能没有启用,如果我们只是单纯完成本章上述步骤依然没有解决这个问题,而且,由于我们在king-rk3399.dts中禁用了原FAN功能逻辑status = "disabled"
,如果在使用时忘记去开启FAN,这就会导致无论何种情况,系统的主动冷却功能都无法启用,这显然是致命的BUG
为解决上述问题,我们需要系统在上电时自动启用FAN功能,打开king3399的/etc/modules-load.d/modules.conf
文件,在文件中新添加一行fan_test
并保存,此时重启系统可以看到FAN功能上电自动启用
fan_test.c、fan_app.c与Makefile文件可在文末仓库链接中获取
[1] Git代码仓库
[2] 《【野火】嵌入式Linux驱动开发实战指南—基于LubanCat RK系列板卡》