天涯杂谈-比特米盒安装飞牛系统解决风扇自启&液晶显示

0 阅读13分钟

刷了机不能正常使用,就很烦恼,于是继续完善,本文为对应比特米盒的必备配置。

天涯杂谈-ARM设备 FNNAS系统 刷机记录

比特米盒飞牛系统的刷机教程请见上方链接文章。

fnnas_amlogic_s905x-b860h_k6.12.41_2026.03.22.img.gz

fnnas_amlogic_s905x-t95_k6.12.41_2026.03.22.img.gz

fnnas_amlogic_s905x_k6.12.41_2026.03.22.img.gz

这三个最新版镜像包我测试都能刷机到比特米盒,最后一个属于通用版,文件也最大。

另外吐槽一下最新版本依然未能解决关机后仍会重启设备的问题,硬拔断电很伤硬盘。

1.1.20版本可能不显示CPU温度,更新后就显示了。网上看有人说OES升级到1.1.27会出现各种问题,推荐保持1.1.24,但是比特米盒好像影响不大。

一、虚拟内存

因为比特米盒只有1GB内存,而飞牛系统至少需要2GB内存才能正常使用。

sudo -i
fnnas-swap 1

该命令会从当前磁盘空间分出1GB来作为虚拟内存,输入2就是2GB。

如果挂载硬盘,会优先使用硬盘的空间,如果没有挂载硬盘,则直接从当前设备自带存储空间中分出。

没有提前挂载好硬盘的话,因为内置存储只有8GB,只能输入1,其实也够用了。建议从内置存储中分,因为机械硬盘受热【来自处理器】会卡顿,此时本来也是内存不足,就导致没啥意义了。

图片

一般遇到-bash报错都表示复制字符问题,需要清洗代码再复制或者手动输入。

如果ERROR报错,就再输入一次命令。

图片

二、风扇自启

图片

图片

以下许多命令只是摸索过程的记录,最终成品不必须全都执行,请自主判断。

查看是否有fan节点。

ls /sys/class/hwmon/

有显示就表示有。

ls /sys/class/hwmon/hwmon0/

temp1_input表示温度

cat /sys/class/hwmon/hwmon0/temp1_input

输出是 毫摄氏度,比如 46000 = 46℃。

测试风扇能不能被系统控制.

cat /sys/class/hwmon/hwmon0/pwm1

结果是没有。

图片

以上测试结果说明飞牛系统内核未加载风扇 PWM 驱动,无法通过标准 PWM 接口控制风扇。

现在开始部署根据温度自动控制风扇启停的 GPIO 温控脚本。

先安装服务并查询可用 GPIO 编号。

sudo apt update && apt install -y gpiod
gpiodetect
gpioinfo

图片

图片

gpiod 已成功安装,系统识别到两个 GPIO 芯片:

gpiochip0(aobus-banks,11 线)

gpiochip1(periphs-banks,100 线)

比特米盒 S905X 的风扇控制引脚通常映射到 gpiochip1(periphs-banks),且大部分引脚为 unused 状态,可用于控制风扇。常见风扇 GPIO 为 GPIOX_17,也就是gpiochip1下的 line 17。

这里需要确认是否如实,依次测试以下简单的检查命令,每次查看风扇是否转动。以下这些代码也是摸索过程记录,非必须。

gpioset gpiochip1 16=1
gpioset gpiochip1 17=1
gpioset gpiochip1 18=1
gpioset gpiochip1 20=1

19和21因为列表中已经显示使用中,所以无需测试。但是很遗憾,以上三个都没有转动,只能选用复杂的检查命令。

图片

列出所有已被系统占用的 GPIO 线号,后续跳过这些线号。

gpioinfo | grep -E "used|active"

图片

从之前输出可知,line 19/21/35/48/85/96 已被占用,测试时直接跳过。

从gpiochip0的line 0开始测试,每三秒切换到下一个。这段代码从微信文章复制到SSH终端可能会报错,但其实没有问题,建议先清洗再复制。

gpioset gpiochip0 0=1 && sleep 3 && gpioset gpiochip0 0=0
gpioset gpiochip0 1=1 && sleep 3 && gpioset gpiochip0 1=0
gpioset gpiochip0 2=1 && sleep 3 && gpioset gpiochip0 2=0
gpioset gpiochip0 3=1 && sleep 3 && gpioset gpiochip0 3=0
gpioset gpiochip0 4=1 && sleep 3 && gpioset gpiochip0 4=0
gpioset gpiochip0 5=1 && sleep 3 && gpioset gpiochip0 5=0
gpioset gpiochip0 6=1 && sleep 3 && gpioset gpiochip0 6=0
gpioset gpiochip0 7=1 && sleep 3 && gpioset gpiochip0 7=0
gpioset gpiochip0 8=1 && sleep 3 && gpioset gpiochip0 8=0
gpioset gpiochip0 9=1 && sleep 3 && gpioset gpiochip0 9=0

如果没反应就继续往下,实测发现有转动,说明正确引脚就在其中,继续浓缩范围,换一种命令。

gpioset gpiochip0 0=1 & PID0=$!; sleep 10; kill $PID0; gpioset gpiochip0 0=0
gpioset gpiochip0 1=1 & PID1=$!; sleep 10; kill $PID1; gpioset gpiochip0 1=0
gpioset gpiochip0 2=1 & PID2=$!; sleep 10; kill $PID2; gpioset gpiochip0 2=0
gpioset gpiochip0 3=1 & PID3=$!; sleep 10; kill $PID3; gpioset gpiochip0 3=0
gpioset gpiochip0 4=1 & PID4=$!; sleep 10; kill $PID4; gpioset gpiochip0 4=0

最终确认比特米盒的风扇控制引脚是3,不知是否存在其他比特米盒不是这个引脚?

实际上我一开始不是从头测试的,而是从gpiochip1的line 22开始测试,浪费了一下午时间,而且发现70~80区间会引发设备掉线,得拔电重启。

图片

根据gpiochip0的line 3编写脚本。但后来测试/sys/class/gpio/gpio3 不存在,说明飞牛系统禁用了传统 gpio 接口(/sys/class/gpio),需要完全利用 gpiod 工具直接操作芯片寄存器,绕开该接口。下方代码也是一改再改,才终于得到终版,注意代码需要清洗后再使用。温度阈值自由调整,我现在这个设置相当于开机就转。

# 自动温控
sudo su
cat > /usr/local/bin/fan_control.sh <<'EOF'
#!/bin/bash
FAN_CHIP=gpiochip0
FAN_LINE=3
CHECK_INTERVAL=60
CPU_MAX_TEMP=50
CPU_MIN_TEMP=45
PID_FILE="/tmp/fan_pid.pid"
# 开机延迟
sleep 60
# 主循环:按温度控制风扇
while truedo
  # 读取CPU温度
  CPU_TEMP=$(cat /sys/class/thermal/thermal_zone0/temp | awk '{print $1/1000}')

  # 温度>50℃:启动风扇
  if (( $(echo "$CPU_TEMP > $CPU_MAX_TEMP" | bc -l) )); then
    if [ -f "$PID_FILE" ]; then
      kill "$(cat "$PID_FILE")" 2>/dev/null
    fi
    sudo gpioset "$FAN_CHIP" "$FAN_LINE=1" &
    echo $! > "$PID_FILE"

  # 温度<45℃:停止风扇
  elif (( $(echo "$CPU_TEMP < $CPU_MIN_TEMP" | bc -l) )); then
    if [ -f "$PID_FILE" ]; then
      kill "$(cat "$PID_FILE")" 2>/dev/null
      rm -f "$PID_FILE"
    fi
    sudo gpioset "$FAN_CHIP" "$FAN_LINE=0"
  fi

  sleep "$CHECK_INTERVAL"
done
EOF
chmod +x /usr/local/bin/fan_control.sh
systemctl restart fan-control
# 服务配置
cat > /etc/systemd/system/fan-control.service <<'EOF'
[Unit]
Description=Auto Fan Control for BitMii S905X (gpiochip0 line 3)
After=network.target
After=sys-devices-virtual-thermal-thermal_zone0.device
[Service]
Type=simple
ExecStart=/usr/local/bin/fan_control.sh
Restart=always          # 服务异常时自动重启
RestartSec=10           # 重启间隔10秒
User=root               # 以root权限运行
KillMode=mixed          # 终止主进程时同时终止子进程
TimeoutSec=30           # 超时时间30秒
[Install]
WantedBy=multi-user.target
EOF
# 重启服务
systemctl daemon-reload
systemctl enable --now fan-control

图片

题外话:gpiochip0的全局编号比较简单,而gpiochip1基地址为480,如果加上其line 3的值,就相当于480 + 3 = 483。

额外增加一个手动温控的代码,建议配置。两者配合才能实现自动温控 + 手动操作 + 状态查询。

cat > /usr/local/bin/fan <<'EOF'
#!/bin/bash
FAN_CHIP=gpiochip0
FAN_LINE=3
PID_FILE="/tmp/fan_pid.pid"
case "$1" in
  on)
    if [ -f "$PID_FILE" ]; then
      kill "$(cat "$PID_FILE")" 2>/dev/null
    fi
    sudo gpioset "$FAN_CHIP" "$FAN_LINE=1" &
    echo $! > "$PID_FILE"
    echo "✅ 风扇已开启(gpiochip0 line 3)"
    ;;
  off)
    if [ -f "$PID_FILE" ]; then
      kill "$(cat "$PID_FILE")" 2>/dev/null
      rm -f "$PID_FILE"
    fi
    sudo gpioset "$FAN_CHIP" "$FAN_LINE=0"
    echo "❌ 风扇已关闭(gpiochip0 line 3)"
    ;;
  status)
    if [ -f "$PID_FILE" ]; then
      echo "🔵 风扇当前状态:开启"
    else
      echo "⚫ 风扇当前状态:关闭"
    fi
    ;;
  temp)
    CPU_TEMP=$(cat /sys/class/thermal/thermal_zone0/temp | awk '{print $1/1000}')
    echo "🌡️ 当前CPU温度:$CPU_TEMP℃"
    ;;
  *)
    echo "用法:fan [on|off|status|temp]"
    exit 1
    ;;
esac
EOF
chmod +x /usr/local/bin/fan

图片

用法已经写入代码,包含四种快捷控制的封装命令:

图片

gpiod 版本不支持直接读取gpiochip0 line 3的电平(或该引脚为输出模式时无法用 gpioget 读取),改用「PID 文件存在即视为开启」的简化判断,保证状态显示和操作一致。

执行以下命令,确认风扇控制生效,如果复制执行出错就手动输入:

# 测试手动控制状态显示
fan on && fan status
fan off && fan status
# 查看温控服务是否正常
systemctl status fan-control
# 查看温控服务的运行日志
sudo journalctl -u fan-control.service -f

图片

使用fan on/off命令也可以手动切换风扇开关状态。

两个查看命令,运行后都可能停滞很久,甚至可能彻底卡死,但是影响不大,只要分别显示active (running)和successfully,就表示服务正常运行。

图片

但是实测发现,设备自带散热风扇效果较弱,对启动Docker并部署服务时的CPU温度影响不大,区别在于原来超过70℃就崩溃死机,现在超过80℃还能继续运行一会儿,死机概率降低但不是彻底不会死机。所以要求别太高,远程文件管理没问题,娱乐服务就趁早放弃吧。

三、液晶显示

直接说结果:目前测试,飞牛系统的fnnas-openvfd脚本可能无法正确关联比特米盒的驱动与设备节点,也不支持128x64 液晶显示屏(LCD) + I2C 接口。gpio 编号不是物理引脚号,而是内核映射号,总线上没有屏幕。我尝试了两天多种思路都没能成功点亮,但是已知当前有三种方法,也要注意配合dtb文件一致:

1、从 Armbian_21.08.1_Ubuntu_CumeBox2_5.10.602.img 或者 Hinas_cumebox_EMMC.img 这两个镜像包中移植液晶显示配置文件,当然也有风扇自启配置文件。对应镜像文件下载见链接文章末尾私信关键词。有多个网友成功案例,但我尚未找出对应文件。

天涯杂谈-固件刷机-比特米盒私家云二代

2、从 github.com/bearcatl/SS… 修改配置文件。采用嵌入式linux驱动SSD1306芯片的OLED,采用json文件配置显示内容。我也修改参数并测试,下文有记录,但没成功。

3、ophub大佬提供的参数修改方法需要慢慢调试,我尝试了几小时,也没成功。

太费时间,又不影响使用,所以暂时搁置,以后随缘。


以下内容全部无效,记录摸索过程,仅供弯路参考:

飞牛 ARM 版集成了fnnas-openvfd工具,用于控制 LED/OLED 屏。

输入以下命令可以看到当前镜像包的内置LED列表,但很遗憾并不支持比特米盒。

fnnas-openvfd

图片

既然提示自定义配置文件不存在,那就创建一个,首先确保其对应目录是否存在,也可以不管是否存在直接创建一个:

sudo mkdir -p /usr/share/openvfd/conf/

实际上我查了默认存在该目录,只是不存在自定义配置文件罢了。

然后创建并编辑 diy.conf 文件:

sudo nano /usr/share/openvfd/conf/diy.conf

或者复制:

mv /usr/share/openvfd/conf/t95.conf /usr/share/openvfd/conf/diy.conf

将以下比特米盒 S905X 通用适配参数粘贴进去:

# 比特米盒 S905X 专属 DIY 配置(强制注册设备号+适配硬件)
vfd_major=249
vfd_minor=0
vfd_gpio_clk=468
vfd_gpio_dat=469
vfd_gpio_stb=470
vfd_gpio0=471
vfd_gpio1=472
vfd_gpio2=473
vfd_gpio3=474
vfd_chars=16
vfd_lines=2
vfd_dot_bits=8
vfd_invert=0
vfd_brightness=255
vfd_display_type=0
vfd_segment_type=0
vfd_pwm=0
vfd_pwm_chip=0
vfd_pwm_channel=0
vfd_i2c_addr=0x3c
vfd_i2c_bus=1
compatible=meson-gxl-s905x-p212
# 强制创建设备节点
vfd_dev_node=/dev/vfd
vfd_gpio_clk=468
vfd_gpio_dat=469
vfd_gpio_stb=470
vfd_gpio0=0
vfd_gpio1=0
vfd_gpio2=0
vfd_gpio3=0
vfd_gpio_protocol=0
vfd_chars=16
vfd_dot_bits=8
vfd_display_type=2
vfd_display_auto_power=1
vfd_brightness=255
compatible=meson-gxl-s905x-p212
vfd_i2c_bus=0
vfd_i2c_addr=0x27

图片

图片

注:

nano Ctrl+O ➡ ENTER ➡ Ctrl+X

vim ESC ➡ :wq ➡ ENTER

此时仍不能实现液晶显示,需要继续配置。

为了保障驱动找到液晶屏对应的设备节点,安装设备树和I2C工具:

sudo apt install -y device-tree-compiler
sudo apt install -y i2c-tools

图片

升级openvfd驱动:

sudo apt upgrade -y openvfd

图片

查看系统识别的I2C总线:

ls /dev/i2c-0

图片

比特米盒S905X通常显示 /dev/i2c-0 /dev/i2c-1,我实际查询是/dev/i2c-0。

扫描每个总线的设备地址:

i2cdetect -y 0
i2cdetect -y 1

图片

扫描所有可能的寄存器:

i2cdump -y 0 0x30

图片

查看驱动可配置的所有参数及默认值 

modinfo openvfd

1、群里找的sj_oled文件,打开乱码,无法直接写入,由于终端权限问题,可以间接复制操作,并加权限:

mv /vol1/1000/PipeCode/sj_oled /usr/local/bin/sj_oled
chmod +x /usr/local/bin/sj_oled

图片

注:后来得知tmp有写入权限,可以先将文件拖入其内,再mv移动或者cp复制。

编辑/etc/rc.local文件,在exit 0的上一行添加 sj_oled & ,保存退出后重启设备。

nano /etc/rc.local

图片

2、群里找的SSD1306_OLED_Library,也是写入并赋权。

mv /vol1/1000/PipeCode/* /usr/local/bin/
find / -name "ssd" -type f 2>/dev/null
chmod +x /usr/local/bin/config.json
chmod +x /usr/local/bin/ssd
/usr/local/bin/ssd -c /usr/local/bin/config.json > /dev/null &

图片

3、依然是无效尝试。

图片

为了加载s905x的openvfd设备树,需要编辑boot配置,通过查询/boot/确定了当前环境配置文件为fnEnv.txt,而非常见的armbianEnv.txt或config.txt。

图片

输入:

sudo nano /boot/fnEnv.txt

当然也可以通过cat命令或者直接编辑文本,但目前测试飞牛系统没有通过MobaXterm直接编辑并保存文本的权限。

文本末尾添加内容:

# 比特米盒 S905X openvfd 设备树配置
overlay_prefix=meson
overlays=openvfd
param_openvfd=meson-gxl-s905x-p212
extraargs=vfd.gpio_clk=472 vfd.gpio_dat=473 vfd.gpio_stb=474

图片

图片


图片

图片

图片


本公众号发表的所有内容仅代表个人观点,和任何机构、组织或者第三方都没有关系,绝对没有歌颂或抨击任何个体或群体的意图。

本公众号会尽力确保发布内容的准确性和完整性,但无法保障所有信息的及时性或者可靠性。分享的各种信息只是提供参考,不能当作专业的技术指导,是否有效还请自行判断。

本公众号会不定期分享一些资源链接,只是为了提供工作或生活的便利,各位读者使用这些资源的时候请自行承担风险,建议搭配沙盒软件或虚拟系统运行。如果因此导致各位读者的数据和隐私安全损害,本公众号无力负责。

本公众号发布的文字、图片、音乐、视频等素材,部分来源于互联网,在此尊重所有原创作者的合理权益,默认会鸣谢作者或提供原始链接,如有疏漏存在侵权请联系我删除。

本公众号保留随时对发布内容进行修改、删除或者更新的权利。

感谢各位读者的阅读、支持与理解,如果符合您的需求或爱好,烦请关注并「设为星标」。