一、led配置
1、界面說明
如上圖可在led configuration界面添加對於led燈的控制。
通過add按鈕添加led閃爍的觸發事件。
Name:配置led名字。
LED Name:設置紅燈和綠燈。 (目前用的測試板紅燈和綠燈都顯示綠燈)
Default state:選中時燈亮度為255,不選時為0.
Trigger:觸發器,設置led的觸發方式。在led modules中可以安裝觸發器module.
添加后,trigger可選項如下:
trigger驅動文件目錄:openwrt\build_dir\target-arm_cortex-a7+neon-vfpv4_musl_eabi\linux-sunxi_cortexa7\linux-4.14.25\drivers\leds\trigger
2、Led triggers 參考博客:LEDE/OpenWRT控制gpio-led
Now we explain in detail what each trigger does.
(1)None
The LED is always in default state. Unlisted LED are default OFF, so this is only useful to declare a LED to be always ON.
(2)Timer
The LED blinks with the configured on/off frequency.
(5)Default-on
The LED is ON. Deprecated, use default=1 trigger=none instead.
(6)Heartbeat
The LED flashes to simulate actual heart beat thump-thump-pause. The frequency is in direct proportion to 1-minute average CPU load.
(7)Flash Writes
The LED flashes as data is written to flash memory.
(8)Network Activity
The LED flashes with link status and/or send and receive activity on the configured interface.
(9)WiFi Activity triggers
The LED flashes on events triggered in physical interface, rather than in software network interface. Besides phy triggers have more events, it also provides possibility of static LED setup in case you want to monitor your 2.4 GHz radio (phy0 usually) and 5 GHz radio (phy1 usually) separately. netdev can’t guarantee this distinguishing since wlan0 may be referring to 2.4 GHz or 5 GHz radio based on current network setup.
- phy0rx - flashes on reception.
- phy0tx - flashes on transmission.
- phy0assoc - flashes on client association.
- phy0radio - (unknown, this option did nothing on my tl-wr1043nd)
- phy0tpt - flashes slowly and steadily on network activity.in comparison to energetic flashes of tx and rx modes
(10)USB Device
The LED turns ON if USB device is connected.
To find out device name use logread to search for it or list /sys/bus/usb/devices (for this example, there would be /sys/bus/usb/devices/1-1 device).
(11)Morse Code
The LED signals a message using Morse code.
(12)GPIO
Allows LEDs to be controlled by gpio events.
二、led腳本介紹
腳本中的config_get、config_load、config_foreach的處理方式可查看https://www.cnblogs.com/yuanqiangfei/p/14751882.html
config_get<variable> <section> <option> [<default>]會獲取led配置(etc/config/system文件中關於led section)的參數,如果沒有配置相關參數會取默認值
config_get sysfs $1 sysfs
config_get name $1 name "$sysfs"
config_get trigger $1 trigger "none"
config_get dev $1 dev
config_get ports $1 port
config_get mode $1 mode "link" //link為默認值
config_get_bool default $1 default "nil"
config_get delayon $1 delayon
config_get delayoff $1 delayoff
config_get interval $1 interval "50"
config_get port_state $1 port_state
config_get delay $1 delay "150"
config_get message $1 message ""
config_get gpio $1 gpio "0"
config_get inverted $1 inverted "0"
/etc/init.d/led腳本對於這幾種觸發器類型led狀態做處理。
case "$trigger" in
"netdev")
[ -n "$dev" ] && {
echo $dev > /sys/class/leds/${sysfs}/device_name
echo $mode > /sys/class/leds/${sysfs}/mode
echo $interval > /sys/class/leds/${sysfs}/interval
}
;;
"timer"|"oneshot")
[ -n "$delayon" ] && \
echo $delayon > /sys/class/leds/${sysfs}/delay_on
[ -n "$delayoff" ] && \
echo $delayoff > /sys/class/leds/${sysfs}/delay_off
;;
"usbport")
local p
for p in $ports; do
echo 1 > /sys/class/leds/${sysfs}/ports/$p
done
;;
"port_state")
[ -n "$port_state" ] && \
echo $port_state > /sys/class/leds/${sysfs}/port_state
;;
"gpio")
echo $gpio > /sys/class/leds/${sysfs}/gpio
echo $inverted > /sys/class/leds/${sysfs}/inverted
;;
配置好狀態后會將led配置寫到/etc/config/system配置文件中:
然后 /etc/init.d/led腳本會獲取/etc/config/system文件中每個option的值寫到/sys/class/led/目錄下的文件中去。
三、查看led燈的gpio
target Profile選擇的是Hangzhou vidtoo model A,可通過修改500-ARM-dts-support-vidtoo-model-A.patch文件來修改gpio,打完patch后生成dts文件。
openwrt/build_dir/target-arm_cortex-a7+neon-vfpv4_musl_eabi/linux-sunxi_cortexa7/linux-4.14.25/arch/arm/boot/dts/sun8i-h2-plus-vidtoo-model-A.dts
dts文件中會有對led燈gpio的配置
科普
在OpenWrt/Linux里面,對GPIO的操作都是通過寄存器操作的,詳細可以看每個板子的DTSI文件,在DTSI文件里描述了板子寄存器的地址。
GPIO按組划分,以MT7620A為例,GPIO一共有72個,一共分了四組,組號為0~3。
0組擁有24個GPIO,GPIO號為0~23;
1組擁有16個GPIO,GPIO號為24-39;
2組擁有32個GPIO,GPIO號為40-71;
3組僅擁有一個GPIO72。
因此,GPIO號=GPIO組號基址+GPIO組內編號。
以ZTE Q7路由器為例,GPIO定義在../target/linux/ramips/dts/mt7620n.dtsi文件中定義
gpio定義的方式是:組號+組內編號
leds { compatible = "gpio-leds"; pwr_led { label = "green:pwr"; gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>; //綠燈是第0組的的第10個,GPIO10默認為高電平 default-state = "on"; }; status_led { label = "red:status"; gpios = <&pio 0 15 GPIO_ACTIVE_HIGH>; //紅燈是第0組的第15個,GPIO15默認為高電平 default-state = "on"; }; };
如果要修改led的gpio,直接修改openwrt/target/linux/sunxi/patch-4.14/500-ARM_dts-support-vidtoo-model-A.patch文件,不要直接修改dts文件,因為在編譯過程中會刪除dts文件重新打patch,會覆蓋掉修改。
可以在500-ARM_dts-support-vidtoo-model-A.patch文件中增加默認trigger