https://www.wpgdadatong.com/cn/blog/detail?BID=B1134 【ATU Book-i.MX8系列】 NXP i.MX8M Mini 環境建置

https://www.wpgdadatong.com/cn/blog/detail?BID=B1389【ATU Book-i.MX8系列】 UUU(Universal Update Utility)

https://www.wpgdadatong.com/cn/blog/detail?BID=B1870【ATU Book-i.MX8系列】 NXP i.MX8M Mini DRM driver解析(Part 2)

1. DRMDirect Rendering Manager

  • 簡介

在早期的 Linux display 子系統中,我們常以 FB(Frame Buffer)做為主要的框架;只要有一個 Frame Buffer,我們就可以在顯示屏幕上秀出各種資訊。但隨著硬體不斷的快速演進,DRM(Direct Rendering Manager)更能配合硬體的功能,相比之下,FB 就顯得不足以應付現有的需求。比方說,FB 不支援 overlay 的概念、不支援 hw cursor … 等等,這些以往都得在 user space 操作。所以現今 Linux 平台上開發的研發人員,已經開始使用 DRM 來取代 FB,就是因為 DRM 子系統在 kernel space 都可以幫忙處理這些事情,從下圖可以簡單看出,FB 以及 DRM 之間在架構上主要的差異。

而本文將以 i.MX8M Mini EVK 平台,介紹 DRM driver 是如何把 MIPI DSI panel 或是 MIPI DSI to HDMI bridge 註冊上子系統並且將整個 display 子系統 bring up 的整個過程。了解這部分可以幫忙開發人員在初期還點不亮 panel 的情況下,更有系統的看懂 log 上所提示的錯誤並且有效的進行 debug。


FB vs. DRM(參考文件 I.)
  • 名詞解釋
  • Frame Buffer:用於描述顯示區塊的 format、pitch、size 等,但不負責存放實際的顯示資料。
  • CRTC:CRT Controller,主要負責 Frame Buffer 的更新(resolution、timing 的配置),並送給 encoder。
  • Planes:影像數據源,每個 CRTC 都至少有一個或多個 plane,可進行 overlay、cursor。
  • Encoder:將像素編碼打包成 Connector 所需要的格式,再送給 Connector。
  • Connector:對應物理的介面,比如說:MIPI、HDMI,當前物理設備的訊息會存在 Connector 裡面(訊息包括連接狀態、EDID、可支援的 mode)。
  • 軟體架構

接下來看一下 DRM 的軟體架構。在用戶空間,DRM 與其他 driver 不同,它把自己封裝成了一個 libdrm,取代一般常用的 IOCTL,藉此來提供使用者更方便更直覺的操作。後面的章節我們會簡單介紹一個 app,示範如何利用 libdrm 進行圖像顯示的一連串操作。

另一方面,在 kernel 端 DRM driver 分為兩大塊,一個是 GEM(Graphics Execution Manager),負責提供 Frame Buffer 的記憶體管理,這也是 GPU 會利用到 DRM 的地方。GEM 在本文中暫時不會提到太多;另一個是 KMS(Kernel Mode Setting),負責選擇並設置所連接的螢幕本身提供的所謂的〝mode〞,這些設定包括 resolution、color depth 以及 refresh rate。這部分將會是本文的重點,在後面的章節裡面我們會細談。

DRM SW arch from Wiki

  • 小結

綜合以上三個小章節,另外補充說明一下所謂的 KMS 就是由 CRTC、Planes、Encoder、Connector 所組成,所以整個架構就可以串起來了。而 KMS 利用這幾個元件的相互合作,達到 mode setting 的功用。如果再進一步說明,所謂的 mode setting 做的事情就是〝更新畫面〞和〝設定 display 參數〞。

  1. 更新畫面 :page-flip、overlay
  2. 設定 display 參數 :resolution、color depth、refresh rate

2. Linux DRM driver 解析

  • Superdevice

DRM 類似 ALSA 是一個牽扯到許多子元件所組成的顯示子系統,所以會以〝顯示卡〞來做表示。而這張代表著整個子系統的顯示卡在 device tree 會以一個 superdevice(display-subsystem) 展現,如下面程式碼所示,並以此管理著所有的子元件。每一個新加入的子元件都會被檢視是否匹配,最後當 superdevice 收集到所有的子元件之後,便會觸發一連串初始化的動作來綁定並帶起整個顯示子系統。

  1. superdevice(display-subsystem),而此處的 “ports” 將說明於後續章節。

  • 建立 masterimx_drm_core 

Superdevice 的 probe function 可參考下圖,透過 drm_of_component_probe_with_match() 可以將 CRTC 以及它有效的 remote endpoint 都添加到 match list 上。如果從 device tree 來查看,在這個例子裡面,CRTC 就是 lcdif,而它有效的 remote endpoint 是 dsim_from_lcdif,所以 lcdif 以及 dsim_from_lcdif 都會被加在 match list 裡面。另外,在這個 probe function 裡面,最後會呼叫 component_master_add_with_match() 來建立一個 master,之前的 match list 也會儲存在 master 裡,並且呼叫 try_to_bring_up_master() 嘗試做第一次 bring up。每一次的 bring up 不一定會成功,在此之後的每一個子元件加入都會重新呼叫 try_to_bring_up_master() 嘗試進行 bring up 動作,但是只有當所有的子元件都 ready 了之後,master 才會被 bring up。

  • 前半段以 superdevice device tree 裡的 ports 綁定 crtc,並加入到 match list 中

  • 後半段可搭配下面 device tree,remote endpoint 為 dsim_from_lcdif,同樣加入 match list 中

  • 最後嘗試 bring up master

  • 新增 Encoder – i.MX MIPI DSI Host Controllersec_mipi_dsim-imx

此小節新增 MIPI DSI Host,它在 device tree 的結構可參考如下。一端與角色為 CRTC 的 lcdif 連接,另一端列舉兩個例子,一個是在原廠預設的 dts 裡可以看到 adv7535,所以可以與 HDMI panel 連接;另一個範例連接了一片 MIPI DSI 的 panel,不論是哪一種選擇,都可以看得出來 MIPI DSI Host 的位置是一個 Encoder 的角色。

選擇 1:fsl-imx8mm-evk-rm67191.dts,對接一片 MIPI DSI panel:

選擇 2:原廠預設 fsl-imx8mm-evk.dts,對接 adv7535 bridge,可以連接 HDMI panel。

再來看 mipi dsi 的 driver,sec_mipi_dsim-imx 的 probe function 會呼叫 component_add() 將 device 加入 component list 裡面,並且如前面章節所描述的,使用 try_to_bring_up_masters() 來嘗試 bring up master。


  • 新增 CRTC – LCDIF DRM CRTClcdif-crtc

同理,不過此小節新增的是 CRTC,它在 device tree 的結構可參考如下,它會與角色為 Encoder 的 mipi_dsi 連接,這也呼應前面小節所談到的。

另外,driver 的部分也是同前一小節,lcdif-crtc 的 probe function 會呼叫 component_add() 將 device 加入 component list 裡面,並嘗試 bring up master。但不同的是,這裡因為 match 與 component 在 find_components() 裡發現匹配成功,所以會進行 bring up master,呼叫 master 的 imx_drm_ops 的 bind function。

  • 匹配成功,進行 bring up master,呼叫 master 的 bind function

3. 未完待續

這篇博文簡單的介紹了 DRM driver 的準備工作,真正的重頭戲還在後面。備好了這些子元件之後,DRM driver 是如何使這些元件互相綁定完成初始化,進而寫一支測試程式來做一個簡單的繪圖並顯示等等之類的內容,我們將在下一篇博文裡繼續介紹。

4. 參考文件

  • https://events.static.linuxfound.org/sites/events/files/slides/brezillon-drm-kms.pdf
  • https://blog.csdn.net/hexiaolong2009/category_9281458.html
  • https://blog.csdn.net/qq_33487044/category_8454463.html
  • DRM wiki (https://en.wikipedia.org/wiki/Direct_Rendering_Manager)
  • Linux DRM 原始碼
  • http://betteros.org/tut/graphics1.php

【ATU Book-i.MX8系列】 NXP i.MX8M Mini DRM driver解析(Part 1)相关推荐

  1. [ 物联网篇 ] 11 - NXP i.MX8M Mini 集成Mender OTA解决方案

    i.MX8M Mini OTA方案介绍 参考收集中的资料,介绍SWupdate 和 Mender 的区别,以及应用场景 代码下载 代码下载 repo init -u https://source.co ...

  2. i.MX8M Mini与i.MX6的一些比较分析

    在NXP i.mx8系列发布前,imx6系列一直是nxp imx系列的主力军,应用于工业物联.数据采集.车载产品等领域.在万物互联时代,对产品有了进一步的要求,更多的设备,更快的处理速度.更低的能耗, ...

  3. I.MX8M mini物联网开发板框架及屏幕接口详解

    本文由用户robe.zhang发表于电路城论坛试用板块  主要内容: 1.imx8m mini 框架 2.核心板系统框架 3.开发板系统框架 4.屏幕接口详解 5.总结 1.imx8m mini 框架 ...

  4. 高性能 低功耗Cortex-A53核心板 | i.MX8M Mini

    基于 NXP i.MX8M Mini四核64位处理器设计,主频最高1.8GHz,ARM Cortex -A53架构,集成2GB或4GB LPDDR4:CPU采用先进的14nm工艺,提供更高效的电源管理 ...

  5. i.MX8m mini核心板及开发板介绍(MYC-C8MMX)

    近几年来,随着AIOT技术的演进,智能充电桩.智慧灯杆.广告机.新零售自动售货/售票机.人机互动查询及业务办理机.车联网及V2X等设备开始走入人们的生活.在工业4.0的趋势下,泛在电力物联网.高性能仪 ...

  6. 基于NXP i.MX8M处理器的MYC-JX8MX核心板-米尔电子

    高性能嵌入式核心板新标杆!米尔推出基于NXP i.MX8M处理器的MYC-JX8MX核心板 随着嵌入式及物联网技术的飞速发展,高性能计算的嵌入式板卡已经成为智能产品的基础硬件平台.为响应行业应用和满足 ...

  7. NXP i.MX8M Plus赋能边缘机器学习,启扬IAC-IMX8MP-Kit开发板

    云计算.边缘计算和机器视觉越来越多地应用在工业和消费系统中,NXP推出先进的i.MX8M Plus应用处理器,将用于机器学习加速的神经处理单元(NPU).图像信号处理器(ISP).GPU集成在处理器上 ...

  8. 《ASP.NET Core In Action》读书笔记系列五 ASP.NET Core 解决方案结构解析1

    <ASP.NET Core In Action>读书笔记系列五 ASP.NET Core 解决方案结构解析1 参考文章: (1)<ASP.NET Core In Action> ...

  9. 【ABAP系列】SAP ABAP SY-SUBRC的含义解析

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP SY-SUBR ...

最新文章

  1. 011_fastdfs-client-java模块
  2. Exchange server 2003迁移到2010之升级默认地址簿及地址策略
  3. 解决网络通信中外网和内网之间的通信问题(NAT转换)
  4. php查询一对多,PHP并输出一对多结果
  5. IntelliJ IDEA for Mac在MacOS模式下的版本控制/本地历史记录快捷键(VCS and Local History Shortcut)
  6. 通州区机器人比赛活动总结_马驹桥镇中心小学在2017通州区青少年机器人竞赛中勇创佳绩...
  7. 图表graph之增加曲线
  8. webservice studio 参数是DataSet时不支持中文 解决方法
  9. Python捕捉命令输出、错误输出及赋值命令到变量的方法
  10. Redhat 国内Yum源配置
  11. Python学习,55道django面试题,来试试吧
  12. 如何让Ubuntu联网
  13. gitlab CI CD
  14. mysql 多数据源配置文件_Spring+MyBatis多数据源配置实现
  15. html 分页样式首页下一页,css中分页样式怎么设置
  16. 用C#设计在局域网发送短信的程序
  17. PHP的优势是什么?
  18. Qt desinger如何使用qrc资源文件
  19. 【RESTful】REST 与 RESTful 理解与实践
  20. Centos查看端口及防火墙

热门文章

  1. 功率电感dcr参数_功率电感的性能参数六大标准,贴片电感有什么作用?
  2. 第一批吃螃蟹的人:浙大全日制英文MBA复试经验分享
  3. 实现html播放ppt的炫酷效果
  4. vue地球围着太阳转
  5. 三分钟详述如何实现像素风格Shader
  6. 常耀俊老师经典《企业级PMO的建设和管理——理论体系和最佳实践》课程
  7. sql_insert_2017/11/1
  8. 物联网系统源码 智慧物联网源码
  9. 【Python实战】入门级都能学懂的Python爬虫之仅需8行代码一键免费下载音乐,听歌自由真这么简单?
  10. 【前端模糊查询】vue用elementul表格,前端写模糊查询功能,简单实现方法