android-5.0.2\hardware\libhardware\include\hardware\lights.h  //系统一些宏定义

android源码只带的灯光驱动在linux内核的driver/leds/led-class.c中,其是led驱动的顶层框架文件

该驱动的提供的功能在leds_class->dev_attrs = led_class_attrs;//在led_class_attrs提供了设备属性,当通过echo或cat访问设备节点的时候会导致响应的函数被调用

//只带驱动提供的方法

echo 255 > /sys/class/leds/led1/brightness//设置亮度
cat /sys/class/leds/led1/brightness//获取当前亮度值
cat /sys/class/leds/led1/max_brightness//获取最大亮度值

闪烁

//可以在注册led_classes之前设置trigger,eg:led_devs[i].cdev.default_trigger = "timer",这样就可以不用echo timer了
echo timer > /sys/class/leds/led1/trigger  //表示使用定时器作为触发器
echo 100 > /sys/class/leds/led1/delay_on //设置点亮时间
echo 200 > /sys/class/leds/led1/delay_off  //设置熄灭时间

关闭
echo 0 > /sys/class/leds/led1/delay_on

echo 0 > /sys/class/leds/led1/brightness

分析闪烁功能:
echo timer > /sys/class/leds/led1/trigger // timer对应 ledtrig-timer.c

//在led-classes.c文件中数组led_class_attrs[]设置的dev的三个属性,其中一个是trigger,在led1下会根据这里的属性创建节点以及操作节点是对应的函数

eg:__ATTR(trigger,0644,led_trigger_show,led_trigger_store)//echo节点导致led_trigger_store被调用,cat节点导致led_trigger_show被调用

led_trigger_store // 1. 从trigger_list找出名为"timer"的trigger
  list_for_each_entry(trig, &trigger_list, next_trig) {
    if (!strcmp(trigger_name, trig->name)) {
      // 2. 调用
      led_trigger_set(led_cdev, trig);
        // 3. 把trigger放入led_classdev的trig_list链表里
        list_add_tail(&led_cdev->trig_list, &trigger->led_cdevs);
        led_cdev->trigger = trigger;
        // 4.
        trigger->activate(led_cdev);
          // 5. 对于"timer",在ledtring-timer.c中定义
          timer_trig_activate
            // 6. 创建2个文件: delay_on, delay_off,同时制定读写这两个文件时调用的函数
            device_create_file  
            device_create_file
            led_blink_set // 让LED闪烁,会传入默认的点亮时间、熄灭时间,值都可以在led_classdev中设置
              led_set_software_blink
                mod_timer();

    }
  }

echo 100 > /sys/class/leds/led1/delay_on
led_delay_on_store(,,buf,size)//这里的buf中存放的是字符串“100”
  state = simple_strtoul(buf, &after, 10);
  led_blink_set // // 让LED闪烁
  led_cdev->blink_delay_on = state;//并且在led_classes结构体中保存时间

echo 200 > /sys/class/leds/led1/delay_off
led_delay_off_store
  state = simple_strtoul(buf, &after, 10);
  led_blink_set // 让LED闪烁
  led_cdev->blink_delay_off = state;

怎么写驱动:
a1. 分配led_classdev
a2. 设置 :
led_cdev->max_brightness
led_cdev->brightness_set
led_cdev->flags
led_cdev->brightness
led_cdev->name

a3. 注册 : led_classdev_register

驱动代码举例:

example1:

//头文件

struct led_desc{

  int gpio;

  char *name;

};

static struct led_desc[] = {

  {EXYNOS4212_GPM(0),"led4"},

  {EXYNOS4212_GPM(1),"led4"},

  {EXYNOS4212_GPM(2),"led4"},

  {EXYNOS4212_GPM(3),"led4"},

};

//构造一个结构体用来保存led_classdec与之对应的led灯

struct led_classdev_4412{

  struct led_classdev cdev;

  int gpio;

};

static struct led_classdev_4412 *led_devs;

static void brightness_set_4412(struct led_classdev *led_cdev,enum led_brightness brightness){

  struct led_classdev_4412 *dev = (struct led_classdev_4412 )led_cdev;

  led_cdev->brightness = brightness;

  if(brightness != LED_OFF)

  {

    gpio_set_value(dev->gpio,0);

  }

  else

  {

    gpio_set_value(dev->gpio,1);

  }

}

static int leds_init(void)

{

  int i;

  int ret;

  /*1、alloc  led_classdev 为我们的四个led灯分配led_classdev结构体*/

  led_devs = kzalloc(sizeof(struct led_classdev_4412)*sizeof(led_gpios)/sizeof(led_gpios[0]),GFP_KERNEL);

  if(led_devs == NULL){

    printk("No memory for device\n");

    return -ENOMEM;

  }  

  for(i = 0;i<sizeof(led_gpios)/sizeof(led_gpios[0];i++)

  {

    s3c_gpio_cfgpin(led_gpios[i].gpio,S3C_GPIO_OUTPUT);//设置为输出引脚  

    gpio_set_value(led_gpio[i].gpio,1);//熄灭灯

    /*2、set*/

    led_devs[i].cdev.max_brightness = LED_FULL;

    led_devs[i].cdev.brightness_set = brightness_set_4412;//设置函数

    led_devs[i].cdev.flags = LED_CORE_SUSPENDRESUME;//表示支持休眠唤醒功能

    led_devs[i].cdev.brightness = LED_OFF;//当前led值

    led_devs[i].cdev.name= led_gpios[i].name;///sys/class/leds/下创建节点

    led_devs[i].gpio = led_gpios[i].gpio;

    /*3、led_classdev_register*/

    ret = led_classes_register(NULL,&led_devs[i].cdev);

    if(ret){

      i--;

      while(i >=0){

        led_classes_unregister(&led_devs[i].cdev);

        i--;

      }

      kfree(led_devs);

      return -EIO;

    }

  }

}

static void leds_exit(void)

{

  int i;

  for(i = 0;i<sizeof(led_gpios)/sizeof(led_gpios[0];i++)

  {

    led_classes_unregister(&led_devs[i].cdev);

  ]

  kfree(led_devs);

}

module_init(leds_init);

module_exit(leds_exit);

MODULE_LICENSE("GPL");

注意:我们的驱动程序是嵌入到linux的led驱动框架中去的

把 leds_4412.c 放到drivers/leds
修改 drivers/leds/Makefile:
obj-y += leds_4412.o

make menuconfig

CONFIG_LEDS_CLASS
CONFIG_LEDS_TRIGGERS
CONFIG_LEDS_TRIGGER_TIMER

-> Device Drivers
  -> LED Support
    [*] LED Class Support 
    [*] LED Trigger support  //实现定时器功能,led闪烁依赖定时器
    <*> LED Timer Trigger

make zImage

关掉开发板,设置为SD卡启动,使用minitools烧写Android Kernel:zImage

关掉开发板,设置为nand启动

ls /sys/class/leds   会发现有了led1、led2、led3、led4

8.2 Android灯光系统_led_class驱动的更多相关文章

  1. 8.1 Android灯光系统_总体框架

    1.框架 APP(java语言实现) ------------------------------- JNI(c++语言实现)     向上提供Java执行c函数的接口  向下访问HAL ------ ...

  2. Linux下安装Android的adb驱动-解决不能识别的问题

    Linux下安装Android的adb驱动-解决不能识别的问题 20141011更新:      老方法对我当时使用的一款设备一直都没有出现问题,最后遇到小米手机还有Android4.4版本的系统都会 ...

  3. Android灯光系统--深入理解背光灯

    Android灯光系统--深入理解背光灯 一.怎么控制背光灯(简述) APP将亮度值写入数据库 线程检测数据库的值是否发生变化 这种机制成为"内容观察者"--contentObse ...

  4. MTK6577+Android之Camera驱动

    MTK6577+Android之Camera驱动 <MTK安卓平台的Camera效果在线调试> 1.     Camera拍照相关概念 1.1  ISP isp--(Image Signa ...

  5. 基于MT6752/32平台 Android L版本驱动移植步骤

    基于MT6752/32平台 Android L版本驱动移植步骤 根据MK官网所述,在Android L 版本上Turnkey ABS 架构将会phase out,而Mediatek Turnkey架构 ...

  6. Android灯光系统--通知灯深入分析【转】

    本文转自:https://www.cnblogs.com/lkq1220/p/6406261.html Android灯光系统--通知灯深入分析 通知的类别 声音 振动 闪灯 APP如何发出通知灯请求 ...

  7. Android灯光系统--通知灯深入分析

    Android灯光系统--通知灯深入分析 通知的类别 声音 振动 闪灯 APP如何发出通知灯请求 getSystemService(获得通知服务) 构造notification 类别 其他参数(颜色, ...

  8. android驱动[置顶] 我的DIY Android之旅--驱动并控制你的Android开发板蜂鸣器

    改章节个人在深圳游玩的时候突然想到的...这几周就有想写几篇关于android驱动的博客,所以回家到之后就奋笔疾书的写出来发布了 这些天一直在想Android驱动框架层的实现,本文借助老罗教师的博客和 ...

  9. 「Android」消息驱动Looper和Handler类分析

    Android系统中的消息驱动工作原理: 1.有一个消息队列,可以往这个消息队列中投递消息; 2.有一个消息循环,不断的从消息队列中取得消息,然后处理. 工作流程: 1.事件源将待处理的消息加入到消息 ...

随机推荐

  1. Vue绑定事件

    <!-- 方法处理器 --> <button v-on:click="doThis"></button> <!-- 内联语句 --> ...

  2. spark源码编译,本地调试

    1.下载源码 2.进入源码根据README.md编译源码,注意使用的是源码目录下的maven编译 3.用idea导入顶层pom文件 4.修改顶层pom文件和example下的pom文件,将scope的 ...

  3. google dataflow model 论文

    http://www.chinacloud.cn/show.aspx?id=24446&cid=17

  4. 前端js中this指向及改变this指向的方法

    js中this指向是一个难点,花了很长时间来整理和学习相关的知识点. 一. this this是JS中的关键字, 它始终指向了一个对象, this是一个指针; 参考博文: JavaScript函数中的 ...

  5. 生成CPU使用率 sin 曲线 控制cpu使用率 编程之美

    入职Oracle 以后想着把之前写过的<编程之美>中控制CPU使用率曲线的程序再写一边, 可是总是由于入职须要学习的东西太多, 没有时间. 程序早就写好了. 最终有机会贴出来了.o(∩∩) ...

  6. 玩转Bash脚本:选择结构之case

    总第5篇 之前,我们谈到了if. 这次我们来谈还有一种选择结构--case. case与if if用于选择的条件,不是非常多的情况,假设选择的条件太多.一系列的if.elif,.也是醉了. 没错,ca ...

  7. 搜索 debian8.7.1 ,google vs baidu

    国外的 Linux 比国内流行, debian官方网站只能找到当前版本DVD文件.想找旧版的Debian在百度一圈后徒劳无功,于是把目标转向 google ,只需要输入 debian?8.7.1-i3 ...

  8. jquery constructor(null)

    <!-- jQuery = function() { --> <!-- return new jQuery.fn.F(); --> <!-- }, --> < ...

  9. worktools-源码下拉问题

    今天下拉源码的时候,出现了一个问题,就是当地的内容跟仓库的内容冲突,导致merge冲突.这时候CC指令不能用.然后希望通过checkout到其他分支,然后cc掉的.结果没办法切换到其他分支,一直停留在 ...

  10. android图片特效处理之图片叠加

    这篇将讲到图片特效处理的图片叠加效果.跟前面一样是对像素点进行处理,可参照前面的android图像处理系列之七--图片涂鸦,水印-图片叠加和android图像处理系列之六--给图片添加边框(下)-图片 ...