LCD相关code所在目录:
kernel/drvier/video/msm/mdss/
软件驱动主要分为三部分:
MDP 驱动
DSI 控制器驱动
FrameBuffer驱动
执行probe 的先后顺序:
MDP probe → DSI probe → FB probe
MDP probe:对使用的硬件资源进行初始化,同时在fb设备中注册mdp的使用接口
(rc = mdss_fb_register_mdp_instance(&mdp5);)
接口定义如下:
struct msm_mdp_interface mdp5 = {
.init_fnc = mdss_mdp_overlay_init,
.fb_mem_get_iommu_domain = mdss_fb_mem_get_iommu_domain,
.fb_stride = mdss_mdp_fb_stride,
.check_dsi_status = mdss_check_dsi_ctrl_status,
.get_format_params = mdss_mdp_get_format_params,
};
DSI probe:解析模组厂提供的panel的dtsi文件,从文件中获得panel的mode,分辨率,帧率,command数据等。
FB probe:从DSI的数据结构中获取到panel的相关信息,多MDP进行初始化。
if (mfd->mdp.init_fnc) {
rc= mfd->mdp.init_fnc(mfd);
if(rc) {
pr_err("init_fncfailed\n");
returnrc;
}
}
init_fnc 就是 MDP probe 注册的 mdss_mdp_overlay_init。
在 mdss_mdp_overlay_init 中,首先是对mdp interface 注册回调函数。
int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd)
{
struct device *dev = mfd->fbi->dev;
struct msm_mdp_interface *mdp5_interface = &mfd->mdp;
struct mdss_overlay_private *mdp5_data = NULL;
struct irq_info *mdss_irq;
int rc;
mdp5_data = kzalloc(sizeof(struct mdss_overlay_private), GFP_KERNEL);
if (!mdp5_data) {
pr_err("fail to allocate mdp5 private data structure");
return -ENOMEM;
}
mdp5_data->mdata = dev_get_drvdata(mfd->pdev->dev.parent);
if (!mdp5_data->mdata) {
pr_err("unable to initialize overlay for fb%d\n", mfd->index);
rc = -ENODEV;
goto init_fail;
}