探索 reMarkable 2
发布日期:2025-11-30 标签:#remarkable #reverse-engineering
自上周三起,我成为了 reMarkable 2 的骄傲拥有者。当时有黑色星期五折扣和一些翻新优惠,让我能以略高于基础平板和触控笔标价的价格,买到平板、Marker Plus触控笔和书本式保护套,于是我决定抓住这个机会。
简短评测
reMarkable 被宣传为一款无干扰的阅读和书写设备,我可以确认它在书写方面表现出色。触控笔在电子墨水屏上的摩擦力感觉恰到好处,延迟足够低,类似于用墨水书写,只是墨水瞬间干涸在页面上。你可以充分自定义笔刷以实现任何你想要的效果。自从高中以来,我从未写过这么多字,我想我有点怀念这种感觉。
Marker Plus 在触控笔的另一端包含一个橡皮擦;如果你考虑购买其中一个,我建议多花点钱买这个版本的触控笔,因为我可以想象擦除东西会变得非常烦人。其他擦除选项包括:双击手势撤销最后一笔(我经常用它来删除写得不理想的最后一个字母),以及一个选择擦除工具,用于删除整个段落。
触摸手势并不理想:它们并不总是能被识别,而且总是需要比预期更大的力度。用触控笔导航要愉快得多,但有些事情(翻页)只能通过滑动来完成。reMarkable 1 过去在屏幕下方有三个物理按钮,我希望第二代能保留这些。
阅读 PDF 文件尚可(阅读论文有点烦人,因为你必须稍微放大才能舒适地阅读),我还没有测试过电子书。
显然,reMarkable 有自己的订阅服务叫做 Connect,它解锁了一些有用的功能,比如无限云存储(免费计划似乎在文件闲置 50 天后会从云端删除)、在配套的桌面和移动应用程序中编辑文档、“高级模板”、屏幕共享、延长保修期以及其他一些东西。
每年 29.90 美元说实话并不算太糟糕的交易,甚至免费计划的限制也不算太差。my.reMarkable 的注册程序会诱导性地引导你注册 50 天试用,我找不到一个全面的页面来展示不付费能获得什么,但如果你不提供支付信息,你会发现你仍然可以查看云同步文件,并启用 Google Drive/Dropbox/OneDrive 集成。
阅读乐谱
我想买电子墨水屏平板的原因之一是阅读乐谱。我在一个合唱团唱歌,我们即将有一场音乐会,由于背光问题,届时将不允许使用普通平板电脑,这感觉像是购买这类设备来玩玩的完美借口。
在 reMarkable 上阅读乐谱并不理想。翻页时的刷新率尚可,用触控笔注释 PDF 是很棒的体验,但有一些我在平板电脑上的 MobileSheets 应用中已经习惯的功能,reMarkable 并不支持:
- 单独裁剪页面。文档查看器允许你放大,但这不精确且会应用于整个文档,而且我认为切换到另一个文档时,缩放级别和偏移量不会被保存。
- 半页翻页。在 MobileSheets 中翻页时,你可以设置它在当前页面上叠加下一页的一半,这样你就可以在查看接下来内容的同时跟随最后一个小节。
- 单次触摸翻页。我提到过我并不太喜欢滑动手势,而且我不想在演出期间试图翻页时与手势识别功能“斗争”。
- 库管理。reMarkable 只显示 PDF 的文件名,但我喜欢按名称和作曲者/编曲者来索引我的乐谱,我更愿意使用元数据而不是命名方案来管理它们。
- 曲目列表。在演出期间,你不想搜索下一首曲子,而且大多数曲子会在许多音乐会中共享。虽然你可以通过文件夹组织文档,但在许多不同文件夹中复制同一份乐谱并不理想。
这些功能对于一个好的乐谱阅读器来说是不可或缺的,而 reMarkable 的原装软件并不达标。当我购买 reMarkable 2 时,我想我可以自己为它编写一个 PDF 阅读器和管理器,并将这些功能融入其中。
运行自制软件
reMarkable 和其他计算机一样,是一台电脑,所以我相信既然我买了它,我就拥有它,我应该能够在上面运行任何我想要的软件。在这方面,该肯定的地方还是要肯定。reMarkable 公司本可以轻易地锁定设备,让你不得不支付订阅费,并在他们停止对旧设备的支持时购买新的迭代设备,但如果你进入 设置 > 帮助 > 版权和许可证 菜单,你会发现一段文字,解释为了遵守 GPLv3,最终用户应该能够修改设备上运行的软件,在这段文字下面还有一个简短的说明,介绍如何以 root 身份 SSH 登录到 reMarkable。
乍一看,reMarkable 也有一个活跃的自制软件生态系统。有一个社区维护的 wiki,上面有指南教你如何安装 toltec(一个软件包管理器)和为设备开发软件。在我拆开平板包装后,我急切地想运行 Toltec 并安装一些软件,但是……
Toltec 对其支持的 reMarkable 操作系统版本有严格的限制。在拆箱并设置我的 reMarkable 2 后,我最终得到的版本是 3.23.0.64,这远远超出了 Toltec 支持的范围。我是不是没戏了?好吧,指南中提到你可以降级到不同的操作系统版本,所以也许……
从 3.11.2.5 或更高版本降级到低于 3.11.2.5 版本的注意事项
如果你的 reMarkable 设备版本达到或高于 3.11.2.5,并且你想降级到低于 3.11.2.5 的版本,codexctl 目前无法做到这一点。请参考 #95(评论)获取手动操作说明。
Ah. 那么 rm2fb 到底是什么呢?
服务器进程将依赖于使用来自 xochitl 或 remarkable-shutdown 的函数,但那些进程实际上并不运行。我们使用 LD_PRELOAD 来接管进程,比如
LD_PRELOAD=rm2fb.so xochitl,然后我们使用自己的 main() 函数,但调用我们需要的 API 来 1) 启动 SWTCON 线程,以及 2) 发送更新。如果我们采用服务器模型,这只需要发生一次(而不是每个应用程序都进行这个操作)
此时我们应该谈谈 xochitl。
专有软件的困境
xochitl 是运行在 reMarkable 上的主要应用程序,它是专有软件。不幸的是,它也成为了自制软件社区唯一可以查阅的、关于如何驱动绘制到 reMarkable 电子墨水显示屏的帧缓冲区的文档;reMarkable 提供的 SDK 仅支持 Qt Quick,所以如果你不想使用 Qt 或链接到 libqsgepaper.so,你就只能逆向工程 xochitl。
reMarkable 1 的显示驱动似乎已经被完全逆向工程,但 reMarkable 2 的没有(除了个人努力,我稍后会谈到)。大多数 reMarkable 的自制程序都是直接写入帧缓冲区,并且它们期望与 reMarkable 1 的帧缓冲区交互。
rm2fb 作为一个兼容层出现,允许与 rm1 帧缓冲区交互的程序在 rm2 上运行。由于 rm2 的帧缓冲区驱动在开发 rm2fb 时尚未被完全逆向工程,rm2fb 会钩入 xochitl 并使用其代码与帧缓冲区交互。这依赖于 rm2fb 知道这些函数在 xochitl 二进制文件中的偏移量和签名,所以显然当 OS 版本改变、xochitl 升级时,这些偏移量和签名会失效,rm2fb 将停止工作,直到有人重新计算出这些信息。
将 reMarkable 2 从 Xochitl 中解放出来
此时,我已经将 xochitl 加载到 Ghidra 中,并开始弄清楚如何在其中使用帧缓冲区。我的意思是,这能有多难?
我主要搜索了 ioctl 的调用,并很快取得了一些进展。然后我想,如果这么容易,那么肯定有比我更有经验的人已经做过了,所以我做了一些更深入的搜索。
rm2fb 的 FAQ 部分还包括另一个链接,那么实现一个开源的 SWTCON 呢?,它链接到一个仓库,包含一个在较新 OS 版本上工作的 rm2fb 版本,以及一个 reMarkable 2 显示驱动的初步实现,该实现仅在某些方面依赖于 xochitl。我还加入了 reMarkable 社区 Discord 服务器,看看是否能收集到更多信息。有一些 timower(rm2-stuff 仓库的所有者)的帖子,谈论了他们在逆向工程过程中遇到的问题。
几年后,Mattéo Delabre 分享了一个链接到一个仓库,里面包含一个不依赖于 xochitl 的 reMarkable 2 显示驱动的 C++ 实现,不过开发似乎在 2022 年左右停滞了。然后几个月前,jakubvf 分享了他们自己用 Zig 实现的 rm2 显示驱动,支持 SDL3。
这些努力似乎都没有流行起来,但 Toltec 的维护者们正在努力支持可以从 3.23.* 安全降级到的较新 OS 版本,所以我希望在不久的将来,我能够在设备上安装 Toltec 而不用过多折腾它。
至于我,我开始了我的“剃牦牛”链条,通过用我选择的编程语言 Rust 重新实现 waved/dazed 来构建乐谱阅读器。我不可能在音乐会前完成这个程序,但这没关系。
我本想在这里包含一个关于如何使用仅仅几个系统调用来驱动 reMarkable 2 显示的部分,但我仍在研究这个!这篇文章已经比我预想的要长了,所以我会把这些内容留到未来可能发布的关于如何为 reMarkable 2 编写软件的文章中。
最后,我要感谢 reMarkable 黑客社区在逆向工程和为其开发软件方面所做的所有工作,因为如果没有他们的努力,我肯定会后悔这次购买。