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需要什么这里就给它提供什么,这里我们实现亮灭闪烁和亮度)


灯光系统的主要功能:

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

  2. 调节LCD亮度: 
    背光灯

灯光系统的jni文件是 com_android_server_lights_LightsService.cpp

其包含:

在JNI中的步骤是:

  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驱动学习-app调用内核驱动过程(驱动框架回顾)

    考研已经过去了,android驱动的学习也断了半年多了,现在重新捡起来学习,回顾一下Android驱动的大体框架. Android系统的核心是java,其有一个David虚拟机.Android-app ...

  2. Android源代码学习之六——ActivityManager框架解析

    ActivityManager在操作系统中有关键的数据,本文利用操作系统源代码,逐步理清ActivityManager的框架,并从静态类结构图和动态序列图两个角度分别进行剖析,从而帮助开发者加强对系统 ...

  3. Android驱动学习-APP操作新硬件的两种方法(支持添加的驱动)

    在给Android添加新的驱动后,app要如何使用呢? 正常的使用一个设备,需要getService.但是像LED等我们自己添加的硬件驱动,Android源代码根本没有我们自己添加的服务. 第一种: ...

  4. Android驱动学习-内部机制_回顾binder框架关键点

    内部机制_回顾binder框架关键点server注册服务时, 对每个服务都提供不同的ptr/cookie,在驱动程序里对每个服务都构造一个binder_node, 它也含有ptr/cookie cli ...

  5. android驱动学习---led实验

    ======================== 驱动: 内核:android-kernel 2.6.36  (必须对应你的板子上内核,不然会出现insmod错误) 目的:通过android应用层用户 ...

  6. android开发学习--网络请求框架RxJava+Retrofit

    看了好多的博客,终于弄清楚了Rxjava和Retrofit,给大家推荐几个不错的文章: https://gank.io/post/56e80c2c677659311bed9841 这个文章是只用Ret ...

  7. Android驱动学习-Eclipse安装与配置

    在ubuntu系统下安装配置Eclipse软件.并且让其支持编译java程序和内核驱动程序. 1. 下载Eclipse软件. 打开官网:http://www.eclipse.org/  点击 DOWN ...

  8. 【转载】Android开源:数据库ORM框架GreenDao学习心得及使用总结

    转载链接:http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁 ...

  9. Android系统--Binder系统具体框架分析(二)Binder驱动情景分析

    Android系统--Binder系统具体框架分析(二)Binder驱动情景分析 1. Binder驱动情景分析 1.1 进程间通信三要素 源 目的:handle表示"服务",即向 ...

随机推荐

  1. oracle ddl 与 dml

    DDL create table 创建表 alter table 修改表 drop table 删除表 truncate table 删除表中所有行 create index 创建索引 drop in ...

  2. Spring Security + JJWT 实现 JWT 认证和授权

    关于 JJWT 的使用,可以参考之前的文章:JJWT 使用示例 一.鉴权过滤器 @Component public class JwtAuthenticationTokenFilter extends ...

  3. django 不使用序列化器时进行查询结果序列化

    在app01views中添加 class User1(View): def post(self,request): user=User.objects.all() list=[] for i in u ...

  4. 转2:Python字符编码详解

    1. 字符编码简介 1.1. ASCII ASCII(American Standard Code for Information Interchange),是一种单字节的编码.计算机世界里一开始只有 ...

  5. 第12.1节 Python os模块导览

    os 模块提供了许多与操作系统交互的函数,一定要使用 import os 而不是 from os import * ,这将避免内建的 open() 函数被 os.open() 隐式替换掉,它们的使用方 ...

  6. 第十八章、QListView/Model开发

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 QListView理论上可以和所有QAbstractItemModel派生的类如QStri ...

  7. clion2020最新安装破解版教程 内含激活码、破解补丁、无限重置时间插件

    clion是一款开发C.C++等相关程序的利器,到目前为止已经更新到2020.3版本啦!还没有升级的小伙伴们赶紧升级啦,本文教大家如何安装clion2020.3版本并且破解,此方法亲测100%可以永久 ...

  8. sql 遍历list

    <select id="findadminSaleList" parameterClass="java.util.Map" resultClass=&qu ...

  9. js生成随机数、随机数列、数值转金融格式

    随机数的生成:min到max之间,包括两者自身 parseInt(Math.random()*(max-min+1)+min,10); Math.floor(Math.random()*(max-mi ...

  10. Android之window机制token验证

    前言 很高兴遇见你~ 欢迎阅读我的文章 这篇文章讲解关于window token的问题,同时也是Context机制和Window机制这两篇文章的一个补充.如果你对Android的Window机制和Co ...