本文转载自:http://blog.csdn.net/yuanlulu/article/details/6438847

============================================
作者:yuanlulu
http://blog.csdn.NET/yuanlulu

版权没有,但是转载请保留此段声明
============================================

gpio-led框架

/driver/leds/leds-gpio.c下实现了gpio-led框架。这个gpio-led框架的作用是把传入的gpio端口信息,注册成 led_classdev。
 
数据结构
平台设备相关的gpio led数据结构
/include/linux/leds.h
struct gpio_led {
     const char *name;          //名字
     char *default_trigger;     //默认触发器的名字
     unsigned      gpio;          //使用的gpio编号
     u8           active_low;     //如果为真则逻辑1代表低电平
};

struct gpio_led_platform_data {
     int           num_leds;                                       //gpio led的数量
     struct gpio_led *leds;                                      //指向要注册的gpio_led数组
     int          (*gpio_blink_set)(unsigned gpio,          //硬件闪烁加速设置,可以为NULL
                         unsigned long *delay_on,
                         unsigned long *delay_off);
};

 
如何注册gpio-led平台设备
例子如下:
#define GPIO_LED3       138                                                                                                                  
#define GPIO_LED4       139

static struct gpio_led gpio_leds[] = {
        {
                .name   = "led3",
                .default_trigger = "heartbeat",
                .gpio   = GPIO_LED3,
                .active_low = 1,
                .default_state = LEDS_GPIO_DEFSTATE_OFF,
        },
        {
                .name   = "led4",
                .gpio   = GPIO_LED4,
                .active_low = 1,
                .default_state = LEDS_GPIO_DEFSTATE_OFF,
        },
};

static struct gpio_led_platform_data gpio_led_info = {
        .leds           = gpio_leds,
        .num_leds       = ARRAY_SIZE(gpio_leds),
};

static struct platform_device leds_gpio = {
        .name   = "leds-gpio",
        .id     = -1,
        .dev    = {
                .platform_data  = &gpio_led_info,
        },
};

最后调用platform_device_register(&leds_gpio)将LED设备注册到内核中。注册之前一定要保证编号为138和139的两个端口是可用的。
成功注册之后,系统中便会出现名为led3和led4的两个led_classdev了。由于是用gpio模拟led,所以对gpio-led设置的亮度,只要不是0就是全亮(gpio只有两个状态)。
对于可能睡眠的gpio,gpio-led会借助于工作队列去设置亮度,所以不用担心会被阻塞。
 

default-on触发器
在/driver/leds/ledtrig-default-on.c中实现了一个名为“default-on”的触发器。这个触发器只定义了activate成员函数。它的activate函数的定义如下:
static void defon_trig_activate(struct led_classdev *led_cdev)
{
     led_set_brightness(led_cdev, LED_FULL);
}
也就是说,点亮led只能是最亮的亮度,无法调节。一旦ledl_classdev与之建立了连接,就一直处于最亮的状态,直到取消和触发器的连接。
 

心跳灯触发器
在/driver/leds/ledtrig-heartbeat.c中定义了一个名为"heartbeat"的心跳触发器,它可以控制所有与之建立连接的led会不停的闪烁。这个触发器用来指示内核是否已经挂掉。如果与之建立连接的led不再闪烁了,说明内核已经挂掉了。这就是“心跳”的含义,和从人的心脏是否跳动来判断人是否死亡的原理是类似的。
 

IDE硬盘指示灯触发器
在/driver/leds/ledtrig-ide-disk.c中定义了一个名为“ide-disk”的IDE硬盘指示灯触发器,与之建立连接的led可以指示硬盘的忙碌状态。这个触发器并没有active接口,因此不会自动闪烁。当内核中的其他模块调用以下函数的时候硬盘指示灯就会亮闪一下:
void ledtrig_ide_activity(void);
这个函数是全局函数,内核空间都可以调用。每调用一次就闪烁一下。具体怎么用,完全依赖于IDE驱动。
可以有多个led_classdev和这个触发器建立连接。每次调用ledtrig_ide_activity,所有与之连接的led都会闪烁一下。
使用ledtrig_ide_activity这个函数的模块应该包含<linux/leds.h>这个头文件。
 

闪烁定时触发器
在/driver/leds/ledtrig-timer.c中定义了一个名为“timer”的触发器。当某个led_classdev与之连接后,这个触发器会在/sys/class/leds/<device>/下创建两个属性文件delay_on/delay_off。用户空间往这两个文件中写入数据后,相应的led会按照设置的高低电平的时间(单位毫秒)来闪烁。如果led_classdev注册了硬件闪烁的接口led_cdev->blink_set就是用硬件控制闪烁,否则用软件定时器来控制闪烁。
 

led_classdev的sysfs属性文件
现在假设有一个名为“REDLED”的led_classdev被注册了,那么会出现/sys/class/leds/REDLED这个目录,这个目录下默认有brightness和trigger这两个属性文件,分别可以设置/读取led的亮度和触发器。如果和触发器“timer”建立了连接,还会有delay_on和delay_off,这两个文件用于设置/读取闪烁的熄灭和点亮的时间,单位是毫秒。
 

LED子系统的使用
系统定义了四个默认触发器:default_on、心跳触发器、硬盘灯触发器、闪烁触发器。除了硬盘灯触发器,其他触发器没有留从其它内核模块访问的接口。led子系统的目的主要是给用户空间控制led的。当然可以定义自己的触发器并留给其它模块访问的接口。
 
0

内核中led触发器实例【转】的更多相关文章

  1. linux 驱动学习笔记02--应用实例:在内核中新增驱动代码目录和子目录

    下面来看一个综合实例,假设我们要在内核源代码 drivers 目录下为 ARM 体系结构新增如下用于 test driver 的树型目录:| --test  | -- cpu  | -- cpu.c ...

  2. Linux内核中的GPIO系统之(3):pin controller driver代码分析

    一.前言 对于一个嵌入式软件工程师,我们的软件模块经常和硬件打交道,pin control subsystem也不例外,被它驱动的硬件叫做pin controller(一般ARM soc的datash ...

  3. Linux内核中的GPIO系统之(3):pin controller driver代码分析--devm_kzalloc使用【转】

    转自:http://www.wowotech.net/linux_kenrel/pin-controller-driver.html 一.前言 对于一个嵌入式软件工程师,我们的软件模块经常和硬件打交道 ...

  4. Linux 内核中的 Device Mapper 机制

    本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机 ...

  5. SQL触发器实例讲解

    SQL触发器实例1 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. 常见的触发器有三种:分别应用于Inser ...

  6. 内核中用于数据接收的结构体struct msghdr(转)

    内核中用于数据接收的结构体struct msghdr(转) 我们从一个实际的数据包发送的例子入手,来看看其发送的具体流程,以及过程中涉及到的相关数据结构.在我们的虚拟机上发送icmp回显请求包,pin ...

  7. SQL触发器实例

    SQL触发器实例讲解(本文是来自百度文库) 备注:本人建了一个站特价汇,我想记录每个商品的点击量,然后按照点击量来牌名商品,想要提高效率,所以必须得用触发器,下面是本人在百度文库中的找到的学习资料,分 ...

  8. [SQL SERVER系列]存储过程,游标和触发器实例[原创]

    自己写的存储过程与游标结合使用的实例,与大家分享,也供自己查阅,仅供参考: --使用游标循环处理,删除重复的记录 declare @UserID int ) ) declare @UnitFlag i ...

  9. oracle触发器实例

    8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2.3 创建替代(INS ...

随机推荐

  1. 2017 [六省联考] T2 相逢是问候

    4869: [Shoi2017]相逢是问候 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1205  Solved: 409[Submit][Stat ...

  2. MySQL中limit与max同时使用时查询为空的情况

    一般情况下使用limit进行分页时通常是第一页就用max和min这些函数去求值,这样的情况是正常的,但是如果limit去到了第二页的时候发现这样用是不行的,原因未知! 修改的方式如下,适合大部分: , ...

  3. Maven的构建生命周期理解

    以下引用官方的生命周期解释https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html: 一.构建生命 ...

  4. 在Debian下安装使用Windows下的字体

    转载:http://blog.163.com/lixiangqiu_9202/blog/static/53575037201251224553801/ Debian下的字体不太好看,没有windows ...

  5. 【css】设置div位于浏览器的最底层,离用户最远

    有时候切换发现某块div一直悬浮在最上层,怎么设置div位于浏览器的最底层.离用户最远? <style> .in{ z-index: -1; } </style> 然后引用in ...

  6. C++精华笔记

    牛客微信推送的C++笔记:2016-12-12   14:23:26 1.C++不仅支持面向对象,也可以像C一样支持面向过程. 2.OOP三大特性:封装 继承 多态 3.函数重载依据:函数类型and形 ...

  7. 初涉IPC,了解AIDL的工作原理及用法

    初涉IPC,了解AIDL的工作原理及用法 今天来讲讲AIDL.这个神奇的AIDL,也是近期在学习的,看了某课大神的解说写下的blog,希望结合自己的看法给各位同价通俗易懂的解说 官方文档:http:/ ...

  8. 用C++设计一个不能被继承的类(转)

    在Java 中定义了关键字final,被final修饰的类不能被继承. 首先想到的是在C++中,子类的构造函数会自动调用父类的构造函数.同样,子类的析构函数也会自动调用父类的析构函数.要想一个类不能被 ...

  9. Mina、Netty、Twisted一起学(七):公布/订阅(Publish/Subscribe)

    消息传递有非常多种方式.请求/响应(Request/Reply)是最经常使用的.在前面的博文的样例中.非常多都是採用请求/响应的方式.当server接收到消息后,会马上write回写一条消息到clie ...

  10. 数据迁移实战:基于Kettle的Mysql到DB2的数据迁移

    From:https://my.oschina.net/simpleton/blog/525675 一.什么是ETL ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数 ...