【嵌入式Linux驅動開發】十八、Linux內核自帶的LED驅動探索

  人生短短如電光,虛度光陰使人傷。
  但凡成才之偉器,莫不單日當一雙。
  兼程而進倍努力,勇往直前向前方。
  用好分秒餘時隙,方可粒米積成倉。


一、 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閃爍!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章