King3399(ubuntu文件系统)风扇驱动

ops/2024/10/10 13:57:27/

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

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系列板卡》


http://www.ppmy.cn/ops/123525.html

相关文章

【Java SE 题库】输出一个数的二进制的奇数位和偶数位

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. 题目 2. 分析 3. 代码实现 3.1 运行结果 4. 小结 1. 题目 输入一个数&#xff0c;请分别打印这个数二进制的奇数位和偶数位 例&#xff1a;15 …

2024-10-09 问AI: [AI面试题] 描述数据预处理在 AI 中的重要性

文心一言 数据预处理在人工智能&#xff08;AI&#xff09;中扮演着至关重要的角色&#xff0c;它是构建高效、准确和可靠AI模型不可或缺的步骤。以下是数据预处理在AI中重要性的详细描述&#xff1a; 1. 提高数据质量 清理和去噪&#xff1a;数据预处理可以识别和纠正数据中…

速盾:cdn加速是高防cdn好还是普通cdn好?

CDN加速是现代互联网服务中非常重要的一环&#xff0c;它可以加速网站内容的分发&#xff0c;提高用户访问网站的速度和体验。在CDN加速中&#xff0c;我们常常会遇到两种不同类型的CDN服务&#xff1a;高防CDN和普通CDN。那么究竟是高防CDN好还是普通CDN好呢&#xff1f;下面我…

九大排序之插入排序

1.前言 插入排序是把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。实际中我们玩扑克牌时&#xff0c;就用了插入排序的思想。 本章重点&#xff1a;主要着重的介绍两种插入排序…

【伺服】通信协议之MODBUS、主从设备、TCP/IP协议

MODBUS 是一种广泛应用于工业自动化系统的通信协议&#xff0c;由 Modicon 公司在 1979 年开发。它主要用于可编程逻辑控制器&#xff08;PLC&#xff09;、变频器、仪器仪表等设备之间的通信。MODBUS 协议因为其简单、易于实现&#xff0c;成为工业控制系统中最常用的协议之一…

sqli-labs靶场第三关less-3

sqli-labs靶场第三关less-3 1、确定注入点 http://192.168.128.3/sq/Less-3/?id1 http://192.168.128.3/sq/Less-3/?id2 有不同回显&#xff0c;判断可能存在注入&#xff0c; 2、判断注入类型 输入 http://192.168.128.3/sq/Less-3/?id1 and 11 http://192.168.128.3/sq/L…

【C语言】内存函数

文章目录 memcpy使用和模拟实现memmove使用和模拟实现memset函数的使用memcmp函数的使用 注意:针对内存块&#xff0c;不在乎内存中的数据 memcpy使用和模拟实现 void * memcpy ( void * destination, const void * source, size_t num );• 函数memcpy从source的位置开始向后…

线性判别器LDA

一、LDA的基础介绍 LDA是一种有监督的降维方法&#xff0c;和它比较类似的是PCA(一种无监督的降维方法)&#xff0c;如果对PCA不熟悉的朋友可以看看下面关于PCA的介绍。 1、PCA介绍和基本思想 ​ 主成分分析(PCA)是一种利用正交变换把由线性相关变量表示的观测数据转化为少数…