该文章仅供参考,编写人不对任何实验设备、人员及测量结果负责!!!

0 引言

文章主要介绍King3399(ubuntu文件系统)风扇控制(GPIO),涉及king-rk3399.dts设备树修改,驱动模块上电自启用

1 散热硬件分析

king3399板载CPU冷却部分由主动散热(风扇)与被动散热(散热槽铝)两个部分组成,若是之前有刷过官方提供的ubuntu镜像应该知道,系统上电就会启动主动散热功能,而对于我们自己编译官方SDK生成的镜像在启动后却并不能自启动该功能,当板子在相对密闭环境或是热天工作时,将会带来安全隐患,本文以此为切入点,学习设备树相关知识

cdrom_king3399_new\03-硬件文档\King3399底板-硬件规格书_20180105.pdf

00 实物图
首先可以在上述网盘路径文档中看到第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

01 原理图
通过上述三个文档可知,第13号接口的元器件位号为J8,在原理图中可以看到J8实际由GPIO1_C2控制通断,在CPU数据手册中可以看到该引脚的可复用功能以及基本电气特性

在没有看数据手册之前,本人一直以为主动散热功能引脚使用的是PWM实现,类似于台式机主板上的风扇,会根据CPU温度调节转速,但king3399该功能并未如此复杂,仅仅是利用一个三极管控制风扇启停

了解上述硬件实现过程后便可着手修改设备树,不同板子该功能引脚可能不同,切记不要上电后盲目控制某个引脚的状态,另外该板子标号为18的接口为空闲接口,可进行输入、输出、ADC、IIC测试,由于引脚间距为2.0mm规格,本人手边无匹配母针,不便使用该接口测试

03 空闲引脚

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并做如下修改

  1. 禁用原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
    
  2. 在根节点下添加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>;
    };
    
  3. 在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系列板卡》

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部