瑞芯微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实现,等硬件就绪再替换成真的。
一个小技巧: 在瑞芯微平台上,HAL模块通常以.so动态库形式存在,放在/vendor/lib/hw/目录下。调试时可以直接push替换,不用编译整个系统。

1.3 HAL在Android体系中的位置

咱们来看一张图,你就全明白了。

应用层 (App) 、相机、游戏... Android Framework CameraService, AudioFlinger, SensorService... HAL 硬件抽象层 camera.rockchip.so / audio.primary.rk30board.so Linux Kernel 内核驱动 V4L2, ALSA, Input子系统... 硬件 (Camera, Audio, Sensor...) HAL 在这里 Framework HAL Kernel

▲ Android体系分层结构图:HAL位于Framework与Kernel之间

从这张图可以清楚看到,HAL就像一座桥。桥的左边是Android Framework,右边是Linux内核驱动。没有这座桥,两边根本没法对话。

具体来说,HAL承担了三个关键职责:

  1. 接口标准化:Framework通过HAL调用硬件功能,比如打开摄像头、播放音频。HAL把复杂的ioctl调用封装成简单的函数。
  2. 多厂商支持:瑞芯微、全志、联发科各自实现自己的HAL模块,但接口完全一致。Framework不用改一行代码。
  3. 权限隔离:HAL运行在独立的进程空间(通过HIDL或AIDL),即使崩溃也不会拖垮整个系统。这一点我在RK3568上深有体会——相机HAL挂了,系统还能正常接电话。
曾经踩过的坑: 有一次我为了省事,直接在HAL里调用了内核驱动的非标准接口。结果Android版本升级后,内核接口变了,整个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方式。

避坑指南: 如果你在RK3288这种老芯片上做Android 7.1项目,老老实实用传统HAL。强行上Treble会把自己搞疯——我曾经试过,光适配HIDL就花了两周,最后发现内核太老根本不支持。

1.5 小结:HAL到底解决了什么问题?

咱们用大白话总结一下:

  • 没有HAL:每个App都得自己写驱动代码,换个硬件就得重写。系统升级?想都别想。
  • 有了HAL:App只管调用标准接口,底层随便换。瑞芯微今天用OV摄像头,明天换索尼的,HAL层改一下就行,上层纹丝不动。

说白了,HAL就是Android生态的万能转接头。没有它,碎片化问题能把开发者逼疯。瑞芯微之所以大力推HAL,也是为了让自己的芯片能无缝融入Android生态,让开发者少掉头发。