把 nasonliu/REweread(原生微信读书 Qt6/QML 客户端)移植到 reMarkable 2。
上游只为 reMarkable Paper Pro Move 验证过。rM2 的 SoC、屏幕驱动、触摸面板都不一样,这个仓库是把它真正跑起来的完整改动 + 踩坑记录。
Required Notice: Copyright 2026 nasonliu
本项目是 REweread 的衍生作品,沿用上游的 PolyForm Noncommercial License 1.0.0(见 LICENSE)。 仅限非商业用途。 分发时必须一并附带本许可证或其 URL: https://polyformproject.org/licenses/noncommercial/1.0.0
在 rM2(固件 3.22.0.64)上实测:
- 书架:微信读书书架全量同步,封面九宫格,分页
- 阅读:分页排版、章节渲染
- 翻页:左 1/3 上一页 · 中间 1/3 呼出菜单 · 右 1/3 下一页
- 阅读设置:字号 24–60、行距、段距、页边距、首行缩进、字体(宋体/微米黑/正黑/霞鹜文楷)、字重
- 目录:抽屉式章节列表,点章节直接跳转
- 进度:跳转进度条、同步/拉取阅读进度
- 网络:设备自己连 WiFi 即可使用,运行时不需要连电脑
| 项 | 值 |
|---|---|
| 机型 | reMarkable 2 |
| 固件 | 3.22.0.64 |
| 架构 | armv7l (i.MX7, cortexa7hf-neon) |
| 内核 | 5.4.70 |
| Qt | 设备自带 Qt 6.8.2(xochitl 是 Qt 应用) |
| 加载 | xovi + AppLoad |
rM2 的 Qt epaper 平台插件走 SWTCON(软件 TCON),启动时抢独占锁 /tmp/epframebuffer.lock——而 xochitl 一直握着这把锁和 /dev/fb0,两个 SWTCON 不能共存,直接闪退。设备上的 Qt 没有编 linuxfb(只有 epaper/vnc/minimal/offscreen),rm2fb 在 3.22 固件上也已失效。
解法:离屏渲染 + 自绘显示通道
QML ──offscreen 平台 + QT_QUICK_BACKEND=software──> QQuickWindow
──grabWindow()──> QImage ──二值化 RGB565──> /dev/shm/qtfb_<key>
──24 字节 UPDATE 包──> qtfb (/tmp/qtfb.sock)
绕开 epaper 插件,完全不碰 SWTCON 锁。实现见 weread-qt/qtfbclient.cpp。
manifest 只需 "qtfb": true,不需要 qtfb-shim 的 LD_PRELOAD。
qtfb 协议要点:
SOCK_SEQPACKET,24 字节 INIT,响应里的shmKeyDefined才是真正的 shm 名(不是你发过去的 key)。
触摸面板 pt_mt(cyttsp5)挂在 /dev/input/event2,上报的原始 ABS 值可直接当屏幕坐标用,但 Y 轴与屏幕相反:
screen_y = 1871 - raw_y // X 不翻转
不翻的话点"上一页"会翻到下一页。实现见 weread-qt/touchinput.cpp(读 event2 → 合成 Qt 鼠标事件)。
reMarkable 官方 codex SDK 是公开可下载的:
https://storage.googleapis.com/remarkable-codex-toolchain/<固件>/rm2/
remarkable-production-image-<sdk版本>-rm2-public-<host>-toolchain.sh
本机固件对应 3.22.0.65/rm2/...-5.2.96-rm2-public-x86_64-toolchain.sh(414MB,Qt 6.8.2 与设备精确匹配)。该版本只有 x86_64 主机版。
两个坑:
- SDK 安装脚本需要 python,debian-slim 镜像里没有 → 用
python:3.12-bookworm source环境脚本前必须去掉set -u,SDK 的openssl.sh引用了未定义的SSL_CERT_FILE
需要 Docker(Apple Silicon 上以 --platform linux/amd64 模拟运行)。
./install-sdk.sh # 下载 SDK 并装进 docker volume rm2_sdk
./build-weread.sh # 交叉编译,产物 weread-qt/build/rm_weread_qt产物应为 ELF 32-bit LSB executable, ARM, EABI5, for GNU/Linux 5.4.0。
# app 本体
scp weread-qt/build/rm_weread_qt \
root@10.11.99.1:/home/root/xovi/exthome/appload/wereadrm2/
scp weread-qt/appload/* \
root@10.11.99.1:/home/root/xovi/exthome/appload/wereadrm2/
# 字体(自备)放到设备 /home/root/weread-qt/fonts/
# source-han-serif.otf / wqy-microhei.ttc / wqy-zenhei.ttc / lxgw-wenkai.ttf网络层复用 weread.koplugin 的 lua 桥接(通过 KOReader 的 luajit 调用),需要装好 KOReader 且在 koplugin 的 config.lua 里填好自己的微信读书凭据。
凭据不入库。
config.lua已在.gitignore里。请用你自己的账号,并注意第三方客户端存在账号风险。
weread-qt/ 移植后的应用
├─ main.cpp harness:qtfb 显示 + event2 触摸 + 合成器
├─ qtfbclient.* qtfb 客户端(离屏帧 → 共享内存 → 墨水屏)
├─ touchinput.* event2 触摸读取 + Y 翻转
├─ *_store.* 上游的 13 个 store(网络/书架/阅读/进度…)
├─ Main.qml 上游 UI,针对 1404×1872 + rM2 硬件调整
└─ appload/ AppLoad manifest 与启动脚本
hello-qt/ 最小 Qt Quick 窗口(验证显示通道用)
build-*.sh 交叉编译脚本
install-sdk.sh SDK 安装
- 新增 qtfb 显示通道与 event2 触摸输入(上游走 Move 的原生平台插件)
- 分辨率 954×1696 → 1404×1872
- 彩色 → 黑白二值化(rM2 无彩色墨水屏)
- 翻页手势改为微信读书式左/中/右三分
- 字体默认改宋体(思源宋体),字号范围放宽到 24–60
- 移除前光相关 UI(rM2 没有前光硬件),原"灯光"行改为"目录"入口
- nasonliu/REweread — 原项目,全部业务逻辑与 UI 出自这里
- asivery/xovi 与 AppLoad — 第三方应用加载
- qtfb — 显示通道协议