随身WIFI折腾日记(一)---霓虹灯

news2025/1/13 6:16:02

引言

通过对高通410芯片的随身WIFI刷写Debain系统,我们已经拥有了一台带4G功能的迷你ARM64单板电脑。现在我们可以基于此此平台进行一下二次开发。

随身WIFI的优势就是价格低廉,性能和树莓派zero2、树莓派3b差不多。

硬件配置如下

  • msm8916 主控 Cortex-A53 * 4 on 0.9GHZ
  • 512MB内存+4GB储存emcp
  • WCN3620 & WCN3680b
  • pm8916 PMIC
  • USB接口

外设的io定义如下

型号red ledgreen ledblue led按键
ufi001b/cgpio22gpio21gpio20gpio37

一、霓虹灯

我主要是想通过点亮LED灯学习一下Linux如何控制底层硬件设备。

1.1 点灯

随身WIFI存在三个led灯,openstick作者设置默认blue表示wifi连接状态,red表示系统是否还处于正常运行状态。

  • 可以通过 echo <行为> > /sys/class/led/<名字>/trigger 来修改led行为。
    可用的行为如下:

    root@openstick:/sys/class/leds/green:internet# cat trigger 
    [none] usb-gadget usb-host rfkill-any rfkill-none kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock timer heartbeat cpu cpu0 cpu1 cpu2 cpu3 default-on panic mmc0 bluetooth-power hci0-power rfkill0 phy0rx phy0tx phy0assoc phy0radio rfkill1
    

可以看到green:internet设备的trigger属性为[none],触发事件为无,即关灯。

  • 设置green led为常量状态

    root@openstick:/sys/class/leds/green:internet# echo default-on > trigger
    

    image-20230517190959899

  • green led的行为定义为usb device模式的活动状态

    root@openstick:/sys/class/leds/green:internet# echo usb-gadget > trigger
    

写入该字符串后led行为立刻生效,重启失效。配置完成后绿色LED在每次USB接口有数据传输时都会闪烁。

1.2 命令解析

 root@openstick:/sys/class/leds/green:internet# echo usb-gadget > trigger
  • /sys: sysfs是一种虚拟的文件系统,可以查看和控制Linux系统中的设备驱动程序和硬件信息。通过sysfs,可以获得系统中已经加载的驱动程序的信息,包括文件系统,输入设备,串口,以太网等等。我们可以通过读写/sys目录下虚拟出来的设备文件控制底层硬件。
  • class - sysfs目录中的一个部分,包含所有的类,用于实现驱动程序中的设备模型。
  • leds - 设备类的名称,用于控制和访问系统的LED组。
  • green:internet - 设备的名称,用于指示您要使用的特定的LED。
  • trigger - 设备属性,表示LED触发器。允许你改变LED工作的模式(例如常亮、闪烁等)。常见的一些trigger值包括none(常亮)、timer(闪烁)、heartbeat(心跳等节律),不同的LED设备支持不同的trigger。可以使用cat命令读取该文件来查看LED设备支持哪些trigger。LED有很多其他常用属性,例如
    • brightness - LED亮度,值为0-255之间的整数。
    • max_brightness - LED的最大亮度值。可以使用cat命令读取该文件来获取LED的最大亮度值。
    • delay_ondelay_off - 用于设置闪烁效果的LED特有属性。delay_on表示LED打开状态的时间长度,delay_off表示LED关闭状态的时间长度。
  • >-重定向符号,即将前面的命令的输出结果(标准输出流stdout)写入到其后面指定的文件中。即向trigger设备文件中写入usb-gadget字符。

总结来说,通过sysfs虚拟文件系统控制底层设备的方法如下:

#  写数据到设备
$/sys/class/设备组/设备名称# echo 属性值 > 属性名称
#  从设备读数据
$/sys/class/设备组/设备名称# cat  属性名称

1.3 硬件控制方式

sysfs之外,我们还可以通过以下方式来控制底层硬件:

  1. 控制寄存器 - 通过使用适当的驱动程序和底层编程语言(如C语言或汇编语言),直接访问控制硬件设备的寄存器。这需要了解硬件设备的寄存器地址和寄存器的具体功能和使用方法。
  2. I/O端口 - 通过使用适当的驱动程序和底层编程语言(如C语言或汇编语言),访问控制硬件设备的I/O端口。这需要了解硬件设备I/O端口的地址和具体的输入输出方法。
  3. 设备文件 - 一些设备可以视为文件,并提供类似文件操作的接口来进行控制。比如,通过/dev/ttyS0设备文件访问串口设备。这需要了解设备文件的访问方法以及设备的具体使用方法。

这些方法都需要了解硬件设备的具体实现细节,因此需要较高水平的技能才能进行硬件控制。如果你想更简单地控制硬件,可以考虑使用通用的高级硬件控制框架或库。这些框架和库一般隐藏了底层硬件控制的实现细节,提供了易于使用和跨平台的高级接口,使得你可以用更简单的方式来控制硬件。

一些流行的高级硬件控制框架或库包括:

  1. WiringPi(用于树莓派)
  2. RPi.GPIO(树莓派Python库)
  3. Adafruit-GPIO(通用的Python GPIO库)
  4. libusb(通用的USB设备控制库)
  5. PyUSB(通用的Python USB库)

使用这些框架或库,你可以用更高级别的代码(通常是Python或其他易于使用的脚本语言)来控制硬件,并且不需要深入了解硬件控制的实现细节,因为这些库已经将它们隐藏在后台中。需要注意的是,使用这些库的好处是简单易用,但是它们可能会带来一些性能和可定制性方面的限制。如果你是高级硬件控制的专家或需要特定的功能,你可能需要更深入地了解底层硬件控制,然后自己实现控制逻辑。

1.4 底层实现:设备树和驱动

image-20230517023046610

为了了解操作系统如何从底层控制LED,我们先需要了解 驱动设备树(Device Tree)2个概念:

  • 驱动程序:实际上是内核的一个模块,用于控制和管理硬件设备。当一个硬件设备插入计算机时,内核会根据其硬件信息来加载相应的驱动程序。驱动程序能够访问硬件设备的寄存器,从而控制设备的操作,例如读写设备状态、发送和接收数据、控制设备的电源等。其它还在操作系统与硬件之间建立了一个桥梁,使得应用程序可以和硬件设备进行交互。通过驱动程序,应用程序可以访问硬件设备。驱动程序建立了一个硬件抽象层,向应用程序提供一些统一用户接口或API,使得用户可以访问某些硬件设备的特性或操作。

  • 设备树:在kernel 3.0以及之后的版本,都是采用设备树的方法实现驱动设备之间的联系。当内核启动时,会在设备树文件中查找与当前系统中硬件设备匹配的节点,之后内核会加载相应的驱动程序来控制设备。这个过程可以通过设备树绑定(Device Tree Binding)来实现。驱动程序需要知道它所控制硬件设备的详细信息,包括设备的寄存器、中断路由、时序等信息。这些信息可以在设备树文件中定义。因此,在编写驱动程序时,需要编写相应的设备树绑定,并根据绑定的规范来编写相应的驱动程序。

    设备树文件通常是系统供应商提供的二进制文件或源代码文件,而在开发中,也会根据具体需求编写或修改。通过设备树文件,内核可以识别硬件并加载相应的设备驱动程序。

简单来说,设备树文件描述了一个系统中的硬件设备及其属性,而驱动程序则实现了针对这些硬件设备的控制和操作。他们的作用总结如下。

  • 驱动程序:提供了一系列的操作系统调用和接口,使得应用程序可以与硬件设备进行交互,方便应用程序开发。

  • 设备树:设备树以文本描述的方式表达硬件结构,与平台无关,方便硬件的移植和维护。可以为不同的硬件平台提供一致的接口,简化驱动程序的开发。

因为随身WIFI的根文件系统中没有Linux源码,所以要想看到设备树和驱动程序的源码,估计需要解包boot.img镜像。太复杂了,没有再深入探究。

1.5 霓虹灯

做点有趣的事,随身WIFI有红 绿 蓝 三个LED灯,尽管不能控制灯的亮度,但应该依旧可以组合出黄色(红+绿),洋红色(红+蓝),青色(绿+蓝),混合(绿+蓝+红)4种颜色。我们来写一个shell脚本,让LED在这些颜色中交替变化吧

for i in $(seq 1 20)
do
  echo none > /sys/class/leds/green:internet/trigger
  echo none > /sys/class/leds/blue:wifi/trigger
  echo none > /sys/class/leds/red:os/trigger

  echo 1 > /sys/class/leds/green:internet/brightness
  sleep 0.25
  echo 0 > /sys/class/leds/green:internet/brightness

  echo 1 > /sys/class/leds/blue:wifi/brightness
  sleep 0.25
  echo 0 > /sys/class/leds/blue:wifi/brightness

  echo 1 > /sys/class/leds/red:os/brightness
  sleep 0.25
  
  echo 1 > /sys/class/leds/green:internet/brightness
  sleep 0.25
  echo 0 > /sys/class/leds/red:os/brightness
  

  echo 1 > /sys/class/leds/blue:wifi/brightness
  sleep 0.25
  echo 0 > /sys/class/leds/green:internet/brightness

  echo 1 > /sys/class/leds/red:os/brightness
  sleep 0.25
  
  echo 1 > /sys/class/leds/green:internet/brightness
  sleep 0.25
  echo 0 > /sys/class/leds/green:internet/brightness
  echo 0 > /sys/class/leds/red:os/brightness
  echo 0 > /sys/class/leds/blue:wifi/brightness  
done

echo none > /sys/class/leds/green:internet/trigger
echo none > /sys/class/leds/blue:wifi/trigger
echo none > /sys/class/leds/red:os/trigger

echo 0 > /sys/class/leds/green:internet/brightness
echo 0 > /sys/class/leds/blue:wifi/brightness
echo 0 > /sys/class/leds/red:os/brightness

这个shell脚本中,我们使用 for 循环运行 20 次,每次间隔 0.25 秒钟,最终脚本会运行 35秒钟。最后,我们再次关闭所有灯的闪烁模式,并用 echo 0 控制所有灯都熄灭。这样可以保证脚本最终状态不会有任何灯闪烁。灯光闪烁的顺序是:绿–蓝–红–黄–青–洋红–混合

image-20230517190903634

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/560762.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

随身WIFI折腾日记(二)---文件传输和软件安装

二、文件传输 我们可以通过SCP和SFTP工具和随身WIFI(USB连接)进行数据传输&#xff0c;上图以scp工具为例。 将本地电脑文件传输至随身WIFI&#xff0c;本地电脑上输入如下指令即可&#xff1a; scp /path/to/local/file user192.168.68.1:/path/to/remote/directory/注意&…

RK3568平台开发系列讲解(驱动基础篇)10min带你获取、了解与编译Kernel源代码

🚀返回专栏总目录 文章目录 一、Kernel获取二、Kernel根目录2.1 Documentation/2.1 arch/2.2 block/2.3 boot.its2.4 drivers/2.5 firmware/2.6 fs/2.7 include/2.8 init/2.9 ipc/2.10 kernel/2.11 lib/2.12 lo

(转载)从0开始学matlab(第13天)—画图进阶

我们将讨论简单的二维图象(之前已有所介绍)的附加特性。这些特性将允许我们控制 x&#xff0c;y 轴上的值的范围&#xff0c;在一个坐标系内打印多个图象&#xff0c;或创建多个图&#xff0c;或在一个图象窗口内创建多个子图像&#xff0c;或提供更加强大的轨迹文本字符控制。…

【c语言】全部知识点总结

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ …

前端如何做单元测试? 看这篇就入门了

前言 对于现在的前端工程&#xff0c;一个标准完整的项目&#xff0c;通常情况单元测试是非常必要的。但很多时候我们只是完成了项目而忽略了项目测试。我认为其中一个很大的原因是很多人对单元测试认知不够&#xff0c;因此我写了这边文章&#xff0c;一方面期望通过这篇文章…

基于DDSRF正负序分离方法的不平衡电网PQ控制策略_平衡电流控制

0.前言 对于并网逆变器而言&#xff0c;电网会存在不平衡的情况。在这种情况下&#xff0c;不平衡的电网电压可以分解成为正序、负序和零序分量。并网逆变器通常期望能够实现单位功率因数并网&#xff0c;向电网注入对称的正弦电流&#xff0c;所以此时的微电网逆变器控制策略显…

DC-9靶机-简单谈一下端口敲门技术 (Port Knocking)

前言 在打靶机DC-9时&#xff0c;爆破SSH时一直显示失败&#xff0c;经过查阅才知道原来是对端口做了“隐藏”&#xff0c;需要通过 Port Knocking 来主动开启&#xff0c;由于平时接触到的机会不多&#xff0c;所以这里简单记录一下&#xff0c;加强一下印象&#xff0c;也希…

Systrace系列7 —— Vsync 解读

本文主要是是介绍 Android 中的 Vsync 机制。文章会从 Systrace 的角度来看 Android 系统如何基于 Vsync 每一帧的展示。Vsync 是 Systrace 中一个非常关键的机制,虽然我们在操作手机的时候看不见,摸不着,但是在 Systrace 中我们可以看到,Android 系统在 Vsync 信号的指引下…

Tomcat系统架构浅析

大家好&#xff0c;我是易安&#xff01; 今天咱们就来一步一步分析Tomcat的设计思路&#xff0c;看看Tomcat的设计者们是如何设计一个复杂系统&#xff0c;怎么设计顶层模块&#xff0c;以及模块之间的关系。 Tomcat总体架构 我们知道如果要设计一个系统&#xff0c;首先是要…

特征缩放(Scale Features)、特征缩放预测​CO2 值、df列索引扩展

目录 1、特征缩放 2、预测CO2 值 3、df列索引扩展 1、特征缩放 特征缩放可以用于不同的度量单位。度量单位不同的情况下&#xff0c;特征的数值大小也会有所不同&#xff0c;这可能会影响到某些机器学习算法的表现。例如&#xff0c;如果一个特征的单位是英寸&#xff0c;而另…

DAB-DETR代码学习笔记

先上一张整体架构图 &#xff1a; 代码地址&#xff1a;GitHub - IDEA-Research/DAB-DETR: [ICLR 2022] DAB-DETR: Dynamic Anchor Boxes are Better Queries for DETR 论文地址&#xff1a; https://arxiv.org/pdf/2201.12329.pdf 文章全名《DYNAMIC ANCHOR BOXES ARE BETTER …

建模杂谈系列223 Q-Learning示例的代码拆解分析

说明 找到了一个合适的例子&#xff0c;然后我对其中的内容进行了拆解分析。我觉得代码表达的内容比伪代码清晰多了。 这次算是补砖了(监督无监督强化)&#xff0c;过去实际上接触过很多强化体系内的基本工具&#xff0c;但一直没有开始做&#xff0c;部分原因是没时间&#…

Java 与排序算法(5):归并排序

一、归并排序 归并排序&#xff08;Merge Sort&#xff09;是一种基于分治思想的排序算法。它将待排序的数组分成两个长度相等的子数组&#xff0c;然后对这两个子数组分别进行归并排序&#xff0c;最后将两个排好序的子数组合并成一个有序的数组。 具体实现过程如下&#xf…

【国内chatgpt使用方法合集】(5月22日已更新)

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

Elasticsearch文档操作:初学者指南(2023年最新版包含DSL语句的使用和RestHighLevelClient在Java中的使用)

2023年还没有学习Elasticsearch?&#xff0c;那么您将错过最强大、最通用的编程语言之一。 本文将介绍在Elasticsearch对文档分别使用DSL语句和Java High Level REST ClientAPI来对文档进行操作。获取更多信息查看官网帮助文档 运行环境&#xff1a; Linux&#xff0c;docke…

驱动开发DAY6

非阻塞IO 在应用程序中读取硬件数据时&#xff0c;无论硬件数据是否准备完毕&#xff0c;read&#xff08;&#xff09;函数不会阻塞&#xff0c;继续向下执行 阻塞IO 当应用程序中读取硬件数据时&#xff0c;在硬件数据没有准备好时&#xff0c;进程会阻塞在read&#xff08;&…

C语言——如何写出好的代码?

哈喽&#xff0c;大家好&#xff0c;今天我们来学习如何才能写出优秀的代码&#xff0c;主要讲的是assert和const的用法。 首先&#xff0c;什么样的代码才算的上是优秀的代码呢&#xff1f;应该符合下面的要求&#xff1a; 1. 代码运行正常 2. bug很少 3. 效率高 4. 可读性高 …

自抗扰PID(梯形图源代码)

有关ADRC的详细算法和源代码,请参看专栏的系列文章,这里不再赘述,常用链接如下: ADRC自抗扰控制算法(含梯形图完整源代码和算法公式)_adrc算法_RXXW_Dor的博客-CSDN博客PLC的自抗扰控制(ADRC)算法_RXXW_Dor的博客-CSDN博客_adrc算法1、自抗扰控制算法,网上很多文章有所…

x210---根文件系统制作

一、busybox的移植 1.1、busybox源码下载 (1)busybox是一个开源项目&#xff0c;所以源代码可以直接从网上下载。 (2)busybox的版本差异不大&#xff0c;版本新旧无所谓。 (3)下载busybox可以去linuxidc等镜像网站&#xff0c;也可以去www.busybox.net官方网站下载。 1.2、修…

技术人如何写简历?(文末有福利)

前言 笔者在滴滴、阿里和字节时候也面试了不少人&#xff0c;看过形形色色的简历没有上百也有大几十份了。校招季也快到了&#xff0c;这里总结自身经验聊一下 技术人的简历如何去写面试官是怎么样从一份简历去开展后续的面试 简历的作用 简历是你向一家公司求职的“敲门砖…