|
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 - drm$ tree -L 1
- .
- ├── amdgpu
- ├── android
- ├── Android.common.mk
- ├── Android.mk
- ├── CleanSpec.mk
- ├── CONTRIBUTING.rst
- ├── core-symbols.txt
- ├── data
- ├── etnaviv
- ├── exynos
- ├── freedreno
- ├── gen_table_fourcc.py
- ├── include
- ├── intel
- ├── libdrm_lists.h
- ├── libdrm_macros.h
- ├── libdrm.pc.in
- ├── libsync.h
- ├── Makefile.sources
- ├── man
- ├── meson.build
- ├── meson_options.txt
- ├── nouveau
- ├── omap
- ├── radeon
- ├── README.rst
- ├── RELEASING
- ├── symbols-check.py
- ├── tegra
- ├── tests
- ├── util_double_list.h
- ├── util_math.h
- ├── vc4
- ├── xf86atomic.h
- ├── xf86drm.c
- ├── xf86drm.h
- ├── xf86drmHash.c
- ├── xf86drmHash.h
- ├── xf86drmMode.c
- ├── xf86drmMode.h
- ├── xf86drmRandom.c
- ├── xf86drmRandom.h
- └── xf86drmSL.c
- 15 directories, 28 files
复制代码 2.2 配置libdrm
新建一个cross_file.txt,meson --cross-file指定使用这个cross_file.txt
- [binaries]
- c = 'aarch64-poky-linux-gcc'
- cpp = 'aarch64-poky-linux-g++'
- ar = 'aarch64-poky-linux-ar'
- [host_machine]
- system = 'linux'
- cpu_family = 'aarch64'
- cpu = 'aarch64'
- endian = 'little'
复制代码 meson --prefix=$(pwd)/install --cross-file cross_file.txt build
2.3 编译libdrm
- cd build
- 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
使用主图层测试:
- root@myir-yg2lx:/etc# modetest -M rcar-du -P 32@37:1920x1080
- testing 1920x1080@XR24 overlay plane 32
复制代码
使用overlay图层测试
- root@myir-yg2lx:/etc# modetest -M rcar-du -P 34@37:1920x1080
- testing 1920x1080@XR24 overlay plane 34
复制代码
使用Connector测试
- root@myir-yg2lx:/etc# modetest -M rcar-du -s 39@37:1920x1080
- setting mode 1920x1080-60.00Hz@XR24 on connectors 39, crtc 37
- failed to set gamma: Invalid argument
复制代码
|
|