Skip to content

Add reMarkable Move (chiappa) device support#19

Open
rmeadomavic wants to merge 5 commits intoawwaiid:mainfrom
rmeadomavic:add-move-support
Open

Add reMarkable Move (chiappa) device support#19
rmeadomavic wants to merge 5 commits intoawwaiid:mainfrom
rmeadomavic:add-move-support

Conversation

@rmeadomavic
Copy link
Copy Markdown

Summary

Adds reMarkable Move ("chiappa") device support to Ghostwriter. The Move is reMarkable's 7.3" tablet using the i.MX93 SoC — same architecture as Paper Pro (aarch64) but with different display hardware.

Key discoveries:

  • Framebuffer: 960x1696, 2bpp, 16-bit little-endian grayscale (low byte carries the grayscale value)
  • Physical display is 954 pixels wide, but framebuffer stride is 960 (padded to 32-pixel alignment)
  • Uses the Paper Pro's DRI card0 pointer-scanning approach for framebuffer location
  • Framebuffer is already in portrait orientation (no rotation needed, unlike RM2)
  • Touch digitizer range is 1248x2208 (different from Paper Pro's 2065x2833)
  • Pen digitizer range is 6760x11960
  • System uinput.ko module works — no bundled module needed

Files changed (5 files, ~60 lines):

  • — Add variant, detect "chiappa 1.0" in
  • — Move-specific encoder: 960x1696, low byte extraction, no rotation, no RM2 tone curve
  • — Load system uinput module via modprobe/insmod instead of bundled modules
  • — Move pen input path and coordinate ranges (event2, 6760x11960)
  • — Move touch input path and coordinate ranges (event3, 1248x2208)

Test plan

  • Device detection: "RemarkableMove" logged on boot
  • Screenshot capture: clean grayscale PNG with readable text and icons
  • API round-trip: screenshot sent to Claude Sonnet, response received
  • SVG drawing: response rendered on screen
  • Touch trigger: lower-left corner tap triggers correctly
  • Tested on firmware 3.26.0.68 (chiappa)

🤖 Generated with Claude Code

Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com

rmeadomavic and others added 5 commits March 27, 2026 14:46
Adds the RemarkableMove variant to DeviceModel, detected via
"chiappa 1.0" in /etc/hwrevision. The Move uses the Paper Pro's
DRI-based framebuffer scanning approach but with RM2-style 16-bit
grayscale pixels at 960x1696 (954 physical + 6px alignment padding).

Key parameters discovered through framebuffer probing:
- Screen: 960x1696, 2 bytes/pixel, little-endian grayscale
- Framebuffer: /dev/dri/card0, same pointer scanning as Paper Pro
- Pen input: /dev/input/event2 (Elan marker, ABS max 6760x11960)
- Touch input: /dev/input/event3 (Elan touch)
- uinput: system module at /usr/lib/modules/.../uinput.ko

Tested on firmware 3.26.0.68 (chiappa).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Touch digitizer on Move reports ABS_MT_POSITION_X max=1248 and
ABS_MT_POSITION_Y max=2208 (different from Paper Pro's 2065x2833).
This fixes trigger corner detection and touch coordinate mapping.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Move framebuffer is already in portrait orientation, unlike RM2 which
needs rotate270 + flip_horizontal. Add encode_png_move that processes
16-bit grayscale without rotation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The RM2's apply_curves() crushes pixel values to near-binary (black/white)
because the RM2 framebuffer uses a narrow value range of 11-15 out of 255.
The Move uses standard grayscale, so applying this curve makes screenshots
unreadable. Skip it for the Move encoder.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Move stores grayscale in the low byte (chunk[0]) of each 16-bit pixel,
not the high byte (chunk[1]) like RM2. Content pixels like 0xFF00 were
appearing white instead of black, making half the ink invisible.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@awwaiid
Copy link
Copy Markdown
Owner

awwaiid commented Mar 27, 2026

@rmeadomavic did you try it on a real device? Does it work? So cool.

I have been doing experiments in the web branch, I wonder how well this would apply to that, if you'd like to try.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants