概要
- 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-zigbuild と Zig コンパイラによるクロスコンパイル推奨
- 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連携など、 新たな活用シーン の創出