本文转载自: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. ASP.NET HttpContext类

      IHttpHandler 接口 定义 ASP.NET 以异步方式处理使用自定义 HTTP 处理程序的 HTTP Web 请求而实现的协定 封装http请求信息 HttpContext.Curren ...

  2. springboot idea激活指定profile

    多Profile文件 配置文件编写的时,可以是application-{profile}.properties/yml,默认使用application.properties的配置: 激活指定profi ...

  3. Extjs grid 单元格编辑

    实现grid勾选后出现编辑按钮,通过增加一个字段checked来控制 事件如下: selectionchange: function (thi, selected, eOpts) { for (var ...

  4. cacti监控linux和windows磁盘IO

    cacti监控linux和windows磁盘IO 标签:cacti linux磁盘IO windows磁盘IO 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则 ...

  5. UITableViewCell -- 动画

    -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath: ...

  6. 【转载】Java NIO学习

    这篇文章介绍了NIO的基本概念: http://www.iteye.com/magazines/132-Java-NIO Java NIO提供了与标准IO不同的IO工作方式: Channels and ...

  7. Unable to lock the administration directory (/var/lib/dpkg/) is another process using it?

    I see pretty much all the answers recommend deleting the lock. I don't recommend doing that as a fir ...

  8. sh_Spring整合Hibernate

    分别介绍了Sping和Hibernate,以下是将它们整合到一块去了.   一.Hibernate内容 1.创建PO类. package cn.tgb.domain; //User实体 public ...

  9. gulp在ionic中的使用

    简介 Gulp是一个基于流的自动化构建器. 安装 npm config set registry http://registry.npm.taobao.org ---最好用国内源 npm instal ...

  10. mysql drop table命令使用总结

    drop性能 drop table(innodb引擎) 数量2000w,只需要5m