首页 > 解决方案 > Android:在 eink 设备上使用 fb0 绘图

问题描述

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

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

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

如何验证 FB 上的写入?android 应用程序可以被直接写入帧缓冲区的像素“覆盖”吗?

标签: androidframebuffere-ink

解决方案


我最终想通了。使用 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 刷新。

这意味着他们可以更快。


推荐阅读