




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、android hal分析报告1 hal 简介android 的 hal (hardware abstract layer硬件抽象层)是 google因应厂商希望不公开源码的要求下,所推出的新观念,其架构如下图。虽然hal 现在的抽象程度还不足,现阶段实作还不是全面符合hal 的架构规划,不过也确实给了我们很好的思考空间。图 1:android hal 架构规划这是 patrick brady (google) 在 2008 google i/o 所发表的演讲 anatomy & physiology of an android中,所提出的android hal 架构图。从这张架构图我
2、们知道,hal 的目的是为了把 android framework 与 linux kernel 完整隔开。让 android 不至过度依赖linux kernel,有点像是 kernel independent 的意思,让 android framework 的开发能在不考虑驱动程序的前提下进行发展。在 android 原始码里, hal 主要的实作储存于以下目录:1. libhardware_legacy/ - 过去的实作、采取链接库模块的观念进行2. libhardware/ - 新版的实作、调整为hal stub 的观念3. ril/ - radio interface layer在
3、hal 的架构实作成熟前(即图1的规划),我们先就目前 hal 现况做一个简单的分析。另外,目前android 的hal 实作,仍旧散布在不同的地方,例如camera 、wifi 等,因此上述的目录并不包含所有的hal 程序代码。2 hal 的过去图 2:android hal / libhardware_legacy过去的 libhardware_legacy 作法,是比较传统的module方式,也就是将*.so 档案当做 shared library来使用,在 runtime(jni 部份)以 direct function call 使用 hal module。透过直接函数呼叫的方式,来
4、操作驱动程序。当然,应用程序也可以不需要透过jni 的方式进行,直接以加载*.so 檔(dlopen)的做法呼叫 *.so 里的符号( symbol)也是一种方式。总而言之是没有经过封装,上层可以直接操作硬件。3 hal 的现况图 3:android hal / libhardware现在的 libhardware 作法,就有 stub的味道了。 hal stub 是一种代理人( proxy)的概念, stub 虽然仍是以 *.so 檔的形式存在,但hal 已经将 *.so 档隐藏起来了。 stub 向hal 提供操作函数( operations),而 runtime 则是向hal 取得特定模
5、块( stub)的 operations ,再 callback 这些操作函数。这种以indirect function call 的实作架构,让 hal stub 变成是一种包含关系,即hal 里包含了许许多多的stub(代理人)。 runtime 只要说明类型,即module id,就可以取得操作函数。对于目前的hal ,可以认为android 定义了 hal 层结构框架,通过几个接口访问硬件从而统一了调用方式。4 hal_legacy 和 hal 的对比hal_legacy:旧式的 hal 是一个模块,采用共享库形式,在编译时会调用到。由于采用function call 形式调用,因此可
6、被多个进程使用,但会被mapping到多个进程空间中,造成浪费,同时需要考虑代码能否安全重入的问题(thread safe)。hal :新式的 hal 采用 hal module 和 hal stub 结合形式,hal stub 不是一个 share library,编译时上层只拥有访问hal stub的函数指针,并不需要hal stub。上层通过 hal module提供的统一接口 获取并操作 hal stub,so文件只会被mapping到一个进程,也不存在重复 mapping和重入问题。5 hal module 架构hal moudle 主要分为 三个结构:struct hw_modul
7、e_t;struct hw_module_methods_t;struct hw_device_t;他们的继承关系如下图:图 4:android hal 结构继承关系6 hal 使用方法(1)native code通过 hw_get_module调用获取 hal stub:hw_get_module (led_hardware_module_id, (const hw_module_t*)&module)(2)通过继承 hw_module_methods_t的 callback来 open设备module-methods-open(module, led_hardware_module
8、_id, (struct hw_device_t*)device);(3)通过继承 hw_device_t的 callback 来控制设备 :sleddevice-set_on(sleddevice, led);sleddevice-set_off(sleddevice, led);7 hal stub 编写方法(1)定义 自己 的 hal 结构 体,编 写头文 件 led.h hardware/hardware.hstruct led_module_t struct hw_module_t common;struct led_control_device_t struct hw_device
9、_t common;int fd; /* file descriptor of led device */* supporting control apis go here */int (*set_on)(struct led_control_device_t *dev, int32_t led);int (*set_off)(struct led_control_device_t *dev, int32_t led);继承关系如下图:图 5:hal stub 与 hal module 继承关系(2)设计 led.c 完成 功能实现和hal stub 注册(2.1)led_module_met
10、hods继承 hw_module_methods_t ,实现open的 callbackstruct hw_module_methods_t led_module_methods = open: led_device_open;(2.2)用 hal_module_info_sym实例 led_module_t,这个名称不可修改tag:需要 制定为 hardware_module_tagid:指定为 hal stub 的 module idmethods:struct hw_module_methods_t ,为 hal 所定义的methodconst struct led_module_t h
11、al_module_info_sym = common: tag: hardware_module_tag,version_major: 1,version_minor: 0,id: led_hardware_module_id,name: sample led stub,author: the mokoid open source project,methods: &led_module_methods,/* supporting apis go here. */;(2.3)open是一个 必须实现的 callback api,负责申请 结构体空间, 填充信息 ,注册具体 操作 ap
12、i 接口,打开 linux 驱动。由于存在多重 继承关系,只需对 子结构体 hw_device_t对象申请空间即可。int led_device_open(const struct hw_module_t* module, const char* name,struct hw_device_t* device) struct led_control_device_t *dev;dev = (struct led_control_device_t *)malloc(sizeof(*dev);memset(dev, 0, sizeof(*dev);dev-common.tag = hardware
13、_device_tag;dev-common.version = 0;dev-common.module = module;dev-common.close = led_device_close;dev-set_on = led_on;dev-set_off = led_off;*device = &dev-common;/* initialize led hardware here.*/dev-fd = open(led_device, o_rdonly);if (dev-fd fd;switch (led) case led_c608: ioctl(fd, 1, &led);break;case led_c609:ioctl(fd, 1, &led);break;default:return -1;return 0;int led_off(struct led_cont
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 既有线施工安全管理措施
- 业务拓展策略执行情况分析表
- 农民合作社财务规范化管理手册
- 护师主管护师复习测试卷
- 法务知识入门学习指南
- 三农村合作社公共交通规划指南
- 季度人力资源招聘与优化规划书
- 股份制公司办公环境优化计划
- 互联网租赁车平台合作协议
- 电视编导制作实战指南
- 2025年山东省中小学生海洋知识竞赛参考试指导题库500题(含答案)
- 2025年高考语文备考之DeepSeek与《哪吒2》相关语言文字运用题训练
- 2024年广东省公务员《申论(行政执法)》试题真题及答案
- (市质检三检)泉州市2025届高中毕业班质量监测 (三)历史试卷
- 2025年安徽卫生健康职业学院单招职业适应性考试题库含答案
- 电子烟管理办法培训课件
- 标准日本语初级教材上册
- 2025云南昆明空港投资开发集团招聘7人易考易错模拟试题(共500题)试卷后附参考答案
- 2025山东能源集团中级人才库选拔高频重点模拟试卷提升(共500题附带答案详解)
- 政务信息化可行性研究报告
- 2025年江苏无锡市惠山国有投资控股集团有限公司招聘笔试参考题库附带答案详解
评论
0/150
提交评论