ophub/amlogic-s9xxx-armbian

请教O大有没有办法开启HK1BOX的蓝色指示灯,不是LED显示屏

Yahome opened this issue · 32 comments

O大,您好,我先说明一下情况,我是在淘宝上购买了一个亚克力盒子的HK1BOX,这个盒子里面自带了一个小风扇。

这个风扇在原厂或者SLIMBOX固件的情况下,不需要任何设置就可以自动转。刷CoreELEC或者EmuELEC的时候添加一个自启动文件autostart.sh到这两个系统的/storage/.config/目录下,再重启以后也可以转。刷完openwrt以后,发现也不能转,这样就导致温度升
得太快了,所以自己就想根据这个autostart.sh的代码,尝试一下,但是没有成功,所以特来请教下O大,看看怎么才能让这个风扇转起来。

PS:我在看完O大的LED说明以后,成功将led显示屏内容点亮,感谢。

autostart.sh 自启动文件内容如下
#!/bin/sh
#change GPIO_ACTIVE_HIGH to GPIO_ACTIVE_LOW for sys_led
new_val=$(fdtget -t i /flash/dtb.img /gpioleds/sys_led gpios | sed "s|([0-9]) ([0-9]) .*|\1 \2 0|")
if [ -n "$new_val" ]; then
mount -o remount,rw /flash
fdtput -t i /flash/dtb.img /gpioleds/sys_led gpios $new_val
sync
mount -o remount,ro /flash
fi

看这个内容好像是替换dtb里面系统指示灯的一个参数的数值,因为他这个dtb.img也是一个设备的DTB文件,所以我自己尝试将这段代码修改了一下如下
new_val=$(fdtget -t i /boot/dtb/amlogic/meson-sm1-hk1box-vontar-x3-oc.dtb /gpioleds/sys_led gpios | sed "s|([0-9]) ([0-9]) .*|\1 \2 0|")
if [ -n "$new_val" ]; then
mount -o remount,rw /boot
fdtput -t i /boot/dtb/amlogic/meson-sm1-hk1box-vontar-x3-oc.dtb /gpioleds/sys_led gpios $new_val
sync
mount -o remount,ro /boot
fi

并将这段代码加到/etc/init.d/sysfixtime的start()代码段里面,因为我想放到一个启动项的代码段里面让他每次启动的时候也跟着执行,但是重启以后风扇依然不转。

ophub commented

安卓系统和armbian不同,脚本里的引用文件路径不对。建议你找debian,Ubuntu系统相关的脚本。

https://www.right.com.cn/forum/thread-2025656-1-1.html

这个应该可以,他是在armbian里测试的。

@ophub PWM自动控制.rar 大佬,可帮传送下这个附件嘛, 我来试试(hk1box).

mail: huapox@126.com PS: 恩山帐号忘密码进不去了..

另找了gpio控制pwm的资料: (gpio这些不太懂)

apt-get install wiringpi

#默认的pwm值范围是0~1023
gpio mode 1 pwm
gpio pwm 1 1023

宿主机安装失败,我直接在容器内跑,错误如下:(wiringpi应该是树莓派专用的)

root@armbian:/home/headless# gpio pwm 1 1023
Oops: Unable to determine board revision from /proc/device-tree/system/linux,revision
or from /proc/cpuinfo
 -> No "Hardware" line
 ->  You'd best google the error to find out why.

这还一篇:https://www.znds.com/tv-1200939-1-1.html #是他人在hk1box成功把蓝灯点亮的。他还定制了个跑马灯! (不过测试下来 zvfd跑不起来..zvfd没放出源码)

用到的dtb,zvfd.tar.gz原文在bd盘里,我打包如下:
zvfd,meson-sm1-hk1box-vontar-x3.zip

内核不一样了 (zvfd.tar.gz\lib\modules\5.9.0-arm-64\kernel\drivers\gpio\zvfd.ko)

root@armbian:/sys/class/pwm# TempX 
Open device failed.
: No such file or directory

root@armbian:/sys/class/pwm# zvfdctl 
argc:1,argv:zvfdctl
Usage wrong!
Please see '-h' or '--help'.
root@armbian:/sys/class/pwm# zvfdctl -h

Usage:	zvfdctl [option...] [-on] [-off]
Or:	zvfdctl [timeon] [tempon] [timeoff] [tempoff]
	Note: Time and Temperature can only choose one!!!

	-on			Display Option LED ON.
	-off			Display Option LED OFF.
	timeon [-12h]		Display Time [12h format] on.
	tempon [n]		Display Temperature [greater than 0] on.
	timeoff			Display Time [12h format] off.
	tempoff			Display Temperature [greater than 0] off.
	-h, --help		This text.

Options: 
	alarm			Display Alarm LED.
	usb			Display USB LED.
	play			Display Play LED.
	pause			Display Pause LED.
	eth			Display Ethernet LED.
	wifi			Display WiFi LED.

root@armbian:/sys/class/pwm# zvfdctl timeon -12h
root@armbian:/sys/class/pwm# Open device failed.
: No such file or directory

这还一篇:https://www.znds.com/tv-1200939-1-1.html #是他人在hk1box成功把蓝灯点亮的。他还定制了个跑马灯! (不过测试下来 zvfd跑不起来..zvfd没放出源码)

用到的dtb,zvfd.tar.gz原文在bd盘里,我打包如下: zvfd,meson-sm1-hk1box-vontar-x3.zip


经测,@Yahome, @ophub

  • dtb把如下这段加上就可以了(开机时蓝色电源灯点亮 散热风扇转)
  • 他这的zvfd 实际上应该是openvfd的改版(加了温控显示、跑马灯)
leds {
  compatible = "gpio-leds";
  status = "okay";
  
  sys_led {
	  label = "sys_led";
	  gpios = <0x75 0x0b 0x00>;
	  default-state = "on";
	  linux,default-trigger = "default-on";
  };
};

bank@14 {
  reg = <0x00 0x14 0x00 0x08 0x00 0x1c 0x00 0x08 0x00 0x24 0x00 0x14>;
  reg-names = "mux\0ds\0gpio";
  gpio-controller;
  #gpio-cells = <0x02>;
  gpio-ranges = <0x25 0x00 0x00 0x0f>;
  phandle = <0x75>;
};

图片

图片

原文标注

图片

ophub commented

openvfd里的时间不能显示吗?

openvfd里的时间不能显示吗?


LED面板用openvfd控制都正常, 说的这个灯:

图片

(开机电源灯, 它点亮后某宝一些改散热的方案能用了。 现有hkbox-vontar-x3.dtb开机电源灯不能点亮,表现为1蓝/1红同时微亮)

ophub commented

你把添加的代码在 https://github.com/unifreq 内核库5.4/5.10/5.15/5.19测试下,通过后提交到他的内核源码里吧。

ophub commented

内核里的 zvfd 是从第三方添加的?默认的内核源码里有没有?我没搜到。
这个的驱动也找到可以合并至内核源码,不然你dtb加在f大的源码里可能无效(不复制5.9ko)

内核里的 zvfd 是从第三方添加的?

这个是三方的(参考前面znds地址,帖子作者即原作者 未开源).

个人觉得 可暂不用管他那个zvfd :(温度显示、开机跑马灯之类,后续有条件了可提交PR完善到openvfd那去)

  • 1)dtb里加上led配置,让hk1box开机点亮电源绿灯
  • 2)直接用openvfd即可,这个开源 使用受众相对多
ophub commented

你测试好了就提交到内核源码库吧,代码缩进统一一下tab

好的,晚点时间

ophub commented

感谢你的分享

@huapox @ophub 两位大佬,这个问题有解决方案了吗,我用上面提到的 bd 盘里面的 dtb 文件替换了盒子里的文件,并且修改了 uEnv.txt 的 FDT 为新替换的 dtb 文件路径,开机后发现小风扇转起来了,但是插的网线不能获取 IP 地址。

你可以看下这个帖子的9楼,用他的方法使用没有其他问题故障的dtb文件修改后,再做替换可以正常开启蓝灯和风扇。@hxulin https://www.znds.com/forum.php?mod=viewthread&tid=1225511&page=1#pid63797966

非常感谢你的分享 @renkoud ,我这边试了一下,修改后还是不能获取IP地址,不知道是不是千兆网口有兼容性问题。
我用的固件是 5.10 的版本,5.15 的版本貌似在我的 HK1-Box 中使用不了,表现为开机一直停在开机画面,进不去系统。

7Ji commented

https://github.com/7Ji/YAopenvfD

这两天写了个配合openvfd驱动使用的替换OpenVFDService的服务程序,可以定义包括时间、日期、温度、占用率、IO、网络在内的多个循环显示的内容,自由组合,同时可以设置监视文件(包括设备虚拟文件)、网络连接情况等点亮熄灭各个小图标。

我自己用的启动命令:

YAopenvfD 3:date:year 3:date:month_day 3:date:weekday 10@alarm:date:24h 10:date:12h 3:temp:0 3:cpu 3@play:io:mmcblk2:m 3@pause:net:end0:m @wifi:net_carrier:wlan0 @eth:net_carrier:end0 @usb:file:/sys/bus/usb/devices/1-1 @play:dev:sda @pause:dev:ttyUSB0 --dots-order 0,1,3,2,4,5,6

这个设置是依次循环显示:3秒年份,3年月份+日期,3秒星期几,10秒24小时的时间且点亮闹钟小图标,10秒12小时的时间(24小时和12小时分别点亮和熄灭小图标以区分),3秒温度感应区0(cpu)的温度,3秒cpu占用率,3秒mmcblk2(emmc)的读写速度且点亮播放键小图标,3秒end0网卡上的网速且点亮暂停键小图标(两者点亮不同图标以区分)。并且也:根据wlan0网卡是否联网点亮熄灭wifi小图标,根据end0网卡是否联网点亮熄灭eth小图标,根据是否存在第一个usb设备点亮熄灭usb小图标,根据是否存在第一个外置驱动器点亮熄灭播放键小图标,根据是否存在第一个usb转串口设备点亮熄灭暂停键小图标。

当然,如果不想循环显示不同内容,那么用单一的显示功能也是可以的,比如

YAopenvfD 0:date:24h

就可以像OpenVFDService一样始终显示时钟了

ophub commented

@7Ji
我想集成在armbian里,应该怎么做呢?
这个和现在的openvfd是否冲突?
是否需要在dtb里添加代码支持?
你这一行长长的命令有点看着蒙,能不能改成一种多行配置文件的形式?类似这样:

# Led display control
openvfd_enable="no"
openvfd_boxid="15"
[[ "${openvfd_enable}" == "yes" && -n "${openvfd_boxid}" && -x "/usr/sbin/armbian-openvfd" ]] && {
armbian-openvfd ${openvfd_boxid}
echo "[$(date +"%Y.%m.%d.%H:%M:%S")] The openvfd service started successfully." >>${custom_log}
}

date=year
alarm=enable
wlan0=enable
eth=disabled
7Ji commented

这个和现在的openvfd是否冲突?

这个项目的定义就是Yet Another openvfd Deamon:又一个OpenVFD的守护进程,它是替换OpenVFD项目内的用户空间服务程序OpenVFDService的,所以不能和另一个守护进程共用。但在内核空间,仍然需要依赖原本openvfd模块工作。

是否需要在dtb里添加代码支持?

不需要,因为它是用户空间的实现,不需要在内核空间做修改。或者说,和openvfd对于dtb添加代码支持的要求是一样的

你这一行长长的命令有点看着蒙,能不能改成一种多行配置文件的形式?

这个守护进程本身的命令行长,是因为这是一个纯命令行程序,处理命令行比处理配置文件方便。你自然可以额外写一个脚本来处理一个你定义的配置文件来翻译成YAopenvfD的命令行。

我想集成在armbian里,应该怎么做呢?

这个项目依然提供静态链接的AArch64二进制。不过和ampart一样我还是建议你在Armbian里原生编译,毕竟静态链接的二进制因为要包含所有C依赖库,比动态链接的大很多。

用户空间的外围调用逻辑,可以参考我打的AUR包,这个包用一个systemd.service单元来管理,读取一个配置文件

7Ji commented

https://github.com/ophub/amlogic-s9xxx-armbian/tree/main/build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/share/openvfd

看起来和这个配置文件通用?

因为要加载openvfd模块,而且YAopenvfD也需要用到openvfd模块的vfd_dot_bits参数来修改小图标位置顺序,所以自然要用openvfd的配置。YAopenvfD的主要点是在openvfd模块的基础上,通过用户空间程序实现随意组合排列的显示功能。

ophub commented

现在用armbian-openvfd 15这样就能激活一个盒子的led,每个盒子一个id对应。对用户来说只要在表格里查看自己的设备ID是什么。没有的也可以比较容易地根据说明去上游复制一个模板改几行数值即可调试使用。

你这个的命令很长,我到此刻还没看明白怎么用。
对用户来说他改那一行命令,可能其中一个字母敲错了,或者少了一个空格,或者需要大量调试,这都会让他望而却步。

我的想法是能不能用把这些配置命令的工作简单到傻瓜模式,面向用户来说,比如 YAopenvfD boxid 这种方法就好了,那行配置我们放在某个或多个配置文件里,一般用户不需要改,想改的给个修改说明。

对你这样的专家,怎么也改不错,再长的命令也能一眼读懂。但是用户是外行,很多人照着说明敲一个 ./install-openwrt 的命令都能敲错了。这么长的命令他们会模糊的。

7Ji commented

显示内容是自由组合的,我用的那条很长不代表你要把它作为默认。事实上那条是为hk1 box定制的,其他盒子的小图标一般不一样。

你可以把YAopenvfD的二进制放到path外,而只要把原来行的调用openvfd的部分改成

YAopenvfD_args="0:date:24h --dots-order ${vfd_dot_bits}"
/path/to/YAopenvfD ${YAopenvfD_args}

就是和原来一样一直显示时间

YAopenvfD 的命令本身是命令行API的实现,如果你不想用这个API,写个脚本wrap过去就得了,不可能改YAopenvfD的参数的,那样的话要重写一整个几百行C代码的配置处理模块

7Ji commented

YAopenvfD boxid 这种方法就好了,那行配置我们放在某个或多个配置文件里,一般用户不需要改,想改的给个修改说明

YAopenvfD是替换OpenVFDService的,不是替换armbian-openvfd的。为什么你认为需要修改YAopenvfD来提供一个boxid的判断?通过boxid判断需要塞给YaopenvfD的参数,这个是armbian-openvfd的工作,不是YAopenvfD自己要处理的。

实现让YAopenvfD去读boxid对应的配置的逻辑,那么把YAopenvfD和你要用的配置文件的布局之间的关系锁死了,强耦合。YAopenvfD写的最大动力就是实现不依赖于任何发行版、任何其他用户空间程序的单二进制,来替换CoreELEC/LibreELEC才能用的OpenVFDService + service.openvfd这个组合的功能,并更加强大。通过命令行吃参数,则不依赖于任何既有的配置文件格式。本来不也是

来读取配置再调用的OpenVFDService吗?我不明白这里直接拉起YAopenvfD有何本质的区别。

要注意,YAopenvfD守护进程,它本来也不应该由用户在终端上直接运行。守护进程(Daemon)应该由管理程序(systemd等,或者和armbian-openvfd一样一个Bash脚本直接加&扔给系统接管)来后台管理。仅当需要调试显示内容参数时,不经过管理程序而直接运行YAopenvfD才是有必要的。


能不能改成一种多行配置文件的形式

date=year
alarm=enable
wlan0=enable
eth=disabled

YAopenvfD支持若干个任意类型、任意时长的不同的显示内容的任意组合,同一类型的显示内容可以多次出现。当你想要实现对这种配置的支持的时候,YAopenvfD本身的命令行API就是最简的实现:

YAopenvfD 0:date:24h

是以24小时格式显示时间,其中0:date:24h定义了一个显示内容:时间无限,类型为日期/时间,类型定义为24小时制

YAopenvfD 0:temp:0

是显示温度感应区0(即/sys/class/thermal/thermal_zone0/temp对应数据)的温度,其中0:temp:0定义了一个显示内容:时间无限,类型为温度,类型定义为0

YAopenvfD 3:date:24h 3:date:12h

是交替以24小时格式和12小时格式显示时间,各显示3秒,两个参数分别定义一个3秒的显示内容

YAopenvfD 3:date:24h 3:temp:0 3:date:12h 3:temp:0

是交替:24小时格式的时间,温度感应区0的温度,12小时格式的时间,温度感应区0的温度,各3秒。注意:同一类型,哪怕是同一定义的显示内容也是可以多次出现的,如果用配置文件,你要以怎样的设置来判断多次显示同样内容

YAopenvfD 3@alarm:date:24h 3:date:12h

是交替以24小时格式和12小时格式显示时间,各显示3秒,两个参数分别定义一个3秒的显示内容,但是额外地,以24小时格式显示时间时,保持闹钟小图标亮起,从而能让你在看的时候更轻松地分辨24小时和12小时的时间。

YAopenvfD 3@usb:date:24h 3:date:12h

和前者类似,但是用usb小图标来标志正在显示的是24小时。注意:显示某内容期间,需要保持亮起的小图标,并不受显示内容限制,任何小图标,只要存在,都可以设置保持亮起。这些图标就是你配置文件里已有的,可以通过写到/sys/class/led/openvfd/led_{on,off}来直接开关的图标。

YAopenvfD 0:date:24h @eth:net_carrier:eth0

则在第一条示例命令的基础上(始终以24小时格式显示时间),额外指定一个监视内容(数字开头是显示/汇报内容,@开头是监视内容,相同的是小图标前都是加@:@本来就是at的意思,keep this icon on/off at this reporter/watcher,符合直觉):监视报告的小图标是eth,类型是net_carrier(网络接口物理层是否联通),监视定义为eth0。即监视eth0网卡的物理层是否联通,如果联通,就保持eth小图标亮起;否则,保持eth小图标熄灭。

组合大量不同的显示内容和监视内容,则是此前发的那条我用在HK1 Box上的。

如果用多行配置文件来设置,你要如何规定某个显示内容为何?持续时间为多久?yamljson等支持dict等类型的文件格式也许是一个选择,但是若你实现了不同的支持,会发现配置文件引入的这层抽象让整个配置变得更加麻烦了。

当然,一个简单的配置文件思路,是根据某些选项的设置与否直接简单地增加减少某些显示内容:

YAopenvfD_arg=''
[[ "${year}" ]] && YAopenvfD_arg+= " 3:date:year"
[[ "${month_day}" && YAopenvfD_arg+= " 3:date:month_day"
......
YAopenvfD_arg+=" --dots-order ${vfd_dot_bits}"
YAopenvfD ${YAopenvfD_arg}

如此一来,你通过强行规定几个预设的显示内容,替用户做了决定,隐藏了所有背后的不同显示内容的细节。

ophub commented

我是举例 YAopenvfD Boxid ,意思也是 VfdScript Boxid 。不是要修改 YAopenvfD 这个文件。

我是想把已知的一些设备,根据他的可显示的图标,给预设好一个可读性较好的配置文件,让用户0代码先使用起来,个性化定制自己再根据说明去微调。一种类似 armbian-openvfd boxid 的方法。把这串 YAopenvfD 0:date:24h @eth:net_carrier:eth0 命令执行的操作,放在一些面向用户的简单易改的txt类型的配置文件里,配置参数的命名上可读性更强一些,让用户不看说明只看单词能知道他在设置什么。如果可配置选项较多就每个设备一个独立预设文件,如果不多就合并为一个文件。

对于技术性用户,什么样的格式的配置都可以使用起来。
你说的对,替用户做决定预设显示内容不是好做法,让用户自己动手体会其中的细节吧。

我之前为了尽量降低使用门槛,添加了 armbian-software 软件中心,其实就是用户以前手动敲代码安装软件,安装docker,但是在f大的交流群里,很多用户复制粘贴代码都错误,一个安装至emmc的指令都敲不对要问许久,基础目录设置都不会改,应该放在data分区的数据都安装在了root目录导致系统盘满了。为了降低大家敲命令的错误率,降低使用门槛,我照猫画虎地鼓捣出了luci-app-amlogic 晶晨宝盒插件,实现了可视化点按钮完成全部之前敲代码实现的操作。对于技术性玩家,这个软件中心和晶晨宝盒插件简直是多余的,甚至降低了他们敲代码的乐趣。但是面向入门级用户,看列表选123和可视化点按钮的方法解决了他们很多操作不当,设置不当的问题。

基于开源理念,想了解软件运行逻辑和乐趣的用户,会去仓库的代码里学习开发者的设计逻辑,并进行个性化修改,不需要替他做预设,他的乐趣不是使用而是折腾的过程。对于非技术型用户,可能看见长串的代码就放弃了。对于软件开发者来说,有很多高大上行业标准和杰出的设计理念,但用户是技术门外汉,只能用小白可以理解的方法介绍怎么用。

中秋节院子里苹果树上的七彩跑马灯带很漂亮,你自己拿树莓派编一个挂树上玩,但是成千上万的家庭只能做到开箱即用,你给他提供树莓派,开发说明书,使用指南,七彩配置diy攻略。。。我想明年的中秋节他家的苹果树也不会忽闪忽闪亮晶晶。

不过我觉得你说的对,不能替用户做决定,让用户动手设置更有乐趣,linux的乐趣就是多动手。

Seems PR merged: unifreq/linux-5.15.y#52

	leds {
		compatible = "gpio-leds";
		status = "okay";
		sys_led {
			label = "sys_led";
			gpios = <&gpio_ao GPIOAO_11 GPIO_ACTIVE_HIGH>;
			default-state = "on";
			linux,default-trigger = "default-on";
		};
	};

抱歉插嘴提问一下,我在CoreELEC的/storage/.config/下添加了autostart.sh的代码,但是重启蓝灯还是不亮,在CoreELEC内依旧是关机或者待机蓝灯亮,运行则不亮?重启过多次依旧不会执行autostart.sh是什么原因呢?是否是因为我刷入的是Android+Coreelec双系统的缘故?开机优先是启动Android然后通过软件切换到Coreelec的原因?请问如何解决这个问题呢?望赐教。

ophub commented

Coreelec和armbian内核不同

请问最近编译的HK1 box openwrt固件无法启动,需要如何调整,期待解决,谢谢(5.0、6.0内核都试了)

接显示器看到跑到什么代码处了

HK1出了个变种,百兆版本,也是905X3,不知道能否适配,期待解决