루스트와 슬린트를 탈옥된 킨들에 적용하기
많은 개발자에게 탈옥된 디바이스의 매력은 단순히 제조사의 제한을 없애는 것이 아니라, 레거시 하드웨어 위에서 최신 툴체인을 실험할 수 있는 자유에 있습니다. 7세대 Kindle Paperwhite는 책을 읽기 위해 설계되었지만, 본질적으로 Linux 기반 ARMv7 디바이스입니다. Rust의 강력한 크로스 컴파일 기능과 Slint GUI 프레임워크를 활용하면 전용 전자책 리더를 맞춤형 대시보드나 특수 도구로 변환할 수 있습니다.
크로스 컴파일의 도전 과제
저전력 임베디드 디바이스에서 Rust를 실행하는 것은 종종 큰 장애물인 컴파일 과정 자체를 동반합니다. 디바이스에서 직접 컴파일을 시도하는 것은 CPU와 RAM이 제한되어 있기 때문에 보통 불가능합니다. 해결책은 armv7-unknown-linux-musleabihf를 목표로 하는 크로스 컴파일입니다.
이를 달성하는 방법은 여러 가지가 있지만, cargo-zigbuild가 매우 효율적인 도구로 부상했습니다. Zig 컴파일러는 모든 지원 아키텍처에 대한 musl libc 소스와 헤더를 함께 제공하므로 완전한 크로스 컴파일 툴체인으로 작동할 수 있습니다. 이를 통해 복잡한 sysroot와 링커를 수동으로 관리할 필요가 사라집니다. 과정은 몇 가지 간단한 단계로 정리됩니다:
- Zig를 설치합니다.
cargo-zigbuild를 설치합니다.cargo zigbuild --release --target armv7-unknown-linux-musleabihf명령을 실행합니다.
커뮤니티의 다른 개발자들은 rust-lld와 특정 cargo 설정을 사용해 C 의존성을 피하면서도 성공적인 결과를 얻었다고 보고했으며, 이는 Kindle 해킹을 위한 ARMv7 musl 타깃의 실용성을 더욱 입증합니다.
디바이스 접근 설정
바이너리를 컴파일한 후 다음 과제는 배포와 디버깅입니다. KUAL(Kindle Unified Application Launcher)과 같은 도구가 제공되지만, 애플리케이션의 표준 출력(stdout)을 확인할 수 있는 충분한 가시성을 제공하지 않습니다.
이를 해결하기 위해 USBNetwork 도구를 사용해 USB 또는 Wi‑Fi를 통한 SSH 접근을 설정합니다. 이를 통해 파일을 직접 전송하고 애플리케이션 실행을 실시간으로 모니터링할 수 있습니다. 이 과정에서 중요한 기술적 세부 사항은 ssh-copy-id가 동작하지 않을 수 있다는 점이며, 공개 키를 디바이스의 /mnt/us/usbnet/etc/authorized_keys에 수동으로 추가해야 합니다.
E‑Ink에 GUI 구현하기
킨들에서 시각적 인터페이스를 만들려면 표준 Amazon UI를 우회하고 하드웨어와 직접 상호 작용해야 합니다. Slint GUI 프레임워크는 거의 모든 플랫폼에서 실행 가능한 경량 소프트웨어 렌더러를 지원하기 때문에 여기서 탁월한 선택입니다.
프레임버퍼에 렌더링
Linux 철학인 “모든 것은 파일이다”에 따라 킨들의 디스플레이는 /dev/fb0에 있는 프레임버퍼를 통해 접근할 수 있습니다. Slint에서 LineBufferProvider를 구현함으로써 애플리케이션은 라스터화된 시각 출력을 라인 단위로 받아 회색조로 변환하고 메모리 매핑된 프레임버퍼에 직접 기록할 수 있습니다.
하지만 프레임버퍼에 단순히 기록하는 것만으로는 e‑ink 디스플레이에 충분하지 않습니다. LCD와 달리 e‑ink는 화면을 새로 고치는 명시적인 명령이 필요합니다. 이는 libc 크레이트와 ioctl()(입출력 제어) 시스템 콜을 사용해 드라이버에 Slint 내부에서 제공하는 특정 “dirty region”을 새로 고치도록 알림으로써 구현됩니다.
터치 입력 처리
입력은 /dev/input/event1 디바이스 파일을 통해 유사하게 처리됩니다. 킨들은 Linux 커널의 멀티터치 프로토콜 type B를 사용합니다. 이 프로토콜은 좌표와 트래킹 ID 스트림을 이벤트로 전달하고, 뒤이어 SYNC_REPORT 이벤트가 발생합니다.
이를 Slint와 통합하려면 애플리케이션은 다음을 수행해야 합니다:
- 도착하는 X와 Y 좌표를 누적합니다.
SYNC_REPORT이벤트가 발생할 때까지 대기합니다.- 트래킹 ID를 Slint 이벤트에 매핑합니다: 트래킹 ID가
-1이면PointerReleased이벤트를 의미하고, 터치 다운 후 첫 번째 sync는PointerPressed이벤트를 의미합니다.
결론
Rust와 같은 현대 언어와 e‑ink 디바이스의 특정 하드웨어 제약 사이의 격차를 메우면 기능적인 GUI를 구현할 수 있습니다. 그 결과는 맞춤형 카운터 애플리케이션이며, 이는 현재 crates.io에서 제공되는 전용 slint-backend-kindle 크레이트의 기반이 되었습니다. 이 프로젝트는 올바른 툴체인—특히 Zig와 Slint—을 사용하면 레거시 하드웨어를 완전히 새로운 용도로 재활용할 수 있음을 보여줍니다.
SUMMARY: Rust를 ARMv7용으로 크로스 컴파일하고 Slint를 사용해 e‑ink 디스플레이용 맞춤형 GUI 백엔드를 구현하는 심층 탐구.
TITLE: 루스트와 슬린트를 탈옥된 킨들에 적용하기