首页 > 编程知识 正文

驱动芯片制程,程序如何驱动

时间:2023-05-05 23:43:37 阅读:119944 作者:1443

! 发表声明!

本文由zjddg修改而来

链接: https://blog.csdn.net/he Xiaolong 2009/article/details/89810355

只为了学习备份而转载。

前言在前面的《最简单的DRM应用程序》系列文章中,您学习了如何使用libdrm界面创建DRM APP应用程序。 从本篇开始,我们将进入一个全新的世界,一起学习如何在kernel空间中编写DRM驱动程序。

在开始创建ObjectsDRM驱动程序之前,必须介绍DRM内部的Objects。 这些Objects是DRM框架的核心,因此是不可缺少的。

上图中的蓝色部分是物理硬件的抽象,黄色部分是软件的抽象。 虚线以上是drm_mode_object,虚线以下是drm_gem_object。

以前,我们在《DRM(Direct Rendering Manager)学习简介》中简要介绍了这些objects,但作为本篇的重点,我认为需要再强调一下这些objects的概念:

对象是crtcRGB信号源(TCON )、显示控制器(planeDisplay Controller )数据源通道、每个crtc至少一个planeencoderRGB信号转换器(DDB ) 控制显示设备休眠唤醒的连接器是可以获取显示参数的所有硬件设备,而与编码器协作的framebuffer通常是格式、pitch和encoder 无需负责分配显示内存,即可释放propertyatomic操作的基础,所有要更改的参数都可以是PC

从上图可以看出,plane是连接帧缓冲器和crtc的纽带,而编码器是连接crtc和连接器的纽带。 与物理缓冲器直接交互的是gem而不是框架缓冲器。

需要注意的是,上图蓝色部分即使没有实际的硬件与之对应,在软件驱动中也需要实现这些 objects,否则 DRM 子系统无法正常运行。

drm_panel drm_panel不是对象的范畴,它只是回调函数的集合。 但是,其存在降低了LCD驱动和编码器驱动之间的耦合度。

生成联轴器:

)1)连接器的主要作用是获取显示参数,因此用液晶屏驱动构建连接器对象。 但是,连接器初始化需要attach上的encoder object,该encoder object经常由单独的硬件驱动程序生成,为了访问该encoder object,必须将它们组合在一起

(2)编码器除了信号转换外,还承担向显示设备通知休眠唤醒的角色。 因此,当编码器通知液晶屏驱动程序执行相应的启用/禁用操作时,它总是调用液晶屏驱动程序导出的全局函数,这也总是生成一些耦合代码。

为了解决该耦合问题,DRM子系统向开发者提供了drm_panel结构,该结构封装了连接器编码器访问LCD的常用接口。

于是,原来编码器驱动与LCD驱动间的耦合成为上图的编码器驱动与drm_panel、drm_panel与LCD驱动间的"耦合"

小技巧:

为了方便驱动程序的设计,通常将encoder和connector放入同一驱动程序中进行初始化。即 encoder 在哪,connector 就在哪。

如何抽象硬件不是DRM中的对象的概念,而是如何构建这些对象与实际硬件之间的对应关系。 这是因为并非所有的显示硬件都能够很好地应对plane/crtc/encoder/connector等对象。 让我们一起学习如何在具体的DRM object中抽象和显示硬件。

MIPI DSI接口下图是典型MIPI DSI接口屏幕的硬件连接框图。

与软件体系结构上的DRM object的对应关系如下图所示。

的详细信息不作介绍,但这里将解释为什么这样分配drm object :

object说明crtcRGB timing的生成和显示数据的更新,需要访问Dislay Controller硬件寄存器,因此放在Dis上

play Controller 驱动中plane对 Overlay 硬件的抽象,同样需要访问 Display Controller 寄存器,因此也放在 Display Controller 驱动中encoder将 RGB 并行信号转换为 DSI 串行信号,需要配置 DSI 硬件寄存器,因此放在 DSI Controller 驱动中connector可以通过 drm_panel 来获取 LCD 的 mode 信息,但是 encoder 在哪,connector 就在哪,因此放在 DSI Controller 驱动中drm_panel用于获取 LCD mode 参数,并提供 LCD 休眠唤醒的回调接口,供 encoder 调用,因此放在 LCD 驱动中

驱动参考:https://elixir.bootlin.com/linux/latest/source/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c

MIPI DPI 接口

DPI 接口也就是我们常说的 RGB 并行接口,Video 数据通过 RGB 并行总线传输,控制命令(如初始化、休眠、唤醒等)则通过 SPI/I2C 总线传输,比如早期的 S3C2440 SoC 平台。下图为一个典型的 MIPI DPI 接口屏的硬件连接框图:

该硬件连接在软件架构上与 DRM object 的对应关系如下图:

多余的细节不做介绍,这里只说明为何如此分配 drm object:

object说明crtcRGB timing的产生,以及显示数据的更新,都需要访问 LCD Controller 硬件寄存器,因此放在 LCD Controller 驱动中planeLCDC 没有 Overlay 硬件,它只有一个数据源通道,被抽象为 Primary Plane,同样需要访问 LCDC 硬件寄存器,因此放在 LCDC 驱动中encoder由于 DPI 接口本身不需要对 RGB 信号做任何转换,因此没有哪个硬件与之对应。但是 drm objects 又缺一不可,因此实现了一个虚拟的 encoder object。至于为什么要放在 LCDC 驱动中实现,纯粹只是为了省事而已,你也可以放在一个虚拟的平台驱动中去实现该 encoder object。connectorencoder 在哪,connector 就在哪,没什么好说的了drm_panel用于获取 LCD mode 参数,并提供 LCD 休眠唤醒的回调接口,供 encoder 调用,因此放在 LCD 驱动中

驱动参考:https://elixir.bootlin.com/linux/v5.0/source/drivers/gpu/drm/panel/panel-sitronix-st7789v.c

MIPI DBI 接口

DBI 接口也就是我们平时常说的 MCU 或 SPI 接口屏,这类屏的 VIDEO 数据和控制命令都是通过同一总线接口(I80、SPI接口)进行传输,而且这类屏幕必须内置 GRAM 显存,否则屏幕无法维持正常显示。

下图为一个典型的 DBI 接口屏的硬件连接框图:

该硬件连接在软件架构上与 DRM object 的对应关系如下:

上图参考 kernel4.19 tinydrm 软件架构。

object说明crtc这类硬件本身不需要任何 RGB timing 信号,因此也没有实际的硬件与之对应。但是 drm objects 缺一不可,需要实现一个虚拟的 crtc object。由于更新图像数据的动作需要通过 SPI 总线发送命令才能完成,因此放在了 LCD 驱动中plane没有实际的硬件与之对应,但 crtc 初始化时需要一个 plane object 作为参数传递,因此和 crtc 放在一起encoder没有实际的硬件与之对应,使用虚拟的 encoder object。因为这类硬件并不是将 RGB 信号转换为 SPI 信号,而是根本就没有 RGB 信号源,也就无从谈起 encoder 设备。但是为了通知 LCD 休眠唤醒,需要调用 LCD 驱动的相应接口,因此放在 LCD 驱动中connector由于没有了 drm_panel,需要调用 LCD 接口来获取 mode 参数,因此放在 LCD 驱动中

驱动参考:https://elixir.bootlin.com/linux/latest/source/drivers/gpu/drm/tinydrm/ili9341.c

总结 这 7 个 objects 缺一不可framebuffer 只是负责描述显存信息,gem 则负责显存的分配/释放等操作encoder 在哪里,connector 就在哪里

在下一篇文章中,我们将开始真正动手编写一个《最简单的 DRM 驱动程序》,尽情期待!

往期回顾:

DRM (Direct Rendering Manager) 学习简介

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。