【嵌入式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闪烁!

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