Android驱动学习-灯光系统总体框架
Android的app访问硬件的大致流程可以分为一下几个步骤:

我们之前说过Android系统在添加新的硬件的时候需要添加一个接口java文件,通过jni来访问硬件。
这个java是我们自己实现的,我们自己能够清楚的知道如何调用它。但是像Android中有一些是别人都有的硬件,比如屏幕、振动器、声卡、led等,因为硬件不一样,所以驱动也不一样,那么我们如何让其他人的app在我们的系统上也能正常的运行呢?这里就需要注意下:

Android系统中已经加入了一些必要的jni,我们想添加一些通用的设备时就需要用系统中的jni文件,编写HAL文件来适应JNI文件,从而达到其他人的app能正常的操作硬件的目的。
下面分析一下灯光系统。
灯光系统由以下四个文件组成
APP:电池灯APP,通知灯APP,背光灯APP
JNI :com_android_server_lights_LightsService.cpp
HAL:我们自己实现,实现一个lights.c
驱动:leds_nanopi3.c(JNI需要什么这里就给它提供什么,这里我们实现亮灭闪烁和亮度)
灯光系统的主要功能:
硬件上是属于同一个的有(包括颜色和闪烁):
电池灯:电池电量发生变化时颜色会发生变化
通知灯:有通知会闪烁,比如未接电话或短信调节LCD亮度:
背光灯
灯光系统的jni文件是 com_android_server_lights_LightsService.cpp
其包含:
在JNI中的步骤是:
- 里面需要获得hw_module_t结构体,所以我们的HAL需要实现这个结构体
- 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驱动学习-灯光系统总体框架的更多相关文章
- Android驱动学习-app调用内核驱动过程(驱动框架回顾)
考研已经过去了,android驱动的学习也断了半年多了,现在重新捡起来学习,回顾一下Android驱动的大体框架. Android系统的核心是java,其有一个David虚拟机.Android-app ...
- Android源代码学习之六——ActivityManager框架解析
ActivityManager在操作系统中有关键的数据,本文利用操作系统源代码,逐步理清ActivityManager的框架,并从静态类结构图和动态序列图两个角度分别进行剖析,从而帮助开发者加强对系统 ...
- Android驱动学习-APP操作新硬件的两种方法(支持添加的驱动)
在给Android添加新的驱动后,app要如何使用呢? 正常的使用一个设备,需要getService.但是像LED等我们自己添加的硬件驱动,Android源代码根本没有我们自己添加的服务. 第一种: ...
- Android驱动学习-内部机制_回顾binder框架关键点
内部机制_回顾binder框架关键点server注册服务时, 对每个服务都提供不同的ptr/cookie,在驱动程序里对每个服务都构造一个binder_node, 它也含有ptr/cookie cli ...
- android驱动学习---led实验
======================== 驱动: 内核:android-kernel 2.6.36 (必须对应你的板子上内核,不然会出现insmod错误) 目的:通过android应用层用户 ...
- android开发学习--网络请求框架RxJava+Retrofit
看了好多的博客,终于弄清楚了Rxjava和Retrofit,给大家推荐几个不错的文章: https://gank.io/post/56e80c2c677659311bed9841 这个文章是只用Ret ...
- Android驱动学习-Eclipse安装与配置
在ubuntu系统下安装配置Eclipse软件.并且让其支持编译java程序和内核驱动程序. 1. 下载Eclipse软件. 打开官网:http://www.eclipse.org/ 点击 DOWN ...
- 【转载】Android开源:数据库ORM框架GreenDao学习心得及使用总结
转载链接:http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁 ...
- Android系统--Binder系统具体框架分析(二)Binder驱动情景分析
Android系统--Binder系统具体框架分析(二)Binder驱动情景分析 1. Binder驱动情景分析 1.1 进程间通信三要素 源 目的:handle表示"服务",即向 ...
随机推荐
- xargs--冬天里的一丝暖意
本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 你有批量kill作业吗?有因为删除文件夹的内容太多而报错吗?-bash: /bin/rm: ...
- PyQt(Python+Qt)学习随笔:图例解释QFrame类的lineWidth、midLineWidth以及frameWidth属性
老猿Python博文目录 老猿Python博客地址 QFrame类有四个跟宽度相关的属性,分别是width.lineWidth.midLineWidth以及frameWidth属性.width是整个Q ...
- JAVA课堂随机出题
一.设计思路 1.利用随机数来确定两个数字. 2.生成0-4的随机数,分别代表 加 减 乘 除. 3.输入的题数利用for循环来出题,每行输出几道题便在循环中加入if语句,当前出题数与每行输出题数求余 ...
- Oracle函数使用1
一.字符串处理函数 1.ascii(x):返回字符的ASCII. SQL语句:select ascii('a') from dual; dual:空表,每创建一个用户都会生成这样一个dual表,表中只 ...
- Oracle10g安装
1.下载链接:https://pan.baidu.com/s/1peD3iCTcE2Gg2cPNGLmLgQ 提取码:tjk4 一.ORACLE安装 WIN7.WIN10系统安装需要修改兼容性. 点击 ...
- pandas 删除列
ddf = pd.DataFrame({"id":[1,2,3], "name":[4,5,6],"age":[7,8,9]})ddf = ...
- hash相关
转译☞:https://www.cs.rice.edu/~as143/COMP441_Spring17/scribe/lect4.pdf 1 大规模图片检索问题 基于树模型的算法在分类跟聚类中很受欢迎 ...
- Robot Framework+adb框架自动化测试Android设备案例⑸——L1层测试用例
一.L1层测试用例 1.初始化.robot *** Settings *** Resource ../L2层关键字.robot *** Test Cases *** 切换EMMC模式 [Tags] A ...
- STL——容器(Map & multimap)的插入与迭代器
1. 容器(Map & multimap)的插入 map.insert(...); //往容器插入元素,返回pair<iterator,bool> map中插入元素的四种方式 ...
- mycat配置MySQL主从读写分离
1.安装java 1.8 mycat 1.6要求的Java需要Java 1.8或1.8以上,安装Java参考以下链接: https://blog.csdn.net/weixin_43893397/ar ...