libdrm移植

  1. 简介
    DRM(Direct Rendering Manager)是Linux目前主流的图形显示框架,相比FB架构,DRM更能适应当前日益更新的显示硬件。比如FB原生不支持多层合成,不支持VSYNC,不支持DMA-BUF,不支持异步更新,不支持fence机制等等,而这些功能DRM原生都支持。同时DRM可以统一管理GPU和Display驱动,使得软件架构更为统一,方便管理和维护 引用于此
    libdrm则是提供给应用层的库,抽象接口,方便用户操作使用;
  2. 移植
    下载地址
#解压并进入解压后的文件夹
xz -d libdrm-2.4.102.tar.xz
tar -xvf libdrm-2.4.102.tar
cd libdrm-2.4.102

#建立安装目录
mkdir install
#创建编译目录
mkdir build
#创建并编写cross_file.txt文件,用于配置交叉编译环境
touch cross_file.txt
#进入build
cd build
#meson配置
#-D 选定需要编译的模块,因为我的是在exynos芯片上的显卡所以-D exynos=true 其他都不编译,选项的值可以是true、auto或者false
#meson --prefix=$(pwd)/../install --cross-file=../cross_file.txt -D amdgpu=false -D cairo-tests=false -D etnaviv=false -D exynos=true -D freedreno=false -D freedreno-kgsl=false -D install-test-programs=true -D intel=false -D libkms=false -D man-pages=false -D nouveau=false -D omap=false -D radeon=false -D tegra=false -D udev=false -D valgrind=false -D vc4=false -D vmwgfx=false
meson --prefix=$(pwd)/../install \
	  --cross-file=../cross_file.txt \
	  -D amdgpu=false \
	  -D cairo-tests=false \
	  -D etnaviv=false \
	  -D exynos=true \
	  -D freedreno=false \
	  -D freedreno-kgsl=false \
	  -D install-test-programs=true \
	  -D intel=false \
	  -D libkms=false \
	  -D man-pages=false \
	  -D nouveau=false \
	  -D omap=false \
	  -D radeon=false \
	  -D tegra=false \
	  -D udev=false \
	  -D valgrind=false \ 
	  -D vc4=false \
	  -D vmwgfx=false

#编译并安装
ninja && ninja install
#完成后在../install目录可以能得到对应的文件
  1. meson交叉编译环境配置文件cross_file.txt
    cross_file.txt需要根据自己的实际情况进行编写;
[binaries]
c = 'arm-linux-gcc'
cpp = 'arm-linux-g++'
ar = 'arm-linux-ar'
strip = 'arm-linux-strip'

[host_machine]
system = 'linux'
cpu_family = 'arm'
cpu = 'armv7'
endian = 'little'

[build_machine]
system = 'linux'
cpu_family = 'x86_64'
cpu = 'x86_64'
endian = 'little'
  1. 测试程序的使用
    modetest:
#modetest 参数
modetest -h  #帮助
 Query options:#用于查询的参数选项

        -c      list connectors #列举出所有的connectors
        -e      list encoders   #列举出所有的encoders   
        -f      list framebuffers #列举出所有的framebuffers 
        -p      list CRTCs and planes (pipes) #列举出所有的CRTCs和planes 

 Test options:#用于测试的参数选项
		#-P给CRTC指定plane
        -P <plane_id>@<crtc_id>:<w>x<h>[+<x>+<y>][*<scale>][@<format>]  set a plane 
        #-s 设置输出模式,选择connector和crtc
        -s <connector_id>[,<connector_id>][@<crtc_id>]:[#<mode index>]<mode>[-<vrefresh>][@<format>] set a mode 
        -C      test hw cursor
        -v      test vsynced page flipping
        -r      set the preferred mode for all connectors
        -w <obj_id>:<prop_name>:<value> set property
        -a      use atomic API
        -F pattern1,pattern2    specify fill patterns

 Generic options:#指定打开设备、驱动

        -d      drop master after mode set
        -M module       use the given driver
        -D device       use the given device

        Default is to dump all info.

#例子
#-s <connector_id>[,<connector_id>][@<crtc_id>]:[#<mode index>]<mode>[-<vrefresh>][@<format>]
#-P <plane_id>@<crtc_id>:<w>x<h>[+<x>+<y>][*<scale>][@<format>]  set a plane 
modetest  -s 37@35:1024x768  -P 33@35:1024x768

参考文章

<think>嗯,用户想了解如何将LVGL移植到Linux平台,特别是教程或示例代码。首先,我需要回忆一下LVGL的基本结构和移植要求。LVGL是一个轻量级的嵌入式图形库,通常用于微控制器,但也可以在Linux上运行,比如通过FrameBuffer或DRM接口。 根据用户提供的引用,尤其是引用[1]中提到用户自己尝试实现FrameBuffer操作,而官方库可能已经有相关支持。所以可能需要参考官方文档或者示例代码。另外,引用[2]和[3]提到了LVGL的源码和ESP32的移植,但用户现在需要的是Linux平台,可能需要调整方向。 首先,移植到Linux通常需要配置显示驱动和输入设备驱动。FrameBuffer是比较常见的方式,尤其是在没有图形界面的嵌入式Linux系统中。所以步骤可能包括初始化FrameBuffer,设置LVGL的显示驱动接口,然后处理输入设备如触摸屏或键盘。 接下来,我需要确认官方是否有Linux的移植示例。根据引用[3]中的lv_port_esp32,可能官方有针对不同平台的示例,但用户需要的是Linux,可能需要查找lv_port_linux之类的仓库或者文档。 另外,用户可能需要安装依赖库,比如SDL2,因为LVGL的模拟器可能使用SDL来在桌面上运行,但实际移植到Linux FrameBuffer可能需要不同的配置。因此,步骤可能包括下载LVGL源码,配置显示驱动,编写或修改现有的移植层代码,编译并测试。 还需要注意权限问题,访问/dev/fb0可能需要root权限,或者将用户加入video组。输入设备方面,比如触摸屏,可能需要读取/dev/input/eventX设备,同样需要权限设置。 可能的问题点包括FrameBuffer的配置是否正确,双缓冲是否启用,以及输入设备的正确识别和处理。另外,内存管理和性能优化也是需要考虑的,比如使用更大的缓冲区或启用硬件加速(如果有的话)。 最后,生成相关问题需要考虑用户可能的后续疑问,比如如何优化显示性能,如何处理触摸输入,或者如何配置多显示器等。可能还需要涉及如何调试LVGL在Linux上的运行,或者如何集成到特定的应用程序中。</think>### LVGL移植到Linux平台指南 #### 一、基础环境准备 1. 安装依赖库: ```bash sudo apt-get install gcc make libsdl2-dev # SDL2用于模拟器开发 sudo apt-get install libdrm-dev libinput-dev # 硬件加速支持[^2] ``` 2. 获取LVGL源码: ```bash git clone --recurse-submodules https://github.com/lvgl/lvgl.git cd lvgl ``` #### 二、FrameBuffer驱动配置 1. 创建显示接口文件`lv_drv_conf.h`: ```c #define USE_FBDEV 1 #define FBDEV_PATH "/dev/fb0" // 指定帧缓冲设备路径[^1] ``` 2. 实现关键回调函数: ```c void fbdev_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_p) { // 将color_p数据写入FrameBuffer内存映射区域 lv_disp_flush_ready(drv); // 必须调用刷新完成通知 } ``` #### 三、输入设备集成 ```c #define USE_EVDEV 1 #define EVDEV_NAME "/dev/input/event2" // 通过evtest工具确认设备节点[^3] // 在输入设备线程中读取事件 while(read(evdev_fd, &in, sizeof(struct input_event)) > 0) { if(in.type == EV_ABS) { lv_indev_data_t data = { .point.x = in.value * x_scale, .point.y = in.value * y_scale, .state = LV_INDEV_STATE_PR }; lv_indev_send(indev, &data); } } ``` #### 四、构建与测试 使用CMake构建系统配置: ```cmake add_executable(lvgl_demo main.c ${LVGL_SRC}/lvgl/lvgl.c ${LVGL_DRV}/display/fbdev.c ${LVGL_DRV}/indev/evdev.c) target_link_libraries(lvgl_demo m pthread) ``` #### 五、高级优化(引用官方建议) 1. 启用双缓冲配置: ```c static lv_disp_draw_buf_t draw_buf; lv_color_t buf1[LV_HOR_RES_MAX * 10]; // 行缓冲区 lv_disp_draw_buf_init(&draw_buf, buf1, NULL, LV_HOR_RES_MAX * 10); ``` 2. 开启硬件加速: ```c lv_disp_drv_t disp_drv; disp_drv.gpu_fill_cb = drm_gpu_fill; // 实现DRM接口的填充函数 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值