dbh 发表于 2019-7-5 12:21

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

本帖最后由 dbh 于 2019-7-15 19:17 编辑

感谢各位大侠的努力,使得粒子云在刷机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/exportecho “high” > /sys/class/gpio/gpio85/directionecho 85 > /sys/class/gpio/unexport

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

二、风扇
         风扇的gpio为70,通过如下命令启动:echo 70 > /sys/class/gpio/exportecho “high” > /sys/class/gpio/gpio70/directionecho 70 > /sys/class/gpio/unexport
通过如下命令关闭:echo 70 > /sys/class/gpio/exportecho “low” > /sys/class/gpio/gpio70/directionecho 70 > /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-rockchip64apt-mark hold linux-image-rockchip64如果已经升级,将通过如下命令将内核降级:apt-get install linux-dtb-rockchip64=5.75linux-image-rockchip64=5.75
         4,也许我的机器是个案,有时不能启动;有时开机时风扇不转,则上面的脚本无效,此时只能多次启动才行,因为对硬件不了解,不明原因。
          5,fans脚本首先启动/停止风扇3次,作为指示之用。
六、下一步建议   1,建议研究手动编译内核,使得开机时不出现随机因素;   2,建议研究dts设置,通过pwm进行风扇调速,降低噪音;
   3,建议研究找出前面板的开机按键的gpio端口,可以自如控制机器。附fans脚本,请将其放到/usr/local/bin下面,并置为可执行:
#!/bin/bashif [ -n "$1" ]; then
max=$1
else
max=70000
fiif [ -n "$2" ]; then
min=$2
else
min=65000
fiecho $max, $min
echo 70 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio70/directioni=0
for j in 1 2 3 4 5 6
do
echo $i > /sys/class/gpio/gpio70/value
i=$(( 1 - $i ))
sleep 2
donewhile 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
doneecho 70 > /sys/class/gpio/unexport



xuanyuan8023 发表于 2019-7-5 12:32

给力啊,竟然真的把gpio口给试出来了
另外想问一下有没有找出按键对应的口,一直想用它开关机或者控制风扇

dbh 发表于 2019-7-5 14:58

我写了个脚本,可以死循环读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

soelin 发表于 2019-7-5 15:58

厉害,对linux不熟,只能看看大神。辛苦

一页青岛 发表于 2019-7-5 17:57

厉害,不知道OMV是不是也这样的

dbh 发表于 2019-7-5 20:33

一页青岛 发表于 2019-7-5 17:57
厉害,不知道OMV是不是也这样的

omv是应用程序。在armbian上手动安装omv,是可以的,已经试过。

scxhwhb 发表于 2019-7-6 22:09

root@rock64:/sys/class/gpio/gpio85# echo “high” > /sys/class/gpio/gpio85/direction
-bash: echo: write error: Invalid argument
为什么我的操作不了,最新版的5.88的armbian

scxhwhb 发表于 2019-7-6 22:25

scxhwhb 发表于 2019-7-6 22:09
root@rock64:/sys/class/gpio/gpio85# echo “high” > /sys/class/gpio/gpio85/direction
-bash: echo: w ...

知道了,引号的问题,还有我是说升级了过后风扇咋就不转了,原来是内核的问题

scxhwhb 发表于 2019-7-6 22:46

解决了,降级5.75,成功可以控制风扇了,写写分享

cocker 发表于 2019-7-6 23:13

nb啊,都是高手

deatyr 发表于 2019-7-7 18:44

root@rock64:~# echo 70 > /sys/class/gpio/export
-bash: echo: write error: Device or resource busy
使用5.75刚刷的,遇到了这个问题

dbh 发表于 2019-7-8 09:28

echo 70 > /sys/class/gpio/export 打开gpio, echo 70 > /sys/class/gpio/unexport 用于关闭gpio。在没有关闭的情况下,打开一次就够了,之前我没有写清楚。

Raymond1981 发表于 2019-7-8 09:58

我们要不要 来搞个群大家一起讨论来解决这个问题,让粒子云能够实现它最基本的存储价值,多个 人的力量总比一个人大。

Raymond1981 发表于 2019-7-8 10:52

for j in 1 2 3 4 5 6
do
echo $i > /sys/class/gpio/gpio70/value
i=$(( 1 - $i ))
sleep 2
done

这段代码的作用是什么呀?

scxhwhb 发表于 2019-7-8 14:12

Raymond1981 发表于 2019-7-8 10:52
for j in 1 2 3 4 5 6
do
echo $i > /sys/class/gpio/gpio70/value


间隔2秒开关风扇,循环3次,楼主写了的,开始会启停3次。
页: [1] 2 3
查看完整版本: 初步解决粒子云风扇和指示灯控制(不动硬件)