Ahao's Technical Blog Ahao's Technical Blog
首页
  • 001.基础篇
  • 002.玩转AOSP篇
  • 003.学穿Binder篇
  • 004.基础组件篇
  • 005.系统启动过程分析
  • 006.Hal开发入门与实践
  • 007.显示系统
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

阿豪讲Framework

不积跬步无以至千里
首页
  • 001.基础篇
  • 002.玩转AOSP篇
  • 003.学穿Binder篇
  • 004.基础组件篇
  • 005.系统启动过程分析
  • 006.Hal开发入门与实践
  • 007.显示系统
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 基础篇

  • 玩转AOSP篇

  • 学穿Binder篇

  • 基础组件篇

  • 系统启动过程分析

  • Hal开发入门与实践

    • 001.Android HAL 层概览
    • 002.传统 Hal 开发指南1 —— 开发环境准备
    • 003.传统 Hal 开发指南2 —— 传统 HAL 整体架构
    • 004.传统 Hal 开发指南3 —— 驱动开发
    • 005.传统 Hal 开发指南4 —— 实现一个简单的 Hal 模块
    • 006.传统 Hal 开发指南5 —— 添加硬件访问服务
    • 007.传统 Hal 开发指南6 —— 开发一个 App 访问硬件服务
    • 008.HIDL HAL 开发指南1 —— 开发环境准备
    • 009.HIDL Hal 开发指南2 —— Android 8 HAL 变迁
    • 010.HIDL Hal 开发指南3 —— HIDL HAL 实例程序
    • 011.HIDL Hal 开发指南4 —— Binderized HALs 实例分析
    • 012.HIDL Hal 开发指南5 —— Passthrough HALs 实例分析
    • 013.HIDL Hal 开发指南6 —— Same-Process HALs 实例分析
    • 014.HIDL Hal 开发指南7 —— 驱动开发
    • 015.HIDL Hal 开发指南8 —— 简单 HIDL HAL 实现
    • 016.HIDL Hal 开发指南9 —— 添加硬件访问服务
    • 017.HIDL Hal 开发指南10 —— 开发一个 App 访问硬件服务
    • 018.AIDL Hal 开发指南1—— 开发环境准备
    • 019.AIDL Hal 开发指南2 —— AIDL HAL 整体架构
    • 020.AIDL Hal 开发指南 3 ———— AIDL HAL 实例分析1
    • 021.AIDL Hal 开发指南 4 ———— AIDL HAL 实例分析2
    • 022.AIDL Hal 开发指南5 —— stable-c HAL 实例分析
    • 023.AIDL Hal 开发指南6 —— 驱动开发
    • 024.AIDL Hal 开发指南7 —— 实现一个简单的 AIDL HAL
    • 025.AIDL Hal 开发指南8 —— 添加硬件访问服务
    • 026.AIDL Hal 开发指南10 —— AIDL HAL 的升级
  • 显示系统

  • Framework
  • Hal开发入门与实践
阿豪
2024-04-08

022.AIDL Hal 开发指南5 —— stable-c HAL 实例分析

在 HIDL HAL 中我们聊过 Same-Process HALs,这类 hal 的调用对性能要求高,一般直接链接,不适用跨进程的方式来调用。

在 AIDL HAL 中,与之对应的是 stable-c HAL。stable-c HAL 就是一个对外接口稳定的 so 库。

接着我们来看一个源码中的 stable-c HAL, hardware/interfaces/graphics/mapper

20240408161235

这里只是给出一个框架,具体需要芯片厂商来做实现。

其中最重要的就是 hardware/interfaces/graphics/mapper/stable-c/implutils/include/android/hardware/graphics/mapper/utils/IMapperProvider.h,其中的 IMapperV5Impl就是 stable-c HAL 的对外接口:

struct IMapperV5Impl {
    static const auto version = AIMAPPER_VERSION_5;
    virtual ~IMapperV5Impl() = default;

    virtual AIMapper_Error importBuffer(const native_handle_t* _Nonnull handle,
                                        buffer_handle_t _Nullable* _Nonnull outBufferHandle) = 0;

    virtual AIMapper_Error freeBuffer(buffer_handle_t _Nonnull buffer) = 0;

    virtual AIMapper_Error getTransportSize(buffer_handle_t _Nonnull buffer,
                                            uint32_t* _Nonnull outNumFds,
                                            uint32_t* _Nonnull outNumInts) = 0;

    virtual AIMapper_Error lock(buffer_handle_t _Nonnull buffer, uint64_t cpuUsage,
                                ARect accessRegion, int acquireFence,
                                void* _Nullable* _Nonnull outData) = 0;

    virtual AIMapper_Error unlock(buffer_handle_t _Nonnull buffer, int* _Nonnull releaseFence) = 0;

    virtual AIMapper_Error flushLockedBuffer(buffer_handle_t _Nonnull buffer) = 0;

    virtual AIMapper_Error rereadLockedBuffer(buffer_handle_t _Nonnull buffer) = 0;

    virtual int32_t getMetadata(buffer_handle_t _Nonnull buffer, AIMapper_MetadataType metadataType,
                                void* _Nullable destBuffer, size_t destBufferSize) = 0;

    virtual int32_t getStandardMetadata(buffer_handle_t _Nonnull buffer,
                                        int64_t standardMetadataType, void* _Nullable destBuffer,
                                        size_t destBufferSize) = 0;

    virtual AIMapper_Error setMetadata(buffer_handle_t _Nonnull buffer,
                                       AIMapper_MetadataType metadataType,
                                       const void* _Nonnull metadata, size_t metadataSize) = 0;

    virtual AIMapper_Error setStandardMetadata(buffer_handle_t _Nonnull buffer,
                                               int64_t standardMetadataType,
                                               const void* _Nonnull metadata,
                                               size_t metadataSize) = 0;

    virtual AIMapper_Error listSupportedMetadataTypes(
            const AIMapper_MetadataTypeDescription* _Nullable* _Nonnull outDescriptionList,
            size_t* _Nonnull outNumberOfDescriptions) = 0;

    virtual AIMapper_Error dumpBuffer(buffer_handle_t _Nonnull bufferHandle,
                                      AIMapper_DumpBufferCallback _Nonnull dumpBufferCallback,
                                      void* _Null_unspecified context) = 0;

    virtual AIMapper_Error dumpAllBuffers(
            AIMapper_BeginDumpBufferCallback _Nonnull beginDumpBufferCallback,
            AIMapper_DumpBufferCallback _Nonnull dumpBufferCallback,
            void* _Null_unspecified context) = 0;

    virtual AIMapper_Error getReservedRegion(buffer_handle_t _Nonnull buffer,
                                             void* _Nullable* _Nonnull outReservedRegion,
                                             uint64_t* _Nonnull outReservedSize) = 0;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

Google 给出了一个模拟器的实现 /external/minigbm/cros_gralloc/mapper_stablec:

在 external/minigbm/cros_gralloc/mapper_stablec/Mapper.cpp 中实现了一个 CrosGrallocMapperV5 类继承自 IMapperV5Impl,实现了所有的对外接口。

另外,定义了两个对外的入口符号:

extern "C" uint32_t ANDROID_HAL_MAPPER_VERSION = AIMAPPER_VERSION_5;

extern "C" AIMapper_Error AIMapper_loadIMapper(AIMapper* _Nullable* _Nonnull outImplementation) {
    static vendor::mapper::IMapperProvider<CrosGrallocMapperV5> provider;
    return provider.load(outImplementation);
}
1
2
3
4
5
6

使用 mapper hal 的程序可以通过 AIMapper_loadIMapper 获取 AIMapper 指针,AIMapper 内部的函数最终都会调用到 CrosGrallocMapperV5 类中的具体实现中。

这里两个符号都使用 extern "C" 修饰,也就是, c 和 cpp 程序都可以使用这两个符号来使用 mmaper 模块。

021.AIDL Hal 开发指南 4 ———— AIDL HAL 实例分析2
023.AIDL Hal 开发指南6 —— 驱动开发

← 021.AIDL Hal 开发指南 4 ———— AIDL HAL 实例分析2 023.AIDL Hal 开发指南6 —— 驱动开发→

最近更新
01
如何调试 SurfaceFlinger
10-05
02
SurfaceFlinger 概述
10-05
03
HWC 接口分析
10-05
更多文章>
Theme by Vdoing | Copyright © 2020-2025 AHao Framework | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式