UEFI GOP driver基础协议解读

12.9 Graphics Output Protocol(GOP)

来源:UEFI Specification 2.11 · 第 12 章 Protocols — Console Support · 12.9 节

12.9.1 EFI_GRAPHICS_OUTPUT_PROTOCOL

GOP 是 UEFI 图形控制台的基础协议,为图形输出设备提供视频模式设置帧缓冲访问像素拷贝(Blt) 能力,取代了旧式 VGA/UGA 方案。每个帧缓冲对应一个 GOP 实例;一个视频控制器可产生多个 GOP(多输出适配器),每个活动输出 handle 上同时安装 GOP、EDID Discovered 与 EDID Active 协议。

  • GUID9042A9DE-23DC-4A38-96FB-7ADED080516A
  • 协议结构
typedef struct _EFI_GRAPHICS_OUTPUT_PROTOCOL {
  EFI_GRAPHICS_OUTPUT_PROTOCOL_QUERY_MODE QueryMode; // 12.9.2.1
  EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE   SetMode;   // 12.9.2.2
  EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT        Blt;       // 12.9.2.3
  EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE       *Mode;     // 12.9.2.4
} EFI_GRAPHICS_OUTPUT_PROTOCOL;

相关类型定义(属于 12.9.1):

// 32-bit 像素:B、G、R、保留(0~255)
typedef struct {
  UINT8 Blue;
  UINT8 Green;
  UINT8 Red;
  UINT8 Reserved;
} EFI_GRAPHICS_OUTPUT_BLT_PIXEL;

// Blt 操作类型
typedef enum {
  EfiBltVideoFill,          // 0:用 BltBuffer[0] 填充目标矩形(忽略源坐标与 Delta)
  EfiBltVideoToBltBuffer,   // 1:屏幕矩形 → CPU 缓冲(DestX/Y 指向缓冲;非零需 Delta)
  EfiBltBufferToVideo,      // 2:CPU 缓冲 → 屏幕矩形(SourceX/Y 指向缓冲;非零需 Delta)
  EfiBltVideoToVideo,       // 3:帧缓冲内矩形拷贝(忽略 BltBuffer 与 Delta,允许重叠)
  EfiGraphicsOutputBltOperationMax
} EFI_GRAPHICS_OUTPUT_BLT_OPERATION;

12.9.2 服务函数与数据结构

12.9.2.1 EFI_GRAPHICS_OUTPUT_PROTOCOL.QueryMode()

返回某个模式号(ModeNumber)下,图形设备与活动输出设备共同支持的模式信息。

typedef
EFI_STATUS
(EFIAPI *EFI_GRAPHICS_OUTPUT_PROTOCOL_QUERY_MODE)(
  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL           *This,
  IN  UINT32                                 ModeNumber,
  OUT UINTN                                  *SizeOfInfo,
  OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION   **Info
);
  • ModeNumber​:0 ~ MaxMode-1;未设置过模式(Mode 未初始化)时先调用 SetMode(),否则返回 EFI_NOT_STARTED
  • SizeOfInfo​/Info:callee 分配的缓冲区大小与指针
  • 返回EFI_SUCCESS​、EFI_DEVICE_ERROR​、EFI_UNSUPPORTED​、EFI_INVALID_PARAMETER​、EFI_BUFFER_TOO_SMALL​、EFI_NOT_STARTED
12.9.2.2 EFI_GRAPHICS_OUTPUT_PROTOCOL.SetMode()

将视频设备设为指定模式,并把输出显示可见区域清为黑色

typedef
EFI_STATUS
(EFIAPI *EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE)(
  IN EFI_GRAPHICS_OUTPUT_PROTOCOL  *This,
  IN UINT32                        ModeNumber
);
  • 返回EFI_SUCCESS​、EFI_DEVICE_ERROR​、EFI_UNSUPPORTED​、EFI_INVALID_PARAMETER
12.9.2.3 EFI_GRAPHICS_OUTPUT_PROTOCOL.Blt()

在帧缓冲与 Blt 缓冲之间进行块传输的软件抽象,共 4 种操作(见 12.9.1 的 EFI_GRAPHICS_OUTPUT_BLT_OPERATION)。

typedef
EFI_STATUS
(EFIAPI *EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT)(
  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL      *This,
  IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL     *BltBuffer,   // OPTIONAL
  IN  EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,
  IN  UINTN                             SourceX,
  IN  UINTN                             SourceY,
  IN  UINTN                             DestinationX,
  IN  UINTN                             DestinationY,
  IN  UINTN                             Width,
  IN  UINTN                             Height,
  IN  UINTN                             Delta         // OPTIONAL
);
  • Delta:Blt 缓冲每行字节数(拷贝模式且 (X,Y) 非零时必需);为 0 时以 Width 作为行宽
  • 屏幕原点 (0,0) 在左上角
  • 返回EFI_SUCCESS​、EFI_INVALID_PARAMETER​、EFI_DEVICE_ERROR​、EFI_UNSUPPORTED
12.9.2.4 EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE

当前图形输出设备模式信息:

typedef struct {
  UINT32                         MaxMode;          // QueryMode()/SetMode() 支持的模式数
  UINT32                         Mode;             // 当前模式号(0 ~ MaxMode-1)
  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;      // 只读模式信息指针
  UINTN                          SizeOfInfo;       // Info 结构字节数(后续版本可能增大)
  EFI_PHYSICAL_ADDRESS           FrameBufferBase;  // 线性帧缓冲基址(偏移 0 = 左上角像素)
  UINTN                          FrameBufferSize;  // 帧缓冲大小 = PixelsPerScanLine × VerticalResolution × 每像素字节
} EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE;
12.9.2.5 EFI_GRAPHICS_OUTPUT_MODE_INFORMATION

描述一个图形输出模式:

typedef struct {
  UINT32                    Version;              // 结构版本
  UINT32                    HorizontalResolution; // X 方向像素数
  UINT32                    VerticalResolution;   // Y 方向像素数
  EFI_GRAPHICS_PIXEL_FORMAT PixelFormat;          // 像素物理格式
  EFI_PIXEL_BITMASK         PixelInformation;     // 仅 PixelBitMask 格式有效
  UINT32                    PixelsPerScanLine;    // 每行像素数(pitch)
} EFI_GRAPHICS_OUTPUT_MODE_INFORMATION;

行字节数(pitch)= PixelsPerScanLine × 每像素字节数;帧缓冲内像素偏移 = pitch×y + 每像素字节数×x

12.9.2.6 EFI_GRAPHICS_PIXEL_FORMAT
typedef enum {
  PixelRedGreenBlueReserved8BitPerColor,  // 0:RGBX
  PixelBlueGreenRedReserved8BitPerColor,  // 1:BGRX(多数硬件默认)
  PixelBitMask,                           // 2:由 EFI_PIXEL_BITMASK 定义
  PixelBltOnly,                           // 3:无线性帧缓冲,仅能用 Blt() 绘制
  PixelFormatMax
} EFI_GRAPHICS_PIXEL_FORMAT;
12.9.2.7 EFI_PIXEL_BITMASK
typedef struct {
  UINT32 RedMask;
  UINT32 GreenMask;
  UINT32 BlueMask;
  UINT32 ReservedMask;
} EFI_PIXEL_BITMASK;

关键要点(GOP driver 研究)

  • 使用流程LocateProtocol(&gEfiGraphicsOutputProtocolGuid)​ → 若 Mode​ 未初始化先 SetMode(0)​ → 遍历 QueryMode()​ 选择模式 → SetMode(n)​ → 直接写 FrameBufferBase​ 或调用 Blt()
  • GOP 是 Boot Time 服务ExitBootServices() 后协议不可用,但帧缓冲保留,可在 OS 中继续使用
  • 写像素前先按 PixelFormat​ 判断像素布局(RGBX / BGRX / BitMask);PixelBltOnly 无帧缓冲
  • 图形驱动需在活动输出 handle 上同时安装 EDID Discovered/Active 协议;平台若提供 EDID Override 协议,驱动必须优先使用其数据填充 EDID Active

EDID 三协议机制(Discovered / Override / Active)

依据:UEFI 规范 12.9 节、Intel《UEFI Driver Development Guide for Graphics Controller Device Classes》、tianocore《UEFI Driver Writer’s Guide》第 23 章

角色分工:

协议角色数据来源
EFI_EDID_DISCOVERED_PROTOCOL从视频输出设备实际读取到的原始 EDID(事实数据)硬件 DDC/I²C 通道
EFI_EDID_OVERRIDE_PROTOCOL(平台可选)平台固件提供的覆盖策略(强制分辨率、EDID 修正等)平台/用户配置
EFI_EDID_ACTIVE_PROTOCOL最终生效的 EDID,系统据此决定显示能力Discovered 或 Override 之一

数据链路:

硬件读到的 EDID (Discovered) ──┬─► 无 Override ──► EDID Active
                               └─► 有 Override ──► 用 Override 数据填充 EDID Active

为什么必须同时安装 Discovered + Active:

  • 两个协议承载两个语义:硬件原始能力(Discovered)与系统最终配置(Active),Override 机制依赖二者区分才成立
  • 消费者不同:系统固件/OS Loader 只看 Active(最终生效);调试诊断看 Discovered(未被策略污染)
  • 规范硬性要求:EFI_EDID_DISCOVERED_PROTOCOL must exist on each handle that represents a video output, and must only represent a single video output device
  • 每个输出 child handle 缺一不可,否则不构成完整的"输出设备接口"

与 GOP 的协作(驱动实现顺序):

  1. Start() 枚举图形控制器输出端口 → 每个输出创建 child handle
  2. 读取硬件 EDID → 安装 EDID Discovered
  3. 查询平台 EDID Override → 决定数据源 → 安装 EDID Active
  4. 计算 控制器支持的模式 ∩ 显示器(EDID)支持的模式 → 安装 GOP(MaxMode​ 与 QueryMode() 返回的都是该交集)

类比:Discovered = 显示器铭牌参数(出厂事实);Override = 贴的便签"实际按 1080p 用"(平台策略);Active = 系统最终照做的参数。只有铭牌无法执行,只有执行参数无法回溯真实能力,故规范要求两个都装。

内容概要:本文围绕基于改进多目标粒子群优化算法(小生境粒子群算法)的配电网有功-无功协调优化问题展开研究,旨在通过智能优化算法有效降低网络损耗、提升电压质量并增强配电系统的运行效率。研究系统地介绍了小生境粒子群算法的改进策略,构建了包含功率平衡、电压安全、设备容量等多重约束的多目标优化模型,并采用IEEE标准测试系统进行仿真验证,充分证明了该方法在处理多目标、多约束优化问题上的优越性能。全文涵盖从数学建模、算法设计、约束处理到多目标折衷解选择的完整流程,并配套提供了完整的Matlab代码实现,便于读者复现结果与进行二次开发。; 适合人群:具备一定电力系统基础知识和Matlab编程能力,从事电力系统优化、智能算法研究或相关领域工作的研究生、科研人员及工程技术人员。; 使用场景及目标:①解决配电网中有功与无功功率的协同优化问题,实现节能降耗与电压稳定;②学习并掌握多目标粒子群算法及其小生境改进策略在电力系统中的具体应用与实现细节;③通过Matlab代码进行仿真,加深对智能优化算法在工程实践中应用的理解,提升科研与工程实践能力。; 阅读建议:此资源以理论分析与代码实现紧密结合的方式呈现,建议读者在深入理解算法原理和模型构建的基础上,结合所提供的Matlab代码进行仿真实验,重点关注参数设置、收敛性分析与结果可视化等关键环节,从而实现从理论认知到实践验证的完整闭环。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cerman

你的鼓励是探索和创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值