参考: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的更多相关文章

  1. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  2. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  3. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

  4. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  5. 浅谈WebService的版本兼容性设计

    在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...

  6. 浅谈angular2+ionic2

    浅谈angular2+ionic2   前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别.   1. 项目所用:angular2+ionic2 ...

  7. iOS开发之浅谈MVVM的架构设计与团队协作

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  8. Linux特殊符号浅谈

    Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...

  9. 浅谈Angular的 $q, defer, promise

    浅谈Angular的 $q, defer, promise 时间 2016-01-13 00:28:00  博客园-原创精华区 原文  http://www.cnblogs.com/big-snow/ ...

随机推荐

  1. JDK源码分析之集合02ArrayList

    一.前言 有了前一篇对集合类的概述,我们知道ArrayList是属于Collection类系中的一个具体实现类,其特点是长度可以动态改变,集合内部使用数组保存元素.下面我们对源码进行分析. 二.Arr ...

  2. .NET MVC4.0与CA对接

    1.改web.confog 2.引用CA提供的 dll 3.在controller层加个方法,记得加上授权认证的特性,获取信息 [Authorize] publi void calogin() { H ...

  3. JS获取当前文件所在的文件夹全路径

    var js = document.scripts; js = js[js.length - 1].src.substring(0, js[js.length - 1].src.lastIndexOf ...

  4. only one is important

    今天早上还是去了图书馆,看了一早上的hello world(intel opencl),清楚了程序编写的基本流程,但是,仍和以前一样,貌似看懂了,其实什么也不会,没有发现什么问题.中午,回来取了我的笔 ...

  5. 根据文字返回Label高度

    NSString分类 @implementation NSString (stringSize) //计算文字显示的所需要的size -(CGSize)sizeWithFont:(UIFont *)f ...

  6. 火箭18号秀光膀为父母割草(FW)

    火箭18号秀光膀为父母割草 一夜致富不改本色 来源:新浪 2015年06月30日 分享到: 更多 收藏 分享 被浏览5次   <ignore_js_op id="r_article_i ...

  7. Java学习一

    Java程序的运行机制和JVM     JVM(java 虚拟机) Java Virtual Machine java语言比较特殊,由Java语言编写的程序需要经过编译步骤, JDK java SE ...

  8. C# 发送邮件3

    C#邮件发送 这篇文章主要介绍如何使用C#的MailAddress类进行邮件的发送. 1.首先引入命名空间using System.Net.Mail; 2.将发送的邮件的功能封装成一个类,该类中包含了 ...

  9. LiveView 0.8 RC1 could boot evidence files acquired from Win10 64bit

    The latest Windows 10 will be more and more popular in the very near future. Now let's take a look i ...

  10. oracle 强杀进程

    在ORACLE数据库当中,有时候会使用ALTER SYSTEM KILL SESSION 'sid,serial#'杀掉一个会话进程,但是使用这个SQL语句杀掉会话后,数据库并不会立即释放掉相关的资源 ...