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