抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

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
#define module_platform_driver(__platform_driver) module_driver(__platform_driver, platform_driver_register, platform_driver_unregister)
  • module_driver
1
2
3
4
5
6
7
8
9
10
11
#define module_driver(__driver, __register, __unregister, ...) \
static int __init __driver##_init(void) \
{ \
return __register(&(__driver) , ##__VA_ARGS__); \
} \
module_init(__driver##_init); \
static void __exit __driver##_exit(void) \
{ \
__unregister(&(__driver) , ##__VA_ARGS__); \
} \
module_exit(__driver##_exit);

展开:

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)

#define module_driver(__driver, __register, __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

关闭心跳灯:image-20241206200317008

开关灯:

image-20241206202329969

评论