最近和同事交流,多次听到HAL层,由于小松以前主要负责应用软件,所以几乎没听说过这一层,搜了一下图片,发现他全名为Hardware Abstraction Laye(硬件抽象层),位于Linux Kernel和FramWork之间,是抽象底层接口传递给上层的,但是我转念一想,如果是控制硬件的话其实这个HAL层完全可以归入Linux Kernel中嘛,难道他还有别的作用?

所以今天呢,小松就来好好研究研究这个层的作用与原理

存在的意义

Hardware Abstraction Layer 为硬件抽象层,我们知道,虽然android应用层使用java或者kotlin语言,但是控制设备的代码一般都是用C/C++的,这里的C/C++接口是以so库的形式存在项目中,然后java通过jni调用so库,那么so库就会继续往下调用设备,这些设备包括Audio,Camera,BlueTooth等等

但是现在有一个问题,比如说小米手机给“拍摄月亮”这一需求进行了底层的算法优化,并提供给其他厂商接口调用,该怎么办?

首先,为了保护知识产权,不能提交到下面的Linux Kernel层,因为这一层是开源的

所以android虽然在内核开源,但是用户空间是可以选择不开源的,所以,用户空间保留了这么一个“黑箱”,厂商自己有知识产权不愿意公开的代码就可以以二进制方式放在里面,对外提供接口,这样自己的代码不会泄漏,别人也能用到自己的产品

另外,还有一个重要原因是,Hardware Abstraction Layer顾名思义,屏蔽了不同硬件设备的差异,不管底层硬件如何变化,使用HAL接口的代码也可以不受影响,所以,通过HAL来控制底层硬件对于开发者来说比较稳定

如下图,类似一个相机控制应用,“拍摄月亮”的算法就可以放在HAL层中,控制路径为 app应用 -> Stub -> HAL Driver -> Kernel Driver

架构

321架构

HAL层由三个结构体,两个常量,一个函数构成,所有的模块需要遵循这一架构

三个结构体

/*** Every hardware module must have a data structure named HAL_MODULE_INFO_SYM* and the fields of this data structure must begin with hw_module_t* followed by module specific information.*/
typedef struct hw_module_t {/** tag must be initialized to HARDWARE_MODULE_TAG */uint32_t tag;
......
typedef struct hw_module_methods_t {/** Open a specific device */int (*open)(const struct hw_module_t* module, const char* id,struct hw_device_t** device);} hw_module_methods_t;/*** Every device data structure must begin with hw_device_t* followed by module specific public methods and attributes.*/
typedef struct hw_device_t {/** tag must be initialized to HARDWARE_DEVICE_TAG */uint32_t tag;
......

其中 hw_module_t依赖hw_module_methods_t,内部的open函数可以被重载,主要存放是具体模块的信息

比如说可以定义一个camera_module_t重载open函数

hw_device_t主要是和硬件设备相关的操作

两个变量与一个函数

# define HAL_MODULE_INFO_SYM HMI
# define HAL_MODULE_INFO_SYM_AS_STR "HMI"
int hw_get_module(const char *id, const struct hw_module_t **module);

在上层调用hw_get_module时,这两个变量可以找到模块入口,重载之前的open函数,从而获取hw_device_t

也就是说,上层首先调用hw_get_module,通过两个变量获取到三个结构体,从而访问对应的【实现函数】

整个逻辑是不是很简单?“拍摄月亮”这样的算法就可以放在【实现函数】中

参考文章

【Android】HAL层浅析

Android硬件抽象层HAL总结

android架构之HAL-3.HAL框架与Stub开发a

新年第一篇,androidHAL层知多少?相关推荐

  1. 新年第一篇!西南民族大学第十届校赛(同步赛)

    https://ac.nowcoder.com/acm/contest/322#question A.dreamstart的催促 代码: #include <cstdio> #includ ...

  2. 拓展kmp(2020新年第一篇博客 学无止境冲啊)

    拓展kmp算法可解决以下问题,给定两个字符串s1和s2,可以求出s1的extend数组(简记为ex),其中extend[i]表示s1从第i位开始的子串和s2的最大公共前缀长度,举个例子:可以看到ext ...

  3. 【新年第一篇】2018互金江湖宠儿“金融科技”如何给企业附能

    <2018互金江湖宠儿"金融科技"如何给企业附能> 前沿 :写在2018年第一天,好久没写东西手都有些生疏,元旦假期自己在家回顾了纷乱的2017,又在思考未来的2018 ...

  4. 【新年第一篇博客】自己完成的第一款游戏 FlappyBird

    游戏简介 <flappy bird>是一款由来自越南的独立游戏开发者Dong Nguyen所开发的作品,游戏于2013年5月24日上线,并在2014年2月突然暴红.2014年2月,< ...

  5. [密码学基础][信息安全][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第一篇]不同类型的处理器

    这是每个密码学博士生应该知道的52件事系列的第一篇文章.PhD研究生在第一年结束的时候应该掌握这些问题.并且尽可能早的在他们能放弃的时候放弃(23333)无论怎样,我们会将这些问题在接下来的一年里表达 ...

  6. 读书笔记第一篇:知乎高赞回答

    自从今年以来,生活发生了极大变化,自己也进入了30大关,开始奔四了.最近总觉得自己一事无成,无论物质还是精神上都没有得到满足,而且自己一个游戏程序员,越来越觉得逐渐被淘汰.所以想到的第一个挣扎的办法, ...

  7. 新年第一天 | 恶补新一季《黑镜》的同时,营长又深入扒了扒它那擅长机器学习的新爸爸是如何赚钱的

    关注『AI科技大本营』的各位小伙伴,新年好!营长祝愿大家天天都是18岁! 跟放假休息的各位一样,元旦假期的营长着实也不想干活--想起前两天刚刚更新的<黑镜>第四季还没有跟,营长便决定在新年 ...

  8. 我的第一篇论文诞生的故事

    点击上方,选择星标或置顶,每天给你送干货! 作者:郭必扬时间:2020-12-16 [插播]年初抽47份大奖!!参加的人还很少,后天开奖! 新年大礼包:Xbox.Switch,PopMart芝麻街系列 ...

  9. 【论文写作】-我的第一篇论文形成记(投稿过程、课题来源、python与数学学习、实验设计、论文思路建立与写作、回复审稿人)

    我的第一篇论文形成记 投稿过程 背景记录 课题来源-本科毕业设计 python及数学学习 实验设计 调参阶段 实验阶段 论文思路建立 论文写作 回复审稿人 总结 投稿过程 2022年12月28日 投A ...

最新文章

  1. 在 Azure Resource Manager 中为虚拟机设置密钥保管库
  2. PHP_MySQL笔试题目一
  3. 【防衰老教程】记录一次IDEA,开发JavaWeb项目时JS中文乱码排错
  4. 【SQL Server】阿里云CentOS安装SQL Server教程 含破解3.5G内存的限制、win端远程连接
  5. 【原创】Ajax的用法总结
  6. sql查找一个范围的值_销售需求丨查找问题
  7. MySQL 5.5 到MySQL 5.6半同步复制(SSL)
  8. MuPlayer『百度音乐播放内核』
  9. hive 列表去重_Hive企业级调优
  10. python无人驾驶技术_智能汽车无人驾驶资料调研(一)
  11. vue2学生签到管理系统案例
  12. navicat for mysql 亲测好用的 中文破解版
  13. Ubuntu 20 更新后突然无法获取IP
  14. 正则表达式,和python re模块
  15. cocos2d实现语音_【Cocos Creator与C++知识分享】Creator接入呀呀语音SDK
  16. 请问java如何跟isapi通讯,代码怎么实现?
  17. 为perf4j提供集中式监控项目perf4j-dashboard
  18. cortana小娜不能文字搜索,只能用语音搜索【修复教程】
  19. 《自适应机器人交互白皮书》
  20. (翻译)箭头和省略号的使用方式

热门文章

  1. 【蓝桥杯练习系统】【入门训练】【BEGIN-1】A+B问题 (Java)
  2. dubbo源码分析25 -- 序列化与反序列化
  3. 《缠中说禅108课》76:逗庄家玩的一些杂史 2
  4. 谷歌浏览器的用户安利一个非常好用的插件
  5. 【强化学习论文合集】十八.2019国际表征学习大会论文(ICLR2019)
  6. 给nz-select的nz-option设置样式
  7. 常用docker镜像
  8. 零基础入门—网站建站教程
  9. (第一个java爬虫)java爬取网页文本并抽取中英文关键词
  10. 【Python】random.randint()用法