ران کردن Rust روی کیندل جیلبریکشده
خلاصهٔ کاملتر
یه توسعهدهنده کیندل Paperwhite نسل هفتمش رو جیلبریک کرد — نه به خاطر نگرانی از سلطه آمازون، بلکه صرفاً برای اینکه بتونه ازش بهعنوان ساعت رومیزی استفاده کنه. اما وقتی در باز شد، یه سوال جالبتر پیش اومد: آیا میشه Rust رو روی این دستگاه اجرا کرد؟ هدف نهایی ساختن یه داشبورد برای Home Assistant بود.
کامپایل کراسپلتفرم اولین چالش بود. کیندل روی معماری ARMv7 با musl libc کار میکنه و اجرای زنجیره کامپایل Rust مستقیم روی خود دستگاه عملاً غیرممکنه. راهحل انتخابی ابزار cargo-zigbuild بود؛ این ابزار از کامپایلر Zig استفاده میکنه که سورسکد و هدرهای musl رو برای همه معماریها به همراه داره و میتونه بهعنوان یه toolchain کامل برای کراسکامپایل عمل کنه. دستور نهایی کامپایل اینقدر سادهست:
cargo zigbuild --release --target armv7-unknown-linux-musleabihf
برای دسترسی به شل دستگاه، از ابزار USBNetwork استفاده شد که SSH از طریق USB یا وایفای رو ممکن میکنه. بعد از تأیید اینکه «Hello, World!» درست اجرا میشه، نوبت به رابط گرافیکی رسید. کتابخونه Slint انتخاب شد که از ARMv7 پشتیبانی میکنه و یه software renderer سبک داره.
برای نمایش تصویر روی صفحه e-ink، از LineBufferProvider در Slint استفاده شد که خروجی رو خطبهخط به فرمت گِریاسکیل تبدیل میکنه و مستقیم توی فایل /dev/fb0 (فریمبافر صفحه) مینویسه. بعد از نوشتن هر فریم، باید از طریق ioctl() به درایور اطلاع داده بشه که صفحه e-ink رو رفرش کنه — چون این صفحهها بر خلاف LCD برای بهروزرسانی نیاز به دستور صریح دارن.
ورودی لمسی هم از همین فلسفه لینوکس («همه چیز یه فایله») بهره برد. صفحه لمسی بهعنوان /dev/input/event1 در دسترسه و کافیه ازش read() بگیریم. کیندل از multi-touch protocol type B هسته لینوکس استفاده میکنه: رویدادها بهصورت جریانی از مختصات X، Y و tracking ID میان و با یه SYNC_REPORT تموم میشن. tracking ID برابر -1 یعنی انگشت از صفحه برداشته شده (PointerReleased)، اولین sync بعد از لمس میشه PointerPressed، و بقیه میشن PointerMoved. Slint بقیه ماجرا رو خودش مدیریت میکنه.
بعد از رفع باگهای متعدد — از خروجی نامرئی گرفته تا ثبت دوباره لمس — نتیجه نهایی به یه کِرِیت مستقل با نام slint-backend-kindle تبدیل شد و روی crates.io منتشر شده. داشبورد اصلی هنوز در راهه.
نکات کلیدی:
- جیلبریک کیندل Paperwhite نسل ۷ و اجرای کدهای دلخواه روی اون
- ابزار cargo-zigbuild برای کراسکامپایل Rust به ARMv7/musl بدون درد
- استفاده از کتابخونه Slint با software renderer برای رندر گرافیک روی e-ink
- نوشتن مستقیم به /dev/fb0 و رفرش صفحه با ioctl()
- خواندن ورودی لمسی از /dev/input/event1 با multi-touch protocol B لینوکس
- کد بهصورت کِرِیت slint-backend-kindle روی crates.io در دسترسه




