1.内核自带LED驱动使能
platform平台
内核自带的驱动,都是通过图形化界面配置,选择使能或者不使用。
输入:
make menuconfig
使能驱动后再
.config
里面就会存在:CONFIG_LEDS_GPIO=y
在Linux内核源码里面一般驱动文件夹下
Makefile
会只用CONFIG_XXX
来决定要编译哪个文件。
1
2 obj-$(CONFIG_LEDS_GPIO) += leds-gpio.o
obj- y += leds-gpio.o ->leds-gpio.c
2.内核自带LED驱动分析
打开
drivers/leds/leds-gpio.c
找到:
1
2
3
4
5
6
7
8
9
10 static struct platform_driver gpio_led_driver = {
.probe = gpio_led_probe,
.remove = gpio_led_remove,
.driver = {
.name = "leds-gpio",
.of_match_table = of_gpio_leds_match,
},
};
module_platform_driver(gpio_led_driver);
module_platform_driver
1
module_driver
1
2
3
4
5
6
7
8
9
10
11
展开:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 module_platform_driver(gpio_led_driver)
module_driver(gpio_led_driver,platform_driver_register,platform_driver_unregister)
static int __init gpio_led_driver_init(void)
{
return platform_driver_register(&gpio_led_driver);
}
module_init(gpio_led_driver_init);
static void __exit gpio_led_driver_exit(void)
{
platform_driver_unregister(&gpio_led_driver);
}
module_exit(gpio_led_driver_exit);
根据
gpio_led_driver
可知,设备树的of_match_table
为of_gpio_leds_match,匹配表里面的值为
1
2
3
4 static const struct of_device_id of_gpio_leds_match[] = {
{ .compatible = "gpio-leds", },
{},
};
当驱动和设备匹配后,
gpio_led_probe
函数执行:->gpio_leds_create
->create_gpio_led
3.内核自带LED驱动使用
1.首先将驱动编译进内核里面。
2.根据绑定文档在设备树里面添加对应的设备节点信息。
3.如果无设备树,那么就要使用platform_device_register向总线注册设备。
4.如果有设备树,那么就直接修改设备树,添加指定的节点。
设备树根节点下添加:
1
2
3
4
5
6
7
8
9
10
11
12
13 //2024/12/6 19:45 cbus
dtsleds{
compatible = "gpio-leds";
led0{
label = "red";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpioled>;
gpios = <&gpio1 3 GPIO_ACTIVE_LOW>;
default-state = "on";
linux,default-trigger = "heartbeat";
};
};
用户空间操作LED:
1 cd /sys/devices/platform/dtsleds/leds/red关闭心跳灯:
开关灯: