Open
Conversation
EPFramebufferSwtcon moved from libqsgepaper.so into xochitl in firmware 3.25, breaking the dlopen/dlsym server path. This adds LD_PRELOAD-based support that hooks into xochitl's statically-linked SWTCON functions. Changes: - Version3.25.cpp: new implementation using malloc/calloc/mmap hooks to redirect the gray buffer to shared memory, then lock → actualUpdate → processAndSignal to drive the framegen thread - Version.cpp: added 3.25 build ID mapping + robust ELF PT_NOTE parsing for build-id discovery (replaces hardcoded address, backward compatible) - PreloadHooks.h: added Mmap to the HOOKS(X) macro - CLAUDE.md: reproduction instructions for future contributors Tested on reMarkable 2 with firmware 3.25.1.1 using yaft terminal emulator with Type Folio keyboard. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Covers SSH access, terminal usage, build/deploy, remote screen verification, debugging, architecture, and address discovery for future firmware versions. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Restores the detailed RE narrative: how addresses were discovered, buffer redirections, update mechanism, ELF build ID parsing, failed approaches, and the terminal helper script. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Rasterize 9,944 glyphs (regular + bold) from JetBrains Mono Nerd Font using a new Python generator script. Covers ASCII, Latin, Greek, Cyrillic, box drawing, block elements, Powerline, and ~5,900 Nerd Font dev icons (Seti-UI, Devicons, Font Awesome, Codicons, etc.). Box drawing characters are post-processed to extend lines to cell edges for seamless connections across terminal cells. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add keyhotd, a keyboard hotkey daemon that listens for Ctrl+Alt+T on the Type Folio to launch the terminal directly from xochitl. Runs as a systemd service, passively monitors input without grabbing, and guards against double-launch. Also includes yaft glyph regeneration with JetBrains Mono Nerd Font, dirty line tracking improvements, and test infrastructure updates. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Skip e-ink updates for cells that haven't actually changed. tmux and Claude Code TUI frequently repaint unchanged content (status bars, static text), causing unnecessary full-screen e-ink flashes. - Add cells_equal() for field-by-field cell comparison (fast path skips pixmap[] unless has_pixmap is set) - Guard erase_cell, set_cell, copy_cell with comparison checks - Make erase_display shouldClear conditional on actual changes - Scope server-side RGB565→Y8/ARGB32 conversion to dirty rect only (was converting all 2.6M pixels per doUpdate call) - Send single bounding-box doUpdate per frame instead of per-line - Fix existing dirty tracking tests for new skip-unchanged semantics - Add 6 new tests for redundant-write skipping Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Server: when GrayReady flag is set, skip redundant gray buffer write and only convert RGB565→ARGB32 (~30% per-pixel savings). The Y8→ARGB32 fast path was investigated but doesn't work due to canvas rotation mismatch between the unrotated gray buffer and rotated RGB565 layout. yaft: replace per-chunk setState with a 32ms debounce timer. Terminal output is parsed immediately but draws are batched, limiting panel refreshes to ~30/sec. This is the biggest performance win — each e-ink refresh costs 50-250ms, so batching rapid output (e.g. ls, cat) into fewer refreshes saves far more time than pixel conversion optimizations. Infrastructure: add GrayReady=8 UpdateFlag, getGrayCanvas(), expanded shared memory mmap for Y8 buffer, and canvasOffset() helper. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…low commands Document actualUpdate's ARGB32 dependency, canvas rotation mismatch, GrayReady fast path behavior, e-ink refresh batching strategy, quick build-deploy-test cycle, screenshot script usage, WiFi fallback note, and expanded files-modified table. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
This worked great for me! I mean Claude did all the work, but i've got Claude Code running on my RM2 now, version 3.25.1.1 ... Thank you!! |
Owner
|
Nice, I do see some changes that are not related to 3.25 support. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
libqsgepaper.sointoxochitl(statically linked)dlopen(libqsgepaper.so)no longer finds the SWTCON implementationVersion.cpp, replacing the hardcoded address (backward compatible with older firmware)What changed in firmware 3.25
In 3.20-3.23,
EPFramebufferSwtconlived inlibqsgepaper.soand the server coulddlopen/dlsymthe update functions. In 3.25, these are statically linked into xochitl.libqsgepaper.sonow only containsEPFramebufferDesktop(a software renderer).The 3.25 build ID is intentionally not mapped for
libqsgepaper.soinVersion.cppso thatServerExefalls through to the LD_PRELOAD path.Files
libs/rm2fb/Versions/Version3.25.cpplock → actualUpdate → processAndSignallibs/rm2fb/Versions/Version.cpplibs/rm2fb/Versions/Version.hversion_3_25_0libs/rm2fb/PreloadHooks.hMmaptoHOOKS(X)macrolibs/rm2fb/CMakeLists.txtVersion3.25.cppto buildCLAUDE.mdTest plan
dbclient)Build
nix build .#dev-crossCross-compiled on aarch64-darwin, deployed via SCP + patchelf.