人生短短如電光,虛度光陰使人傷。
但凡成才之偉器,莫不單日當一雙。
兼程而進倍努力,勇往直前向前方。
用好分秒餘時隙,方可粒米積成倉。
一、 Linux 內核自帶 LED 驅動使能
進入Linux內核源碼根目錄下,輸入make menuconfig打開圖形配置界面,按照以下路徑打開LED驅動配置項:Device Drivers -> LED Support (NEW_LEDS [=y]) -> LED Support for GPIO connected LEDs
,配置完成後如下圖所示:
Linux 會根據 CONFIG_LEDS_GPIO 的值來選擇如何編譯LED 燈驅動,如果爲‘ y’就將其編譯進 Linux 內核。配置好 Linux 內核以後退出配置界面,打開.config 文件,會找到“CONFIG_LEDS_GPIO=y”這一行,如圖所示:
重新編譯 Linux 內核,然後使用新編譯出來的 zImage 鏡像啓動開發板。【替換方法,這裏也不在贅述】
二、Linux內核自帶LED驅動分析
LED 燈驅動文件爲/drivers/leds/leds-gpio.c
文件,打開該文件會看到以下內容
......
static const struct of_device_id of_gpio_leds_match[] = {
{ .compatible = "gpio-leds", },
{},
};
......
static struct platform_driver gpio_led_driver = {
.probe = gpio_led_probe,
.shutdown = gpio_led_shutdown,
.driver = {
.name = "leds-gpio",
.of_match_table = of_gpio_leds_match,
},
};
根據上述代碼,可以看到LED 驅動的匹配表,compatible 內容爲“ gpio-leds”,因此設備樹中的 LED 燈設備節點的 compatible 屬性值也要爲“ gpio-leds”。
另外,驅動程序中的gpio_led_probe 函數主要功能就是獲取 LED 燈的設備信息,然後根據這些信息來初始化對應的 IO,設置爲輸出等。所以設備樹中無需再重新設置複用和電氣屬性,即無需再設置pinctrl。
三、設備樹節點編寫
文檔 Documentation/devicetree/bindings/leds/leds-gpio.txt
詳細的講解了 Linux 自帶驅動對應的設備樹節點該如何編寫,我們在編寫設備節點的時候要注意以下幾點:
- ①、創建一個節點表示 LED 燈設備,比如 dtsleds,如果板子上有多個 LED 燈的話每個 LED燈都作爲 dtsleds 的子節點。
- ②、 dtsleds 節點的 compatible 屬性值一定要爲“ gpio-leds”。
- ③、設置 label 屬性,此屬性爲可選,每個子節點都有一個 label 屬性, label 屬性一般表示LED 燈的名字,比如以顏色區分的話就是 red、 green 等等。
- ④、每個子節點必須要設置 gpios 屬性值,表示此 LED 所使用的 GPIO 引腳!
- ⑤、可以設置“ linux,default-trigger”屬性值,也就是設置 LED 燈的默認功能,可以查閱
Documentation/devicetree/bindings/leds/common.txt
這個文檔來查看可選功能,比如:- backlight: LED 燈作爲背光。
- default-on: LED 燈打開
- heartbeat: LED 燈作爲心跳指示燈,可以作爲系統運行提示燈。
- ide-disk: LED 燈作爲硬盤活動指示燈。
- timer: LED 燈週期性閃爍,由定時器驅動,閃爍頻率可以修改
- ⑥、可以設置“ default-state”屬性值,可以設置爲 on、 off 或 keep,爲 on 的時候 LED 燈默認打開,爲 off 的話 LED 燈默認關閉,爲 keep 的話 LED 燈保持當前模式。
示例設備節點代碼
dtsleds {
compatible = "gpio-leds";
led0 {
label = "red";
gpios = <&gpio5 3 GPIO_ACTIVE_LOW>;
default-state = "off";
};
};
四、運行程序
用新的zImage和設備樹文件啓 動 開 發 板 , 啓 動 以 後 查 看/sys/bus/platform/devices/dtsleds
這個目錄是否存在,同時也可以ls查看該目錄下leds下的內容,如圖所示:
在 leds 目錄下有一個名爲“ red”子目錄,這個子目錄的名字就是我們在設備樹中設置的 label 屬性值!而後,輸入以下指令測試LED亮滅:
echo 1 > /sys/class/leds/red/brightness //打開 LED0
echo 0 > /sys/class/leds/red/brightness //關閉 LED0
如果能正常的打開和關閉 LED 燈話就說明我們 Linux 內核自帶的 LED 燈驅動工作正常。我們一般會使用一個 LED 燈作爲系統指示燈,系統運行正常的話這個 LED 指示燈就會一閃一閃的。設置方法如下,在 dtsleds 這個設備節點中加入“ linux,default-trigger”屬性信息即可,屬性值爲“ heartbeat”,修改完以後的 dtsleds 節點內容如下:
dtsleds {
compatible = "gpio-leds";
led0 {
label = "red";
gpios = <&gpio5 3 GPIO_ACTIVE_LOW>;
linux,default-trigger = "heartbeat";
default-state = "on";
};
};
再次重新編譯替換設備樹,運行板子,可看到LED閃爍!