zoukankan      html  css  js  c++  java
  • 内核中led触发器实例【转】

    本文转载自: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
  • 相关阅读:
    Artifact Project3:war exploded: Error during artifact deployment. See server log for details.
    Struts2的OGNL表达式语言
    java空指针异常:java.lang.NullPointException
    两天撸一个天气应用微信小程序
    Graves of the Internet
    JavaScript并非“按值传递”
    js实现黑客帝国二进制雨
    JavaScript“并非”一切皆对象
    纯CSS打造银色MacBook Air(完整版)
    element-ui中轮播图自适应图片高度
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/6942117.html
Copyright © 2011-2022 走看看