支持主板风扇调速的龙芯3A2000C Linux 5.10内核

之前在《安装DEBIAN 11到长城龙芯3A2000C平台》一文中,记录了如何将Debian 11安装到龙芯3A2000C电脑上。Debian 11默认的Linux内核版本是5.10,对比龙芯官方的内核,版本比较新,能够支持许多新的特性。但是也带来了一些问题,这个内核并未针对长城的龙芯3A2000C主板做优化,例如主板的风扇转速就一直居高不下,且操作系统也无法获得主板的转速,在特定的场合就无法静音运行(例如做NAS)。

龙芯官方的内核是4.19版本的,没有这个问题。我花时间研究了下官方的4.19内核源码,发现产生这个问题的原因是,5.10内核并未包含EC芯片的驱动程序,且主板上的EC芯片也无法直接获得CPU的温度,官方内核的解决办法是,通过内核获得当前温度,每秒更新一次给EC芯片,以便于其根据策略控制风扇转速。

/*
 * Kernel helper policy
 *
 * Fan is controlled by EC in laptop pruducts, but EC can not get the current
 * cpu temperature which used for adjusting the current fan speed.
 *
 * So, kernel read the CPU temperature and notify it to EC per second,
 * that's all!
 */
struct loongson_fan_policy kernel_helper_policy = {
        .type = KERNEL_HELPER_POLICY,
        .adjust_period = 1,
        .depend_temp = loongson3_cpu_temp,
};

/*
 * Policy at step mode
 *
 * up_step array    |   down_step array
 *                  |
 * [min, 50),  50%  |   (min, 45),  50%
 * [50,  60),  60%  |   [45,  55),  60%
 * [60,  70),  70%  |   [55,  65),  70%
 * [70,  80),  80%  |   [65,  75),  80%
 * [80,  max), 100% |   [75,  max), 100%
 *
 */
struct loongson_fan_policy step_speed_policy = {
        .type = STEP_SPEED_POLICY,
        .adjust_period = 1,
        .depend_temp = loongson3_cpu_temp,
        .up_step_num = 5,
        .down_step_num = 5,
        .up_step = {
                        {MIN_TEMP, 50,    50},
                        {   50,    60,    60},
                        {   60,    70,    70},
                        {   70,    80,    80},
                        {   80, MAX_TEMP, 100},
                   },
        .down_step = {
                        {MIN_TEMP, 45,    50},
                        {   45,    55,    60},
                        {   55,    65,    70},
                        {   65,    75,    80},
                        {   75, MAX_TEMP, 100},
                     },
};

/*
 * Constant speed policy
 *
 */
struct loongson_fan_policy constant_speed_policy = {
        .type = CONSTANT_SPEED_POLICY,
};

相关的部分代码

了解到这个原因后,就参考官方的内核,把相关代码搬到5.10内核中,并根据新的内核源码做了修改,调整了Makefile。于是经过半小时的交叉编译,现在的5.10内核可以读取风扇转速了,而且一开机也不会全速运转发出噪音了,完全可以放在书房静音使用。

我把编译好的内核打了包 ,需要的朋友可以到以下地址下载。当然我周末会更新到之前做的NAS和系统的镜像中,之后下载的朋友就可以享受最新的静音NAS镜像了。已经安装的朋友可以用安装包手动更新内核(更新完记得改 /boot/grub.cfg 文件用新内核启动哦)。

下载地址:

根据GPL协议,修改过的内核源代码可以在这里下载:

12 thoughts on “支持主板风扇调速的龙芯3A2000C Linux 5.10内核

  1. 大佬太厉害了,早有这个我就不用买了个猫扇了,猫扇也没啥用,也是很吵。马上试一下。

    1. 试了下新内核可以正常运行,风扇1100多转,温度60多度。有两个问题反馈一下:
      1、默认的debian11不支持zst压缩的deb,所以用https://unix.stackexchange.com/questions/669004/zst-compression-not-supported-by-apt-dpkg 的方法重新做了一下deb才能安装
      2、换猫扇的话,转速太慢压不住温度,所以大佬有没方法自己定义文中的温度和转速的对应关系。

  2. 补充一些内容,芯片驱动是drivers/platform/mips/sbx00_fan.c,安装了新内核后可以用/sys/devices/virtual/hwmon/hwmon3控制,pwm1_enable = 1时可以echo 0-255给pwm1来控制原装风扇速度,最大1800转(很吵)。我用的猫扇没法正常工作,可能是因为EC驱动里pm2_iowrite(FREQDIV0_REG, PWM_19KHZ); ,而猫扇的工作频率是25KHz,所以大佬能不能提供下修改后的kernel和交叉编译的命令?

    1. 没问题,稍后我把我改过之后的源码打包传上来。gcc交叉编译环境我用的龙芯提供的gcc-8.3环境,Loongnix.org网站有下

  3. 我是使用手动安装包从5.10升级到的这个修改的内核。在原来的内核版本中我使用一个USB无线网卡(rtl8192fu)连接WIFI。更换到新内核后,我重新编译安装其驱动产生以下报错

    ERROR: Kernel configuration is invalid.
    include/generated/autoconf.h or include/config/auto.conf are missing.
    Run ‘make oldconfig && make prepare’ on kernel src to fix it.

    我发现是/usr/src/linux-headers-5.10.205-geeklogic/include/autoconf.h文件缺失了
    于是我按照提示进行make oldconfig && make prepare 或者我也尝试了make menuconfig
    但这些命令都会产生同样的报错

    /bin/sh: 1: scripts/basic/fixdep: Exec format error

    在互联网上找了一段时间,还是没有理解这个报错应该如何解决。
    本人是一名对计算机感兴趣的学生,第一次接触到linux内核层面的知识。提出问题和理解问题都不够成熟,希望能向大家请教一下问题出在哪里。谢谢。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据