首先别人的APP要能直接访问到你写的硬件或者不经过任何修改的APP能直接使用你的驱动,就需要使用系统自带的JNI,所以我们需要写出符合系统自带JNI文件的HAL文件和驱动程序,下面具体分析一个这个HAL和驱动程序需要实现什么。


灯光系统由以下四个文件组成

APP:电池灯APP,通知灯APP,背光灯APP
JNI :com_android_server_lights_LightsService.cpp
HAL:我们自己实现,实现一个lights.c
驱动:leds_nanopi3.c(JNI需要什么这里就给它提供什么,这里我们实现亮灭闪烁和亮度)


灯光系统的主要功能:

  1. 硬件上是属于同一个的有(包括颜色和闪烁):
    电池灯:电池电量发生变化时颜色会发生变化
    通知灯:有通知会闪烁,比如未接电话或短信

  2. 调节LCD亮度:
    背光灯


驱动部分:

JNI:
com_android_server_lights_LightsService.cpp(不需要我们实现,但我们需要给它提供接口)

  1. 里面需要获得hw_module_t结构体,所以我们的HAL需要实现这个结构体

  2. JNI里面的get_device会根据不同的名字调用module->methods->open返回不同的light_device_t结构体,这个结构体里面带有set_light,即不同灯的控制函数

*********************lights.h*********************#define LIGHT_ID_BACKLIGHT          "backlight"
#define LIGHT_ID_KEYBOARD           "keyboard"
#define LIGHT_ID_BUTTONS            "buttons"
#define LIGHT_ID_BATTERY            "battery"
#define LIGHT_ID_NOTIFICATIONS      "notifications"
#define LIGHT_ID_ATTENTION          "attention"

这里我们只实现LIGHT_ID_BACKLIGHT(背光)、LIGHT_ID_BATTERY(电池)、LIGHT_ID_NOTIFICATIONS(通知)

HAL:
把硬件LED再次划分为不同的逻辑灯
1. 实现hw_module_t结构体
2. 实现open函数,它会根据name返回不同的light_device_t结构体
3. 针对不同的灯(背光/电池/通知),实现对应的set_light函数

struct light_device_t {struct hw_device_t common;int (*set_light)(struct light_device_t* dev,struct light_state_t const* state);
};

这里需实现三个set_light函数

set_light_battery (struct light_device_t *dev, struct light_state_t const* state)
set_light_notifications (struct light_device_t *dev, struct light_state_t const* state)
set_light_backlight (struct light_device_t *dev, struct light_state_t const *state)

通过这些函数里面操作驱动程序

驱动程序:
1. 对于RGB三个LED,实现亮灭闪烁三个功能
2. 对于背光灯,设置PWM

总结:
我们只需要实现一个HAL和一个驱动程序,HAL里面我们只需要实现hw_module_t结构体和一个open函数,open函数根据传进来的不同的name构造不同的light_device_t结构体,最后指向不同的set_light函数操作驱动程序,下一章具体实现这些代码。

Android灯光系统框架分析相关推荐

  1. Android DRM框架分析

    Android DRM框架分析 1. DRM框架 2.DRM架构 3.DRM插件 4. 实现 5.DRM插件详情 6.MediaDrm 7.MediaCrypto 8.参考链接 1. DRM框架 An ...

  2. Android WIFI框架分析(1)

    趁做Android WIFI驱动移植,对Android WIFI框架做了深刻的分析,并做此文档共同学习. 对上层WIFI的应用,基本流程为:(1)WIFI初始化  (2)Wifi启动      (3) ...

  3. MTK Android Led框架分析

    1 驱动部分 这部分主要根据驱动源码的初始化部分进行分析 1.1 mtk_leds_drv 路径:/kernel-4.14/drivers/misc/mediatek/leds/mtk_leds_dr ...

  4. android输入法框架分析,Android与iOS输入法开发框架比较谈

    对于任何一个使用手机的人,有一样工具是不可能缺少的,它既不是微信之类的社交工具,也不是支付宝之类的金融工具(事实上这两个都越界了),而是输入法这样的输入工具.更重要的是,输入法还是一种特权工具,因为它 ...

  5. Android Framework框架分析

    转自:微点阅读  https://www.weidianyuedu.com/content/2617738210126.html Android framework analysis (partI z ...

  6. Android RIL框架分析

    1.RIL框架 RIL,Radio Interface Layer.本层为一个协议转换层,提供Android Telephony与无线通信设备之间的抽象层. Android RIL位于Telephon ...

  7. android输入法框架分析,Android输入法架构.ppt

    Android输入法架构 Android输入法架构 裴润升 oppo开发三部 输入法 为系统中其他模块提供输入功能的模块 1 硬键盘 2 软键盘 3 手写 4 语音输入 问题: 输入法和应用分属不同的 ...

  8. android nfc框架分析,Android NFC架构分析

    原创:木头月亮 来自:http://blog.csdn.net/mutouyueliang/archive/2011/03/08/6232028.aspx Android中对NFC的实现代码分布在如下 ...

  9. Android以太网框架情景分析之启动简介

            Android以太网框架情景分析之启动简介 Android网络框架分析系列文章目录: Android P适配以太网功能开发指南 Android以太网框架情景分析之启动简介 Androi ...

最新文章

  1. 如何做产品路线图规划?
  2. mysql自动增长恢复_mysql自动增长的有关问题,怎么恢复从1开始
  3. 关于数据的级联删除和更新
  4. doc2vec介绍和实践
  5. {面试题2: 实现 Singleton 模式}
  6. layui分页limit不显示_小心避坑:MySQL分页时使用 limit+order by 会出现数据重复问题...
  7. 织梦在线报名平台php,DedeCMSv5
  8. 请编写一个程序,用于统计字符串中每个字母的出现次数(字母忽略大小写),统计出结果后,请按照{'a':3,'b':2}的格式输出。
  9. 用mac的chrome浏览器调试Android手机的网页
  10. 题目1131:合唱队形(最长递增子序列进阶)
  11. linux环境下主从复制,Linux之CentOS上配置MariaDB主从复制
  12. DE 31 Non-linear Autonomous Systems
  13. MySQL游标(cursor) 定义及使用
  14. “同心鼓”运动在理想状态下的最佳策略研究
  15. 笔记本电脑蓝屏代码stop:0x0000007b(0xb84d3524,0xc0000034,0x00000000,0x00000000)
  16. 【2】C++语法与数据结构之MFC_CList学生管理系统_链表内排序_函数指针
  17. 【opencv-python不规则多边形 ROI提取】
  18. Windows控制台的打开方式
  19. day07面向对象复习+课后练习
  20. css实现盾牌的动画效果

热门文章

  1. 经典例题:判断给定数组是否已经排好序
  2. 微信定向流量_中国移动终于投诚了!微信惊现10G流量包,只要10元?
  3. java模拟时钟课程设计_java课程设计-时钟图形模拟
  4. 国产桌面操作系统到底怎么做才能有戏?
  5. 交互器、linux下的常用命令
  6. Dango笔记---manage.py 脚本的使用
  7. FANUC机器人外部电缆连接示意图(一)
  8. 微服务拆分策略和原则
  9. 华为静态路由及默认路由的配置
  10. autoware planning trajectory_smoother 模块解读