初步解决粒子云风扇和指示灯控制(不动硬件)

本文介绍了在Linux Rock64设备上通过GPIO控制指示灯和风扇的方法,包括脚本实现温度触发风扇控制,并提供了硬盘休眠设置和自动执行方案。讨论了GPIO复用问题和进一步优化建议。
感谢各位大侠的努力,使得粒子云在刷机linux后能正常运行,本人通过对128个gpio的逐个检测,经历n次死机/刷机后,找出了指示灯和风扇的gpio端口,基本实现对其控制。以下操作均基于ss2 和Armbian_5.75(https://dl.armbian.com/rock64/archive/Armbian_5.75_Rock64_Debian_stretch_default_4.4.174.7z),并且所有命令以root用户执行:

一,指示灯

指示灯的gpip为85。通过如下指令使指示灯变蓝:
echo 85 > /sys/class/gpio/export
echo “high” > /sys/class/gpio/gpio85/direction
echo 85 > /sys/class/gpio/unexport


 

通过如下指令使指示灯变红:
echo 85 > /sys/class/gpio/export
echo “low” > /sys/class/gpio/gpio85/direction
echo 85 > /sys/class/gpio/unexport

二、风扇

         风扇的gpio为70,通过如下命令启动:
echo 70 > /sys/class/gpio/export
echo “high” > /sys/class/gpio/gpio70/direction
echo 70 > /sys/class/gpio/unexport

通过如下命令关闭:
echo 70 > /sys/class/gpio/export
echo “low” > /sys/class/gpio/gpio70/direction
echo 70 > /sys/class/gpio/unexport


 

echo 79 > /sys/class/gpio/export
echo high > /sys/class/gpio/gpio79/direction
echo 79 > /sys/class/gpio/unexport

echo 79 > /sys/class/gpio/export
echo low > /sys/class/gpio/gpio79/direction
echo 79 > /sys/class/gpio/unexport

我写了个脚本(/usr/local/bin/fans),根据cpu温度自动启停风扇,用法如下:
/usr/local/bin/fans 开启温度 停止温度
温度单位是1/1000度,如高于70度开启,低于60度停止,则可以这样执行命令
/usr/local/bin/fans 70000 60000
如果不加参数,则默认为高于70度开启,低于65度停止。

三、硬盘休眠
         通过如下命令设置为5分钟不用则硬盘休眠
         /sbin/hdparm–S60 /dev/sda

四、自动执行
将以下2行命令添加到/etc/rc.local文件,以便每次重启后自动执行:
/sbin/hdparm–S60 /dev/sda
/usr/local/bin/fans&

五、说明
         1,以上均在Armbian_5.75和联想ss2中测试通过;
         2,我家云L1pro不支持指示灯灯光控制;
         3,如果升级 Armbian,则要首先执行如下命令,将内核版本固定,否则风扇不能控制:
apt-mark hold linux-dtb-rockchip64
apt-mark hold linux-image-rockchip64
如果已经升级,将通过如下命令将内核降级:
apt-get install linux-dtb-rockchip64=5.75  linux-image-rockchip64=5.75

         4,也许我的机器是个案,有时不能启动;有时开机时风扇不转,则上面的脚本无效,此时只能多次启动才行,因为对硬件不了解,不明原因。
          5,fans脚本首先启动/停止风扇3次,作为指示之用。

六、下一步建议
     1,建议研究手动编译内核,使得开机时不出现随机因素;
     2,建议研究dts设置,通过pwm进行风扇调速,降低噪音;
     3,建议研究找出前面板的开机按键的gpio端口,可以自如控制机器。
附fans脚本,请将其放到/usr/local/bin下面,并置为可执行:
#!/bin/bash
if [ -n "$1" ]; then
max=$1
else
max=70000
fi
if [ -n "$2" ]; then
min=$2
else
min=65000
fi
echo $max, $min
echo 70 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio70/direction
i=0
for j in 1 2 3 4 5 6
do
echo $i > /sys/class/gpio/gpio70/value
i=$(( 1 - $i ))
sleep 2
done
while true
do
t=`/bin/cat /sys/class/thermal/thermal_zone0/temp`
if [ $t -gt $max ]; then
  echo 1 > /sys/class/gpio/gpio70/value
  echo "$t > $max"
fi
if [ $t -lt $min ]; then
  echo 0 > /sys/class/gpio/gpio70/value
  echo "$t < $min"
fi
sleep 10
done
echo 70 > /sys/class/gpio/unexport
----------------------------------------------------

我写了个脚本,可以死循环读gpio口的值(按ctlr-c退出),运行后点按按键,看数值是否有变化,有变化则就找到其gpio口。
将以下脚本保存为 rr, 运行 chmod +x rr 将其置为可执行,然后运行(比如读取35口)  ./rr 35 即可。
rk3328共有128个,如果有兴趣,建议每位测试一组12个,(0到11,12到23... ),大家共同努力,把按键端口找出来。读的过程中如果死机,可能需要重启动或重刷系统。

#!/bin/bash
echo $1 > /sys/class/gpio/export
echo $1
if [ -e /sys/class/gpio/gpio$1 ]; then
        echo "in" > /sys/class/gpio/gpio$1/direction
        while true
        do
                cat /sys/class/gpio/gpio$1/value
        done
fi
echo $1 > /sys/class/gpio/unexport

-------------------------------------------------------------------------

上面有朋友 说通过轮询查询128个GPIO,那是不准确的。那是再你刷的系统里定义的,其实硬GPIO 就20多个,GPIO是可以复用的,所以在你刷的固件里70是风扇,但官方是79 82 85, 82是对比反馈电压,。
本主板是通过pinctrl 来驱动的。
如果你想编译安卓或者armbian,都要重新定义这些GPIO,目前第三方都是不完整的,希望对重新编译的朋友有用。
有问题留言。

ayufan-rock64 发布的 stretch-minimal-rock64-0.8.3-1141-arm64.img, 79 可以启停风扇!感谢23楼!!

------------------------

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值