# firefly-vsync **Repository Path**: caodev/firefly-vsync ## Basic Information - **Project Name**: firefly-vsync - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-27 - **Last Updated**: 2025-12-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 当前开发板环境 CPU: RK3588 显卡部分: /dev/dri/card0 表示显卡设备 /dev/dri/card1 表示 NPU加速设备 # 概念说明 ## connector_id 指的是物理的接口,例如DP口或者 HDMI口的 在内核的DRM子系统中的唯一标识符 获取方式: ``` # 输出的第一列,就是 DP的第一个端口的 connector_id 的值。如果是 DP的第二个,或者HDMI自行切换查询 # 263 262 connected DP-1 350x190 34 262 modetest | grep "DP-1" # 这里的 connector_id 就是第一列 263 # 这里的 encoder_id 就是第二列 262 ``` ## crtc_id 是一种逻辑上的控制器。负责将FrameBuffer中的数据,输出到哪个物理输出的connector_id中。 获取方式: ``` # 需要提前知道 物理设备对应的 encoder_id,这里假设是 262 【上一步获取 connector_id 中会一并获取到】 modetest | grep -A 10 "Encoders:" ``` 输出内容: ``` Encoders: id crtc type possible crtcs possible clones 218 0 Virtual 0x0000000f 0x00000001 224 0 TMDS 0x00000001 0x00000002 244 0 TMDS 0x00000002 0x00000004 262 122 TMDS 0x00000004 0x00000008 270 0 TMDS 0x00000004 0x00000010 Connectors: ``` 找到 Encoders 中id是262的,发现对应的 crtc_id 是 122 即可。 # 编译环境 ``` sudo apt install gcc g++ clangd cmake libdrm-dev gdb ``` ## 编译 ```bash chmod +x build.sh ./build.sh ``` ## 调试 ```bash chmod +x build-debug.sh ./build.sh ``` ## 运行 每一个实例中,都会触发 onVsync 函数; - build/vsync_demo/vsync_demo 【cpp版本】单纯的vsync的事件处理 - build/vsync_demo/vsync_gui 【cpp版本】vsync的事件处理 + GUI绘图 【执行前 sudo systemctl stop lightdm】 - build/vsync_demo/vsync_simple_gui 【cpp版本】vsync的事件处理 + 简单GUI绘图 【执行前 sudo systemctl stop lightdm】 - build/vsync_c_call/vsync_call 【c语言版本】支持c语言调用,提供回调机制,参考main函数里的初始化和回调函数注册 # 报错处理 ## has no framebuffer, freeing 说明无法创建framebuffer,有人占用,一般是Xorg占用,执行 `sudo systemctl stop lightdm`