前言
前不久不知道树莓派抽什么风,风扇的噪音突然变得奇大无比,弄得潇叫苦连连。虽然我亲自去听了之后觉得声音远远比不上他的神舟和那台安装了 FreeBSD 的古董机,但毕竟有求于人,这样下去也不是个办法。稍加分析不难得出,风扇声音大是因为 24 小时常开导致了积灰和磨损,尤其是前者更是难以避免。而我树莓派大部分时候都处于闲置状态,风扇其实是没必要 24 小时上线的。那么,能不能让风扇按需启动呢?这样一来可以改善噪音问题,同时树莓派困扰许久的供电不足问题也能够得到相应的改善。
初步思路
那么,如何用树莓派控制风扇呢?不同于 PC 主板,树莓派并没有能够直接控制风扇的接口,因此要想控制风扇只有通过那 40PIN 的 GPIO 来实现。
首先我们来查一下树莓派的引脚:
我平时长通使用的就是右侧的 4,6 号针脚,而需要控制的话,右侧的 12 号,14 号针脚看起来是个理想的选择。
安装 wiringPi
在树莓派上想要轻松地使用 GPIO 针脚需要用到wiringPi这个库,它可以让我们用 C 或者 C++对树莓派的 GPIO 针脚进行控制。
安装过程非常简单,跟着官网教程走就行了:
1 | git clone git://git.drogon.net/wiringPi |
竟然不是 make 略微让我吃惊,不过安装完成没出什么幺蛾子就好(这个 flag…)。
编写控制代码
其实整个程序的逻辑并不复杂,也就是
- 获取温度
- 根据预先写好的规则进行判断
- 调整 GPIO 输出
相关代码如下:
1 |
|
编译
这部分就是非常基础了,总之先测试一下:
1 | g++ main.cpp -lwiringPi |
看起来并没有遇到什么问题,那么接下来就尝试运行一下吧。
碰壁
1 | # root @ rasp in ~/projects/AutoFan [14:43:28] |
喵喵喵?这什么鬼。。看起来是不认我的 cpuinfo?
赶紧cat
一下:
1 | cat cpuinfo |
这就奇怪了,确实没有硬件相关的字段。。难道是我内核的问题?之前为了所谓的性能提升,我给树莓派安装的是 64 位 Debian,并不是官方的通用 Raspbian。
原因
在翻了大半天 github 之后,我找到了这个issue接着又被导引到这个,里面这个疑似内核维护者的人写道:
1.We aren’t supporting 64-bit builds, although if there are simple things we can do (like hosting defconfigs for arm64) then we will.
2.When we do support arm64 it will be with the absolute minimum number of changes to the upstream kernel (ideally none), and the content of /proc/cpuinfo would not be high on the list of priorities. Board revision number and serial number are concepts that don’t appear to exist in the arm64 architecture, but we will continue to make that information available via /proc/device-tree/system/linux,revision and /proc/device-tree/system/linux,serial, with human-readable versions in /proc/device-tree/model and /proc/device-tree/serial-number
大意就是树莓派 linux 从未支持过 arm64,并且 arm64 的上游内核决定在 cpuinfo 里面显示更少的信息,并将版本号等信息移到/proc/device-tree/model
等地去,他们决定对上游内核做尽可能少的修改,因此不打算修复这个不算 bug 的问题。所有我能做的就是等待 wiringPi 等库更新,以兼容 arm64。
后续
很遗憾,根据这个 issue 提出的日期来看,他们是没有兼容的意向的,因此我现在就维持在一种凉凉的状态。只能说,这就是使用小众系统的代价,找不到文档或者社区支持已经是常态,BSD 也好,slackware 也好,都是这样。
对于这种问题来讲目前是没有什么好思路的,今天天色也不早了,问题留到明天再看看吧。
つづく