zoukankan      html  css  js  c++  java
  • 初探linux子系统集之led子系统(一)【转】

    本文转载自:http://blog.csdn.net/eastmoon502136/article/details/37569789

     就像学编程第一个范例helloworld一样,学嵌入式,单片机、fpga之类的第一个范例就是点亮一盏灯。对于庞大的Linux系统,当然可以编写一个字符设备驱动来实现我们需要的led灯,也可以直接利用gpio口,应用程序来拉高拉低管脚控制。不过,既然linux系统自己本来就带有led子系统,那么就可以好好利用之。好处不用多说了,主要对于应用层来说,不同平台都用linux的led子系统,那么应用程序不用做任何的改变,就可以在新的平台上运行,可移植性好。

             linux的led子系统的源码路径:

    [html] view plain copy
     
    1. Include/Linux/leds.h  
    2. drivers/leds  

             首先看一下led子系统中的主要文件:

    [html] view plain copy
     
    1. # LED Core  
    2. obj-$(CONFIG_NEW_LEDS)                        +=led-core.o  
    3. obj-$(CONFIG_LEDS_CLASS)                 += led-class.o  
    4. obj-$(CONFIG_LEDS_TRIGGERS)              +=led-triggers.o  
    5.    
    6. # LED PlatformDrivers  
    7. obj-$(CONFIG_LEDS_GPIO)                        += leds-gpio.o  
    8.    
    9. # LED Triggers  
    10. obj-$(CONFIG_LEDS_TRIGGER_TIMER) +=ledtrig-timer.o  
    11. obj-$(CONFIG_LEDS_TRIGGER_IDE_DISK)      +=ledtrig-ide-disk.o  
    12. obj-$(CONFIG_LEDS_TRIGGER_HEARTBEAT) +=ledtrig-heartbeat.o  
    13. obj-$(CONFIG_LEDS_TRIGGER_BACKLIGHT) +=ledtrig-backlight.o  
    14. obj-$(CONFIG_LEDS_TRIGGER_GPIO)              +=ledtrig-gpio.o  
    15. obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON)        += ledtrig-default-on.o  

    主要由leds.h、led-core.c、led-class.c、led-triggers.c,其中led-triggers又分为了timer、ide-disk、heartbeat、backlight、gpio、default-on等算法

    例子程序是leds-gpio,接下去会主要分析这个驱动实现。

    首先简单看一下主要的文件

    Leds.h

    [html] view plain copy
     
    1. 1、enum led_brightness{  
    2.          LED_OFF           = 0,  
    3.          LED_HALF         = 127,  
    4.          LED_FULL         = 255,  
    5. };  

    Led的亮度,分为三等级,关、中间、最亮。

    [html] view plain copy
     
    1. 2、struct led_classdev{  
    2.          constchar                  *name;   // Led的名字  
    3.          int                       brightness;   //led亮度  
    4.          int                       max_brightness; //led最大亮度  
    5.          int                       flags;  
    6.    
    7.          /*Lower 16 bits reflect status */  
    8. #define LED_SUSPENDED                  (1 <0)  
    9.          /*Upper 16 bits reflect control information */  
    10. #define LED_CORE_SUSPENDRESUME   (1 <16)  
    11.    
    12.          /*Set LED brightness level */  
    13.          /*Must not sleep, use a workqueue if needed */  
    14.          void           (*brightness_set)(struct led_classdev*led_cdev,  
    15.                                                  enum led_brightness brightness);   //亮度设置函数指针  
    16.          /*Get LED brightness level */  
    17.          enumled_brightness (*brightness_get)(struct led_classdev *led_cdev); //获取亮度函数指针  
    18.    
    19.          int              (*blink_set)(struct led_classdev*led_cdev,  
    20.                                           unsigned long *delay_on,  
    21.                                           unsigned long *delay_off);  //闪烁时点亮和熄灭的时间设置  
    22.    
    23.          structdevice             *dev;  
    24.          structlist_head        node;                        //leds-list的node  
    25.          constchar                  *default_trigger;     //默认trigger的名字  
    26.    
    27.          unsignedlong           blink_delay_on,blink_delay_off;   //闪烁的开关时间  
    28.          structtimer_list       blink_timer;                    //闪烁的定时器链表  
    29.          int                       blink_brightness;                   //闪烁的亮度  
    30.    
    31. #ifdef CONFIG_LEDS_TRIGGERS  
    32.          /*Protects the trigger data below */  
    33.          structrw_semaphore      trigger_lock;               //trigger的锁  
    34.    
    35.          structled_trigger    *trigger;                      //led的trigger  
    36.          structlist_head        trig_list;                     //trigger的链表  
    37.          void                    *trigger_data;                     //trigger的数据  
    38. #endif  
    39. };  
    [html] view plain copy
     
    1. 3、struct led_trigger {  
    2.          /*Trigger Properties */  
    3.          constchar        *name;           //trigger的名字  
    4.          void           (*activate)(struct led_classdev*led_cdev);   //激活trigger  
    5.          void           (*deactivate)(struct led_classdev*led_cdev);    
    6.    
    7.          /*LEDs under control by this trigger (for simple triggers) */  
    8.          rwlock_t   leddev_list_lock;  
    9.          structlist_head  led_cdevs;                     //led设备的链表  
    10.    
    11.          /*Link to next registered trigger */  
    12.          structlist_head  next_trig;  
    13. };  
    [html] view plain copy
     
    1. 4、/* For the leds-gpiodriver */  
    2. struct gpio_led {  
    3.          constchar *name;              //led的名字  
    4.          constchar *default_trigger;            //默认的trigger  
    5.          unsigned         gpio;                            //gpio口  
    6.          unsigned  active_low : 1;         
    7.          unsigned  retain_state_suspended : 1;  
    8.          unsigned  default_state : 2;  
    9.          /*default_state should be one of LEDS_GPIO_DEFSTATE_(ON|OFF|KEEP) */  
    10. };  
    11.    
    [html] view plain copy
     
    1. 5、structgpio_led_platform_data {  
    2.          int           num_leds;             led的个数  
    3.          conststruct gpio_led *leds;       led结构体  
    4.    
    5. #define GPIO_LED_NO_BLINK_LOW       0       /*No blink GPIO state low */  
    6. #define GPIO_LED_NO_BLINK_HIGH      1       /*No blink GPIO state high */  
    7. #define GPIO_LED_BLINK                 2       /* Please, blink */  
    8.          int              (*gpio_blink_set)(unsigned gpio,int state,  
    9.                                                unsignedlong *delay_on,  
    10.                                                unsignedlong *delay_off);  
    11. };  
    12.    



    led-core.c

    [html] view plain copy
     
    1. DECLARE_RWSEM(leds_list_lock);  
    2. EXPORT_SYMBOL_GPL(leds_list_lock);  
    3.    
    4. LIST_HEAD(leds_list);  
    5. EXPORT_SYMBOL_GPL(leds_list);  

    主要是声明了leds的链表和锁。

    Led-class.c

    1、  leds_init

    主要是创建leds_class,赋值suspend和resume以及dev_attrs。

    led_class_attrs

    [html] view plain copy
     
    1. static  struct device_attribute led_class_attrs[] = {  
    2.          __ATTR(brightness,0644, led_brightness_show, led_brightness_store),  
    3.          __ATTR(max_brightness,0444, led_max_brightness_show, NULL),  
    4. #ifdef CONFIG_LEDS_TRIGGERS  
    5.          __ATTR(trigger,0644, led_trigger_show, led_trigger_store),  
    6. #endif  
    7.          __ATTR_NULL,  
    8. };  

    2、led_classdev_register

             创建classdev设备,也即Leds_class类中实例化一个对象,类似于c++的new一个对象,leds有很多种,而这里是注册一个特定的led,内核中的面向对象思想也极其丰富。

             加到leds_list链表中,初始化blinktimer,指定blink_timer的function和data,设置trigger,然后一个新的led设备就注册好了,就可以使用了。

    led-triggers.c

    1、led_trigger_register

             扫描trigger链表中是否有同名的trigger,接着把当前trigger加入到链表中,如果led_classdev中有默认的trigger,那么就设置这个默认的。

    好了,简单看了下led子系统中比较重要的结构体和函数,那么接下去就可以通过leds-gpio这个驱动来进一步了解led子系统了。

  • 相关阅读:
    URL传参数导致乱码
    [转载]HTTP协议详解
    https中关于密码学的基础概念
    JavaScript高级程序设计 第四章 变量、作用域和内存问题
    JavaScript高级程序设计 第三章 基本概念
    实现sticky footer的五种方法
    css grid学习材料整理
    ASP.NET MVC编程——视图
    Entity Framework——配置文件设置
    Entity Framework——记录执行的命令信息
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/6945092.html
Copyright © 2011-2022 走看看