kernel初始化

初始化 相关文件
-5.10//gpu/drm/
DRM Core
/gpu/drm/
MTK
/gpu/drm///
Panel
/gpu/drm/panel/
DRMFile
/drm/ /uapi/drm/
MTK
DRM
.c
MTK ddp
.c
我们已经知道,drm需要依次实现kms的如下模块:crtc,plane,,和panel(这里不考虑的情况) 。
针对这种,内核使用框架来保证能够按照一定的顺序初始化设备 。在框架中,包含两个基本概念,和 。被称为“超级设备”,是由管理的“普通设备”,要求先被初始化 。先看设备初始化:
=》//
? =》ster([i])
?=》// ver作为数组的第一项最先被注册并调用probe
?// de来遍历根节点的子节点,
// 并找到数组指定的并加入到普通设备中;
?=》of_id = (, node)
?=》(dev, &match, , node)
?=》(dev, &, match)// 注册设备
上图的会被依次注册进内核并调用他们的probe函数,以此完成和drm的初始化 。本文聚焦mtk-drm的实现,这里只看所实现的和 。

? =》er(&dsi->host)// 注册,这里还会去注册
? =》(&pdev->dev, &s) // 注册普通设备
当所有的普通设备通过注册后,最后就会调用的bind函数,也就是上面.bind函数 。
=》
? =》drm = (&, dev)// 根据来创建
? =》(drm)
?=》(drm)
?=》(drm->dev, drm)// 这里会依次回调设备的bind函数
?。。。。。。// 这里省略其他设备的bind回调
?=》
?=》dsi->panel = ()
?=》enc(drm, dsi)// 注册和
?=》
?=》dd
?=》ctor(drm, dsi)
?=》
?=》_add
?=》(&dsi->conn, &dsi->)
?=》(drm, ->data->)
?=》// 注册plane
?=》init
?=》
?=》// 注册crtc
?=》lanes
?=》
? =》(drm, 0)// 注册
【kernel初始化】当我们向内核成功注册后,drm-core会自动完成如下事情:
drm-hwc初始化 相关文件
hidl HWC
////
MTKHWC
/////
MTK
/////
hwc的请求会转成这个全局变量去完成对应的功能 。当对象被实例化,会调用类的构造函数::() 。构造函数中会调用:sp= (),并将赋值到,到这里hwc才跟drm扯上了关系 。MTK通过CE宏定义来兼容egacy和drm两个方式,代码分布在://2.0.0/drm/和//2.0.0// 。下面简单看一下drm的初始化 。
这是一个典型的单例模式 。类的构造函数会完成对drm资源的初始化 。
=》::()
? =》m_drm.init()// m_drm是对象
?=》::init()
?=》m_fd = open(, )// "/dev/dri/card0"
?=》()
?=》(m_fd, , 1)
?=》(m_fd, C, 1)

kernel初始化

文章插图
?=》(m_fd, , 1)
?=》()
?=》 res = (m_fd)
?=》(res)
?=》 c = (m_fd, r->crtcs[i])
?=》 *crtc = new (this, c)
?=》.(crtc)
?=》(res)
?=》(res)
?=》()
简单介绍::init()函数的处理流程:
打开"/dev/dri/card0"文件节点;
设置的的能力;
a. 设置,获取所有支持的Plane资源;
b. 设置C,告知DRM驱动该应用程序支持操作;
c. 设置,开启DRM驱动支持;
调用()函数,依次获取所有的:crtc,plane,和,创建对应的对象并加入到对应的list中;
a. (res)
b. (res)
c. (res)
d. ()
到这里,hwc-drm对ctrc,plane,和的初始化结束了 。这里还需要提一嘴fb的初始化 。
=》::e
=》m_drm.
=》crtc->()
=》m_drm->(&)
=》(, &)
=》addFb(fb_bo)
=》
=》(fd, 2
=》
=》(fd, TC, &crtc)
对这一块不太了解的话,请移步龙哥的《最简单的DRM应用程序》和这位同学《一瓶布满》 。简单说一下,