我所理解的高通UEFI之display的流程和移植

UEFI的流程

UEFI跟uboot一样都是在在kernel加载启动之前,正确的引导指定启动服务,并向内核传递信息,代替原先的uboot。它包含了上电、驱动实现,以及os环境的建立和应用程序(类似于fastboot)。这个os是UEFI自己独立运行独有。

UEFI由XBL和ABL组成:

  • XBL:原先的LK移到这里,负责驱动和充电功能,属于高通的私有代码。其中大量的使用了protocol,包含了驱动函数指针和数据,也就是驱动,在ABL可以直接调用。

  • ABL:应用程序,主要作用是加载引导kernel,和fastboot。在Android 代码测。

lcd流程:

  • DisplayDxeInitialize 函数入口:Drivers/DisplayDxe/DisplayDxe.inf 文件中ENTRY_POINT=DisplayDxeInitialize。位置:BOOT.XF.4.1\boot_images\QcomPkg\Drivers\DisplayDxe\DisplayDxe.c

  • CreateEventEx:创建回调函数,关于给屏幕上下电

  • DisplayPwr_InitLPMSupport:初始化相关,如电源、时钟。

  • MDPSetProperty:初始化ABL上下文,获得支持的屏。位置QcomPkg\Library\MDPLib\MDPLib.c

  • Display_Utils_Initialize:通过 MDP_DISPLAY_PROPERTY_ABL_INTERFACE_INIT 类型进入

  • CheckTargetPanelSupport:获取所有的panel 列表

  • MDPPlatformConfigure:获取gPanelList数组,保存在psPanelDTInfo中,从头文件#include "MDPPlatformLib.h"可以看出,调用的是 /MDPPlatformLibBoot/MDPPlatformLib.c 中的代码

  • MDP_SetBootServiceVariable: QcomTokenSpace GUID 配置变量PanelCount和PanelList

  • CheckPanelOverride:检查ABL是否有配置覆盖

  • MDPInit:初始化屏。位置boot_images/QcomPkg/Library/MDPLib/MDPLib.c

  • MDP_OSAL_CALLOC:分配 DSI 和 I2C 相关的缓存内存资源

  • MDPPlatformConfigure:判断是否有硬件加速

  • MDPPlatformConfigure:获取平台芯片id

  • sInitParam.aSupportedDisplays[MDP_DISPLAY_PRIMARY]):如果配置了MDP_DISPLAY_PRIMARY

  • MDPPower:上电

  • MDPDetect:检查默认配置的屏幕,通过MDPDetectPanel 读取LCD id,选择具体屏的xml

  • DisplayDxeSelectMode:配置显示屏的模式

  • MDPSetProperty:使能主屏显示prop属性

  • InstallMultipleProtocolInterfaces:仅当检测到面板时才安装显示协议。

UEFI之display的移植:

  1. BOOT.XF.4.1/boot_images/QcomPkg/Settings/Panel下复制一份xml修改其中的数据:Panel_cptf_xxxx_1440_vid.xml

  1. SocPkg/AgattiPkg/LAA/Core.fdf :把该xml加入编译,guid可以用工具生成

FILE FREEFORM = 439836d3-599f-4156-a671-f98a64d8482b {
    SECTION UI = "Panel_cptf_xxxxx_1440_vid.xml"
    SECTION RAW = QcomPkg/Settings/Panel/Panel_cptf_ili8911_1440_vid.xml
  }
  1. Include/Library/MDPPlatformLib.h 添加lcd宏:MDPPLATFORM_PANEL_xxxxx_1440_HDPLUS_VIDEO

  1. SocPkg/AgattiPkg/Library/MDPPlatformLib/MDPPlatformLibPanelConfig.h,将lcd宏、功能函数、xml绑定

 { 
    MDPPLATFORM_PANEL_xxxxx_1440_HDPLUS_VIDEO,               // ePanelSelected
    "Panel_cptf_xxxx_1440_vid.xml",                          // pPanelXmlConfig
    Panel_Default_PowerUp,                                      // pPanel_PowerUp
    Panel_Default_PowerDown,                                     // pPanel_PowerDown
    Panel_Default_Reset,                                        // pPanel_Reset
    Panel_Default_Peripheral_Power,                             // pPanel_Peripheral_Power
    Panel_Default_Brightness_Enable,                            // pPanel_Brightness_Enable
    Panel_Default_Brightness_Level                              // pPanel_Brightness_Level
  },
  1. SocPkg/AgattiPkg/Library/MDPPlatformLib/MDPPlatformLib.c: fastBootPanelList和uefiPanelList

  • 添加fastBootPanelList:将lcd宏和xml及kernel的dts绑定

  PANEL_CREATE_ENTRY("cpft_xxxx_1440_vid",      MDPPLATFORM_PANEL_xxxxx_1440_HDPLUS_VIDEO,  "qcom,mdss_dsi_cpft_xxxx_video:",   DISP_INTF_DSI, DISP_TOPOLOGY_CONFIG_NONE,  DISP_TIMING_CONFIG_NONE,PLL_OVERRIDE_NONE, DISP_MODE_SINGLE_DSI | DISP_MODE_SKIP_BOOTLOADER,  DISP_MODE_SINGLE_DSI | DISP_MODE_SKIP_BOOTLOADER,     DISP_MODE_SINGLE_DSI | DISP_MODE_SKIP_BOOTLOADER),
  • uefiPanelList:将LCD的id和lcd宏绑定,读取id后会选择该lcd宏,选取该lcd配置

{  
      0x06,                                                  // uCmdType
      0x05,                                              // total number of retry on failures
      {
        {
    
    {0xDA, 0x00},                                       // address to read ID1
        {0xid, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}     // expected readback
        }, 
        {
    
    {0xDB, 0x00},                                       // address to read ID2
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}     // expected readback
        },
        {
    
    {0xDC, 0x00},                                       // address to read ID3
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}     // expected readback
        }
      },
      0,                                                     // Lane remap order {0, 1, 2, 3}
      NULL,                                               // psPanelCfg (panel configuration)
      0,                                                     // uPanelCfgSize
      MDPPLATFORM_PANEL_xxxxx_1440_HDPLUS_VIDEO,          // eSelectedPanel 
      0                                                      // uFlags
    },
  1. ./SocPkg/AgattiPkg/Library/MDPPlatformLib/MDPPlatformLibPanelCommon.h 设置修改lcd rest gpio:

#define DEFAULT_DISP_RESET_GPIO           82 
  1. 如果开机需要修改gpio的配置状态,可以修改SocPkg/AgattiPkg/Settings/TLMM/loader/TLMMChipset.xml

uefi-kernel之lcd移植

  1. vendor/qcom/proprietary/devicetree-4.19/qcom:复制其他panel dtsi并修改相关的proch值

&mdss_mdp {
    dsi_cpft_xxxx_video: qcom,mdss_dsi_cpft_xxxx_video {
        qcom,mdss-dsi-panel-name = "cptf xxxx video mode dsi panel";
        qcom,mdss-dsi-panel-controller = <&mdss_dsi0>;
        qcom,mdss-dsi-panel-type = "dsi_video_mode";
        qcom,mdss-dsi-panel-destination = "display_1";
        ....
  1. ./bengal-sde-display.dtsi 添加头文件 :

#include "dsi-panel-cpft-xxxx-1440-plus-vid.dtsi"
  1. ./scuba-idp.dtsi添加电源、reset、背光模式

&dsi_cpft_xxxx_video {
        qcom,panel-supply-entries = <&dsi_panel_pwr_supply_no_labibb>;
        qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs";
        qcom,bl-pmic-pwm-period-usecs = <100>;
        qcom,mdss-dsi-bl-min-level = <1>;
        qcom,mdss-dsi-bl-max-level = <4095>;
        qcom,platform-reset-gpio = <&tlmm 82 0>;
        qcom,platform-reset-gpio-always-on;
        qcom,platform-en-gpio = <&tlmm 105 0>;
};
  1. 添加clock时序:记得用2.0.0的时序表格

&dsi_cpft_xxxx_video {
        qcom,mdss-dsi-t-clk-post = <0x09>;
        qcom,mdss-dsi-t-clk-pre = <0x15>;
        qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0",
                                "src_byte_clk0", "src_pixel_clk0",
                                "shadow_byte_clk0", "shadow_pixel_clk0";

        qcom,mdss-dsi-display-timings {
                timing@0 {
                        qcom,mdss-dsi-panel-phy-timings =
                                 [1C 19 02 03 01 02 04 a0
                                1C 19 02 03 01 02 04 a0
                                1C 19 02 03 01 02 04 a0
                                1C 19 02 03 01 02 04 a0
                                1C 07 02 03 01 02 04 a0         ];
                        qcom,display-topology = <1 0 1>;
                        qcom,default-topology-index = <0>;
                };
        };
};
  1. 如果没有亮屏,可以试试息屏在亮屏。如果可以亮屏,则是xbl没亮问题而引起kernel亮屏失败。

猜你喜欢

转载自blog.csdn.net/weixin_42432281/article/details/128728006
今日推荐