Linux Led驱动

1. Led class初始化

文件路径: \drivers\leds\led-class.c

static int __init leds_init(void)
{
	leds_class = class_create(THIS_MODULE, "leds");		//生成目录/sys/class/leds
	if (IS_ERR(leds_class))
		return PTR_ERR(leds_class);
	leds_class->pm = &leds_class_dev_pm_ops;
	leds_class->dev_groups = led_groups;				//子设备都具有这些属性
	return 0;
}

在内核中搜索 leds_class ,可以看到被调用流程:

devm_led_classdev_register_ext
	led_classdev_register_ext
		device_create_with_groups(leds_class, parent, 0, led_cdev, led_cdev->groups, "%s", final_name);

2. 默认的属性文件attribute

leds_init 中可以看到,创建class时默认有属性文件:led_groups

static struct attribute *led_class_attrs[] = {
	&dev_attr_brightness.attr,
	&dev_attr_max_brightness.attr,
	NULL,
};
static const struct attribute_group led_group = {
	.attrs = led_class_attrs,
};

static const struct attribute_group *led_groups[] = {
	&led_group,
#ifdef CONFIG_LEDS_TRIGGERS
	&led_trigger_group,
#endif
	NULL,
};

创建设备后,设备下就默认有brightnessmax_brightness两个文件
在这里插入图片描述
设置亮度时 echo 255 > /sys/class/leds/xxx/brightness 就会调用到 brightness_store 函数:

static ssize_t brightness_store(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t size)
{
	struct led_classdev *led_cdev = dev_get_drvdata(dev);
	unsigned long state;
	ssize_t ret;

	mutex_lock(&led_cdev->led_access);

	if (led_sysfs_is_disabled(led_cdev)) {
		ret = -EBUSY;
		goto unlock;
	}

	ret = kstrtoul(buf, 10, &state);
	if (ret)
		goto unlock;

	if (state == LED_OFF)
		led_trigger_remove(led_cdev);
	led_set_brightness(led_cdev, state);
	flush_work(&led_cdev->set_brightness_work);

	ret = size;
unlock:
	mutex_unlock(&led_cdev->led_access);
	return ret;
}

最终会调用 led_cdev->brightness_set(led_cdev, value);

3. struct led_classdev

led_classdev_register_ext函数需要一个led_classdev 结构体作为参数,led_classdev 是核心,
驱动程序需要申请,配置,注册这个led_classdev,先看一下这个结构体:

struct led_classdev {
	const char		*name;
	const char *default_trigger;
	enum led_brightness	 brightness;	//亮度
	
	struct device *dev; //记录在类下面创建设备时返回的device,由device_create_with_groups()返回
	const struct attribute_group **groups;	//创建device时传入,对应/sys/class/leds/.../下的属性文件
	...
	/* 使用之前需要初始化这些函数 */
	void (*brightness_set)(struct led_classdev *led_cdev, enum led_brightness brightness);//Set LED brightness level
	int (*brightness_set_blocking)(struct led_classdev *led_cdev,enum led_brightness brightness);
	...
};

4. Leds-gpio驱动

搜索devm_led_classdev_register_ext函数,调用该函数在leds_class 下注册设备的地方应该就是我们要找的led驱动程序了.
以leds-gpio驱动程序为例:\drivers\leds\led-class.c

int gpio_led_probe(struct platform_device *pdev)
	struct gpio_leds_priv *priv = gpio_leds_create(pdev);	//子函数中申请gpio_leds_priv 
	|	create_gpio_led(&led, led_dat, dev, child, NULL);	//配置led_classdev结构体
	|	|	devm_led_classdev_register_ext(parent, &led_dat->cdev, &init_data);
	platform_set_drvdata(pdev, priv);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux LED 驱动程序用于控制嵌入式系统中的 LED 灯。要使用 Linux LED 驱动程序,您需要做以下几件事: 1. 打开内核配置界面,启用 LED 驱动程序支持。您可以通过以下命令打开内核配置界面: ``` make menuconfig ``` 在内核配置界面中,找到“Device Drivers”选项,然后选择“LED驱动程序支持”。 2. 确定您要控制的 LED 灯的 GPIO 引脚编号。您可以查看系统文档或者使用以下命令查看: ``` cat /sys/kernel/debug/gpio ``` 3. 创建一个设备树节点,以告诉 Linux 内核有哪些 LED 灯可以使用。例如,如果您要控制 GPIO1_2 引脚上的 LED 灯,可以在设备树中添加以下节点: ``` leds { compatible = "gpio-leds"; green { gpios = <&gpio1 2 GPIO_ACTIVE_LOW>; label = "green_led"; }; }; ``` 4. 在 Linux 中使用命令行或编程语言(例如 C 或 Python)控制 LED 灯。例如,您可以使用以下命令打开 LED 灯: ``` echo 1 > /sys/class/leds/green/brightness ``` 您也可以使用编程语言编写应用程序来控制 LED 灯,例如使用 C 语言和 sysfs 接口: ``` #include <stdio.h> #include <stdlib.h> #define LED "/sys/class/leds/green/brightness" int main(int argc, char *argv[]) { FILE *fp; fp = fopen(LED, "w"); if (fp == NULL) { printf("Failed to open LED\n"); return 1; } fprintf(fp, "%d", atoi(argv[1])); fclose(fp); return 0; } ``` 以上就是在 Linux 中使用 LED 驱动程序控制 LED 灯的基本步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值