用LED驱动框架注册led设备的示例代码

Posted 正在起飞的蜗牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用LED驱动框架注册led设备的示例代码相关的知识,希望对你有一定的参考价值。

1、LED驱动框架分析

参考博客:《内核LED驱动框架讲解以及led设备注册示例代码》

2、简单的用LED驱动框架注册led设备的代码

#include <linux/module.h>		
#include <linux/init.h>			
#include <linux/fs.h>
#include <linux/leds.h>
#include <mach/regs-gpio.h>
#include <mach/gpio-bank.h>
#include <linux/io.h>
#include <linux/ioport.h>

static struct led_classdev mydev;	// 定义结构体变量


// 这个函数就是要去完成具体的硬件读写任务的
static void s5pv210_led_set(struct led_classdev *led_cdev,
			    enum led_brightness value)

	printk(KERN_INFO "s5pv210_led_set\\n");
	
	//根据value去操作led



static int __init s5pv210_led_init(void)

	// 用户insmod安装驱动模块时会调用该函数
	// 该函数的主要任务就是去使用led驱动框架提供的设备注册函数来注册一个设备
	int ret = -1;
	
	mydev.name = "myled";	//led的设备名:/sys/class/leds/myled
	mydev.brightness = 0;	//默认亮度0
	mydev.max_brightness = 255;	//最大亮度255
	mydev.brightness_set = s5pv210_led_set;	//设置led设备亮度的方法
	
	ret = led_classdev_register(NULL, &mydev); //向LED驱动框架注册led设备
	if (ret < 0) 
		printk(KERN_ERR "led_classdev_register failed\\n");
		return ret;
	
	
	return 0;


static void __exit s5pv210_led_exit(void)

	led_classdev_unregister(&mydev);


module_init(s5pv210_led_init);
module_exit(s5pv210_led_exit);

// MODULE_xxx这种宏作用是用来添加模块描述信息
MODULE_LICENSE("GPL");							// 描述模块的许可证
MODULE_AUTHOR("aston");		// 描述模块的作者
MODULE_DESCRIPTION("s5pv210 led driver");		// 描述模块的介绍信息
MODULE_ALIAS("s5pv210_led");					// 描述模块的别名信息

上面是可以编译并运行的驱动代码,不涉及具体硬件操作,只是用来讲解如何利用LED框架注册led设备;

3、上面驱动代码注册后的效果

root@Storage:/sys/class/leds/myled# ls -l
total 0
-rw-r--r--    1 root     root          4096 May 10 09:52 brightness
lrwxrwxrwx    1 root     root             0 May 10 09:52 device -> ../../../0000:00:10.0
-r--r--r--    1 root     root          4096 May 10 09:52 max_brightness
drwxr-xr-x    2 root     root             0 May 10 09:52 power
lrwxrwxrwx    1 root     root             0 May 10 09:52 subsystem -> ../../../../../class/leds
-rw-r--r--    1 root     root          4096 May 10 09:52 uevent

(1)在leds类下面创建了myled设备,设备下默认有brightness和max_brightness文件,这是在创建leds类时初始化的设备属性;
(2)应用层操作led设备就是通过读写"/sys/class/leds/myled"目录下的文件;

4、应用层设置led亮度的分析

4.1、应用层的操作

	echo 1 > /sys/class/leds/myled/brightness

通过向brightness文件写数据来设置led的亮度;

4.2、驱动层的响应

led_brightness_store();	
	dev_get_drvdata();	
	simple_strtoul();
	led_set_brightness();
		led_cdev->brightness_set(led_cdev, value);

(1)led_brightness_store:调用brightness文件的store方法;
(2)dev_get_drvdata:从传入的struct device结构体解析处我们注册led设备时传入的struct led_classdev结构体;
(3)simple_strtoul:将我们写入的字符数据转换成10进制数据;
(4)led_set_brightness:传入亮度数据,设置led亮度;
(5)brightness_set:调用我们在向LED框架注册led设备时,传入的设置led亮度的函数;

以上是关于用LED驱动框架注册led设备的示例代码的主要内容,如果未能解决你的问题,请参考以下文章

从Linux内核LED驱动来理解字符设备驱动开发流程

小熊派:用OpenHarmory3.0点亮LED

linux4.10.8 内核移植---字符设备驱动_led驱动程序

字符设备驱动之LED驱动

迅为iTOP-RK3568开发板编写LED驱动

字符设备驱动程序--LED驱动