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. 76.QT槽的机制

    按钮点击获取文本框输入 void Dialog::on_pushButton_clicked() { //获取文本输入 QString vstr = ui->lineEdit->text( ...

  2. 39.C语言操作数据库

    一.准备工作: sqlite3工具集:链接:https://pan.baidu.com/s/1mjufXZa 密码:2ui7 安装步骤: 打开如下文件夹,找到sqlite3.dll,并放入系统目录 2 ...

  3. C语言-常量指针与指针常量

    最近倪健问我一个问题,他说:什么是常指针?什么是指向常变量的指针?请举例说明 我查阅资料后这么回答他了, 指针常量(常指针):int * const p : 指针是一个常量,也就是说它始终指向那个地址 ...

  4. cat---查看文件内容

  5. 新版mysql修改root密码

  6. 今日SGU 5.3

    SGU 107 题意:输入一个N,表示N位数字里面有多少个的平方数的结尾9位是987654321 收获:打表,你发现相同位数的数相乘结果的最后几位,就和那两个相乘的数最后几位相乘一样,比如3416*8 ...

  7. MySQL具体解释(13)------------事务

    一. 什么是事务 事务就是一段sql 语句的批处理.可是这个批处理是一个atom(原子) .不可切割,要么都运行,要么回滚(rollback)都不运行. 二.为什么出现这样的技术 为什么要使用事务这个 ...

  8. Maven实战(五)——自己主动化Web应用集成測试

    自己主动化集成測试的角色 本专栏的上一篇文章讲述了Maven与持续集成的一些关系及详细实践,我们都知道,自己主动化測试是持续集成不可缺少的一部分,基本上,没有自己主动化測试的持续集成,都非常难称之为真 ...

  9. 深入理解javascript之原型

    理解原型 原型是一个对象.其它对象能够通过它实现属性继承. 不论什么一个对象都能够成为继承,全部对象在默认的情况下都有一个原型.由于原型本身也是对象,所以每一个原型自身又有一个原型. 不论什么一个对象 ...

  10. Funui-overlay 如何添加theme 的 overlay

    昨天更改theme主题的时候,发现所有仓库下的theme都是共用的.也就是说,如果你更改了52平台下的theme,那么你提交了代码以后,82下也会发生相应的更改.但是,昨天修改的theme属性,只在3 ...