我所理解的高通UEFI之display的流程和移植
UEFI的流程
UEFI跟uboot一样在OS加载启动之前,正确的指定启动服务,并向内核传递信息,代替原先的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的移植:
BOOT.XF.4.1/boot_images/QcomPkg/Settings/Panel下复制一份xml修改其中的数据:Panel_cptf_xxxx_1440_vid.xml
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}
Include/Library/MDPPlatformLib.h 添加lcd宏:MDPPLATFORM_PANEL_xxxxx_1440_HDPLUS_VIDEO
SocPkg/AgattiPkg/Library/MDPPlatformLib/MDPPlatformLibPanelConfig.h,将lcd宏、功能函数、xml绑定
{ MDPPLATFORM_PANEL_xxxxx_1440_HDPLUS_VIDEO, // ePanelSelected"Panel_cptf_xxxx_1440_vid.xml", // pPanelXmlConfigPanel_Default_PowerUp, // pPanel_PowerUpPanel_Default_PowerDown, // pPanel_PowerDownPanel_Default_Reset, // pPanel_ResetPanel_Default_Peripheral_Power, // pPanel_Peripheral_PowerPanel_Default_Brightness_Enable, // pPanel_Brightness_EnablePanel_Default_Brightness_Level // pPanel_Brightness_Level},
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, // uCmdType0x05, // 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, // uPanelCfgSizeMDPPLATFORM_PANEL_xxxxx_1440_HDPLUS_VIDEO, // eSelectedPanel 0 // uFlags},
./SocPkg/AgattiPkg/Library/MDPPlatformLib/MDPPlatformLibPanelCommon.h 设置修改lcd rest gpio:
#define DEFAULT_DISP_RESET_GPIO 82
如果开机需要修改gpio的配置状态,可以修改SocPkg/AgattiPkg/Settings/TLMM/loader/TLMMChipset.xml
uefi-kernel之lcd移植
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";....
./bengal-sde-display.dtsi 添加头文件 :
#include "dsi-panel-cpft-xxxx-1440-plus-vid.dtsi"
./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>;
};
添加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 a01C 19 02 03 01 02 04 a01C 19 02 03 01 02 04 a01C 19 02 03 01 02 04 a01C 07 02 03 01 02 04 a0 ];qcom,display-topology = <1 0 1>;qcom,default-topology-index = <0>;};};
};
如果没有亮屏,可以试试息屏在亮屏。如果可以亮屏,则是xbl没亮问题而引起kernel亮屏失败。