無線路由器有許多 LED 顯示狀態。在 OpenWrt 下,如何控制 LED 呢?
除了電源狀態 (PWR) 是有電就亮,及一些 Ethernet 狀態 (WAN 和 LAN 1 2 3 4) 是 Ethernet Controller 直接控制外,其它 LED 是接到 SoC 的 GPIO,Linux Kernel 有個 platform 子系統,並有一些針對 GPIO 的現成驅動程式,例如驅動程式 leds-gpio 用來控制 LED。只要把 GPIO 的位置,所使用的驅動程式及功能在編譯前設定好,編譯後的 Linux Kernel 就能支援這些 GPIO。
- 準備資料結構 struct gpio_led,內含每個 LED 名稱、GPIO 接腳、是否 low 動作等。例如:
static struct gpio_led tl_wr1043nd_leds_gpio[] __initdata = {
{
.name = "tl-wr1043nd:green:wlan",
.gpio = TL_WR1043ND_GPIO_LED_WLAN,
.active_low = 1,
}
};
不清楚 LED 名稱為何要取 tl-wr1043nd:green:wlan
這麼一長串
- 透過 platform_device_alloc() 取得使用 "leds-gpio" 的資料結構 struct platform_device。(相反是 platform_device_put())
- 建構資料結構 struct gpio_led_platform_data,包括 LED 數目,及 leds 欄位指到 struct gpio_led
- 透過 platform_device_add_data() 加進 struct gpio_led_platform_data
- 透過 platform_device_add() 登記到 Linux Kernel
上述例子是在 Linux 的 arch/mips/ar71xx/mach-tl-wr1043nd.c 執行 arch/mips/ar71xx/dev-leds-gpio.c 裡的 ar71xx_add_device_leds_gpio() 完成的。
編譯後的 Linux 就會有 /sys/class/leds/tl_wr1043nd:green:wlan/ 目錄。使用方式,例如
點亮 LED:
echo 1 > /sys/class/leds/tl_wr1043nd:green:wlan/brightness
熄滅 LED
echo 0 > /sys/class/leds/tl_wr1043nd:green:wlan/brightness
應該還有其它用法,待了解。