在跟 AI 对话了一周后仍未解决,几乎要放弃了,想到 V 友们都是大佬,所以来求帮助了。
800 * 1280 的 mipi屏幕,采用 LVGL显示,需要旋转实现横屏显示,因为 DRM当前 CRTC 绑定的 plane 不支持旋转,所以采用 frambuffer 显示。
目前问题: 
/** Default display refresh, input device read and animation step period. */
#define LV_DEF_REFR_PERIOD  33      /**< [ms] */ 
/** Driver for /dev/fb */
#define LV_USE_LINUX_FBDEV      1
#if LV_USE_LINUX_FBDEV
    #define LV_LINUX_FBDEV_BSD           0
    #define LV_LINUX_FBDEV_RENDER_MODE   LV_DISPLAY_RENDER_MODE_PARTIAL
    #define LV_LINUX_FBDEV_BUFFER_COUNT  2
    #define LV_LINUX_FBDEV_BUFFER_SIZE   1280 * 400
    #define LV_LINUX_FBDEV_MMAP          1
#endif
// 修改 rockchip_vop2_reg.c 中 plane_mask 对应的 rk3568_vp_plane_mask ,命令 modetest -M rockchip 得到的信息并无变化
static const struct vop2_data rk3568_vop = {
	.version = VOP_VERSION_RK3568,
	.nr_vps = 3,
	.nr_mixers = 5,
	.nr_layers = 6,
	.nr_gammas = 1,
	.max_input = { 4096, 2304 },
	.max_output = { 4096, 2304 },
	.ctrl = &rk3568_vop_ctrl,
	.sys_grf = &rk3568_sys_grf_ctrl,
	.axi_intr = rk3568_vop_axi_intr,
	.nr_axi_intr = ARRAY_SIZE(rk3568_vop_axi_intr),
	.vp = rk3568_vop_video_ports,
	.wb = &rk3568_vop_wb_data,
	.layer = rk3568_vop_layers,
	.win = rk3568_vop_win_data,
	.win_size = ARRAY_SIZE(rk3568_vop_win_data),
	.dump_regs = rk3568_dump_regs,
	.dump_regs_size = ARRAY_SIZE(rk3568_dump_regs),
	.plane_mask = rk3568_vp_plane_mask[0],
	.plane_mask_base = RK3568_PLANE_MASK_BASE,
};
|  |      1zzzyk      54 天前 感觉是 lvgl 的 display 驱动问题。3568 不至于带不动 800 * 1280 的屏幕。 | 
|  |      2yolee599      54 天前 via Android 1. 是的,内核开启了 CONFIG_FB 就会有 framebuffer 驱动。 2 ,3. framebuffer 的效率确实比 DRM 更差,屏幕分辨率越大差别越明显,可以用过双缓冲缓解一下。 4. 不要随便改 VOP 驱动,会改出问题的。 | 
|      3heyjim75111      54 天前 3568 的 plane 肯定支持旋转啊,可以在 lvgl 的 drm 应用层驱动里修改配置 | 
|  |      4yolee599      54 天前 via Android 你要旋转应该改屏幕的初始化寄存器参数 | 
|  |      5xomix      54 天前 lvgl 问题,我这边标准的 RK3568 ,触摸屏安卓都不卡,上个 xfce 的 debian 完全不卡。 | 
|      6jettming OP @heyjim75111 #3    | 
|  |      9BingoXuan      49 天前 1. 我记得 drm 是需要使用 libdrm 来控制的。你用 fb0 应该还在用 framebuffer 框架 2. framebuffer 性能并不好 3. 理论上是的 4. 我记得 lvgl 在 linux 上有多个渲染后端的。我不确定你是怎么配置的。但我建议你可以配置成 sdl2 ,让 lvgl 渲染到 offscreen 上再通过图像渲染传递到 drm 上 https://github.com/lvgl/lv_port_linux |