0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

以xc7z010 SOPC为例的DRM-KMS方案分析

电子设计 来源:Nick 作者:Nick 2020-12-04 12:04 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

作者:Nick

在上一小节Linux GUI加速(1)_GUI系统概述》中,我们从应用层到kernel层大致分析了linux中的图形界面的构成,并在最后给出了kernel中DRM+KMS的软件显示框架以及accelerate logic+framebuffer+displayport的硬件结构。在这一子篇会将这两块内容详细展开。

本篇主要以Xilinx的xc7z010 的SOPC(zybo的开发板)为硬件平台,在以下几方面介绍:

① 以zynq 7000的逻辑资源(PL)搭建CRTC/Encoder/Connector硬件模块,以HDMI输出接口为例,介绍各个模块的接口特性(Framebuffer对应着物理的DDR部分);

② 会先给出DRM+KMS驱动框架下的主要模块,并针对上述硬件子模块分析对应的内核驱动部分;

DRI在片上系统的硬件构成

在各类SOC上,CRTC+Endode+Connector一般是集成在一个外设模块挂在系统总线上,以ARM为例,CRTC/Endoder等需要配置的外设模块,配置接口挂在APB总线,数据接口直接在AHB总线上,实现和Framebuffer的高速通信

我们按照connector-->encoder-->crtc-->framebuffer的顺序倒过来介绍吧。

Connector

Connector其实就是和显示器连接的物理接口,常见的有VGA/HDMI/DVI/DP等。以HDMI为例,HDMI的接口信号主要由以下几组信号组成:

① 1组TMDS clock:差分时钟用于同步信号驱动;
② 3组TMDS data:查分数据传输视频信号;
③ 1组I2C:用于EDID的获取;
④ 1组音频总线;

(注:EDID全称是Extended Display Identification Data(扩展显示标识数据),目的是让视频信号输出设备输出前获取到存储在显示器内部的相关参数,如支持的分辨率、帧率、图像格式:RGB等,因此,整个输出的控制参数是由以下几个部分综合决定的:

①通过connector读出的显示器支持的参数;
② 内核静态配置或devicetree传入的参数;
③ 用户空间输入的参数)

HDMI类型的connector的任务就是输出显示器解码芯片所需的信号时序(主要是TMDS clock以及TMDS data)。

Encoder

Encoder比较好理解,在此处其实就是将一定格式的图像信号(如RGB、YUV等)编码成connector需要输出的信号。以HDMI为例,帧/行同步/显示内容都是通过TMDS data的串行总线输出的,那么并行的时序按照HDMI的标准编码为串行顺序则是Encoder的任务;

在本片中的XC7Z010 SOPC中Encoder+Connector如下:


CRTC

CRTC的任务是从Framebuffer中读出待显示的图像,并按照相应的格式输出给Encoder(本处的CRTC功能受限,相关格式配置只能通过配置硬件IP参数来改变,而不能通过内核)。在本例中,CRTC的硬件构成如下:

① AXI Video Direct Memory Access IP,通过AXI4总线获取DDR中Framebuffer数据,转为video-stream流格式的图像信息;

② Video Timing Controller IP,根据内核相应配置输出与视频流匹配的帧、行同步信号;

③ AXI4-Stream to Video Out IP,将串行视频流转化为指定格式(IP配置)、指定分辨率(内核配置)的时序;

如下图:


Planes

Plane其实就是图层,实际输出的图像往往由多个图层叠加而成(想象一下photoshop的过程),比如主图层,显示光标的图层,其中有些图层由硬件加速模块生成,本例中不涉及,因此所有plane的相关操作都由软件实现,不涉及到任何硬件结构。

Framebuffer

Framebuffer对应着存储空间中的图像数据,此处对应硬件为DDR。

麻雀虽小,五脏俱全,次例程中的显示框架非常简单,但也包含了Framebuffer、CRTC、Planes、Encoder、Connector5个组件,片内硬件结构如下:


(PS:Dynamic Clock Generator生成显示子系统中各组件所需的驱动时钟,由Linux中的common clock framework统一管理)

DRI在Linux Kernel内的软件构成

按照DRI中几个组件分别介绍。

Framebuffer

我们知道Framebuffer是存储待显示图像信息的空间,因此,Framebuffer相关驱动中也就是对内存的操作,也就涉及到下面两个部分:
① 对内存的管理(如GEM,for Graphics Execution Manager)
② 内存中数据的更显方式(如DMA等)

对于第一点,GEM主要完成的事情是:
① 对图像内存(显存)的空间开辟、释放;
② 不同硬件对同一显存资源访问下的管理;

在Linux Kernel下的默认实现方式是CMA(Contiguous Memory Allocator)实现的,内核中对应代码是:

drivers/gpu/drm/drm_fb_cma_helper.c

这里稍微提一下CMA,CMA是个好东西,不仅在显存管理中有应用,在所有软硬件协 同处理中同样起这重要的作用。在一般的硬件(片内硬件加速模块)加速方案中,一般实现方式如下:

① linux kernel通过device-tree传入CMA配置所需的配置参数供CMA开辟相应的物理内存 空间(不被Cache到),并且相应的信息(物理空间首地址,size等)通过/dev/device 映射到用户空间;

② DMA可以将加速模块预处理后的数据,根据已知参数(开辟的物理地址),传递到共享空间中供软件访问;


struct drm_framebuffer{
[...]
const struct drm_format_info *format;
[...]
}

• format用于描述内存空间的组成,使用FOURCC(four-character code)制式,结构体中的pitch、offset 4个元素分别用于计算FOURCC4个图层中的内存长宽参数;(width和height用于描述显示的长宽参数);

• DRI中支持下面这三种格式图像:
① RGB:R/G/B分别存于不同的图层中;
② YUV:不同压缩格式下的YUV存储方式不一;
③ C8:通过存储一块映射到RGB的映射表来实现图像信息存储;

framebuffer中在不同格式下所需要处理的图层的数量不一,具体的显存处理、格式解析主要在下列源码表中:

(显存管理)

drivers/gpu/drm/drm_framebuffer.c

drivers/gpu/drm/drm_gem.c

drivers/gpu/drm/drm_gem_cma_helper.c

drivers/gpu/drm/drm_fb_cma_helper.c

drivers/gpu/drm/drm_fb_framebuffer_helper.c

drivers/gpu/drm/drm_fb_fourcc.c

drivers/gpu/drm/drm_fb_cma_helper.c

drivers/gpu/drm/drm_fb_cma_helper.c

drivers/gpu/drm/drm_fb_cma_helper.c

(显存更新驱动接口)

drivers/gpu/drm/ati_pcigart.c

drivers/gpu/drm/ati_agpsupport.c

CRTC

CRTC虽然字面上意思为阴极射线显像管控制器,但CRT在普通显示设备中早已被淘汰,DRI中CRTC主要承担的作用:
① 配置适合显示器的分辨率(kernel)并输出相应时序(hardware logic);
② 扫描framebuffer送显到一个或多个显示设备中;
③ 更新framebuffer;

上述功能的主要通过struct drm_crtc_funcs和struct drm_crtc_helper_funcs这两个描述符实现:



drm_crtc_funcs中的两个重要句柄set_config和page_flip,其中,

set_config主要任务是:
① 更新待送显的framebuffer中数据;
② 根据(之前说的EDID读出支持的配置,device-tree对内核的配置以及用户空间的配置)参数配置软件参数并控制相应的寄存器(在本例中的VDMA及VTC的行列像素值等寄存器);
③ 将Encoder和connector的信息送给CRTC模块。

page_flip解决的问题很简单:

• 必须得保证CRTC在读取framebuffer的时候,framebuffer里的帧不会被修改而产生窜帧的情况,采用的解决方式也是软硬件异构处理时常见的乒乓缓存的方式。


当page_flip完成后,会通过event通知用户层准备好下一帧的数据;

Planes

不涉及到GPU的话,planes没有那么复杂,主要是负责:
• 主图层;
• 移动光标图层;
• 覆盖图层;

的创建、更新、销毁,其中图层的更新(多个图层的叠加),通过struct中的drm_plane_funcs来实现。


比较形象的例子如下:


Connector & Encoder

由于Connector和Encoder是SOC与外设直接打交道的地方,因此对应着不同SOC也是驱动适配修改最频繁的地方。DRI中这两块通过适配struct drm_connector_helper_funcs和struct drm_encoder_helper_funcs来实现。

Linux Kernel中的DRM+KMS中涉及到的点太多,由于能力和时间问题,没能遍历一遍,只能根据自己认为的重点讨论一边,但有些点我认为比较重要的,但没能深入了解,比如:

• 硬件graphic加速和DRM的交互逻辑
• CRTC的Atomic刷新机制的具体实现方式等,如果大家能够交流一下自己的理解,那再好不过了。

编辑:hfy


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • HDMI
    +关注

    关注

    34

    文章

    1876

    浏览量

    158935
  • Xilinx
    +关注

    关注

    73

    文章

    2193

    浏览量

    130057
  • Dri
    Dri
    +关注

    关注

    0

    文章

    13

    浏览量

    15677
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    PCIe接口卡设计原理图:124-基于XC7Z015的PCIe低速扩展底板

    板卡由SoC XC7Z015芯片来完成卡主控及数字信号处理,XC7Z015内部集成了两个ARM Cortex-A9核和一个Artix 7的FPGA,通过PL端FPGA扩展PMC接口、用于扩展震动、噪声、生物信息、加速度等低速信息
    的头像 发表于 10-22 10:42 531次阅读
    PCIe接口卡设计原理图:124-基于<b class='flag-5'>XC7Z</b>015的PCIe低速扩展底板

    DRM Kit数字版权保护服务介绍

    DRM Kit (Digital Rights Management Kit,数字版权保护服务)提供了DRM加密节目授权解密的功能,包括DRM插件管理、DRM证书管理、
    的头像 发表于 10-15 13:58 428次阅读
    <b class='flag-5'>DRM</b> Kit数字版权保护服务介绍

    CW32L01x系列MCU驱动TFT屏的应用方案

    CW32L01x系列MCU应用广泛,本文将详细介绍CW32L01x系列MCU驱动TFT屏的应用方案。我们CW32L010系列MCU来介
    的头像 发表于 10-14 10:18 876次阅读
    CW32L01x系列MCU驱动TFT屏的应用<b class='flag-5'>方案</b>

    倾佳电子B3M010C075Z碳化硅MOSFET深度分析:性能基准与战略应用

    倾佳电子B3M010C075Z碳化硅MOSFET深度分析:性能基准与战略应用 倾佳电子(Changer Tech)是一家专注于功率半导体和新能源汽车连接器的分销商。主要服务于中国工业电源、电力
    的头像 发表于 10-09 18:06 669次阅读
    倾佳电子B3M<b class='flag-5'>010C075Z</b>碳化硅MOSFET深度<b class='flag-5'>分析</b>:性能基准与战略应用

    示波器如何设置延迟功能? 横河DL950

    诚然在测量途中延迟的出现固然会引起不必要的误差,但如果我们能换个思路就会发现延迟亦不失衡量测试精度的一大标尺。横河示波器DL950,作为一款备受好评的高精度示波器其delay功
    的头像 发表于 07-08 16:43 1310次阅读
    示波器如何设置延迟功能? <b class='flag-5'>以</b>横河DL950<b class='flag-5'>为</b><b class='flag-5'>例</b>

    EtherCAT与Profinet协议转换在工业自动化中的应用:汇川伺服驱动器

    在工业自动化领域,实现不同协议设备间的无缝通信是提升生产效率的关键。EtherCAT主站通过Profinet网关连接汇川伺服驱动器的场景,这一技术组合不仅解决了异构网络协同的难题,更通过精准的速度控制为生产线注入了智能化动
    的头像 发表于 07-08 15:49 643次阅读
    EtherCAT与Profinet协议转换在工业自动化中的应用:<b class='flag-5'>以</b>汇川伺服驱动器<b class='flag-5'>为</b><b class='flag-5'>例</b>

    基于CW32L010的高性能温控器方案

    武汉芯源半导体的明星产品CW32L010系列MCU凭借其ARM Cortex-M0+内核、超低功耗特性以及丰富的外设接口,温控器设计提供了理想的解决方案。 本文将介绍无锡梓轩电子基于武汉芯源半导体低功耗CW32L
    的头像 发表于 07-02 09:47 1001次阅读
    基于CW32L<b class='flag-5'>010</b>的高性能温控器<b class='flag-5'>方案</b>

    基于CW32L010的高性能温控器方案

    Cortex-M0+内核、超低功耗特性以及丰富的外设接口,温控器设计提供了理想的解决方案。 本文将介绍无锡梓轩电子基于武汉芯源半导体低功耗CW32L010单片机开发的温控器方案,功
    发表于 07-02 09:46

    基于 ROS + ADI 芯片方案 的 人形机器人子系统级BOM清单(腿部子系统

    基于 ROS + ADI 芯片方案 的 人形机器人子系统级BOM清单 ( 腿部子系统 ),包括核心感知、执行与通信模块,配合主控系统通过 ROS2 实现分布式控制与状态反馈。 一
    的头像 发表于 06-17 17:06 1572次阅读

    基于CW32L010单片机的扫振一体电动牙刷应用方案

    大幅摆动实现了高效的刷牙方式,这种设计能够更高效地清洁牙齿和牙龈沟,用户带来全新的洁牙体验‌。本文将介绍武汉芯源半导体CW32L010单片机在扫振一体电动牙刷上的应用方案。 图1:电动牙刷
    发表于 06-17 09:38

    突破性能边界:基本半导体B3M010C075Z SiC MOSFET技术解析与应用前景

    取代传统硅基器件。基本半导体推出的B3M010C075Z750V SiC MOSFET,通过创新设计与先进工艺,实现了功率密度与能效的跨越式突破,下一代电力转换系统树立了新标杆。 一、核心技术亮点:重新定义功率器件性能边界 超低导通损耗 采用银烧结工艺强化散热路径,在1
    的头像 发表于 06-16 15:20 651次阅读
    突破性能边界:基本半导体B3M<b class='flag-5'>010C075Z</b> SiC MOSFET技术解析与应用前景

    DeepSeek企业级部署服务器资源计算 raksmart裸机云服务器

    RakSmart裸机云服务器,针对DeepSeek企业级部署的服务器资源计算指南,涵盖GPU/CPU/内存/存储/网络等核心维度的详细计算方法与配置推荐,主机推荐小编为您整理发布
    的头像 发表于 03-21 10:17 835次阅读

    华为发布AI中心的网络解决方案

    在MWC25巴塞罗那期间举办的产品与解决方案发布会上,华为董事、ICT BG CEO杨超斌发布了AI中心的网络解决方案(AI-Centric Network)。
    的头像 发表于 03-05 10:02 973次阅读

    HEU_KMS_Activator_42.0.1系统激活工具

    电子发烧友网站提供《HEU_KMS_Activator_42.0.1系统激活工具.exe》资料免费下载
    发表于 02-17 16:23 1次下载

    ADS1146的外接时钟,4.096MHZ,这个时钟频率是用来决定采样频率的么?

    读了数据手册后,有如下的困惑:(ADS1146) 1、可以通过产生一个START的脉冲来启动一次AD转换,或者将START持续拉高进行连续的AD转换,这两种操作方式和通过SPI写入控制命令
    发表于 02-07 08:04