@allen 发表于 2014-9-1 16:20:23

[嵌入式学习]led 子系统与led trigger

本帖最后由 @allen 于 2014-9-2 10:02 编辑

更多的基于cubieboard 的学习贴可搜:嵌入式学习


1. cubieboard 板载led 了解与使用

以CT为例,ls /sys/class/leds/可以看到blue:ph21:led1/   green:ph07:led4/orange:ph20:led2/ white:ph11:led3/以绿灯为例在/sys/class/leds/green\:ph07\:led4/有:brightnessdevicemax_brightnesspowersubsystemtriggerueventroot@cubietruck:~# cat /sys/class/leds/green\:ph07\:led4/trigger
none rfkill0 battery-charging-or-full battery-charging battery-full battery-charging-blink-full-solid ac-online usb-online<font color="Red"> </font> mmc1 timer heartbeat cpu0 cpu1 default-on rfkill1 rfkill2
root@cubietruck:~#
说明它被定义成mmc0 触发,所以当你插TF到CT上面的卡槽的时候,绿灯会闪烁一下,提示你mmc0 触发
蓝灯被定义成heartbeat (指示内核是否已经挂掉),
橙灯被定义成cpu0(双核A20 cpu0负载情况),
白灯被定义成cpu1

这些触发定义,在script.binmount /dev/nanda /mnt
cd /mnt
bin2fex script.bin script.fex
vi script.fex搜leds ,可以看到:
leds_used = 1                                  //总开关
leds_num = 4                                  //灯数量
leds_pin_1 = port:PH21<1><default><default><0>   // 连接到那个管脚
leds_name_1 = "blue:ph21:led1"   // 名字,可以自己名个
leds_default_1 = 0                         //系统起来后,是亮着的还是灭着的
leds_trigger_1 = "heartbeat"         // 触发器
leds_pin_2 = port:PH20<1><default><default><0>
leds_name_2 = "orange:ph20:led2"
leds_default_2 = 0
leds_trigger_2 = "cpu0"
leds_pin_3 = port:PH11<1><default><default><0>
leds_name_3 = "white:ph11:led3"
leds_default_3 = 0
leds_trigger_3 = "cpu1"
leds_pin_4 = port:PH07<1><default><default><0>
leds_name_4 = "green:ph07:led4"
leds_default_4 = 1
leds_trigger_4 = "mmc0"
主要有有用的:
none (去掉触发)   
timer (按照自己定义的延时时间闪烁)      
battery-charging (电池充电中)
battery-full(电池充电满了)

参考:http://linux-sunxi.org/Fex_Guide   “led configuration” 部分
          http://blog.csdn.net/yuanlulu/article/details/6438847   文章后面


将led 灯点亮:echo none > /sys/class/leds/green\:ph07\:led4/trigger
echo1 > /sys/class/leds/green\:ph07\:led4/brightness
echo0> /sys/class/leds/green\:ph07\:led4/brightness不过,此方法重启trigger就变为script.bin 定义的,所以最好改script.bin的trigger


经典led 应用:
接个锂电池供电的时候,用led提示电量情况

电池指示灯:
>放电时,电量为0的时候等全灭,
> 1-25亮蓝灯,26-50亮蓝橙灯,51-75蓝橙白灯,76-100四灯全亮。
> 充电时,0-25一盏闪烁、26-50一亮一闪烁、51-75两亮一闪烁、
> 76-99三亮一闪烁、100 充满全亮
> 当pmu检测不到电池时,电池指示灯全部处于闪烁状态#!/bin/bash
FILE_CAPACIty="/sys/class/power_supply/battery/capacity"
FILE_ONLINE="/sys/class/power_supply/battery/online"
FLIE_PRESENT="/sys/class/power_supply/battery/present"

LED1_TRIGGER="/sys/class/leds/blue:ph21:led1/trigger"
LED2_TRIGGER="/sys/class/leds/orange:ph20:led2/trigger"
LED3_TRIGGER="/sys/class/leds/white:ph11:led3/trigger"
LED4_TRIGGER="/sys/class/leds/green:ph07:led4/trigger"

LED_TRG_TIMER="timer"
LED_TRG_NONE="none"

LED1_BRIGHT="/sys/class/leds/blue:ph21:led1/brightness"
LED2_BRIGHT="/sys/class/leds/orange:ph20:led2/brightness"
LED3_BRIGHT="/sys/class/leds/white:ph11:led3/brightness"
LED4_BRIGHT="/sys/class/leds/green:ph07:led4/brightness"

CAPACITY=`cat ${FILE_CAPACIty}`
ONLINE=`cat ${FILE_ONLINE}`
PRESENT=`cat ${FLIE_PRESENT}`
if [ ${PRESENT} = 0 ]; then
      echo ${LED_TRG_NONE} > ${LED1_TRIGGER}
      echo 0 > ${LED1_BRIGHT}
      echo ${LED_TRG_NONE} > ${LED2_TRIGGER}
      echo 0 > ${LED2_BRIGHT}
      echo ${LED_TRG_NONE} > ${LED3_TRIGGER}
      echo 0 > ${LED3_BRIGHT}
      echo ${LED_TRG_NONE} > ${LED4_TRIGGER}
      echo 0 > ${LED4_BRIGHT}
      echo ${LED_TRG_TIMER} > ${LED1_TRIGGER}
      echo ${LED_TRG_TIMER} > ${LED2_TRIGGER}
      echo ${LED_TRG_TIMER} > ${LED3_TRIGGER}
      echo ${LED_TRG_TIMER} > ${LED4_TRIGGER}
else
      if [ ${ONLINE} = 1 ]; then
                if [ ${CAPACITY} = 0 ]; then
                        echo ${LED_TRG_NONE} > ${LED1_TRIGGER}
                        echo 0 > ${LED1_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED2_TRIGGER}
                        echo 0 > ${LED2_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED3_TRIGGER}
                        echo 0 > ${LED3_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED4_TRIGGER}
                        echo 0 > ${LED4_BRIGHT}
                elif [ ${CAPACITY} -lt 25 ]; then
                        echo ${LED_TRG_NONE} > ${LED1_TRIGGER}
                        echo 1 > ${LED1_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED2_TRIGGER}
                        echo 0 > ${LED2_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED3_TRIGGER}
                        echo 0 > ${LED3_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED4_TRIGGER}
                        echo 0 > ${LED4_BRIGHT}
                elif [ ${CAPACITY} -lt 50 ]; then
                        echo ${LED_TRG_NONE} > ${LED1_TRIGGER}
                        echo 1 > ${LED1_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED2_TRIGGER}
                        echo 1 > ${LED2_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED3_TRIGGER}
                        echo 0 > ${LED3_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED4_TRIGGER}
                        echo 0 > ${LED4_BRIGHT}
                elif [ ${CAPACITY} -lt 75 ]; then
                        echo ${LED_TRG_NONE} > ${LED1_TRIGGER}
                        echo 1 > ${LED1_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED2_TRIGGER}
                        echo 1 > ${LED2_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED3_TRIGGER}
                        echo 1 > ${LED3_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED4_TRIGGER}
                        echo 0 > ${LED4_BRIGHT}
                elif [ ${CAPACITY} -lt 100 ]; then
                        echo ${LED_TRG_NONE} > ${LED1_TRIGGER}
                        echo 1 > ${LED1_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED2_TRIGGER}
                        echo 1 > ${LED2_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED3_TRIGGER}
                        echo 1 > ${LED3_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED4_TRIGGER}
                        echo 1 > ${LED4_BRIGHT}
                else
                        echo err!
                fi

      else
                if [ ${CAPACITY} = 0 ]; then
                        echo ${LED_TRG_TIMER} > ${LED1_TRIGGER}
                        echo ${LED_TRG_NONE} > ${LED2_TRIGGER}
                        echo 0 > ${LED2_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED3_TRIGGER}
                        echo 0 > ${LED3_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED4_TRIGGER}
                        echo 0 > ${LED4_BRIGHT}
                elif [ ${CAPACITY} -lt 25 ]; then
                        echo ${LED_TRG_TIMER} > ${LED1_TRIGGER}
                        echo ${LED_TRG_NONE} > ${LED2_TRIGGER}
                        echo 0 > ${LED2_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED3_TRIGGER}
                        echo 0 > ${LED3_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED4_TRIGGER}
                        echo 0 > ${LED4_BRIGHT}
                elif [ ${CAPACITY} -lt 50 ]; then
                        echo ${LED_TRG_NONE} > ${LED1_TRIGGER}
                        echo 1 > ${LED1_BRIGHT}
                        echo ${LED_TRG_TIMER} > ${LED2_TRIGGER}

                        echo ${LED_TRG_NONE} > ${LED3_TRIGGER}
                        echo 0 > ${LED3_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED4_TRIGGER}
                        echo 0 > ${LED4_BRIGHT}
                elif [ ${CAPACITY} -lt 75 ]; then
                        echo ${LED_TRG_NONE} > ${LED1_TRIGGER}
                        echo 1 > ${LED1_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED2_TRIGGER}
                        echo 1 > ${LED2_BRIGHT}
                        echo ${LED_TRG_TIMER} > ${LED3_TRIGGER}
                        echo ${LED_TRG_NONE} > ${LED4_TRIGGER}
                        echo 0 > ${LED4_BRIGHT}
                elif [ ${CAPACITY} -lt 100 ]; then
                        echo ${LED_TRG_NONE} > ${LED1_TRIGGER}
                        echo 1 > ${LED1_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED2_TRIGGER}
                        echo 1 > ${LED2_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED3_TRIGGER}
                        echo 1 > ${LED3_BRIGHT}
                        echo ${LED_TRG_TIMER} > ${LED4_TRIGGER}
                elif [ ${CAPACITY} -eq 100 ]; then
                        echo ${LED_TRG_NONE} > ${LED1_TRIGGER}
                        echo 1 > ${LED1_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED2_TRIGGER}
                        echo 1 > ${LED2_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED3_TRIGGER}
                        echo 1 > ${LED3_BRIGHT}
                        echo ${LED_TRG_NONE} > ${LED4_TRIGGER}
                        echo 1 > ${LED4_BRIGHT}
                else
                        echo err!!!
                fi
      fi
fi

vi battrey_leds.sh
chmod +x battrey_leds.sh
cp battrey_leds.sh /usr/bin/
vi /etc/udev/rules.d/10-bat-leds.rules

SUBSYSTEM=="power_supply", RUN+="/usr/bin/battrey_leds.sh"AXP209 检查到电量变化,就会上报power_supply事件,调用/usr/bin/battrey_leds.sh




@allen 发表于 2014-9-1 16:21:38

本帖最后由 @allen 于 2014-9-15 14:38 编辑


2.led trigger 与驱动学习

1.http://www.cnblogs.com/soc-linux-driver/archive/2012/06/30/2561031.html
2.http://www.cnblogs.com/soc-linux-driver/archive/2012/07/10/2584337.html
3.http://blog.csdn.net/g_salamander/article/details/7946026
4.http://blog.csdn.net/yuanlulu/article/details/6438841

我是看这几篇学习的,超详细了,再结合以下几个trigger 来玩玩,就能基本学会
linux-sunxi/drivers/leds/ledtrig-default-on.c
linux-sunxi/drivers/leds/ledtrig-timer.c
linux-sunxi/drivers/leds/ledtrig-cpu.c

@allen 发表于 2014-9-1 17:14:13

占楼


3.

jerryli 发表于 2014-9-2 11:21:51

这个东西好,用LED监控系统状态。
说实话,现在的LED用来显示ip的莫尔斯电码,有点多余。太黑客化了,呵呵

sunbeyond 发表于 2014-9-3 09:26:55

jerryli 发表于 2014-9-2 11:21 static/image/common/back.gif
这个东西好,用LED监控系统状态。
说实话,现在的LED用来显示ip的莫尔斯电码,有点多余。太黑客化了,呵呵 ...

不错。支持一下。

Emile 发表于 2014-12-19 19:50:09

楼主要是折腾一个sata硬盘灯就好了。有读写闪烁,长时间读写常亮。不读写,就灭。
不懂技术,相当伸手党啊。{:soso_e113:}

@allen 发表于 2014-12-19 20:01:42

本帖最后由 @allen 于 2014-12-19 20:18 编辑

Emile 发表于 2014-12-19 19:50 static/image/common/back.gif
楼主要是折腾一个sata硬盘灯就好了。有读写闪烁,长时间读写常亮。不读写,就灭。
不懂技术,相当伸手党啊 ...
有 sata 的读写 trigger 新的固件已经默认编译成模块

Emile 发表于 2014-12-19 20:08:48

@allen 发表于 2014-12-19 20:01 static/image/common/back.gif
有 sata 的读写 trigger 已经新的固件默认编译成模块

喔。版主大大,我用的是debian-server。请问该这么改绿色led为硬盘灯呢。搜索了论坛没发现有这个。。

@allen 发表于 2014-12-19 20:24:46

Emile 发表于 2014-12-19 20:08 static/image/common/back.gif
喔。版主大大,我用的是debian-server。请问该这么改绿色led为硬盘灯呢。搜索了论坛没发现有这个。。 ...

查了下,内核有这个驱动,debian-server 默认没编译进内核或模块,需要自己编译出来。驱动:drivers/leds/ledtrig-disk.c        

Emile 发表于 2014-12-19 20:36:39

@allen 发表于 2014-12-19 20:24 static/image/common/back.gif
查了下,内核有这个驱动,debian-server 默认没编译进内核或模块,需要自己编译出来。驱动:drivers/leds ...

十分感谢。
编译。。没编译过,我自己摸索吧
:lol
页: [1]
查看完整版本: [嵌入式学习]led 子系统与led trigger