在Alpine Linux上用命令行控制LEDs

我们已经开发了一个用于工业用途的嵌入式树莓派计算模块载体板:PCCB。

pccb-small

正如你所看到的,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了 笑一笑 而且你已经学到了一些关于设备树和设备树覆盖的知识,恭喜你!你已经学会了。

参考文献。