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

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

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

  1. Include/Linux/leds.h
  2. drivers/leds

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

  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. # LED PlatformDrivers
  6. obj-$(CONFIG_LEDS_GPIO)                        += leds-gpio.o
  7. # LED Triggers
  8. obj-$(CONFIG_LEDS_TRIGGER_TIMER) +=ledtrig-timer.o
  9. obj-$(CONFIG_LEDS_TRIGGER_IDE_DISK)      +=ledtrig-ide-disk.o
  10. obj-$(CONFIG_LEDS_TRIGGER_HEARTBEAT) +=ledtrig-heartbeat.o
  11. obj-$(CONFIG_LEDS_TRIGGER_BACKLIGHT) +=ledtrig-backlight.o
  12. obj-$(CONFIG_LEDS_TRIGGER_GPIO)              +=ledtrig-gpio.o
  13. 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

  1. 1、enum led_brightness{
  2. LED_OFF           = 0,
  3. LED_HALF         = 127,
  4. LED_FULL         = 255,
  5. };

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

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

led-core.c

  1. DECLARE_RWSEM(leds_list_lock);
  2. EXPORT_SYMBOL_GPL(leds_list_lock);
  3. LIST_HEAD(leds_list);
  4. EXPORT_SYMBOL_GPL(leds_list);

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

Led-class.c

1、  leds_init

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

led_class_attrs

  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子系统了。

初探linux子系统集之led子系统(一)【转】的更多相关文章

  1. 初探linux子系统集之led子系统(二)

    巴西世界杯,德国7比1东道主,那个惨不忍睹啊,早上起来看新闻,第一眼看到7:1还以为点球也能踢成这样,后来想想,点球对多嘛6比1啊,接着就是各种新闻铺天盖地的来了.其实失败并没有什么,人生若是能够成功 ...

  2. 初探linux子系统集之led子系统(一)

    就像学编程第一个范例helloworld一样,学嵌入式,单片机.fpga之类的第一个范例就是点亮一盏灯.对于庞大的linux系统,当然可以编写一个字符设备驱动来实现我们需要的led灯,也可以直接利用g ...

  3. 初探linux子系统集之led子系统(二)【转】

    本文转载自:http://blog.csdn.net/eastmoon502136/article/details/37606487 巴西世界杯,德国7比1东道主,那个惨不忍睹啊,早上起来看新闻,第一 ...

  4. 初探linux子系统集之led子系统(三)

    世界杯结束了,德国战车夺得了大力神杯,阿根廷最终还是失败了.也许3年,5年,或者10年后,人们就不知道巴西世界杯的亚军是谁,但是总是会记得冠军是谁.就像什么考试,比赛,第一永远会被人们所记住,所以我们 ...

  5. 初探linux子系统集之led子系统(三)【转】

    本文转载自:http://blog.csdn.net/eastmoon502136/article/details/37822837 世界杯结束了,德国战车夺得了大力神杯,阿根廷最终还是失败了.也许3 ...

  6. 初探linux子系统集之timer子系统(三)

    因为现在的linux虽然还是可以使用低精度的timer,但是趋势是高精度hrtimer,所以上一篇试着翻译一下hrtimer的一些介绍,翻译的不是很好,看来英语还得好好学习啊,下面还是好好学习下lin ...

  7. 初探linux子系统集之timer子系统(一)

    一般来说要让整个linux系统跑起来,那么一个必须的就是linux的时钟,也就是时间子系统了,这里正好工作需要,那么就研究下linux下的时间子系统了. linux内核必须完成两种主要的定时测量.一个 ...

  8. 初探linux子系统集之timer子系统(二)

    想着博客中还没有翻译过一篇文章,虽然英文水平有限,但是借助google翻译慢慢地翻译出一篇文章也是不错的选择.那就来学习下hrtimer的文档吧,翻译的略搓,可以直接跳过这篇,这里仅作为学习的过程!^ ...

  9. 初探linux子系统集之i2c子系统(一)

    I2c子系统在进公司来的时候就学习过了,可是那是还不是很熟悉linux中的i2c子系统,就没有细看.记得当初很想熟悉linux中的各种总线驱动,想专门写一个关于总线驱动的专集,后来发现好像就没有几个, ...

随机推荐

  1. LR(1)文法分析器 //c++ 实现

    1.先读入终结符,非终结符,和所有产生式. 2.预处理:初始化:getpp()获得每个非终结符在产生式左边时的产生式编号, 记录在 string getp[]中(可以多个). 3.获得所有的符号的fi ...

  2. P1551 亲戚 洛谷

    https://www.luogu.org/problem/show?pid=1551 题目背景 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个 ...

  3. T1013 求先序排列 codevs

    http://codevs.cn/problem/1013/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descr ...

  4. ubuntu远程桌面设置

    一.服务器端电脑设置: 1.在搜索端搜索desktop sharing,然后设置后退出 二.客户端电脑设置: 1.在搜索端搜索remmina remote desktop client 2.如图设置: ...

  5. 大整数类BIGN的设计与实现 C++高精度模板

    首先感谢刘汝佳所著的<算法竞赛入门经典>. 众所周知,C++中储存能力最大的unsigned long long 也是有着一个上限,如果我们想计算非常大的整数时,就不知所措了,所以,我写了 ...

  6. Java成长之路

    怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作三五年之后开始迷茫的老程序员经常会问到的问题.希 ...

  7. setImageEdgeInsets 和 setImage配合使用达到button区域大并可调节其上图片显示区域大小的效果

    [self.indicator setImage:[UIImage imageNamed:@"01_login_moreicon@2x.png"] forState:UIContr ...

  8. openfalcon的安装和使用

    蛮复杂的样子 根据官方文档指导,一步一步走起:https://book.open-falcon.org/zh_0_2/quick_install/prepare.html 单机安装的过程:单击安装会把 ...

  9. 【Lucene】具体解释Lucene全文检索的信息写入与读取

    Lucene的大致结构图: 信息写入索引库的过程: 读取信息的过程: 以下是一个向索引库写入信息与读取信息的样例: public void testCreateIndex() throws Excep ...

  10. 单点登录CAS-Demo

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 1安全证书配置 2部署服务端CAS-Server 3部署CAS-Client 4测试SSO   1,安全证书配置 CAS默认 ...