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的移植:
- 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", // 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
},
- 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
},
- ./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 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>;
};
};
};
- 如果没有亮屏,可以试试息屏在亮屏。如果可以亮屏,则是xbl没亮问题而引起kernel亮屏失败。