𝓣𝓻𝓪𝓿𝓲𝓼


  • 首页
  • 归档
  • 分类
  • 友链
  • 关于

© 2025 Travis

Gamma流程

发布于 2024-07-05 代码流程 

当进行FGA校正时,会直接将FGA校正生成的 gamma22 table直接写入寄存器;但假如系统不进行FGA校正时,我们则需要将之前校正OK的gamma22 table当作默认值预置进去,作为量产默认值。

这两种流程的核心区别在于 Gamma 数据的来源:

  • FGA 校正: 数据来自外部校准工具,是动态的。
  • 默认加载: 数据来自固件内部预存的 const 表,是静态的。

流程一:FGA 校正流程 (在线校准)

此流程通常由产线上的校准程序(Tool)通过 DDC/CI 或 UART 等接口触发。

  1. 外部触发 (External Trigger)

    • 校准工具通过 DDC/CI 或 UART 发送一个特定的 VCP Code(虚拟控制面板命令)或自定义命令,该命令包含了“开始 FGA Gamma 校准”的指令以及新的 Gamma 2.2 LUT 数据。
  2. 命令接收与解析 (Command Reception & Parsing)

    • DdcciCmd.c 或 UartHandler.c 中的命令处理函数接收到数据。
    • 它会解析命令,识别出这是一个 FGA Gamma 写入请求,并将附带的 Gamma 数据存入一个缓冲区。
    • 我将搜索 FGA 相关的调用,以找到命令处理的入口。

✦ 从 DdcciCmd.c 的搜索结果中,我们可以看到 VCPOP_NVT_FGA_ACCESS 这个 VCP Code。当接收到这个命令时,会调用 FGADDCCI() 函数。

  1. FGA 数据处理 (FGA Data Processing)

    • FGA.c: FGADDCCI() 函数是 FGA 校准的核心。它会根据收到的子命令(如 NVT_FGA_BLOCKSEL)执行不同的操作。
    • 当接收到 Gamma 数据块时,FGADDCCI() 会调用 SYSAPI_ConfigFGAOffset() 设置 Flash 的写入地址,然后将数据块写入 Flash 的特定区域(FGA Staging Area)。
  2. Gamma 表解压与加载 (Decompression & Loading)

    • FGA.c: 数据通常是压缩后传输的。在所有数据块都写入 Flash 后,校准工具会发送一个“应用 FGA”的命令。
    • FGADDCCI() 接收到此命令后,会调用 FGA_LoadGammma()。
    • FGA_LoadGammma() 函数会从 Flash 中读取之前存入的压缩数据,然后调用 FGA_DecompressGamma() 或 FGA_DecompressPostGamma() 进行解压。
    • 解压后的 Gamma LUT 数据会被存放在 RAM 中的一个全局数组里。
  3. 写入硬件寄存器 (Hardware Register Write)

    • Gamma.c: FGA_LoadGammma() 函数在获取到解压后的 Gamma LUT 后,会调用 LoadPostGamma320() 或类似的函数。
    • LoadPostGamma320() 函数接收 RAM 中的 Gamma 数据作为参数。
    • drv_ScalerGamma.c: LoadPostGamma320() 内部会调用底层的驱动函数,如 drv_GM_LoadPostGamma()。
    • drv_GM_LoadPostGamma() 函数通过 SPI/I2C 接口,将 RAM 中的 Gamma LUT 数据逐点写入到 Scaler 芯片的 Gamma 硬件寄存器中。
  4. 设置标志位 (Set Flag)

    • 校准成功后,FGADDCCI() 会设置一个标志位(例如 stCustomSystem.bFGADone = TRUE),并将其保存到 NVRAM 中。这个标志位用于告知系统,FGA 校准已经完成,下次启动时应直接从 Flash
      加载已校准的数据,而不是使用默认值。

FGA 校正流程总结:

Tool -> DDC/CI -> DdcciCmd.c (VCPOP_NVT_FGA_ACCESS) -> FGA.c (FGADDCCI) -> Flash (Staging Area) -> FGA.c (FGA_LoadGammma) -> FGA.c (FGA_DecompressPostGamma) -> RAM (Decompressed LUT) ->
Gamma.c (LoadPostGamma320) -> drv_ScalerGamma.c (drv_GM_LoadPostGamma) -> Scaler Registers


流程二:加载默认 Gamma 值 (批量生产)

此流程在每次开机时执行,如果系统检测到没有进行过 FGA 校准,或者用户恢复了出厂设置,就会加载固件中预置的默认 Gamma 表。

  1. 系统初始化 (System Initialization)

    • main.c: 系统上电后,main() 函数会调用一系列初始化函数,其中包括 Panel_CoolInitialize()。
  2. 面板参数加载 (Panel Parameter Loading)

    • Panel.c: Panel_CoolInitialize() 调用 PanelRecallDefaultData(),此函数会根据 SystemData.ucPanelSel 从 PanelList 中加载当前面板的 PanelData 结构体到 SysPanelData。此时,SysPanelData
      中的 Gamma 函数指针 pfGetDispGamma 指向了 GammaData.c 中的 Panel_GetDispGamma_… 函数。
  3. 色彩系统初始化 (Color System Initialization)

    • 在后续的初始化流程中,会调用 SysColor_Init() 或类似函数来初始化色彩相关配置。
    • SysColor.c: SysColor_Init() 函数会根据当前的色彩模式和用户设置来加载相应的 Gamma 表。
  4. 检查 FGA 标志位 (Check FGA Flag)

    • SysColor.c 或 Gamma.c: 在加载 Gamma 之前,系统会检查之前在 FGA 校准流程中设置的 stCustomSystem.bFGADone 标志位。
    • 如果 bFGADone 为 TRUE:
      • 调用 FGA_LoadGammma(),直接从 Flash 中加载已经校准过的 Gamma 数据到 RAM,然后写入硬件寄存器。这个流程和 FGA 校正的第 4、5 步类似,只是没有了外部触发和数据写入 Flash 的过程。
    • 如果 bFGADone 为 FALSE (或用户恢复出厂设置):
      • 执行默认 Gamma 加载流程。
  5. 加载默认 Gamma (Load Default Gamma)

    • Gamma.c: 系统会调用 LoadGamma() 或类似函数来加载默认 Gamma。
    • LoadGamma() 函数内部会调用 SysPanelData.pfGetDispGamma(ucGammaIdx)。
      • ucGammaIdx 是 Gamma 表的索引(例如,对应 Gamma 2.2)。
    • GammaData.c: Panel_GetDispGamma_…() 函数被调用,它从 DispGammaTable 数组中返回指向 gstGammaTable 的 const 指针。
    • Gamma.c: LoadGamma() 获取到 gstGammaTable 的地址后,调用 LoadPostGamma320()。
  6. 写入硬件寄存器 (Hardware Register Write)

    • Gamma.c: LoadPostGamma320() 将 gstGammaTable 的内容(这是一个 const 数组,数据固化在固件中)作为参数传递。
    • drv_ScalerGamma.c: LoadPostGamma320() 内部调用 drv_GM_LoadPostGamma(),将固件中的默认 Gamma LUT 数据写入 Scaler 的硬件寄存器。

默认加载流程总结:

main() -> Panel_CoolInitialize() -> PanelRecallDefaultData() -> SysColor_Init() -> Gamma.c (LoadGamma) -> SysPanelData.pfGetDispGamma() -> GammaData.c (Panel_GetDispGamma_…) -> return
&gstGammaTable -> Gamma.c (LoadPostGamma320) -> drv_ScalerGamma.c (drv_GM_LoadPostGamma) -> Scaler Registers

通过这两个流程的梳理,我们可以清晰地看到,系统通过一个 FGA 完成标志位,灵活地实现了在“在线校准”和“离线默认值”两种模式下的 Gamma 加载切换,兼顾了产线校准的灵活性和批量生产的一致性。

 上一篇: TodoList 下一篇: 为何拥有越多越烦恼 

© 2025 Travis