Framebuffer 与输入设备

默认图形接口为 /dev/fb0,触摸屏通过 /dev/input/event* 提供 evdev 事件。

查看 framebuffer 参数

cat /sys/class/graphics/fb0/virtual_size
cat /sys/class/graphics/fb0/bits_per_pixel
cat /sys/class/graphics/fb0/stride

应用通常通过以下流程绘图:

  1. open("/dev/fb0", O_RDWR)
  2. 使用 FBIOGET_FSCREENINFOFBIOGET_VSCREENINFO 查询布局
  3. 使用 mmap 映射显存
  4. line_length 和像素格式写入颜色值

不能假定每行字节数等于 宽度 x 每像素字节数,应始终使用驱动返回的 line_length

确定触摸事件节点

cat /proc/bus/input/devices

在 Goodix 设备段中查找:

Handlers=event1

事件编号会随已注册输入设备变化,应用应允许通过命令行或配置文件指定设备节点。

编译触摸与 framebuffer 测试程序

cd ~/v3s-workspace/projects/touch-fb-test
make CROSS_COMPILE=arm-linux-gnueabihf-
scp touch_fb_test root@<开发板IP>:/root/

开发板上先停止默认 LVGL 程序,避免两个程序同时写 framebuffer:

/etc/init.d/S20lvgl-v9-demo stop
/root/touch_fb_test -f /dev/fb0 -i /dev/input/event1

程序会绘制网格并在触摸位置显示标记。设备编号不同则替换 -i 参数。

坐标方向

触摸坐标与画面方向不一致时,优先在设备树 Goodix 节点中使用标准属性:

touchscreen-swapped-x-y;
touchscreen-inverted-x;
touchscreen-inverted-y;

只添加实际需要的属性,重新编译并更新 DTB 后测试四角坐标。