Android灯光系统

1.Linux的leds class驱动

  • Android 系统的灯光很多:
    电池指示灯,按键灯,键盘灯,屏幕亮度调节灯

  • 打开安卓源码 /home/topeet/Android/iTop4412_ICS_git/hardware/libhardware/include/hardware/lights.h
    可以看到有八种逻辑上的灯光

  • 在Android系统中灯光的使用方式有哪些
    brightness: 0-255不同数值对应不同的亮度 或者只有亮灭 OFF-0/ON-255
    color RGB
    blink 亮nms 灭nms,可以通过定时器实现闪烁功能

  • 以前的驱动程序只有控制等的亮灭,满足不了android系统应用。比如我们要实现闪烁功能,可以自己用定时器,设置亮灭的时间来操作,比较麻烦。

  • 实际中我们也不需要从0开始写灯光系统驱动,在linux内核已经有了Led class驱动程序,它已经实现了设置brightness,和闪烁blink的功能
    源码路径 源码 drivers/leds/Led-class.c,可以找到入口函数

    在入口函数中创建class,这个class有dev_attrs这个设备属性

    这是一个数组里边有三个属性
    我们想设置brightness,我们可通过 这个语句设置
    echo 255 > sys/class/leds/led1/brightness
    通过这样的语句设置亮度brightness数值,最终会导致这个属性的led_brightness_store会被调用

    在这个函数中,手续获得一个led_classdev,然后把buf中的字符串转化为整数state,最后调用函数led_set_brightness()

    这个函数通过led_cdev中的brightness_set来设置led的亮度。
    cat sys/class/ldes/led1/max_brightness
    这个语句只能读取max_brightness,函数led_max_brightness_show就会被调用

  • 怎么写驱动:

  • 1.分配led_classdev

  • 2.设置
    led_cdev->max_brightness
    led_cdev->brightness_set()
    led_cdev->flags
    led_cdev->brightness
    led_cdev->name

  • 3.注册:led_classdev_register()

  • 如果我们通过这个语句获取brightness的数值,那么这个函数就会被执行
    cat sys/class/ldes/led1/brightness

    这个函数中首先得到一个led_classdev然后,返回这个结构体的成员brightness

2. 编写leds驱动程序

  • leds_4412.c
#include #include #include #include #include #include #include #include //#include #include #include #include //#include "gps.h"#include #include #define LEDS_DEBUG#ifdef LEDS_DEBUG#define DPRINTK(x...) printk("LEDS_CTL DEBUG:" x)#else#define DPRINTK(x...)#endif#define DRIVER_NAME "leds"struct led_desc{int gpio;char *name;};static struct led_desc led_gpios[] = {{EXYNOS4_GPL2(0),"led1"},{EXYNOS4_GPK1(1),"led2"},};#define LED_NUMARRAY_SIZE(led_gpios)struct led_classdev_4412 {struct led_classdev cdev;int gpio;};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->blink_brightness = brightness;if(brightness != LED_OFF)gpio_set_value(dev->gpio, 0);elsegpio_set_value(dev->gpio, 1);}static struct led_classdev_4412 *led_devs;static int __init leds_init(void){int  i,ret;/*1. alloc led_classdev */led_devs = kzalloc(sizeof(struct led_classdev_4412)*LED_NUM, GFP_KERNEL);if (led_devs == NULL) {printk("No memory for device\n");for (i = 0;i < LED_NUM;i++){s3c_gpio_cfgpin(led_gpios[i].gpio, S3C_GPIO_OUTPUT);gpio_set_value(led_gpios[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_devs[i].cdev.name = led_gpios[i].name;led_devs[i].gpio = led_gpios[i].gpio;/* 3. register */ret = led_classdev_register(NULL,&led_devs[i].cdev);if(ret){i--;while(i>=0){led_classdev_unregister(&led_devs[i].cdev);i--;}kfree(led_devs);return -EIO;}}}static void __exit leds_exit(void){int i = 0;for (i = 0;i < LED_NUM;i++){led_classdev_unregister(&led_devs[i]);}kfree(led_devs);}module_init(leds_init);module_exit(leds_exit);MODULE_LICENSE("Dual BSD/GPL");
  • 将leds_4412.c上传到drivers/leds目录
  • 修改目录下drivers/ledsmakefile文件
    添加 obj-y += leds_4412.o

    另外需要添加配置项,CONFIG_LEDS_CLASS CONFIG_LEDS_TRIGGERS
    trigger是用来控制led闪烁的,它需要定时器,CONFIG_LEDS_TRIGGER_TIMER
  • make menuconfig 配置以上选项

  • 编译成功,重新烧录内核,重启itop4412开发板
  • 发送一下语句,看看到开发板两个灯的亮灭
  • 如何让led实现闪烁

    可以看到设备led1有trigger,cat trigger

    none表示当前的触发器为none,可以把trigger触发器设置为后边这三种,我们把timer设置到trigger中,看效果

    可以看到led1闪烁,并且目录下出现了一些文件。
    可以设置led的闪烁亮灭时间

  • 分析
    echo timer > /sys/class/leds/led1/trigger
    当把timer 写到文件sys/class/leds/led1/trigger中时,led_trigger_store被调用

首先trigger_name把buf中把name取出来,如果trigger等于none什么都不做返回,从triggerlist中找出相同名字的,如果相等,调用led_trigger_set(),把trigger放入到led_classdev的trigger_list链表中,

更多相关文章

  1. 箭头函数的基础使用
  2. Python技巧匿名函数、回调函数和高阶函数
  3. Android(安卓)Permission大全
  4. ImageButton设置 android:background添加点击效果
  5. Android中使用Dialog风格弹出框的Activity
  6. Android(安卓)TextView设置个别字体样式
  7. Android设置Activity透明背景样式
  8. Android布局layout中的一些属性(转)
  9. android源码浅析--AlertController

随机推荐

  1. Android(安卓)菜单(OptionMenu)大全 建立
  2. jdk和android的DES加密
  3. [图解]Android源码分析——Service的启动
  4. Linux下 解包/打包 Android(安卓)映像文
  5. android 基于百度地图api获取经纬度
  6. android 零散笔记不定期更新
  7. android客户端向服务器端验证登陆方法的
  8. 三步实现Android悬浮效果
  9. [Android-Demo] Android(安卓)数据库(SQL)
  10. Android中实现整个视图切换的左右滑动效