前言:
有些信息是在网上查资料后总结的,没有去追代码验证。如果有说得不对的地方,欢迎提出指正。感谢!
手机启动的大致流程
1.长按开机键
2.执行存储在ROM里(应该是某一个固定地址或是预定义的地址)的Primary Bootloader,会做以下事情:
初始化RAM
将secondary stage bootloader拷贝到内存
3.secondary stage bootloader会做以下事情
准备好device tree,告诉内核dtb的首地址
初始化一些硬件设备,比如显示
启动内核,传递参数
与显示相关的部分:dpu、dsi、dphy、屏幕上电,读屏幕ID来识别屏幕,屏幕初始化,显示开机logo
4.Kernel
启动init进程
挂载根文件系统(init进程内核态)
解析cmdline参数
创建各种服务进程(init进程用户态)
bootloader阶段,显示做了什么
目前在网上没有找到高通最新的uefi源码,先空着吧。
内核启动时,显示驱动做了什么
module_init
vendor\qcom\opensource\display-drivers\msm\msm_drv.c
module_init(msm_drm_register);
module_init是一个宏定义:#define module_init(x) __initcall(x);
将msm_drm_register函数放在.initcall6.init段中,在内核启动过程中通过start_kernel -> reset_init -> kernel_init->do_initcalls调用通过module_init注册的msm_drm_register函数。[10][11]
那register函数做了什么?
vendor\qcom\opensource\display-drivers\msm\msm_drv.c
static int __init msm_drm_register(void)
{
...
platform_driver_register(&msm_platform_driver);
dsi_display_register();
...
}
vendor\qcom\opensource\display-drivers\msm\dsi\dsi_display.c
void __init dsi_display_register(void)
{
...
dsi_phy_drv_register();
dsi_ctrl_drv_register();
dsi_display_parse_boot_display_selection();-------------2
platform_driver_register(&dsi_display_driver);
}
调用platform_driver_register函数注册以下platform driver:
msm_platform_driver、dsi_phy_platform_driver、dsi_ctrl_driver、dsi_display_driver
从名字上可以看出来,dsi_phy_platform_driver对于dphy模块,dsi_ctrl_driver对应dsi模块,其它两个呢?
2.解析屏幕名字。具体分析参考DRM驱动代码分析:uboot和kernel之间屏幕是如何匹配的
tips:
宏定义__init,用于告诉编译器相关函数或变量仅用于初始化。
编译器将标__init的所有代码存在特殊的内存段中,初始化结束后就释放这段内存。
来源:百度百科-__init
qcom DRM driver里的platform driver:

unisoc DRM driver里的platform driver:

static const struct of_device_id dsi_display_dt_match[] =

最低0.47元/天 解锁文章
617

被折叠的 条评论
为什么被折叠?



