固件嵌入式操作系统驱动开发【免费下载链接】corebootRead-only mirror of https://review.coreboot.org/coreboot.git. Synced every hour. We dont handle Pull Requests.项目地址https://gitcode.com/gh_mirrors/co/coreboot点击查看免费下载本篇围绕 coreboot 仓库中的 Display Panel Specifics 文档展开讲解在为 Intel 平台笔记本编写/移植 coreboot 固件时如何确定内嵌面板LVDS/eDP的上电与背光时序参数先从 Linux 系统文件读取 EDID 识别面板型号再结合面板数据手册的 T[N] 时序表或 Intel GPU 工具直接 dump PCH PP 寄存器、从厂商 UEFI 的 VBT 表中提取数值最终写入devicetree.cb的gpu_panel_*_delay寄存器项。读完后你将能够独立完成识别面板 → 取得时序参数 → 配置 coreboot 面板时序的完整流程并理解这些参数在源码中如何映射到PCH_PP_ON_DELAYS、PCH_PP_OFF_DELAYS、PCH_PP_DIVISOR等硬件寄存器。1. 为什么需要配置面板时序参数coreboot 在启动早期要为内嵌显示面板panel建立供电与背光的开启顺序。Intel PCH 通过一组 Power SequencePP寄存器驱动这一过程如果时序不符合面板数据手册datasheet的要求轻则屏幕闪烁、黑屏重则损伤面板驱动 IC。因此每个使用内嵌面板的主板其devicetree.cb中都需要填写一组面板时序寄存器本文档Documentation/gfx/display-panel.md正是讲这些参数的取值来源。2. 从 EDID 识别面板型号EDID 是连接在显示器上的身份描述数据。在 Linux 系统上可以从 sysfs 中的edid二进制文件里直接提取面板厂商与型号字符串。文档中给出的示例命令具体路径随 PCI 拓扑略有差异$ strings /sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-eDP-1/edid 0 5 LG Display LP140WF3-SPD1输出中的LP140WF3-SPD1就是 LG Display 生产的一块 14 英寸面板的型号。拿到型号后即可检索该面板的数据手册手册中通常有一张命名形如 T[N] 的power sequence timing parameters表格例如 T1、T2、…、T12。这些 T 编号与 Intel 编程手册中对 PP 寄存器的引用一一对应是参数映射的关键桥梁。3. devicetree.cb 时序参数与 T[N] 的对应关系文档给出的核心对照表如下Intel 文档描述 →devicetree.cb寄存器项 → eDP 时序编号Intel 文档中的描述devicetree.cb 寄存器项eDP 时序Power up delaygpu_panel_power_up_delayT3Power on to backlight ongpu_panel_power_backlight_on_delayT7Power Down delaygpu_panel_power_down_delayT10Backlight off to power downgpu_panel_power_backlight_off_delayT9Power Cycle Delaygpu_panel_power_cycle_delayT12这五个寄存器项在 coreboot 源码中有明确的类型与注释定义。以 Sandy Bridge/Ivy Bridge 北桥芯片为例chip.h 中定义u8 gpu_panel_power_cycle_delay; /* T4 time sequence */ u16 gpu_panel_power_up_delay; /* T1T2 time sequence */ u16 gpu_panel_power_down_delay; /* T3 time sequence */ u16 gpu_panel_power_backlight_on_delay; /* T5 time sequence */ u16 gpu_panel_power_backlight_off_delay; /* Tx time sequence */同族的 i945、gm45、gm965、ironlake 等芯片的 chip.h 中也有相同的字段各芯片注释中使用的 T 编号略有差异对应各自世代的数据手册。从源码结构看这些 devicetree 值最终会被写进 PCH 的三个 PP 寄存器。gma.c 中的gma_pm_init_post_vbios()展示了这一映射/* Setup Panel Power On Delays */ reg32 gtt_read(0xc7208); if (!reg32) { reg32 (conf-gpu_panel_port_select 0x3) 30; reg32 | (conf-gpu_panel_power_up_delay 0x1fff) 16; reg32 | (conf-gpu_panel_power_backlight_on_delay 0x1fff); gtt_write(0xc7208, reg32); } /* Setup Panel Power Off Delays */ reg32 gtt_read(0xc720c); if (!reg32) { reg32 (conf-gpu_panel_power_down_delay 0x1fff) 16; reg32 | (conf-gpu_panel_power_backlight_off_delay 0x1fff); gtt_write(0xc720c, reg32); } /* Setup Panel Power Cycle Delay */ if (conf-gpu_panel_power_cycle_delay) { reg32 gtt_read(0xc7210); reg32 ~0xff; reg32 | conf-gpu_panel_power_cycle_delay 0xff; gtt_write(0xc7210, reg32); }可以读出以下实现细节0xc7208即文档第 4 节示例中的PCH_PP_ON_DELAYS基址 0xc7000 偏移 0x208低 13 位是上电到背光开启延迟T7高 13 位是上电延迟T3最高两位选择面板端口0xc720c即PCH_PP_OFF_DELAYS同样为两个 13 位域分别对应背光关闭延迟T9与掉电延迟T100xc7210即PCH_PP_DIVISOR仅写入最低字节为电源循环延迟T12的除数代码对PCH_PP_ON_DELAYS/PCH_PP_OFF_DELAYS采用若寄存器已有非零值则跳过写入的策略说明这些值也可能由更底层的初始化路径如运行 VBIOS 时的硬件状态预先写入而 cycle delay 只要配置非零就会改写。各字段的位宽13 位即 0x0–0x1FFF也解释了为什么 devicetree 中的值以毫秒计数、上限约为 8191 ms 这一量级。真实主板的 devicetree.cb 示例Documentation/gfx/display-panel.md 没有给出完整示例仓库中大量使用内嵌面板的笔记本主板则提供了现成参考。例如 lenovo/t420/devicetree.cb# Enable Panel as LVDS and configure power delays register gpu_panel_port_select PANEL_PORT_LVDS register gpu_panel_power_cycle_delay 1 register gpu_panel_power_up_delay 300 # T1T2: 30ms register gpu_panel_power_down_delay 300 # T5T6: 30ms register gpu_panel_power_backlight_on_delay 2000 # T3: 200ms register gpu_panel_power_backlight_off_delay 2000 # T4: 200ms register gpu_cpu_backlight 0x1155 register gpu_pch_backlight 0x06100610注意注释中的毫秒换算300 计数 30 ms这来自PCH_PP_DIVISOR对时基的除数作用——这也是为什么文档表格中gpu_panel_power_cycle_delay对应 T12它是除数而非直接的延迟值。同一组寄存器项在 lenovo/t430s、lenovo/t530、lenovo/x220、asrock/b75pro3-m 等数十个主板的devicetree.cb中都有对应写法可作为同类芯片平台移植时的取值参考但最终数值必须以具体面板的数据手册或厂商 BIOS 实际值为准。4. 两种取值途径寄存器 dump 与 VBT 解码如果手边有能正常运行该主板的系统无论运行厂商固件还是已移植的 coreboot文档给出了两条互证路径。4.1 从运行系统直接 dump 寄存器大多数发行版的 Intel GPU 工具包命名为intel-gpu-tools或igt-gpu-tools其中intel_reg dump可读取 GPU 寄存器。文档示例$ intel_reg dump --all | grep PCH_PP PCH_PP_STATUS (0x000c7200): 0x80000008 PCH_PP_CONTROL (0x000c7204): 0x00000007 PCH_PP_ON_DELAYS (0x000c7208): 0x07d00001 PCH_PP_OFF_DELAYS (0x000c720c): 0x01f40001 PCH_PP_DIVISOR (0x000c7210): 0x0004af06对照第 3 节的位域布局即可手动拆解PCH_PP_ON_DELAYS 0x07d00001低 13 位0x001 上电到背光开启延迟0x07d0右移 16 位后 上电延迟最高两位0x0表示面板端口选择PCH_PP_OFF_DELAYS 0x01f40001低 13 位0x001 背光关闭后延迟0x01f4 掉电延迟PCH_PP_DIVISOR 0x0004af06最低字节0x06即 T12 除数字段高字节属于其他时序字段coreboot 侧只改写最低字节。4.2 从厂商 UEFI 的 VBT 解码VBTVideo BIOS Table是 Intel 图形微代码使用的视频 BIOS 表通常内嵌在厂商 UEFI/Option ROM 镜像中。coreboot 仓库的 util/intelvbttool/ 提供了intel_vbt_decode工具其 Makefile 用于编译源码解析 VGA BIOS Option ROM 头、PCIR 头、VBT 头及 BDB 结构以还原表内容。文档示例$ intel_vbt_decode data.vbt | grep T3 Power Sequence: T3 2000 T7 10 T9 2000 T10 500 T12 5000 T3 optimization: no一行 Power Sequence 就列出了 T3/T7/T9/T10/T12 五个关键值可与 4.1 节寄存器 dump 的解码结果互相印证。两条途径运行系统寄存器 dump、VBT 静态解码都拿到一致数值后再代回面板数据手册的 T[N] 表核对物理含义即完成了参数确认闭环。5. 工作流程小结在目标机器上运行 Linuxstrings读取 sysfs 中的edid文件获得面板厂商与型号如LP140WF3-SPD1用型号检索面板数据手册找到 T[N] 电源时序表记录 T3/T7/T9/T10/T12 的数值如有可用系统用intel_reg dump --all | grep PCH_PPdump 寄存器或从厂商 UEFI 提取 VBT 后执行intel_vbt_decode将第 2 步的表格数值与实际运行值交叉验证按第 3 节的对照表把五个值填入主板的devicetree.cb参考 lenovo/t420/devicetree.cb 的写法与注释风格同时确认gpu_panel_port_select与实际面板连接端口LVDS/eDP一致烧录后观察面板点亮时序必要时用BIOS_DEBUG日志核对 gma.c 中PCH_PP_ON_DELAYS/PCH_PP_OFF_DELAYS是否按预期写入寄存器已有值时 coreboot 会跳过写入若被 VBIOS 路径提前写过需留意此行为。6. 适用前提与限制文档与源码证据均针对Intel 平台i945/gm45/gm965/ironlake/sandybridge 等北桥PCH 上的 PP 寄存器非 Intel 平台不适用本流程寄存器偏移0xc7200 段与位域布局随芯片世代略有差异跨世代取值时请以对应芯片的gma.c实现和 Intel 编程手册为准devicetree 中数值的单位与除数依赖PCH_PP_DIVISOR的 T12 字段注释中的毫秒换算需结合该字段解读参见 t420 主板的注释示例本文引用的面板型号、寄存器 dump 与 VBT 输出均来自 Documentation/gfx/display-panel.md 原文示例仅用于演示流程不代表某一具体机型的实际参数。赞分享固件嵌入式操作系统驱动开发【免费下载链接】corebootRead-only mirror of https://review.coreboot.org/coreboot.git. Synced every hour. We dont handle Pull Requests.项目地址https://gitcode.com/gh_mirrors/co/coreboot点击查看免费下载相关推荐coreboot 主板 GPIO 配置实战指南从 Boot Stage 划分到 Pad 寄存器编程coreboot 主板 GPIO 配置实战指南从 Boot Stage 划分到 Pad 寄存器编程 在 coreboot 中每块主板mainboard都固件嵌入式操作系统驱动开发libmodbus 中的 modbus_get_float_abcd从两个 Modbus 寄存器解析 ABCD 字节序浮点数libmodbus 中的 modbus_get_float_abcd从两个 Modbus 寄存器解析 ABCD 字节序浮点数 导读 modbus_get_fl通信嵌入式物联网ESP32-HUB75-MatrixPanel-DMA 中的 FM6126A 面板支持控制寄存器 REG1/REG2 研究与初始化时序实现ESP32 HUB75 MatrixPanel DMA 中的 FM6126A 面板支持控制寄存器 REG1/REG2 研究与初始化时序实现 本篇围绕 ESP3嵌入式硬件开发驱动开发物联网创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考