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

世界杯结束了,德国战车夺得了大力神杯,阿根廷最终还是失败了。也许3年,5年,或者10年后,人们就不知道巴西世界杯的亚军是谁,但是总是会记得冠军是谁。就像什么考试,比赛,第一永远会被人们所记住,所以我们都想去追寻第一,渴望第一,在一次次的追寻中,成者为王败者为寇。而处在第一的位置,永远担心下面的会超越自己,从而活得很累,而第二永远想争取第一,也活得很累,有时候,想想,人一生当中,成功真的就那么重要吗?富有真的那么重要吗?采菊东篱下,悠然见南山不是也很有诗意吗?说了好多,还是继续写led子系统吧。

前面写了很多关于led子系统的相关知识,现在终于可以开始分析leds-gpio.c这个驱动了。

注册了platform驱动。

platform_driver_register(&gpio_led_driver);

platform总线就不多说了,在自己的平台下添加platform device就可以了。

当device和dirver匹配后,就会调用driver的probe函数,这里调用的是下面这个函数。

[html] view plaincopy
  1. static int __devinit gpio_led_probe(struct platform_device *pdev)
  2. {
  3. structgpio_led_platform_data *pdata = pdev->dev.platform_data;
  4. struct gpio_leds_priv*priv;
  5. int i, ret = 0;
  6. if (pdata &&pdata->num_leds) {
  7. priv =kzalloc(sizeof_gpio_leds_priv(pdata->num_leds),
  8. GFP_KERNEL);
  9. if (!priv)
  10. return-ENOMEM;
  11. priv->num_leds= pdata->num_leds;
  12. for (i = 0;i < priv->num_leds; i++) {
  13. ret= create_gpio_led(&pdata->leds[i],
  14. &priv->leds[i],
  15. &pdev->dev,pdata->gpio_blink_set);
  16. if(ret < 0) {
  17. /*On failure: unwind the led creations */
  18. for(i = i - 1; i >= 0; i--)
  19. delete_gpio_led(&priv->leds[i]);
  20. kfree(priv);
  21. returnret;
  22. }
  23. }
  24. } else {
  25. priv =gpio_leds_create_of(pdev);
  26. if (!priv)
  27. return-ENODEV;
  28. }
  29. platform_set_drvdata(pdev,priv);
  30. return 0;
  31. }

获取platform里的device的数据,然后create_gpio_led,这里可以注册很多歌led,具体的leds-gpio的platform数据可以参考

http://blog.csdn.net/eastmoon502136/article/details/37569789。

接着看一下create_gpio_led这个函数。

[html] view plaincopy
  1. static int __devinit create_gpio_led(const struct gpio_led*template,
  2. struct gpio_led_data*led_dat, struct device *parent,
  3. int (*blink_set)(unsigned,int, unsigned long *, unsigned long *))
  4. {
  5. int ret, state;
  6. led_dat->gpio = -1;
  7. /* skip leds thataren't available */
  8. if(!gpio_is_valid(template->gpio)) {
  9. printk(KERN_INFO"Skipping unavailable LED gpio %d (%s)\n",
  10. template->gpio,template->name);
  11. return 0;
  12. }
  13. ret =gpio_request(template->gpio, template->name);
  14. if (ret < 0)
  15. return ret;
  16. led_dat->cdev.name= template->name;
  17. led_dat->cdev.default_trigger= template->default_trigger;
  18. led_dat->gpio =template->gpio;
  19. led_dat->can_sleep= gpio_cansleep(template->gpio);
  20. led_dat->active_low= template->active_low;
  21. led_dat->blinking =0;
  22. if (blink_set) {
  23. led_dat->platform_gpio_blink_set= blink_set;
  24. led_dat->cdev.blink_set= gpio_blink_set;
  25. }
  26. led_dat->cdev.brightness_set= gpio_led_set;
  27. if(template->default_state == LEDS_GPIO_DEFSTATE_KEEP)
  28. state =!!gpio_get_value(led_dat->gpio) ^ led_dat->active_low;
  29. else
  30. state =(template->default_state == LEDS_GPIO_DEFSTATE_ON);
  31. led_dat->cdev.brightness= state ? LED_FULL : LED_OFF;
  32. if(!template->retain_state_suspended)
  33. led_dat->cdev.flags|= LED_CORE_SUSPENDRESUME;
  34. ret =gpio_direction_output(led_dat->gpio, led_dat->active_low ^ state);
  35. if (ret < 0)
  36. goto err;
  37. INIT_WORK(&led_dat->work,gpio_led_work);
  38. ret =led_classdev_register(parent, &led_dat->cdev);
  39. if (ret < 0)
  40. goto err;
  41. return 0;
  42. err:
  43. gpio_free(led_dat->gpio);
  44. return ret;
  45. }
[html] view plaincopy
  1. struct gpio_led_data {
  2. struct led_classdevcdev;
  3. unsigned gpio;
  4. struct work_structwork;
  5. u8 new_level;
  6. u8 can_sleep;
  7. u8 active_low;
  8. u8 blinking;
  9. int(*platform_gpio_blink_set)(unsigned gpio, int state,
  10. unsignedlong *delay_on, unsigned long *delay_off);
  11. };

申请gpio,以及对于一些变量和函数指针的赋值,最后注册led设备。

关于应用层的调用:

比如我们在platform设备中注册了

[html] view plaincopy
  1. Static struct gpio_led gpio_leds[] = {
  2. {
  3. .name=”my-led”,
  4. .default_trigger= “timer”,
  5. .gpio= 30,
  6. .active_low= 1,
  7. .default_state= LEDS_GPIO_DEFSTATE_OFF,
  8. }
  9. };

那么在/sys/class/leds/下会有my-led目录,在目录下面会创建两个文件delay_on和delay_off。

可以通过

echo 100 > /sys/class/leds/my-led/delay_on

echo 100 > /sys/class/leds/my-led/delay_off

来控制闪烁的时间。

cat /sys/class/leds/my-led/delay_on

cat  /sys/class/leds/my-led/delay_off

来获取当前的delay_on和delay_off的值

对于led子系统就简单的介绍到这里了。

初探linux子系统集之led子系统(三)【转】相关推荐

  1. 初探linux子系统集之led子系统(一)【转】

    本文转载自:http://blog.csdn.net/eastmoon502136/article/details/37569789 就像学编程第一个范例helloworld一样,学嵌入式,单片机.f ...

  2. Linux下的LED子系统

    最简单的led驱动就是从端口输出0或1来关闭或点亮灯.而我们这里讲的led子系统,主要是对led事件进行了分装和优化,这里我们主要讲的是可以实现跨平台的led驱动.不管你是使用三星的平台,还是Atme ...

  3. Linux内核LED子系统、请务必看

    前言 LED子系统你要是说很难嘛,但是它就是控制一些简单的GPIO口,但是你要是说它很简单嘛,但是我也不见得一个初学者很快就能掌握,你如果是刚入门这部分的话,我觉得你还是要去仔细研究下这些驱动.前两天 ...

  4. LINUX系统子系统DEMON,【linux】led子系统

    目录 前言 led子系统 led子系统实战-系统调用-ARM平台 前言 接下来记录的是 led子系统 目前不涉及驱动源码 linux子系统 在 Linux 系统中 绝大多数硬件设备都有非常成熟的驱动框 ...

  5. 基于PM8916 MPP创建一个Linux led子系统

    基于PM8916 MPP创建一个Linuxled子系统 首先,从kernel文件系统层面上创建sys文件系统节点/sys/class/leds/button-backlight/brightness的 ...

  6. LINUX IIO子系统分析之一 IIO子系统概述

    从本章开始,我们进行IIO子系统专栏的分析文档,本次IIO子系统专栏分析文档大概包含如下几章: 一. IIO子系统概述 二.IIO子系统相关数据结构分析 三.iio trigger 介绍 四.iio ...

  7. linux驱动系列学习之i2c子系统(四)

    一.i2c子系统简介 1. i2c总线 i2c总线因为只用SCL.SDA两根线就实现了设备之间的数据互传,极大的简化PCB布线,因此,2c总线在EEPROM.小型LCD等设备中应用极光.i2c的相关时 ...

  8. Linux中断(interrupt)子系统之四:驱动程序接口层 中断通用逻辑层

    在本系列文章的第一篇:Linux中断(interrupt)子系统之一:中断系统基本原理,我把通用中断子系统分为了4个层次,其中的驱动程序接口层和中断通用逻辑层的界限实际上不是很明确,因为中断通用逻辑层 ...

  9. linux iio 设备驱动,Linux设备驱动之IIO子系统——IIO框架数据读取,linuxiio

    Linux设备驱动之IIO子系统--IIO框架数据读取,linuxiio IIO DATA ACCESS IIO数据获取 只有两种方法可以使用IIO框架访问数据; 通过sysf通道进行一次性捕获,或通 ...

  10. linux内核添加spi驱动,Linux内核驱动之spi子系统spi协议.docx

    Linux内核驱动之spi子系统spi协议 概况 SPI接口是摩托罗拉首先提出的全双工三线同步串行外围接口SCK,MOSI,MISO,采用主从模式(Master Slave)架构:支持多slave模式 ...

最新文章

  1. Linux 启动mysql
  2. 再译《A *路径搜索入门》之二
  3. 前端学习(479):html简介
  4. PASCAL不仅仅是语言
  5. 陷阱计算机音乐谱大全,陷阱 原版C调-王北车-和弦谱-《弹吧》官网tan8.com-和弦谱大全,学吉他,秀吉他...
  6. 【Python】pyCryptodome模块实现AES加密、解密
  7. .rpt文件内容读取java_Java 中读取文件内容的 n 中方式
  8. 入行数据科学,仅需6步
  9. Java的I/O总结
  10. jQuery、Ajax,DataTable数据如何转换成Json格式
  11. 静态HTML网页设计作品——食品餐饮行业网站模板(10页) HTML+CSS+JavaScript 学生DW网页设计作业成品 美食生鲜零食网页设计
  12. Unity之Touch触摸屏单指、多指触碰
  13. java发送QQ邮件详细步骤
  14. Unity 游戏多语言解决方案和字体错误解决方法的想法
  15. 【python】parser.add_argument后面为什么要加-和--?
  16. 往数据库里添加date(时间)类型的数据
  17. cygwin 安装 ffplay
  18. iOS精品资源汇总(持续更新)
  19. PDF如何编辑修改,怎么编辑PDF文字与图片
  20. 【vbers】ibv_get_async_event()

热门文章

  1. 【连载之一】那些公众号不会告诉你的职业真相
  2. 一起来看看阿里开源的15个顶级Java项目
  3. 建议直接收藏,阿里巴巴开源15个顶级Java项目
  4. appcan mysql_AppCan 双击返回按钮退出应用 | 学步园
  5. 内购 税务信息页填写-新版填写
  6. php调用itunes,使用cURL和PHP检索iTunes App Store XML
  7. 1024网易程序员节,最上头的爱,给最好的你!
  8. 技术驱动婚恋,百合网的混合云、大数据与机器学习实践
  9. 实验六—基本数据管理(三)
  10. 告别360全家桶,安利一波电脑必备软件