DRM驱动代码分析:开机过程中显示驱动做了什么

前言:

有些信息是在网上查资料后总结的,没有去追代码验证。如果有说得不对的地方,欢迎提出指正。感谢!

手机启动的大致流程


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[] =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值