上节在《显示处理器介绍》中阐述了显示处理器的大致功能以及要配置的参数;本节将介绍一下DRM驱动中的模块与显示处理器的关系。
做过显示的都知道,目前大多数厂商已经抛弃fb框架,使用drm驱动来管理显示。其中的优点是芯片厂商不必重复造轮子,只需将自己显示处理器的配置流程实现为函数,由drm驱动调用即可。同时drm也为用户提供同一接口,方便使用。
DRM驱动模块
了解过drm的可能都看过下面这张图
最初刚接触drm的时候,很难理解,crtc、plane、encoder、connector都是些什么。如果不接触芯片内部的的显示处理器是怎么工作的,或者不知道芯片处理器需要配置些什么内容对这些模块确实非常难理解。
上节介绍到drm驱动是显示处理器的软件抽象。
planes:对应显示处理器的layer,负责配置layer的一些属性
crtc:对应显示处理器中的图层合成以及时序的生成的模块;从crtc出来的信号是图像信号,想要显示还需要encoder进行翻译。
encoder:将合成后的图像数据生成对应的时序信号,比如dsi,lvds等。
这里的硬件对应的是dsi控制器,或者是lvds控制器。将crtc送入的图像信号翻译为标准协议如dsi,lvds等,通过io接口输出给显示设备。接口不同需要配置的参数也不同,比如dsi需要配置phy,format,data type等等,这块不做详解。具体可以了解对应的协议标准。
connector:用于连接显示器。其实connector与encoder区分不明显,比如dsi的控制器抽象为encoder,dsi的phy抽象到connector,或者整个dsi的功能抽象为encoder;或者将整个dsi抽象为connector,这个取决于驱动工程师怎么抽象。
以上每个模块都有一组由各个厂商实现的回调函数,用来配置硬件功能。回调函数由drm核心调用。因此熟悉这些回调的作用对显示驱动的移植至关重要。
后面我会根据一个简单的显示应用来剖析内核中drm驱动的调用逻辑。