世界を動かす技術を、日本語で。

脱獄したKindle上のRust(およびSlint)

概要

  • Kindle Paperwhite第7世代を 脱獄 し、独自アプリを動作させる試み
  • Rust をKindle上でクロスコンパイルし、動作検証まで実施
  • Slint によるGUI表示とタッチパネル入力の実装方法を解説
  • Kindleの e-ink画面タッチ入力 の制御方法を詳細に説明
  • Slint用Kindleバックエンドを crates.io に公開

Kindle PaperwhiteでRustを動かすまで

  • Kindle Paperwhite第7世代の 脱獄 とKUALの導入
  • 脱獄の動機はAmazonの制限解除よりも、 ナイトスタンド用の時計 アプリ作成
  • 独自プロジェクトの実装経緯と「既存ライブラリより自作」のプログラマ精神

Rustのクロスコンパイル環境構築

  • Kindleは ARMv7 + musl libc がターゲット
  • 低スペック端末でのRustネイティブビルドは非現実的
  • cargo-zigbuildZig コンパイラによるクロスコンパイル推奨
    • Zigは全アーキテクチャ向けmusl libcを内蔵
    • zig ccによる完全なクロスコンパイルツールチェーン
  • ビルドコマンド例
    • cargo zigbuild --release --target armv7-unknown-linux-musleabihf

Kindleへのアプリ転送とシェルアクセス

  • USBNetworkツールで SSHアクセス を有効化
    • USBまたはWi-Fi経由で接続
  • sshconfigにエントリ追加、公開鍵を手動で /mnt/us/usbnet/etc/authorized_keys へ配置
  • ssh-copy-idはKindleでは動作せず

SlintによるGUI表示

  • Rust用GUIライブラリ Slint を選択
  • ARMv7対応済み、Raspberry Piでの経験を活用
  • 出力先はe-ink画面、入力はタッチパネル
    • /dev/fb0(フレームバッファ)をメモリマップし、グレースケール画像を書き込み
    • SlintのLineBufferProviderで1ラインずつ処理し描画
  • 描画後は ioctl() でドライバに画面リフレッシュを通知

タッチパネル入力の取り扱い

  • タッチコントローラは /dev/input/event1 として認識
    • read()で直接イベント構造体を受信
  • Linuxカーネルの マルチタッチプロトコルtype B に準拠
    • X座標、Y座標、トラッキングIDなどのイベントを逐次取得
    • SYNC_REPORTイベントで入力バッチを確定
    • トラッキングID=-1で指離し(PointerReleased)、タッチ開始/移動も適切にSlintへ通知

実装のまとめと公開

  • 多数のバグ修正を経て、 カウンター+インクリメントボタン の動作を実現
  • Kindle Paperwhite第7世代向けに最適化(他機種では調整必要)
  • Slint用Kindleバックエンドを crateとして公開
  • 今後はダッシュボード等のアプリ拡張を予定

KindleでGUIアプリを自作する意義

  • Kindleの 制限を超えた活用 の可能性
  • RustとSlintによる 軽量・高機能なGUIアプリ 開発環境の構築
  • 独自ダッシュボードやIoT連携など、 新たな活用シーン の創出

Hackerたちの意見

コード: https://github.com/sverrejb/slint-kindle-backend

これ、めっちゃクールだね!最近数ヶ月の間にHNで見た中で、試してみたいと思った最初の投稿の一つだよ。

これ、いいね!シェアしてくれてありがとう。最近、LicheeRV NanoでRust / Slintをコンパイルしたんだ。これはRISC-V 64bitのmuslなんだけど、ちょっとしたポータブルオーディオプレーヤーを作ってるところ。コンパイルはカスタムのCross dockerイメージを使ってやったよ。今はBattery Palを評価中なんだけど、TP4057モジュールがUSB-Cから3.5mmアダプターを安定して供給できなかったから。今のところ、期待通りに動いてるみたい。 1: https://github.com/nanowave-player/nanowave-ui 2: https://pnlabs.ca/batterypal/

これ、すごい!Kindleの脱獄やアップデート回避ってどれくらい信頼できるの?「アフターマーケット」のKindle改造があまりにも小さいエコシステムに見えたから、xteinkとか将来的にはbooxみたいな他のデバイスを選んだんだ。Kindleは、信頼できる脱獄ができてカスタムソフトウェアを載せられるなら、すごくいい選択肢になると思う。

ファームウェアのバージョンによっては、ほとんどの脱獄ガイドがOTAファームウェアファイルと同じ名前の空のディレクトリを作るように指示したり、renameotabinという拡張機能をインストールさせて、アップデートを行うバイナリの名前を変更してアクセスできなくするんだ。出典: https://kindlemodding.org/jailbreaking/post-jailbreak/disabl...

Koboデバイスは全然ロックされてなくて、Linuxが動いてるってことも覚えておく価値があるよ。すごくビルドしやすいんだ。

一番後悔してるのは、去年自動更新される前にKindleを脱獄しなかったことだな。

ジェイルブレイクしたKindleをWi-Fiに繋げてるんだけど、(理論上は)インターネットにもアクセスできるよ。もう3年間問題なし!

Amazonを確実にブロックしたいなら、これを使ってみてね: https://github.com/Darthagnon/kindle-kual-blockamazon それと、ここにあるKindleのソフトウェアアップデートブロッカーのどれかもね: https://github.com/Darthagnon/BlockKindleOTA

最新のKindleファームウェアでは、追加の拡張機能をインストールしない限り、ジェイルブレイクが上書きされちゃうよ。俺は「renameotabin」って拡張機能を使ってて、たまにWi-FiをオンにしてKoreader経由でFTPから本を読み込んでる。ジェイルブレイクしてから3年経つけど、リセットは一度もないよ。詳細はここを見てね: https://kindlemodding.org/jailbreaking/post-jailbreak/disabl...

いい記事だね!古いKindleをハッキングするのは楽しいよ!みんなもぜひ試してみてほしい。einkのレトロな感じが特別なんだ。昔、古いKindleでZigをクロスコンパイルした経験について書いたことがあるよ。 https://samkhawase.com/blog/zig-kindle-gdb/

ちょっと脱線するけど、SlintはDruidやeguiと比べてどうなの?

私も気になる!ここでの大きな違いは、Slintが組み込みデバイスやno-stdで動くことだと思う。

ちょっと脱線するけど、Druidはもう放置されてるんだ。精神はXilemとして生き続けてるけど、そっちもあまり注目されてない。すごく…探求的な感じだね。個人的にはicedが好きで、RustのGUIライブラリの中ではこれが一番だと思ってる。質問があればDiscordもすごく活発だよ。 https://iced.rs/

Slintは、Qtと似たモデルで開発を支援する会社にバックアップされてるんだ。

RustのクロスコンパイルバックエンドとしてのZigはめっちゃいいよね。

脱獄したKindle用の自己ホスティングライブラリサーバーを作ってて、KUALアプリには純粋なRustを使うことにしたんだ。本と注釈をサーバーと同期するためにね。cargo build --release --target armv7-unknown-linux-musleabihfを実行するだけで、.cargo/config.tomlはこんな感じ:[target.armv7-unknown-linux-musleabihf] linker = "rust-lld" rustflags = ["-C", "link-self-contained=yes"]. ただ、C依存は使えないのが難点かな。 :)

脱獄可能なKindleのリストってどこかにある?しばらく遊ぶために買おうと思ってるんだけど、あまりにも厳しくロックされてるやつや、自分のコードが動かせないやつをうっかり買いたくないんだよね。

最新のソフトウェア更新がされたもの以外は全部脱獄可能だよ。ここにサポートされているソフトウェアバージョンとデバイスの詳細なリストがある。このウェブサイトには必要な情報が全部揃ってるよ。(https://kindlemodding.org/kindle-models.html) それに、すごく人気のDiscordもあるよ。(https://discord.com/invite/wDbbZTF5QF)

前のPaperwhiteをこういう風に使えたらいいのにな。旅行中に失くしちゃうだけなんだよね。最近、2019年版の最後の一台を失くしちゃった。これで3台目だよ…