0%

吃灰的 Kindle 7,被我改成了一块日历天气屏

吃灰的 Kindle 7,被我改成了一块日历天气屏

抽屉里那台 Kindle 7 吃灰好几年了。当年换了带前置灯的 Paperwhite 10 后,这台没有背光的 7 代就被替换了下来。

这几天我把它翻出来,打算改成挂在玄关的桌面日历天气屏:定时唤醒,把月历和天气刷在墨水屏上,刷完继续休眠。

文末附了提示词,可以复制给 Claude Code / Cursor / Codex 等 AI 助手直接帮你操作,助手会先诊断设备再执行。想自己动手可以看下文。


确认硬件与固件

翻出机身背面标签确认型号:

1
MODEL NO. WP63GW    FCC ID: 2ABQ9-0725 ... INPUT: 5.25V ⎓ 500mA

查下对应的是 Kindle 7(2014 年第 7 代入门版,代号 KT2)。

  • 屏幕:6 英寸电子墨水屏(600×800,167 ppi,16 级灰阶)
  • 前置灯:无(暗处看不清,适合摆在玄关或书桌等有光处)
  • 存储:4 GB
  • 固件版本:5.11.1.1

设备背面标签照片


这台机器之前刷过 CrackDroid 双系统

这台机器早几年刷过 CrackDroid 双系统(安卓 4.4.2 + 原生 Kindle OS),用 fastboot 刷入:

  • 原生切安卓:设置 → 设备选项 → 重启
  • 安卓切原生:「Eink 设置」→ 点击「启动 Kindle」

安卓 4.4.2 在这个硬件上卡顿明显,且刷机重置了原生系统,清空了旧越狱和 KUAL。这次改造直接在原生系统下进行。


固件越狱(KindleBreak)

5.11.1.1 固件属于 KindleBreak(支持 5.10.3–5.13.3)范围。文件来自 MobileRead 社区的 jb-kindlebreak.zip 压缩包:

  1. 开启飞行模式(防止自动升级);
  2. 解压 jb-kindlebreak.zip,将 jbjb.shkindlebreak.htmlkindlebreak.jxr 拷入 Kindle 根目录;
  3. file__0.localstorage 放入 /.active_content_sandbox/browser/resource/LocalStorage/(没有该目录则手动建);
  4. 拔掉数据线,打开 Kindle 内置的「体验版浏览器」;
  5. 浏览器卡死后等待 1–5 分钟重启,弹出 Application ErrorCollecting Debug Info 即越狱成功。

越狱成功后的日志文件


越狱验证与热修复

KindleBreak 完成后搜索框输入 ;log 无反应属于正常现象,该命令由热修复(Hotfix)包提供。

先检查根目录越狱日志 kindlebreak_log.txt

1
2
3
4
Created developer key (0)
Updated permissions for developer key
Enabled developer flag
Finished installing jailbreak, restarting...

确认日志无误后安装 Universal Hotfix:

  1. 从 KindleModding/Hotfix 下载 Update_hotfix_universal.bin 拷入根目录;
  2. 拔线点击「设置 → 右上角菜单 → 更新您的 Kindle」;
  3. 重启后在书库点击 Run Hotfix
  4. 搜索框输入 ;log 弹出提示即安装完成。

热修复提供了后文依赖的三项能力:注入 ;log、安装工具 FBInk、开启 sh_integration(允许书库直接运行 Shell 脚本)。


放弃 KUAL 与 linkss,改用脚本替换屏保

传统方案常用 KUAL 菜单 + linkss 插件,但在这台 5.11.1.1 设备上并不适用:

  1. 新版 KUAL (PEKI) 要求固件 ≥ 5.12.2.2;
  2. linkss 旧链接大多失效,且只支持静态本地轮播,无法完成远程定时抓图。

热修复自带的 sh_integration 能让 documents/ 下的 .sh 脚本像电子书一样在书库里直接以 root 权限运行。

既然 linkss 本质也是替换系统屏保图片,直接用 Shell 脚本替换原生文件更干净。


屏保替换细节

原生屏保存储在 /usr/share/blanket/screensaver/bg_ss00.pngbg_ss19.png(共 20 张 600×800 图片)。

注意事项:

  • rootfs 为只读挂载,替换前需 mntroot rw,替换后恢复 mntroot ro
  • 备份原图以便还原;
  • 将 20 张替换为同一张图片,休眠时即可固定显示日历。

此外,替换图片不需要重启 Kindle 框架(stop framework && start framework)。系统会在进入休眠的瞬间现读屏保文件,只要在休眠前完成覆盖就能无感生效。


自动化更新机制

服务端(小服务器/NAS)

  • Python Pillow 绘制当月日历与天气,生成 600×800 PNG;
  • 农历支持节气与节日;
  • 天气调用 Open-Meteo API(免费无 Key);
  • 请求异常时自动使用上次缓存。

设备端处理

  1. RTC 唤醒需走 powerd 接口
    直接向 /sys/class/rtc/rtc0/wakealarm 写入时间无效,因为 Kindle 的 powerd 休眠前会用 rtcWakeup 覆盖闹钟。必须在 readyToSuspend 事件触发时设置:

    1
    2
    3
    lipc-wait-event -m com.lab126.powerd 'goingToScreenSaver,wakeupFromSuspend,readyToSuspend'
    # 收到 readyToSuspend 时设置:
    lipc-set-prop -i com.lab126.powerd rtcWakeup 3600
  2. Wi-Fi 恢复重试策略
    定时唤醒后 Wi-Fi 重连需 15–30 秒不等。采用三段式重试(等待 15 秒 → 重置连网等待 30 秒 → 最长重试 150 秒),避免超时导致拉图失败白耗电。

  3. 屏保主动重绘
    powerd 定时唤醒不会主动刷新屏保画面,拉取新图后需调用 eips -g 手动刷屏。

  4. 休眠计时陷阱
    Kindle 休眠时 Shell 的 sleep 会挂起(基于 CLOCK_MONOTONIC),时间计算需统一使用挂钟时间戳(date +%s)。

设备端执行流程

1
2
3
4
upstart 守护任务
└─ 守护脚本
├─ readyToSuspend → 设置 rtcWakeup 并关闭 Wi-Fi
└─ wakeupFromSuspend → 开启 Wi-Fi → 重试拉图 → eips 刷新屏幕

最终屏保效果


改造成果

  • 屏保为当月月历,今日格子反白显示;
  • 附带农历、节气与节日;
  • 下半屏显示天气与未来三天预报;
  • 每小时自动唤醒一次,刷新后继续休眠;
  • 书库点击 ss-restore.sh 随时还原官方屏保。

摆在玄关,白天看很清晰。闲置硬件重新利用起来了。


项目代码

代码与踩坑记录已整理在 GitHub:

https://github.com/fanzhh/kindle-calendar-weather

docs/pitfalls.md 记录了遇到的一些具体问题(如 ;log 依赖、powerd 覆盖 RTC 闹钟、唤醒后 Wi-Fi 恢复耗时、busybox 计时器机制、Shell 参数解析等)。


附:把大部分工作交给 AI 助手

如果不打算手动配置,可以把下面这段 Prompt 复制给支持终端与文件操作的 AI 助手(如 Claude Code / Cursor / Codex)。前提是 Kindle 已越狱、已安装热修复并连接电脑。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
你是我的技术助手。现在有一台已越狱并装好热修复的 Kindle,通过 USB 连在这台电脑上,
挂载为一个可移动磁盘。

请按开源方案 https://github.com/fanzhh/kindle-calendar-weather 把它改造成
「日历 + 天气」休眠屏保。尽量自己完成,只在必须我在设备屏幕上操作时才停下来告诉我。

一、先诊断,不要急着改
1. 定位挂载点:macOS 通常 /Volumes/Kindle,Linux 通常 /media/$USER/Kindle。
2. <挂载点>/system/version.txt,记录固件版本。
3. 判断越狱/热修复状态:
- <挂载点>/documents/ 中是否有可点击执行的 .sh
- <挂载点>/libkh/bin/fbink 是否存在
- <挂载点>/extensions/ 是否存在
4. 克隆仓库到本地,先读完 README.md、docs/hardware.md、docs/pitfalls.md 再动手。
5. 向我汇报:型号、固件版本、屏幕分辨率、越狱状态、还缺哪些前置条件。

二、按分辨率定参数
- 屏幕 600×800:用默认值。
- 其他分辨率(如 1072×1448):同时改 render/dash.py 的 W, H 与
kindle/ss-install.sh 的 WANT_W / WANT_H。
- 屏保目录若不是 /usr/share/blanket/screensaver/,一并修正。

三、服务端
1. 在常开的机器上执行 bash setup-mac.sh(macOS)或等价步骤(Linux)。
2. 问我天气城市的名称或经纬度,改 render/weather.py 里的 PLACE。
3. 执行 bash selftest.sh,五项必须全部通过才能进入下一步。

四、设备端
1. 把 kindle/*.sh 与 config/dash.conf.example(改名为 dash.conf 并填入本机局域网 IP)
拷贝到设备。
2. 拷完删除 macOS 生成的 ._* 文件。
3. 停下来告诉我:需要在 Kindle 书库里依次点击哪些脚本,每一步预期看到什么。

硬性约束
- 改设备前,屏保原图必须备份到 /mnt/us/screensaver-backup/。
- 只操作 /mnt/us 与 /usr/share/blanket/screensaver/,不要动 /etc/uks 之外的系统文件,
不要碰安卓分区。
- 每次写入设备后执行 sync。
- 若现象与 docs/pitfalls.md 描述不符,停下来报告,不要猜测继续。
- 全程说明你在做什么、为什么。

验收
我休眠设备后,屏保应显示当月月历 + 农历/节气/节日 + 天气。
若仍显示旧图,按 docs/pitfalls.md 排查。