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函数操作驱动程序,下一章具体实现这些代码。

最新文章

  1. csv表格处理(下)--纯JS解析导入csv
  2. SqlServer中使用正则表达式
  3. 利用反射实现通用的excel导入导出
  4. centos 6x系统下源码安装mysql操作记录
  5. f.lux for Linux安装
  6. Ubuntu 系统密码相关问题
  7. ssis trainning
  8. ArcGIS API for Silverlight 点沿着线流动
  9. Linux安装配置php
  10. JavaScript闭包函数的写法
  11. PC机安装android apk | adb install -r
  12. hdu2222Keywords Search (特里)
  13. 微软IE11浏览器的7大变化
  14. 如何用CropBox实现头像裁剪并与java后台交互
  15. 漫画:一招学会TCP的三次握手和四次挥手
  16. 提升webpack打包速度
  17. elasticsearch视频
  18. Python正则表达式的re库一些用法(上)
  19. CentOS 7 下sendEmail发邮件失败,提示invalid SSL_version specified at /usr/share/perl5/vendor_perl/IO/Socket/SSL.pm line 415.
  20. 峰Redis学习(7)Redis 之Keys 通用操作

热门文章

  1. linux系统下oracle表空间占用情况
  2. Django----Serializer序列化
  3. 为什么SimpleDateFormat不是线程安全的?
  4. 用了Dapper之后就不要再见到SqlConnection咯
  5. getElementBy系列和querySelector系列的区别
  6. YoyoGo使用指南
  7. 记一次MySQL出现Waiting for table metadata lock的原因、排查过程与解决方法
  8. java8+ Lambda表达式基本用法
  9. js 转换为字符串方法
  10. 函数动态参数 *args **kwargs