浅谈HAL
参考:http://blog.csdn.net/mr_raptor/article/details/8074549
代码实现:http://blog.csdn.net/mr_raptor/article/details/8082360
HAL:
至于为什么使用HAL,简单说为了死守自家的代码(个人利益,不让人抄袭)。
直观点说HAL是一个c中的interface,就是说用一个structure中的pointer一直向下指,最终指向一个设备(/dev/led)。
具体流程:

也就是说:
1。app(应用层)代码
2. serveice(framework层,此层是给应用层提供服务的)
3. JNI(java不能访问C/CPP,所以就得使用这个楼,jni中的C/CPP文件编译后就生成一个.so文件(libled_runtime.so),jni还会引用hal中头文件来获取hal中一些函数or变量)
4. HAL(jni中会调用hal中的interface,hal中的代码编译后也会生成一个.so文件(led.default.so))
5. device & driver(硬件设备)
HAL 代码结构:
HAL stub的框架比较简单,三个结构体、两个常量、一个函数,简称321架构。
@hardware/libhardware/include/hardware/hardware.h
@hardware/libhardware/hardware.c
1. 三个结构体


0) 三个结构体指的是:hw_module_t, hw_module_methods_t,hw_device_t
1) led_module_t继承hw_module_t,也就是说led_module_t结构体中有hw_module_t成员变量。每个某块都需要继承hw_module_t。
2) 每一个模块都有各自独特的函数,led_device_t中的setON之类的。led_device_open中定义led_device_t
重新整理一下的话:

2. 两个变量
#define HAL_MODULE_INFO_SYM HMI
#define HAL_MODULE_INFO_SYM_AS_STR "HMI"
这个就是led_module_t 的名字罢了,就是为了统一,就是HAL Stub的固定名字。
注册时有用会加载HMI地址。
3. 一个函数
int hw_get_module(const char *id, const struct hw_module_t **module);
通过module id(led.default.so中的led)获取hw_module_t。
4. HALStub是怎么注册的
在前面中HAL编译后会生成led.default.so,
其中led是硬件ID。可参考hardware.c文件,此文件中进行注册。
1)hardware.c中会查找有没有*.prop.so或*.default.so文件,
2)有的话就进行注册,打开此文件,在so代码里有定义的函数名或变量名为HMI,
dlsym返回其地址hmi,将该地址转化成hw_module_t类型,即,硬件对象。
浅谈HAL的更多相关文章
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- 浅谈 LayoutInflater
浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
- 浅谈WebService的版本兼容性设计
在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...
- 浅谈angular2+ionic2
浅谈angular2+ionic2 前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别. 1. 项目所用:angular2+ionic2 ...
- iOS开发之浅谈MVVM的架构设计与团队协作
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- Linux特殊符号浅谈
Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...
- 浅谈Angular的 $q, defer, promise
浅谈Angular的 $q, defer, promise 时间 2016-01-13 00:28:00 博客园-原创精华区 原文 http://www.cnblogs.com/big-snow/ ...
随机推荐
- Oracle 事务
begin begin savepoint p1; DELETE FROM sys_re_xxx; //红色部分替换为需要一起执行的SQL即可 DELETE FROM SYS_xxxx; ...... ...
- 学习练习 java 输入输出流练习2
编写IoDemo.java的Java应用程序,程序完成的功能是:首先读取text.txt文件内容,再通过键盘输入文件的名称为iodemo.txt,把text.txt的内容存入iodemo.txt p ...
- C++异常:no matching function for call to "Matrix(Matrix&)"
C++异常:no matching function for call to "Matrix(Matrix&)" 我定义了一个类叫Matrix,其中构造函数explicit ...
- jquery css快捷方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 尝试自己建立以alpine 为基础的docker基础镜像和组件镜像
安装ubuntu14.04 然后 #获取root权限 sudo su #安装docker apt-get install docker #准备基础镜像 docker pull alpine docke ...
- Linq to XML---网站地图和RSS Feed(ASP.NET的SEO)
本系列目录网站地图的作用是让搜索引擎尽快的,更多的收录网站的各个网页. 这里我们首先要明白一个基本的原理,搜索引擎的爬行方式.整个互联网就像一张纵横交错的"网":网的各个节点 ...
- JMeter笔记4:测试结果-聚合报告的字段说明
1.Lable :定义 HTTP 请求名称2.Samples :表示这次测试中一共发出了多少个请求3.Average :平均响应时长---默认情况下是单个Request的平均响应时长,当使用Trans ...
- 前端工程筹建NodeJs+gulp+bower
1.安装nodejs nodejs 官网下载安装文件 安装完成之后,在命令窗口执行,(显示nodejs版本) 和(显示npm版本)可以使用这两个命令查看是否安装成功: node -v npm -v 2 ...
- Android手机与计算机间的”信任关系”
在iDevices(如iPhone.iPad等等)的取证方面,那个代表”信任关系”的plist无疑是最为关键的迹证,只要有了它,哪怕是最新机型的iDevice及最新版的iOS,且有着指纹保护或pass ...
- App Naver Line 5.3 add new features - "True Delete"
Line is getting more and more popular in recent years. Lots of peope use Line, so do "Suspects& ...