Android: 在 eink 设备上使用 fb0 绘图

Android: draw using fb0 on eink device

我到处找了很多地方,找不到太多清楚的东西。上下文是我有一个支持手写笔的电子墨水平板电脑,我在上面编程是为了好玩,我喜欢使用本机库来读取笔事件,并直接在帧缓冲区上绘图。供应商提供了一个秘密(一个 .so JNI 库,您可以只使用一个大小参数来调用它)。

我想这是为了激活帧缓冲区上的直接绘制,最终刷新。但我无法理解它应该如何与 SurfaceFlinger 和 Android...

组合

任何人都有通过 IOCTL 从 JNI 显示的通用 eink 技巧的经验,这可以解释我为什么我看不到像素变化,除非我在 java 中绘制自己(我可以更改更新模式并绘制相当快,但是......我想要最快的)?

如何验证 FB 上的写入? android 应用程序可以 "overlayed" 像素直接写入帧缓冲区吗?

最后我想通了。使用 strace 通过 ioctl + lsof + 官方绘图应用程序的远程调试来捕获对 fb0 的调用,这表明我错了。

这款平板电脑的供应商软件与非凡的软件不同,它不会直接通过神奇的 ioctl 命令在帧缓冲区上绘制。它所做的只是将屏幕区域注册为不可由 Android 普通显示基元刷新。这使他们无需将层次结构中的每个视图都配置为直接更新 eink 模式,同时使用 android 框架和尽可能少的自定义代码。

我可以看到命令是这样传递的:

[pid  3997] openat(AT_FDCWD, "/dev/graphics/fb0", O_RDWR|O_LARGEFILE) = 30
[pid  3997] ioctl(30, _IOC(0, 0x6d, 0x25, 0x00), 0x1) = 0
[pid  3997] close(30)   

这只是将屏幕置于锁定状态并停止所有 android 刷新。

这意味着它们可以更快。

我建议你用 C 语言为帧缓冲区编写一个基本的像素绘图程序。正常执行它,然后为其创建一个 JNI 调用。速度差异可以忽略不计。