瑞芯微Camera HAL开发环境搭建实战 - 第1节
1. HAL概念扫盲
第一章HAL概念扫盲:什么是HAL?为什么瑞芯微要用HAL?
各位同学好,我是你们的嵌入式系统讲师。今天咱们来聊聊HAL——这个在Android体系里被反复提起,但很多人其实没真正搞明白的概念。
我记得刚入行那会儿,第一次接触瑞芯微的SDK,看到一堆以hal_开头的文件,心里直犯嘀咕:这玩意儿到底是干啥的?后来踩了不少坑,才慢慢摸清门道。今天我就把这点经验掰开了揉碎了讲给你听。
1.1 到底什么是HAL?
HAL,全称Hardware Abstraction Layer,硬件抽象层。说白了,就是给上层软件一个统一的接口,让它们不用管底层硬件长什么样。
你想想看,Android系统要运行在成千上万种硬件上——不同厂商的摄像头、不同的音频芯片、不同的传感器。如果每个App都直接操作硬件寄存器,那代码得写成什么样?
HAL的作用就是:把硬件差异封装起来,向上层提供标准接口。上层调用open()、ioctl()这些函数时,根本不需要知道底层是瑞芯微还是高通。
举个例子。我在项目中调试过一款摄像头模组,Sensor A和Sensor B的初始化流程完全不同。但通过HAL层封装后,上层Camera Service调用的都是start_preview(),底层差异被完美隐藏了。
1.2 瑞芯微为什么非要用HAL?
这个问题我当年也困惑过。瑞芯微自己做芯片,自己写驱动,为什么还要多此一举加一层HAL?
原因其实很现实:Android生态的硬性要求。Google在Android 8.0之后推行了Treble架构,强制要求OEM厂商必须实现HAL接口。不这么做,系统就没法通过CTS认证,也就没法预装Google服务。
但更深层的原因,我总结为三点:
- 解耦:内核驱动和Framework彻底分开。驱动出问题,不用重新刷整个系统,换个HAL模块就行。我在RK3399项目上就遇到过,音频驱动有bug,只替换了
audio.primary.rk30board.so就搞定了,不用动内核。 - 兼容性:同一套Android系统,可以跑在RK3288、RK3399、RK3568等不同芯片上。只要HAL接口一致,上层代码几乎不用改。
- 开发效率:硬件厂商和系统厂商可以并行开发。硬件还没出来,先用HAL的stub(桩)把上层调通。我习惯先写一个假的HAL实现,等硬件就绪再替换成真的。
.so动态库形式存在,放在/vendor/lib/hw/目录下。调试时可以直接push替换,不用编译整个系统。
1.3 HAL在Android体系中的位置
咱们来看一张图,你就全明白了。
▲ Android体系分层结构图:HAL位于Framework与Kernel之间
从这张图可以清楚看到,HAL就像一座桥。桥的左边是Android Framework,右边是Linux内核驱动。没有这座桥,两边根本没法对话。
具体来说,HAL承担了三个关键职责:
- 接口标准化:Framework通过HAL调用硬件功能,比如打开摄像头、播放音频。HAL把复杂的ioctl调用封装成简单的函数。
- 多厂商支持:瑞芯微、全志、联发科各自实现自己的HAL模块,但接口完全一致。Framework不用改一行代码。
- 权限隔离:HAL运行在独立的进程空间(通过HIDL或AIDL),即使崩溃也不会拖垮整个系统。这一点我在RK3568上深有体会——相机HAL挂了,系统还能正常接电话。
1.4 HAL的两种实现方式
在瑞芯微平台上,HAL主要有两种实现方式。我整理了一个表格,方便你对比:
| 实现方式 | 特点 | 适用场景 | 瑞芯微示例 |
|---|---|---|---|
| 传统HAL (Legacy) | 直接以.so库加载,通过hw_get_module()调用 |
Android 8.0之前的老项目 | camera.rockchip.so |
| Treble HAL (HIDL) | 通过HIDL接口定义,进程间通信 | Android 8.0+新项目 | android.hardware.camera.provider@2.4 |
我个人习惯在新项目里直接用Treble HAL。虽然初期配置麻烦点,但后期维护省心太多。特别是瑞芯微的SDK从Android 10开始,官方推荐的都是HIDL方式。
1.5 小结:HAL到底解决了什么问题?
咱们用大白话总结一下:
- 没有HAL:每个App都得自己写驱动代码,换个硬件就得重写。系统升级?想都别想。
- 有了HAL:App只管调用标准接口,底层随便换。瑞芯微今天用OV摄像头,明天换索尼的,HAL层改一下就行,上层纹丝不动。
说白了,HAL就是Android生态的万能转接头。没有它,碎片化问题能把开发者逼疯。瑞芯微之所以大力推HAL,也是为了让自己的芯片能无缝融入Android生态,让开发者少掉头发。