led子系统【转】
本文转载自:http://blog.csdn.net/yuanlulu/article/details/6438841
版权声明:本文为博主原创文章,未经博主允许不得转载。
============================================
作者:yuanlulu
http://blog.csdn.NET/yuanlulu
版权没有,但是转载请保留此段声明
============================================
LED_OFF = 0,
LED_HALF = 127,
LED_FULL = 255,
};
struct led_classdev {
const char *name; //名字
int brightness; //当前亮度
int flags; //标志,目前只支持 LED_SUSPENDED
#define LED_SUSPENDED (1 << 0)
/*设置led的亮度,不可以睡眠,有必要的话可以使用工作队列*/
void (*brightness_set)(struct led_classdev *led_cdev,
enum led_brightness brightness);
/* 获取亮度 */
enum led_brightness (*brightness_get)(struct led_classdev *led_cdev);
/* 激活硬件加速的闪烁 */
int (*blink_set)(struct led_classdev *led_cdev,
unsigned long *delay_on,
unsigned long *delay_off);
struct device *dev;
struct list_head node; /* 所有已经注册的led_classdev使用这个节点串联起来 */
const char *default_trigger; /* 默认触发器 */
#ifdef CONFIG_LEDS_TRIGGERS //如果配置内核时使能了触发器功能,才会编译下面一段
/* 这个读写子轩锁保护下面的触发器数据 */
struct rw_semaphore trigger_lock;
struct led_trigger *trigger; //触发器指针
struct list_head trig_list; //触发器使用的链表节点,用来连接同一触发器上的所有led_classdev
void *trigger_data; //触发器使用的私有数据
#endif
};
struct led_trigger {
const char *name; //触发器名字
void (*activate)(struct led_classdev *led_cdev); //激活ledled。led_classdev和触发器建立连接时会调用这个方法。
void (*deactivate)(struct led_classdev *led_cdev); //取消激活。led_classdev和触发器取消连接时会调用这个方法。
/* 本触发器控制之下的led链表 */
rwlock_t leddev_list_lock; //保护链表的锁
struct list_head led_cdevs; //链表头
/* 连接下一个已注册触发器的链表节点 ,所有已注册的触发器都会被加入一个全局链表*/
struct list_head next_trig;
};
const char *name;
char *default_trigger;
int flags;
};
struct led_platform_data {
int num_leds;
struct led_info *leds;
};
const char *name;
char *default_trigger;
unsigned gpio;
u8 active_low;
};
struct gpio_led_platform_data {
int num_leds;
struct gpio_led *leds;
int (*gpio_blink_set)(unsigned gpio,
unsigned long *delay_on,
unsigned long *delay_off);
};
led_classdev接口分析/driver/rtc/led-class.c
{
int rc;
"%s", led_cdev->name);
if (IS_ERR(led_cdev->dev))
return PTR_ERR(led_cdev->dev);
/* register the attributes */
rc = device_create_file(led_cdev->dev, &dev_attr_brightness);//在sys/class/rtc/下创建一个led的属性文件。
if (rc)
goto err_out;
/* add to the list of leds */
down_write(&leds_list_lock);
list_add_tail(&led_cdev->node, &leds_list);//将新的led加入链表,全局链表是leds_list
up_write(&leds_list_lock);
led_update_brightness(led_cdev);//获取led当前的亮度更新led_cdev的brightness成员
#ifdef CONFIG_LEDS_TRIGGERS
init_rwsem(&led_cdev->trigger_lock);//初始化led_cdev的触发器自旋锁
rc = device_create_file(led_cdev->dev, &dev_attr_trigger);//在sys/class/led中为触发器创建属性文件
if (rc)
goto err_out_led_list;
led_trigger_set_default(led_cdev); //为led_cdev设置默认的触发器
#endif
printk(KERN_INFO "Registered led device: %s/n",
led_cdev->name);
return 0;
#ifdef CONFIG_LEDS_TRIGGERS
err_out_led_list:
device_remove_file(led_cdev->dev, &dev_attr_brightness);
list_del(&led_cdev->node);
#endif
err_out:
device_unregister(led_cdev->dev);
return rc;
}
EXPORT_SYMBOL_GPL(led_classdev_register);
static DEVICE_ATTR(trigger, 0644, led_trigger_show, led_trigger_store);
led子系统【转】的更多相关文章
- LED子系统剖析
写之前,先看一张图: 上次说了LED驱动程序,Linux自身也携带了LED驱动,且是脱离平台的,即LED子系统.操作起来十分简单.但是它的实质却不是那么容易,研究了一个晚上,终于明白了其中一个文件的功 ...
- 初探linux子系统集之led子系统(三)
世界杯结束了,德国战车夺得了大力神杯,阿根廷最终还是失败了.也许3年,5年,或者10年后,人们就不知道巴西世界杯的亚军是谁,但是总是会记得冠军是谁.就像什么考试,比赛,第一永远会被人们所记住,所以我们 ...
- 初探linux子系统集之led子系统(二)
巴西世界杯,德国7比1东道主,那个惨不忍睹啊,早上起来看新闻,第一眼看到7:1还以为点球也能踢成这样,后来想想,点球对多嘛6比1啊,接着就是各种新闻铺天盖地的来了.其实失败并没有什么,人生若是能够成功 ...
- 初探linux子系统集之led子系统(一)
就像学编程第一个范例helloworld一样,学嵌入式,单片机.fpga之类的第一个范例就是点亮一盏灯.对于庞大的linux系统,当然可以编写一个字符设备驱动来实现我们需要的led灯,也可以直接利用g ...
- led子系统
最简单的led驱动就是从端口输出0或1来关闭或点亮灯.而我们这里讲的led子系统,主要是对led事件进行了分装和优化,这里我们主要讲的是可 以实现跨平台的led驱动.不管你是使用三星的平台,还是Atm ...
- arm Linux 驱动LED子系统 测试
Linux内核在3.0以上引入了设备树概念(具体哪个版本不清楚)在编译内核后需要将与之对应的dtb文件也下载人板子上才能使内核与硬件关联起来. dtb文件是有dts文件编译后生成的:例如 /* * C ...
- linux led子系统(二)
对于led子系统中,有那么多得trigger,下面就来简单了解下. 1.default-on static void defon_trig_activate(struct led_classdev * ...
- linux led子系统(一)
就像学编程第一个范例helloworld一样,学嵌入式,单片机.fpga之类的第一个范例就是点亮一盏灯.对于庞大的linux系统,当然可以编写一个字符设备驱动来实现我们需要的led灯,也可以直接利用g ...
- 初探linux子系统集之led子系统(三)【转】
本文转载自:http://blog.csdn.net/eastmoon502136/article/details/37822837 世界杯结束了,德国战车夺得了大力神杯,阿根廷最终还是失败了.也许3 ...
- 初探linux子系统集之led子系统(二)【转】
本文转载自:http://blog.csdn.net/eastmoon502136/article/details/37606487 巴西世界杯,德国7比1东道主,那个惨不忍睹啊,早上起来看新闻,第一 ...
随机推荐
- Codeforces 835F Roads in the Kingdom (环套树 + DP)
题目链接 Roads in the Kingdom 题意 给出一个环套树的结构,现在要删去这个结构中的一条边,满足所有点依然连通. 删边之后的这个结构是一棵树,求所有删边情况中树的直径的最小值. 显 ...
- 湖南集训day2
难度:☆☆ /*显然可以前缀和*/ #include<iostream> #include<cstdio> #include<cstring> #define N ...
- 【APIO2015】Bali Sculptures
题目描述 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有 $N$ 座雕塑,为方便起见,我们把这些雕塑从 $1$ 到 $N$ 连续地进行标号,其中第 $i$ 座雕塑的年 ...
- 某考试 T3 bitboard
bitboardDiscription 天才发明家小K 制造了一块比特板.板子上有2^n个比特元,编号为0 ∼ 2^n−1.每个比特元
- 【原】手写spring async异步组件
最近在工作中使用到了spring自带的Async,主要是为了把其中耗时多.响应慢.计算复杂的业务抽取几个模块出来,并行查询.不得不说spring自带的比传统线程池提交在代码层次上看起来优雅简洁了不少 ...
- ConcurrentHashMap如何保证线程安全
以前看过HashMap的内部实现,知道HashMap是使用Node数组+链表+红黑树的数据结构来实现,如下图所示.但是HashMap是非线程安全,在多线程环境不能够使用. 不过JDK在其并发包中为我们 ...
- electron入门教程
1.atom/electron github: https://github.com/atom/electron 中文文档: https://github.com/atom/electron/tree ...
- dtrace 语法
Usage: dtrace [-aACeFHlqSvVwZ] [-arch i386|x86_64] [-b bufsz] [-c cmd] [-D name[=def]] [-I path ...
- [NSURL URLWithString:] 返回nil
具体问题原因是url中输入的有中文,那么这个就看作非法的字符无法识别.这种的必须使用post方式来发送消息.具体为: tmp = mainurl; [parameters app ...
- Android自定义xml解析
<?xml version="1.0" encoding="utf-8"?> <resources> <Users> < ...