4. 获取显示设备信息

任务说明

本案例实现一个 getDisplayInfo 函数,用于查询并返回显示设备的基本信息,包括分辨率(宽、高)和刷新率。该函数模拟 Android Display HAL 中读取显示设备参数并向上层返回数据的核心逻辑,可作为 HAL 层 DisplayDevice 信息查询的最小可复现实现。

核心实现

// display_info.h
#ifndef DISPLAY_INFO_H
#define DISPLAY_INFO_H

#include <cstdint>

struct DisplayInfo {
    uint32_t width;      // 像素宽度
    uint32_t height;     // 像素高度
    float refreshRate;   // 刷新率 (Hz)
};

// 获取显示设备基本信息
// 返回 0 表示成功,非 0 表示失败
int getDisplayInfo(DisplayInfo* info);

#endif // DISPLAY_INFO_H
// display_info.cpp
#include "display_info.h"

// 模拟从硬件寄存器/驱动节点读取显示参数
// 实际 HAL 实现中,此处通常对应读取 /sys/class/drm/.../modes 或
// 通过 ioctl 查询 DRM connector 的 mode 信息
int getDisplayInfo(DisplayInfo* info) {
    if (info == nullptr) {
        return -1;
    }

    // 以下为模拟的硬件参数读取过程
    // 在真实设备上,这些值来自驱动解析 EDID 或平台配置
    const uint32_t kDefaultWidth = 1920;
    const uint32_t kDefaultHeight = 1080;
    const float kDefaultRefreshRate = 60.0f;

    // 模拟读取成功
    info->width = kDefaultWidth;
    info->height = kDefaultHeight;
    info->refreshRate = kDefaultRefreshRate;

    return 0;
}
// main.cpp
#include <cstdio>
#include "display_info.h"

int main() {
    DisplayInfo info = {0, 0, 0.0f};

    int ret = getDisplayInfo(&info);
    if (ret != 0) {
        printf("Failed to get display info, error code: %d\n", ret);
        return 1;
    }

    printf("Display Info:\n");
    printf("  Resolution: %u x %u\n", info.width, info.height);
    printf("  Refresh Rate: %.1f Hz\n", info.refreshRate);

    return 0;
}

编译与运行

# 编译(需要 C++11 或更高版本)
g++ -std=c++11 -o display_info main.cpp display_info.cpp

# 运行
./display_info

预期输出

Display Info:
  Resolution: 1920 x 1080
  Refresh Rate: 60.0 Hz

验证方法

编译并运行程序,观察输出是否与上述预期一致。若输出分辨率、刷新率与代码中定义的常量值匹配,则说明 getDisplayInfo 函数正确返回了显示设备信息。如需验证错误处理路径,可将 main.cpp 中的调用改为 getDisplayInfo(nullptr),程序应返回错误码 -1 并打印失败信息。

getDisplayInfo 调用流程 上层调用者 main() getDisplayInfo() Display HAL display_info.cpp 读取参数 硬件参数源 EDID/寄存器 DisplayInfo 结构体 width: 1920 height: 1080 refreshRate: 60.0 返回 struct DisplayInfo

代码说明

本实现将显示设备信息查询封装为独立的 getDisplayInfo 函数,通过 DisplayInfo 结构体返回分辨率与刷新率。在真实 HAL 环境中,该函数内部会通过 ioctl 或 sysfs 节点读取 DRM connector 的当前 mode 信息;此处使用常量模拟硬件读取过程,以保持案例独立可运行。函数包含空指针检查,错误时返回 -1,成功时返回 0,符合 HAL 层常见的返回值约定。