在Alpine Linux上用命令行控制LEDs
我们已经开发了一个用于工业用途的嵌入式树莓派计算模块载体板:PCCB。
正如你所看到的,PCCB上有三个(直接)用户可编程的LED:USER / INFO / ACT。
这些都是在设备树中定义的。例如,我们可以在设备树叠加中定义如下。
//LEDs
fragment@11 {
目标=。
覆盖__ {
led_act: ledact {
label = "myledact"。
gpios = ;
linux,default-trigger = "mmc0";
};
led_info: ledinfo {
label = "myledinfo";
gpios = ;
linux,default-trigger = "cpu";
};
led_user: leduser {
label = "myleduser"。
gpios = ;
linux,default-trigger = "heartbeat";
};
};
};
设备树覆盖的源文件(.dts)将需要被编译,并将产生一个.dtbo文件。
这个文件作为覆盖层包含在config.txt中(在我们的例子中,它实际上包含在一个子文件中,即usercfg.txt中,该文件从config.txt中包含。)
# Pi控制载体板覆盖物
dtoverlay=pi-control-carrier-board
这将告诉首先加载的VideoCore操作系统,将特定Pi模型的设备树(包括我们的覆盖层)传递给Linux内核。
什么是设备树?
与拥有标准化组件的标准x86设备相比,ARM设备已经变得越来越定制化和多样化。
为了避免重新编译内核和不得不匹配每一个修改过的硬件,我们设计了一个向Linux内核描述硬件布局的系统。
设备树。
它是一个独立于操作系统的概念,因为它被加载到操作系统的内核中。任何希望支持它的操作系统都可以支持它。
Linux内核将收到设备树,从而知道哪个设备是存在的,它是如何连接的,以及如何与它对话(例如,根据设备树的提示加载驱动程序)。
由于Raspberry Pi不是静态的硬件,但它有不同的配置,可以暴露不同的引脚,例如,也有不同的插件(HATs),所以需要一个额外的插件:设备树覆盖。
这些文件允许修改设备树,而不需要为每一个你可以连接到Pi上或配置到Pi上的硬件的可能组合建立一个单独的新设备树。
我如何控制LED?
这些LED灯将在系统中出现,在 /sys/class/leds 目录。
正如你所看到的,这里总共暴露了四个LED,其中三个(myledact、myledinfo、myleduser)是我们使用覆盖层添加的
这些LED中的每一个本身就是一个目录。
这让你可以控制LED。
记住,在Linux中,所有的东西都是一个文件/与内核对话被抽象为对文件系统进行操作(这实际上是一种UNIX范式)。
运转
猫咪触发器
为LED。
它将向你显示一个列表,说明可以为其设置哪些触发器。
none rc-feedback 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 oneshot heartbeat backlight gpio cpu cpu0 cpu1 cpu2 cpu3 default-on input panic [mmc0] 。
注意,最后一个触发器mmc0在方括号内。这就是当前LED的设置!
你可以尝试通过将这个触发器写入LED,将其设置为其他任何一个触发器(如果你有足够的权限的话 ):
echo "timer" > trigger
将使LED灯闪烁。
注意,如果你现在再次列出LED控制目录,你会看到额外的条目--为定时器模式暴露的新功能。
延迟关闭和延迟开启
cat delay_off
产量为500。这些是500毫秒。
你可以调整这些值,使LED闪烁得更快,比如说。
echo "150" > delay_off
echo "150" > delay_on
或更慢......。
echo "1500" > delay_on
echo "1500" > delay_off
有几个值得注意的触发因素。
- 无:LED上没有活动
- mmc0:如果正在访问Flash/microSD,则处于激活状态。
- cpu:随着CPU的活动而活动(监测CPU的繁忙程度很好,因为如果CPU活动较少,它就会变暗,这要归功于一种有效的PWM)。
- heartbeat: 将给出一个稳定的闪烁模式,以显示Pi仍然是活的,内核仍然在线并在做它的工作。
用我自己的代码控制LED的GPIO?
要从你自己的代码中控制LED,使用GPIO库,将触发器设置为 "无"。
echo "none" > trigger
你仍然可以从命令行中打开和关闭它,通过写入亮度(1表示打开,0表示关闭)。
echo "1" > brightness
echo "0" > brightness
现在你能够从命令行控制一个LED了 而且你已经学到了一些关于设备树和设备树覆盖的知识,恭喜你!你已经学会了。