
2026/05/28 4:51
ジャイルブレイクされたKindleでのRust(およびSlint)の動作
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
オリジナルのサマリーは優れており、簡潔で主要なポイントを適切に捉えています。厳密な改訂は必要ありませんが、「飛躍的な進展」(crate の公開)を「障壁の低下」というより大きな含意との間に明確な接続をつけることで、流れが少し洗練され改善されます。
改善されたサマリー: 7 世代 Kindle Paperwhite の Jailbreak に成功し、それを独自の Rust アプリケーションを実行する機能的な Linux デバイスに変化させることで、大きな技術的画期が達成されました。Zig ツールを使用して ARMv7 アーキテクチャ向けの Rust コードをクロスコンパイルし、自動化された手法では失敗した USBNetwork を介して SSH アクセスを手動で設定することで、プロジェクトは内在的なハードウェアの制限を克服しました。グラフィックレンダリングには Slint のソフトウェアレンダラを使用しており、
ioctl を介してフレームバッファに灰度データを出力し、タッチ入力は生の Linux イベントから処理され、マルチタッチプロトコルを解釈してポインタイベントを正確にディスパッチします。以前の実行 Jailbreak の努力に基づき、この仕事は Slint がリソース制約のある E-Ink ハードウェア上で実用であることを検証するだけでなく、crates.io に公開された堅牢なオープンソースバックエンド crate を導入しました。この再利用可能な基盤は効果的に開発者のための障壁を下げ、Kindle Linux 改修の将来の改善のための堅固な土台を確立します。本文
Rust on Kindle: 電子書籍リーダーへのグラフカルとタッチスクリーンの実装記
公開日: 2026 年 5 月 26 日
著者: 開発者(自己紹介)
🎯 プロジェクトのきっかけ
- ファームウェアアンロック(Jailbreak)
- 第 7 世代 Kindle Paperwhite のファームウェアを解放しました。
- 当初は「Amazon の制限からの開放」が動機でしたが、真の目的は寝室のナイトスタンドで時計として活用したいという欲求でした。
- Rust on Kindle への思い
- コード調整次第で実現可能であると思い試したところ成功し、好奇心が増幅されました。
- 「Kindle 上で Rust を動かせるか?」
- 「さらに有用なことはできないか?」
- コード調整次第で実現可能であると思い試したところ成功し、好奇心が増幅されました。
- 今後の展望
- Home Assistant とスマートデバイスへの関心が再燃しており、機能用のダッシュボード作成を検討しています。
「プログラム対話において、『X を行うためのライブラリが既に存在する』と伝えることは、歌手に『愛についての曲がもうある』と同じだ。」
— Pete Cordell
🛠️ Kindle 向け Rust のクロスコンパイル
ARMv7 アーキテクチャおよび
musl libc をターゲットにする必要があります。低性能デバイスでの Rust コンパイルは過去に苦労した経験がありますが、クロスコンパイルには優れたツールが存在します。
- 使用する主要ツール
- cargo-zigbuild: Rust のクロスコンパイルに慣用的に使用されるツールです(皮肉にも Zig を経由しています)。
- Zig コンパイラ:
- 対応アーキテクチャに対する
のソースコードとヘッダーを内蔵。musl libc - 独自のリンカを備えるため、ホストマシンから任意の musl ターゲットへクロスコンパイル可能な完全なツールチェーンを提供します。
- 対応アーキテクチャに対する
コンパイル手順
- Zig のインストール
- cargo-zigbuild のインストール
- Kindle 向けコンパイルの実行
cargo zigbuild --release --target armv7-unknown-linux-musleabihf
🔓 Kindle へのシェルアクセスの取得
コンパイルは完了しましたが、出力を表示・確認するための手段が不可欠でした。
- KUAL を使用する場合
- Jailbreak 時にインストール可能なツールですが、アプリケーションの実動作確認には不十分です。
- SSH 接続の設定(採用案)
- USBNetwork (
): USB または Wi-Fi 経由で SSH アクセスを提供するツールを使用しました。usbnet - sshconfig の設定
は機能しないため、公開鍵を直接コピーする必要がありました。ssh-copy-id- コマンド(例):
cat ~/.ssh/id_rsa.pub | ssh root@kindlehost "mkdir -p /mnt/us/usbnet/etc && cat >> /mnt/us/usbnet/etc/authorized_keys"
- USBNetwork (
👋 Hello World!では次に?
- 現状の確認
- Shell アクセスが確保され、クロスコンパイルツールの有効性が確認できました。
- SSH 経由での標準出力(stdout)表示は成功しましたが、実用性は限定的です。
- GUI ライブラリの選定
- Rust の成熟に伴い多数の GUI ライブラリが登場していますが、経験則からSlintを選択しました。
- 課題: Raspberry Pi での実績がある ARMv7 サポートはありましたが、Kindle 特有のハードウェア対応が残ります。
- 電子インキディスプレイへの出力
- タッチパネルからの入力
🎨 やっと視覚表現が実現しました!
Slint は軽量で汎用性の高いソフトウェアレンダラーをサポートしています。
- 画像描画の仕組み
を実装し、LineBufferProvider
関数を通じてラスタライズされたラインを逐次取得します。process_line()- 取得したデータをグレースケールに変換後、フレームバッファへ書き込みます。
- フレームバッファの場所:
(Linux の「すべてはファイルである」という哲学が光ります)。/dev/fb0
- 画面更新の実装
クレートを用いたlibc
システムコールでドライバに更新を通知します。ioctl()- Dirty Region(更新が必要な領域): Slint の内部メカニズムによって自動的に提供されるデータを指定するだけで済み、手動計算不要です。
👆 タッチ入力もここに!
画面描画に加え、タッチパネルとの連携が次の課題でした。これも「すべてはファイルである」という原則で解決します。
- デバイスノード
- タッチコントローラーは
として露出されており、単純な/dev/input/event1
操作でイベントを収集できます。read()
- タッチコントローラーは
- イベント構造体
- カーネルが直接書き込んだ構造体が得られ、以下の要素を含みます:
- タイムスタンプ
- イベントタイプ
- コード
- 値
- プロトコル解読やパース処理は不要です。
- カーネルが直接書き込んだ構造体が得られ、以下の要素を含みます:
マルチタッチプロトコル(タイプ B)の扱い
- データストリーム形式
- X 座標、Y 座標、トラッキング ID が更新される順にストリームされます。
- バッチ処理完了の合図として
イベントが入ります。SYNC_REPORT
- Slint へのマッピングロジック
- 蓄積処理: 最新のパリメータ(X, Y, ID)をバッファに保持します。
- アクション判定 (SYNC_REPORT にて):
: 指が離れた →ID == -1PointerReleased- 初回イベント: タッチダウン →
PointerPressed - その後のイベント: 移動 →
PointerMoved
- 実装方針: 詳細な判定ロジックは Slint に委譲します。
✅ やっと動作しました!
多数のデバッグを経て、以下の機能を安定して実装することに成功しました。
- 表示の問題解決(非表示、更新失敗など)
- フラッシュ現象の抑制(二重フラッシュの排除)
- タッチ入力検知の正確化(過検出の防止)
オープンソース化
- 成果物
- 特定デバイスで動作を確認した Slint バックエンド (
) を作成しました。kindle-backend - 関連コードを独立したクラートとして抽出し、crates.io に公開しています。
- 特定デバイスで動作を確認した Slint バックエンド (
⚠️ 注意点: この実装は特定の Kindle デバイス(第 7 世代 Paperwhite など)で動作が保証されています。他の機種では設定変更が必要になる可能性が高いです。
次回への展望
- 「owl」ダッシュボード全体の描画と Home Assistant 連携などを今後紹介予定です。