设为首页收藏本站
查看: 1006|回复: 2

【米尔瑞萨RZ/G2L开发板-创新应用】基于DRM的Linux显示系统--drop

[复制链接]

9

主题

15

回帖

165

积分

注册会员

积分
165
slamdunk 发表于 2023-9-10 23:01:44 | 显示全部楼层 |阅读模式

modeset-src.zip

21.03 KB, 下载次数: 445

libdrm.so.zip

229.5 KB, 下载次数: 425

回复

使用道具 举报

9

主题

15

回帖

165

积分

注册会员

积分
165
 楼主| slamdunk 发表于 2023-9-11 09:46:29 | 显示全部楼层
回复 支持 反对

使用道具 举报

9

主题

15

回帖

165

积分

注册会员

积分
165
 楼主| slamdunk 发表于 2023-9-11 09:47:26 | 显示全部楼层
slamdunk 发表于 2023-9-11 09:46
1、Linux Graphic框架

Linux图形栈简单来说可以分为用户空间程序和kernel空间的驱动两个部分。

1、Linux Graphic框架

Linux图形栈简单来说可以分为用户空间程序和kernel空间的驱动两个部分。
其中用户空间包括libdrm库和基于libdrm的APP
kernel空间主要是图显驱动和buffer的管理。



1.1 DRM简介
Direct Rendering Manager(DRM)是linux内核子系统,负责与显卡交互。 DRM提供一组API,用户空间程序可以使用该API将命令和数据发送到GPU并执行诸如配置显示器的模式设置之类的操作。

DRM位于内核空间中,因此用户空间程序必须使用内核系统调用来请求其服务。DRM检测到的每个GPU都称为DRM设备,并创建了一个设备文件/dev/dri/cardX节点,并使用ioctl调用与DRM进行通信。不同的ioctl对应于DRM API的不同功能。DRM提供了libdrm库,以方便用户空间程序与DRM子系统交互。

基于DRM的Linux显示系统,从APP到底层的大概结构如下图所示。


1.2 DRM和FB框架的区别
DRM是Linux目前主流的图形显示框架,相比FB架构,DRM更能适应当前日益更新的显示硬件。 比如FB原生不支持多层合成,不支持VSYNC,不支持DMA-BUF,不支持异步更新,不支持fence机制等等, 而这些功能DRM原生都支持。同时DRM可以统一管理GPU和Display驱动,使得软件架构更为统一,方便管理和维护。





本文主要涉及:
1)移植libdrm到rzg2l开发板
2)基于libdrm编写测试APP
3)移植LVGL图形界面

2、移植libdrm


2.1 下载libdrm源码
git clone git://anongit.freedesktop.org/mesa/drm
  1. drm$ tree -L 1
  2. .
  3. ├── amdgpu
  4. ├── android
  5. ├── Android.common.mk
  6. ├── Android.mk
  7. ├── CleanSpec.mk
  8. ├── CONTRIBUTING.rst
  9. ├── core-symbols.txt
  10. ├── data
  11. ├── etnaviv
  12. ├── exynos
  13. ├── freedreno
  14. ├── gen_table_fourcc.py
  15. ├── include
  16. ├── intel
  17. ├── libdrm_lists.h
  18. ├── libdrm_macros.h
  19. ├── libdrm.pc.in
  20. ├── libsync.h
  21. ├── Makefile.sources
  22. ├── man
  23. ├── meson.build
  24. ├── meson_options.txt
  25. ├── nouveau
  26. ├── omap
  27. ├── radeon
  28. ├── README.rst
  29. ├── RELEASING
  30. ├── symbols-check.py
  31. ├── tegra
  32. ├── tests
  33. ├── util_double_list.h
  34. ├── util_math.h
  35. ├── vc4
  36. ├── xf86atomic.h
  37. ├── xf86drm.c
  38. ├── xf86drm.h
  39. ├── xf86drmHash.c
  40. ├── xf86drmHash.h
  41. ├── xf86drmMode.c
  42. ├── xf86drmMode.h
  43. ├── xf86drmRandom.c
  44. ├── xf86drmRandom.h
  45. └── xf86drmSL.c

  46. 15 directories, 28 files
复制代码
2.2 配置libdrm
新建一个cross_file.txt,meson --cross-file指定使用这个cross_file.txt
  1. [binaries]
  2. c = 'aarch64-poky-linux-gcc'
  3. cpp = 'aarch64-poky-linux-g++'
  4. ar = 'aarch64-poky-linux-ar'

  5. [host_machine]
  6. system = 'linux'
  7. cpu_family = 'aarch64'
  8. cpu = 'aarch64'
  9. endian = 'little'
复制代码
  meson --prefix=$(pwd)/install --cross-file cross_file.txt build


2.3 编译libdrm

  1. cd build
  2. ninja && ninja install
复制代码


最终要用到的是这个库文件 libdrm.so.2和一些位于bin目录下的测试工具



2.4 使用modetest测试
将上一步编译好的 libdrm.so.2库放入到板子的/usr/lib, bin程序copy到板端/usr/bin下。

执行modetest -M rcar-du查看资源:
可以看出CRTC ID是37,ENCODER ID是38,CONNECTOR ID是39
主图层primary plane ID是32,overlay plane ID是34



  1. modetest -M rcar-du
  2. Encoders:
  3. id      crtc    type    possible crtcs  possible clones
  4. 38      37      none    0x00000001      0x00000001
  5. 44      0       Virtual 0x00000001      0x00000002

  6. Connectors:
  7. id      encoder status          name            size (mm)       modes   encoders
  8. 39      38      connected       HDMI-A-1        0x0             1       38
  9.   modes:
  10.         index name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot)
  11.   #0 1920x1080 60.00 1920 2008 2052 2200 1080 1116 1121 1125 148500 flags: ; type: preferred
  12.   props:
  13.         1 EDID:
  14.                 flags: immutable blob
  15.                 blobs:

  16.                 value:
  17.         2 DPMS:
  18.                 flags: enum
  19.                 enums: On=0 Standby=1 Suspend=2 Off=3
  20.                 value: 0
  21.         5 link-status:
  22.                 flags: enum
  23.                 enums: Good=0 Bad=1
  24.                 value: 0
  25.         6 non-desktop:
  26.                 flags: immutable range
  27.                 values: 0 1
  28.                 value: 0
  29.         4 TILE:
  30.                 flags: immutable blob
  31.                 blobs:

  32.                 value:
  33.         20 CRTC_ID:
  34.                 flags: object
  35.                 value: 37

  36. CRTCs:
  37. id      fb      pos     size
  38. 37      46      (0,0)   (1920x1080)
  39.   #0 1920x1080 60.00 1920 2008 2052 2200 1080 1116 1121 1125 148500 flags: ; type: preferred
  40.   props:
  41.         22 ACTIVE:
  42.                 flags: range
  43.                 values: 0 1
  44.                 value: 1
  45.         23 MODE_ID:
  46.                 flags: blob
  47.                 blobs:

  48.                 value:
  49.                         144402008007d8070408980800003804
  50.                         5c046104650400003c00000000000000
  51.                         08000000313932307831303830000000
  52.                         00000000000000000000000000000000
  53.                         00000000
  54.         19 OUT_FENCE_PTR:
  55.                 flags: range
  56.                 values: 0 18446744073709551615
  57.                 value: 0
  58.         24 VRR_ENABLED:
  59.                 flags: range
  60.                 values: 0 1
  61.                 value: 0

  62. Planes:
  63. id      crtc    fb      CRTC x,y        x,y     gamma size      possible crtcs
  64. 32      37      46      0,0             0,0     0               0x00000001
  65.   formats:
  66. RGB8 AR12 XR12 AR15 XR15 RG16 BG24 RG24 BA24 BX24 AR24 XR24 UYVY YUYV
  67. YVYU NV12 NV21 NV16 NV61 YU12 YV12 YU16 YV16 YU24 YV24
  68.   props:
  69.         8 type:
  70.                 flags: immutable enum
  71.                 enums: Overlay=0 Primary=1 Cursor=2
  72.                 value: 1
  73.         17 FB_ID:
  74.                 flags: object
  75.                 value: 46
  76.         18 IN_FENCE_FD:
  77.                 flags: signed range
  78.                 values: -1 2147483647
  79.                 value: -1
  80.         20 CRTC_ID:
  81.                 flags: object
  82.                 value: 37
  83.         13 CRTC_X:
  84.                 flags: signed range
  85.                 values: -2147483648 2147483647
  86.                 value: 0
  87.         14 CRTC_Y:
  88.                 flags: signed range
  89.                 values: -2147483648 2147483647
  90.                 value: 0
  91.         15 CRTC_W:
  92.                 flags: range
  93.                 values: 0 2147483647
  94.                 value: 1920
  95.         16 CRTC_H:
  96.                 flags: range
  97.                 values: 0 2147483647
  98.                 value: 1080
  99.         9 SRC_X:
  100.                 flags: range
  101.                 values: 0 4294967295
  102.                 value: 0
  103.         10 SRC_Y:
  104.                 flags: range
  105.                 values: 0 4294967295
  106.                 value: 0
  107.         11 SRC_W:
  108.                 flags: range
  109.                 values: 0 4294967295
  110.                 value: 125829120
  111.         12 SRC_H:
  112.                 flags: range
  113.                 values: 0 4294967295
  114.                 value: 70778880
  115.         33 zpos:
  116.                 flags: immutable range
  117.                 values: 0 0
  118.                 value: 0
  119. 34      0       0       0,0             0,0     0               0x00000001
  120.   formats:
  121. RGB8 AR12 XR12 AR15 XR15 RG16 BG24 RG24 BA24 BX24 AR24 XR24 UYVY YUYV
  122. YVYU NV12 NV21 NV16 NV61 YU12 YV12 YU16 YV16 YU24 YV24
  123.   props:
  124.         8 type:
  125.                 flags: immutable enum
  126.                 enums: Overlay=0 Primary=1 Cursor=2
  127.                 value: 0
  128.         17 FB_ID:
  129.                 flags: object
  130.                 value: 0
  131.         18 IN_FENCE_FD:
  132.                 flags: signed range
  133.                 values: -1 2147483647
  134.                 value: -1
  135.         20 CRTC_ID:
  136.                 flags: object
  137.                 value: 0
  138.         13 CRTC_X:
  139.                 flags: signed range
  140.                 values: -2147483648 2147483647
  141.                 value: 0
  142.         14 CRTC_Y:
  143.                 flags: signed range
  144.                 values: -2147483648 2147483647
  145.                 value: 0
  146.         15 CRTC_W:
  147.                 flags: range
  148.                 values: 0 2147483647
  149.                 value: 0
  150.         16 CRTC_H:
  151.                 flags: range
  152.                 values: 0 2147483647
  153.                 value: 0
  154.         9 SRC_X:
  155.                 flags: range
  156.                 values: 0 4294967295
  157.                 value: 0
  158.         10 SRC_Y:
  159.                 flags: range
  160.                 values: 0 4294967295
  161.                 value: 0
  162.         11 SRC_W:
  163.                 flags: range
  164.                 values: 0 4294967295
  165.                 value: 0
  166.         12 SRC_H:
  167.                 flags: range
  168.                 values: 0 4294967295
  169.                 value: 0
  170.         35 alpha:
  171.                 flags: range
  172.                 values: 0 65535
  173.                 value: 65535
  174.         36 zpos:
  175.                 flags: range
  176.                 values: 1 1
  177.                 value: 1

  178. Frame buffers:
  179. id      size    pitch
复制代码
使用主图层测试:



  1. root@myir-yg2lx:/etc# modetest -M rcar-du -P 32@37:1920x1080
  2. testing 1920x1080@XR24 overlay plane 32
复制代码


使用overlay图层测试

  1. root@myir-yg2lx:/etc# modetest -M rcar-du -P 34@37:1920x1080
  2. testing 1920x1080@XR24 overlay plane 34
复制代码


使用Connector测试

  1. root@myir-yg2lx:/etc# modetest -M rcar-du -s 39@37:1920x1080
  2. setting mode 1920x1080-60.00Hz@XR24 on connectors 39, crtc 37
  3. failed to set gamma: Invalid argument
复制代码







回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录

本版积分规则

Archiver|手机版|小黑屋|米尔科技论坛   

GMT+8, 2024-12-22 11:51 , Processed in 0.846689 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表