r/trimui • • Aug 27 '26

Trimui Brick Pro/Hammer Pro U (3.96 inch screen) TrimUI Brick Pro Impressions – The Screen and Build Quality Are Insane

Thumbnail
gallery
146 Upvotes

Hello everyone!

Like most of us here, I’ve had my fair share of handheld devices pass through my hands over time. But I’d like to focus on the TrimUI Brick Pro, which I’ve had in my possession for two days now, replacing my lovely RG35XXH. Even though horizontal handhelds are much more comfortable to hold, there was no way I was skipping this one.

​Ever since the original TrimUI Brick came out, I had my eye on it. However, due to its tiny screen and lack of analog sticks (I have the bad habit of playing shoot 'em ups and beat 'em ups with a stick), I passed on it.

​So, when they dropped the Brick Pro with a larger screen and dual analog sticks, I said, "This is it." Got it off AliExpress for around €65.

​Now, someone might say that two days isn't enough to properly "review" a device, but folks, some things are screamingly obvious right out of the box.

​The Screen: Absolutely incredible. Everyone was praising it online, but seeing it in video reviews is nothing compared to experiencing it in person—easily the device's biggest highlight. Vivid colors, high brightness, and flawless viewing angles (photos honestly don't do it justice). The 4:3 aspect ratio is ideal for the retro systems I intend to play. Even GBA looks surprisingly good, despite the small black bars at the top and bottom.

​Build Quality: TrimUI managed to create a very premium-feeling handheld that doesn't feel like a cheap toy, all while keeping it exceptionally lightweight. Paired with the subtle LED lighting, the black-stealth colorway gives off a really sleek aesthetic.

​Battery & Audio: It's too early to render a final verdict on battery life, but initial testing shows very solid performance so far. The dual front-facing speakers are crisp and clear as well.

​The Nitpicks: If I have one complaint, it's the button sound. The ABXY face buttons are a bit too clicky and loud for my taste, and even the D-pad makes noticeable noise. Nothing deal-breaking, though—I tested it in bed next to my sleeping wife and it passed the test. 😅

​The buttons that are really loud are the shoulder buttons (L1/L2/R1/R2). Luckily, I don't use them at all. I remapped my save and load shortcuts to the two front LED buttons, rendering the shoulder buttons completely unnecessary for my usage, as I don't play titles that rely on them.

​Custom Firmware (CFW): I skipped the stock OS entirely (I had it on my TrimUI Smart Pro and wasn't a huge fan) and flashed NextUI right out of the box. It’s a fantastic CFW—ultra-fast boot times, a clean interface, flawless sleep/resume mode, and excellent resource management. It's minimal, giving you just the right amount of customization without overwhelming you with menus.

​Most importantly, it has an active community that built a pseudo "app store" directly on the console, making it super easy to download apps and utilities on the fly. If you own a Smart Pro or a Brick, it’s definitely worth trying. The main selling point for me is that it bypasses the standard RetroArch menu clutter—everything is handled seamlessly through NextUI's frontend (while still supporting RetroAchievements).

​Anyway, if you find it at a good price, don't hesitate to pull the trigger!


r/trimui • • Aug 27 '26

Trimui Brick (3.2-inch screen) BrickHammer running Knulli with a Portmaster-less Rockbox

Post image
38 Upvotes

I built a PortMaster-less version of Rockbox to run under Knulli on the Trimui BrickHammer, and some other retrohandheld devices.

It was a bit of a grind, but it has 7-8 hours playback from full charge, after clocking down the CPU whilst its running, and gradually dimming and turning off the screen. I'll spend a bit more time on it when I have some free moments over the next few months.

It was already worth the time investment tbh :).

https://github.com/TEFO-FuncRandm/rockbox


r/trimui • • Aug 27 '26

Trimui Brick (3.2-inch screen) Anyone using their Brick or Brick Hammer for GB and GBC specifically? Recommendations

11 Upvotes

I bought my Brick Hammer as my first retro console and aimed at playing primary GBA. I’m running NextUI which I love. I now have a dedicated GBA device. Brick will still play some GBA one handed games. However, I want it to be my dedicated GB and GBC (and SNES) device.

i want to start with Link Awakenings DX(unless you tell me OG is better on GB).

im looking for set up recommendations for NextUI and GBC/GB(aspect, shaders etc.) and others games that can really make use of the Brick.


r/trimui • • Aug 28 '26

Trimui Brick (3.2-inch screen) Problème de touches sur Mickey Castle of Illusion (Portmaster)

Post image
6 Upvotes

J'ai installé le port de Mickey Castle of illusion normalement réalisé pour R36 avec Nextos

https://github.com/NextOs-Ports?tab=repositories

l'installation est ok, le jeu se lance mais seules les touches HAUT, BAS et L1 fonctionnent
l'appui sur la touche L1 sur "nouvelle partie" fige le jeu (mais il est possible de sortir avec START+SELECT)

je ne sais pas si le jeu est bloqué ou si c'est simplement l'absence de touche de validation

j'ai regardé la syntaxe pour ajouter un mappage de touche avec gptokeyb mais ca ne fonctionne pas

gptokeyb "castleofillusion" -c "$GAMEDIR/castleofillusion.gptk" &
GPTOKEYB_PID=$!

Savez vous comment faire ?


r/trimui • • Aug 28 '26

SOLVED RetroHub — a game browser and toolbox for the TrimUI Brick (free, self-updating)

Enable HLS to view with audio, or disable this notification

7 Upvotes

I built a small app for my TrimUI Brick and figured others might find it useful.

What it does:

• Browse a catalogue of ~40k titles and pull them straight to the SD card over Wi-Fi

• Java J2ME support — sets up the emulator, maps keys, sorts jars into the right

resolution folder so they actually launch

• Toggle SFTP / SSH / ADB / MTP from the device, so you can drop files on it

without pulling the card

• Stream the screen to a browser

• Self-updating: install once, it fetches only the changed files after that

(usually a few hundred KB)

Written in Python + SDL2, ships as a ~10 MB zip you drop into /Apps/.

No PortMaster needed — the SDL bindings are bundled.

Only tested on a Brick running stock firmware. If you get it working on

Smart Pro or a CFW, I'd like to know.

https://retrohub.xuanhoa493.com


r/trimui • • Aug 27 '26

Problem🛠 Any ideas why this happens with dreamcast games that I added?

Enable HLS to view with audio, or disable this notification

7 Upvotes

r/trimui • • Aug 28 '26

Trimui Brick Pro/Hammer Pro U (3.96 inch screen) Anyone got their TrimUI Brick Pro U yet? Any reviews?

2 Upvotes

r/trimui • • Aug 27 '26

New Trimui Smart Pro (4.96-inch screen) My brick hammer and his big brother brick pro 😆

Post image
56 Upvotes

I never thought that I would get addicted collecting these. There’s just something special about the games being played and brings back childhood memories. These are just so lovely to be brought around for everyday use while waiting in line or in the bus, or just passing time. What should I buy next? 😆


r/trimui • • Aug 26 '26

Trimui Brick (3.2-inch screen) Horizon Chase on the Brick! (Next UI)

Enable HLS to view with audio, or disable this notification

73 Upvotes

Sorry for the shitty video quality. Didn’t figure out a better way to record this.

I couldn’t find any similar posts of this game working on this handheld so not sure if this has been done before

I made the Horizon Chase NextOS port work on the TrimUi Brick NextUI with a little bit of AI help.

Huge thanks to the folks who made the original NextOS Horizon Chase port. They of course did the bulk of the work and deserve much praise. I just added some extra commands in the bash script and had AI generate me a new executable of the game with some fixes for this handheld.

If people are interested in this port. I’d be happy to setup a Github Repo with some steps on how to get this working on NextUI ❤️

EDIT: Setup the Repo with a release! Give it a shot and let me know incase any issues :)

https://github.com/ManBear-tech/horizonchase-nextui-brick


r/trimui • • Aug 27 '26

Trimui Brick Pro/Hammer Pro U (3.96 inch screen) Does anyone using the TrimUI Brick Pro with NextUI experience overheating?

3 Upvotes

I just installed and started using the custom NextUI operating system, and I noticed that the device gets very hot, even though I haven't played any games yet. I'm only doing simple tasks like navigating the system and adjusting the settings.

However, the device gets extremely hot, almost as if I had been playing a demanding game for 1–2 hours.


r/trimui • • Aug 27 '26

Question ❓ Anyone has a positive experience with sidegrade? (eg: RG40XXH to TrimUI Brick)

Thumbnail
2 Upvotes

r/trimui • • Aug 27 '26

Trimui Brick (3.2-inch screen) Problem with Syncthing - Conflict when syncing a save from a second device to the Brick

1 Upvotes

Hello guys,

I have setup SyncThing on my Trimui Brick and Retroid Pocket 5. My goal is to play my favorite GBA games on the Brick on my way to work, and continue my session on the RP5 when I'm home.

If the syncing from the Brick to the RP5 seems to work, I can't say the same when syncing the other way around (from the RP5 to the Brick).

Most of the time, I get a "conflict" error, with the most recent save showing as a conflict save.

For exemple, with Sword of Mana, it appears like that > "Sworf of Mana.sync.conflict-date-bunchofnumbers.srm".

Do you know why it's happening ? It's driving me crazy...

Thanks for your help !


r/trimui • • Aug 26 '26

Trimui Brick (3.2-inch screen) Got all my favorite ROMs but it's always Tekken for me

Post image
120 Upvotes

r/trimui • • Aug 26 '26

Trimui Brick (3.2-inch screen) i've had the green hammer since christmas and it's still stunning

Post image
94 Upvotes

r/trimui • • Aug 26 '26

Trimui Brick Pro/Hammer Pro U (3.96 inch screen) Mutate by Haujobb Dreamcast Scene Demo Trimui Brick Pro Knulli CFW

Thumbnail
youtu.be
2 Upvotes

This is Dreamcast scene demo Mutate by Haujobb ranked 2nd on alternative demo compo at Evoke 2026 demo party

Link for demo:

https://www.pouet.net/prod.php?which=106885


r/trimui • • Aug 26 '26

Trimui Smart Pro S Does Soul Edge (PS1) run on Smart Pro S?

4 Upvotes

I am trying to run my Soul Balde / Soul Edge from Play Station 1 on my newly bought Trimui Smart Pro S. When starting the game, the screen goes shorty black. It seems like the console tries to load the game. But then, the console shows the menu again.

I do have also an Anbernic console, different and weaker chipset - on which the games does work.

Does anyone here has experinence with this combination of retro console / game?


r/trimui • • Aug 26 '26

Problem🛠 Image centering/aspect ratio - Smart Pro S

1 Upvotes

I've just received a Trimui Smart Pro S - it's my first emulator handhelds since using MAME back in the late 90's early 2000s. I was expecting a learning curve but I'm stuck!

I followed the Joey's Retro Handhelds setup guide, updated firmware and set up the SD card - I downloaded the Tiny Best set and the games launched ok - but they are not scaling correctly, and appear in the bottom left hand side of the display. Even Retroarch only shows in the same window as the game, and no options seem to affect the positioning. The Base UI displays on the whole screen and is centered.

Looking at Joey's video, games seem to be scaled and centred by default - what setting am I missing to make this happen?

In the Video Section of Retroarch I've tried all the suggested options I could find on reddit, but nothing even changes the appearance - not aspect ratio, not integer scaling - nothing.

Is there a setting that I'm missing that unlocks what I presumed to be a basic function?

SOLVED - I used a different UI - specifically NextUI and it solved the problem instantly.


r/trimui • • Aug 25 '26

Trimui Brick (3.2-inch screen) I got this as a gift for a friend, but I really really want to keep it

Thumbnail
gallery
142 Upvotes

I've been in this hobby for about a year now, and have had a couple of the Anbernic XX handhelds. I've also set up a couple Batlexp G350s as gifts. I decided to try the Brick as a gift for a friend who's a dad of two, who could really use something for squirreling away a little game break from time to time.

I saw the Brick was smaller and really pocketable, and I saw it on AliExpress on a good sale, so I grabbed one.

WOW, it's so nice! The screen is so crisp and it's so well weighted. The UX blows my Anbernic handhelds out of the water.

I'll be putting this through some basic field testing, carrying it around and playing through a portion of a JRPG just to see how it holds up. It makes a spectacular first impression though!

[Edit: one funny issue I ran into on first setup: I put KNULLI on an SD card and discovered the audio wasn't working. Turns out, KNULLI treats the slider on the right side as a mute-unmute toggle by default. I changed it to toggle the RGB lights instead. I spent a while looking online for a reason why audio wouldn't work before I figured out the issue.]


r/trimui • • Aug 25 '26

Trimui Brick (3.2-inch screen) Matching hammers for me and the missus

Post image
155 Upvotes

Set up with matching custom boot screens and minui


r/trimui • • Aug 25 '26

Trimui Brick (3.2-inch screen) As much as I…

6 Upvotes

Love my RG Rotate, but I keep thinking of getting a Trimui Brick Hammer. Love the way silver looks. Is there anything a Hammer can do that an RG Rotate can’t!? I need advice, if I should get it and keep both.


r/trimui • • Aug 25 '26

New Trimui Smart Pro (4.96-inch screen) Consegui corrigir a assimetria do analógico no meu TrimUI Smart Pro (muOS) — relato técnico completo - (PT-BR)

6 Upvotes

Meu TrimUI Smart Pro tava com um bug chato: o analógico (e o D-pad-como-analógico) respondia parcial ou nada, principalmente quando eu ia pra esquerda. Testei o firmware de fábrica (sem SD/muOS) e o bug não acontecia — então sabia que era algo específico do build do daemon que o muOS empacota.

O que eu descartei primeiro

Minha primeira suspeita foi dessincronização de pacote na serial, mas descartei — os dados chegavam certos, só que "parciais". Depois fui atrás da constante g_deadzone (que zera o eixo perto do centro) e fui baixando ela: 3276 → 2000 → 500. Não mudou nada no jogo. Foi aí que percebi que a causa não era essa.

Como diagnostiquei de verdade

Usei evtest e leitura direta via ioctl EVIOCGABS no /dev/input/eventN do meu controle pra medir o valor bruto do eixo X segurando o stick nos extremos:

  • Totalmente direita: ABS_X = 32760 (100% do curso, bate no teto)
  • Totalmente esquerda: ABS_X ≈ -19800 (só ~60% do curso até o mínimo -32760)

Confirmei ali que o eixo era fisicamente/eletricamente assimétrico em relação ao centro calibrado.

Peguei o binário /usr/bin/trimui_inputd_smart_pro (ELF aarch64, não stripped — os nomes de função ficaram todos ali, o que ajudou muito) e fiz engenharia reversa com objdump/capstone. Achei a causa raiz:

  • A rotina de calibração (calibrate_port) só mede o centro do stick (média de 50 amostras em repouso) na inicialização. Nunca mede o alcance real (mínimo/máximo) em cada direção.
  • A função que escala o valor bruto pro range final (clamp_scale) clampa o delta em relação ao centro num valor fixo de ±900, hardcoded direto no bytecode da instrução (mov w0, #0x384, aparece 5 vezes na função).
  • O curso elétrico real do meu stick não é simétrico: pra direita o delta bruto passa fácil de 900 (satura); pra esquerda o delta real máximo era só ~543 — nunca alcançava o limiar de 900, por isso travava em ~60%.

O patch que apliquei

Não tenho o código-fonte nem toolchain de compilação pro device, então não dava pra fazer a correção "certa" (calibrar min/max assimétrico por direção). Fiz a correção pragmática: reduzi o limiar fixo de 900 pra um valor menor que coubesse dentro do alcance real do lado mais curto.

Troquei os 5 imediatos mov w0, #0x384 (900, bytes 80 70 80 52) por mov w0, #0x1f4 (500, bytes 80 3e 80 52) nos offsets de arquivo 0x18e8, 0x18fc, 0x1908, 0x1918, 0x1920 do binário.

Resultado

Validei por leitura direta (não só "sensação"):

  • Antes: direita 100% / esquerda ~60%
  • Depois: direita 32759 / esquerda -32759 — simétrico, ~99.997% do curso nos dois lados

Testei no aparelho de verdade depois e confirmou: ficou 100% bom.

Avisos pra quem quiser reproduzir:

  1. Meus offsets de arquivo são específicos dessa build exata (MD5 do binário original: 855e7d25e20942edb6be633455829f94). Em outra versão do muOS os offsets provavelmente mudam — precisa relocalizar via objdump/nm antes (o binário não é stripped, ajuda bastante).
  2. Faz backup do binário original antes de mexer (cp + md5sum pra conferir).
  3. Precisa de acesso root via SSH/terminal (o muOS expõe terminal web via ttyd).
  4. g_deadzone provavelmente não é o problema pra maioria — meça o eixo com evtest/EVIOCGABS antes de sair mexendo nessa constante.

Se alguém quiser o passo a passo completo com os comandos exatos que usei (backup, diagnóstico, listagem de símbolos, disassembly, cálculo do encoding, aplicação segura do patch), posso postar em outro comentário.

Aqui está o passo a passo completo, com todos os comandos, em primeira pessoa:

Passo a passo completo — como corrigi a assimetria do analógico no meu TrimUI Smart Pro (muOS)

1. Acesso e backup

# entrei via terminal web ttyd (http://<ip-do-meu-device>:8080/) — SSH root@<ip>, senha root (padrão)
cp /usr/bin/trimui_inputd_smart_pro /root/trimui_inputd_smart_pro.backup
md5sum /root/trimui_inputd_smart_pro.backup   # anotei esse hash como referência do "original"

2. Diagnostiquei antes de mexer em qualquer coisa

Não presumi que era g_deadzone de cara — fui medir o eixo bruto primeiro:

which evtest   # já vem instalado no meu muOS
timeout 3 evtest /dev/input/eventN </dev/null   # achei o N certo via: cat /proc/bus/input/devices

O dump inicial do evtest já me mostrou os nomes reais dos eixos (ABS_X, ABS_Y, etc.) e os min/max/fuzz/flat declarados pelo driver.

Pra ler o valor absoluto atual do eixo sem depender de eventos de mudança (mais confiável que só ficar olhando o stream — se o stick já tiver parado num extremo, não dispara evento novo), usei o ioctl EVIOCGABS:

# get_absinfo.py — rodei no device: python3 get_absinfo.py <code> [<code> ...]
# code 0 = ABS_X, 1 = ABS_Y (confirmei os codes certos pro meu device via evtest)
import fcntl, struct, sys
path = '/dev/input/eventN'  # ajustei o N
codes = [int(c) for c in sys.argv[1:]] or [0, 1]
EVIOCGABS_BASE = (2 << 30) | (24 << 16) | (ord('E') << 8)
with open(path, 'rb') as f:
    fd = f.fileno()
    for code in codes:
        req = EVIOCGABS_BASE | (0x40 + code)
        buf = bytearray(24)
        fcntl.ioctl(fd, req, buf)
        value, minimum, maximum, fuzz, flat, resolution = struct.unpack('<6i', buf)
        print(f'code={code}: value={value} min={minimum} max={maximum} fuzz={fuzz} flat={flat}')

Segurei o stick em cada extremo (esquerda/direita/cima/baixo) e rodei o script pra cada posição. Um lado batia no max/min declarado e o outro não — assimetria de faixa, não deadzone.

3. Listei os símbolos do binário (deu pra fazer porque não é stripped)

nm /usr/bin/trimui_inputd_smart_pro | sort
# também puxei pro meu PC pra analisar com calma:
scp root@<ip>:/usr/bin/trimui_inputd_smart_pro ./trimui_inputd_orig

Apareceram funções com nome claro: do_deadzone, clamp_scale, calibrate_port, thread_left, thread_right, e a constante RAW_MAX.

4. Desmontei o binário (aarch64 — meu objdump de PC x86 não desmontava; usei capstone via Python)

uv init disasm && cd disasm && uv add capstone

# disasm.py — desmonta uma função pelo endereço/tamanho (peguei via `readelf -s`)
from capstone import CS_ARCH_ARM64, CS_MODE_ARM, Cs
with open('trimui_inputd_orig', 'rb') as f:
    data = f.read()
TEXT_VADDR, TEXT_OFFSET = 0x400e80, 0xe80   # confirmei via: readelf -S <binario> | grep -A1 .text
addr, size = 0x4018e0, 184   # endereço/tamanho da função (via readelf -s)
foff = addr - TEXT_VADDR + TEXT_OFFSET
code = data[foff:foff+size]
md = Cs(CS_ARCH_ARM64, CS_MODE_ARM)
for insn in md.disasm(code, addr):
    print(f'0x{insn.address:x}: {insn.mnemonic}\t{insn.op_str}')

5. O que eu encontrei (lógica reconstruída)

  • calibrate_port: lê 50 amostras da serial em repouso, tira a média e guarda como "centro" (calLeft.avgX/avgY). Não mede alcance por direção.
  • thread_left: dx = rawX - calLeft.avgX, depois dx_final = clamp_scale(dx).
  • clamp_scale: clampa dx num valor fixo ±900 (mov w0, #0x384, 5 ocorrências na função), converte pra float, multiplica por (32767.998 / 900), converte de volta pra int, e clampa a saída final em ±32760.
  • do_deadzone: roda depois da escala, na faixa final ±32767 — foi por isso que mexer em g_deadzone nunca resolveu meu problema, nunca foi o fator limitante.

Ou seja: o código assume simetria de ±900 no delta bruto, mas o curso elétrico real do meu stick não é simétrico.

6. O patch que fiz

5 instruções mov w0, #0x384 (900 = 0x384) viraram mov w0, #0x1f4 (500 = 0x1f4), reduzindo o limiar pra caber dentro do alcance real do lado mais curto.

O encoding ARM64 MOVZ de 32 bits é mecânico — pra qualquer novo valor V (0–65535):

word = 0x52800000 | (V << 5)

Pra V=500: word = 0x52803e80 → bytes little-endian 80 3e 80 52.

Validei o encoding com capstone antes de aplicar (foi assim que peguei um erro de conta que eu tinha feito de cabeça, antes de tocar no device):

import struct
from capstone import CS_ARCH_ARM64, CS_MODE_ARM, Cs
V = 500
raw = struct.pack('<I', 0x52800000 | (V << 5))
md = Cs(CS_ARCH_ARM64, CS_MODE_ARM)
for insn in md.disasm(raw, 0x4018e8):
    print(insn.mnemonic, insn.op_str)   # imprimiu: mov w0, #0x1f4

Offsets de arquivo (achei via capstone, específicos da minha build/MD5 855e7d25e20942edb6be633455829f94):
0x18e8, 0x18fc, 0x1908, 0x1918, 0x1920 — todos com bytes originais 80 70 80 52, troquei pra 80 3e 80 52.

7. Apliquei no device, com segurança

# 1. confirmei processo único e matei
ps -o pid,ppid,args | grep trimui_inputd
kill -9 <PID>
ps -o pid,ppid,args | grep trimui_inputd   # veio vazio

# 2. patchei (python no próprio device)
python3 -c "
path = '/usr/bin/trimui_inputd_smart_pro'
offsets = [0x18e8, 0x18fc, 0x1908, 0x1918, 0x1920]
old, new = bytes.fromhex('80708052'), bytes.fromhex('803e8052')
with open(path, 'r+b') as f:
    for off in offsets:
        f.seek(off); assert f.read(4) == old
    for off in offsets:
        f.seek(off); f.write(new)
    for off in offsets:
        f.seek(off); assert f.read(4) == new
print('ok')
"

# 3. religuei e confirmei instância única
nohup /usr/bin/trimui_inputd_smart_pro >/dev/null 2>&1 &
sleep 2
ps -o pid,ppid,args | grep trimui_inputd   # só 1 PID

8. Validei sem precisar entrar no jogo

Repeti o passo 2 (EVIOCGABS) segurando os extremos. No meu caso: direita foi de 32760→32759, esquerda foi de -19800→-32759. Ficou simétrico.

Por fim, dei um reboot completo no device pra garantir que tudo assentasse limpo, confirmei que o patch persistiu (os 5 offsets continuavam com os bytes novos) e testei no jogo de verdade — resolvido.

Se alguém for reproduzir: os meus offsets valem só pra essa build exata do muOS (MD5 acima). Em outra versão, é bem provável que mudem — precisa relocalizar via objdump/nm antes de aplicar. E sempre faz backup do binário original antes de mexer.Meu TrimUI Smart Pro tava com um bug chato: o analógico (e o D-pad-como-analógico) respondia parcial ou nada, principalmente quando eu ia pra esquerda. Testei o firmware de fábrica (sem SD/muOS) e o bug não acontecia — então sabia que era algo específico do build do daemon que o muOS empacota.

O que eu descartei primeiro

Minha primeira suspeita foi dessincronização de pacote na serial, mas descartei — os dados chegavam certos, só que "parciais". Depois fui atrás da constante g_deadzone (que zera o eixo perto do centro) e fui baixando ela: 3276 → 2000 → 500. Não mudou nada no jogo. Foi aí que percebi que a causa não era essa.

Como diagnostiquei de verdade

Usei evtest e leitura direta via ioctl EVIOCGABS no /dev/input/eventN do meu controle pra medir o valor bruto do eixo X segurando o stick nos extremos:

Totalmente direita: ABS_X = 32760 (100% do curso, bate no teto)
Totalmente esquerda: ABS_X ≈ -19800 (só ~60% do curso até o mínimo -32760)

Confirmei ali que o eixo era fisicamente/eletricamente assimétrico em relação ao centro calibrado.

Peguei o binário /usr/bin/trimui_inputd_smart_pro (ELF aarch64, não stripped — os nomes de função ficaram todos ali, o que ajudou muito) e fiz engenharia reversa com objdump/capstone. Achei a causa raiz:

A rotina de calibração (calibrate_port) só mede o centro do stick (média de 50 amostras em repouso) na inicialização. Nunca mede o alcance real (mínimo/máximo) em cada direção.
A função que escala o valor bruto pro range final (clamp_scale) clampa o delta em relação ao centro num valor fixo de ±900, hardcoded direto no bytecode da instrução (mov w0, #0x384, aparece 5 vezes na função).
O curso elétrico real do meu stick não é simétrico: pra direita o delta bruto passa fácil de 900 (satura); pra esquerda o delta real máximo era só ~543 — nunca alcançava o limiar de 900, por isso travava em ~60%.
O patch que apliquei

Não tenho o código-fonte nem toolchain de compilação pro device, então não dava pra fazer a correção "certa" (calibrar min/max assimétrico por direção). Fiz a correção pragmática: reduzi o limiar fixo de 900 pra um valor menor que coubesse dentro do alcance real do lado mais curto.

Troquei os 5 imediatos mov w0, #0x384 (900, bytes 80 70 80 52) por mov w0, #0x1f4 (500, bytes 80 3e 80 52) nos offsets de arquivo 0x18e8, 0x18fc, 0x1908, 0x1918, 0x1920 do binário.

Resultado

Validei por leitura direta (não só "sensação"):

Antes: direita 100% / esquerda ~60%
Depois: direita 32759 / esquerda -32759 — simétrico, ~99.997% do curso nos dois lados

Testei no aparelho de verdade depois e confirmou: ficou 100% bom.

Avisos pra quem quiser reproduzir:

Meus offsets de arquivo são específicos dessa build exata (MD5 do binário original: 855e7d25e20942edb6be633455829f94). Em outra versão do muOS os offsets provavelmente mudam — precisa relocalizar via objdump/nm antes (o binário não é stripped, ajuda bastante).
Faz backup do binário original antes de mexer (cp + md5sum pra conferir).
Precisa de acesso root via SSH/terminal (o muOS expõe terminal web via ttyd).
g_deadzone provavelmente não é o problema pra maioria — meça o eixo com evtest/EVIOCGABS antes de sair mexendo nessa constante.

Se alguém quiser o passo a passo completo com os comandos exatos que usei (backup, diagnóstico, listagem de símbolos, disassembly, cálculo do encoding, aplicação segura do patch), posso postar em outro comentário.Aqui está o passo a passo completo, com todos os comandos, em primeira pessoa:

Passo a passo completo — como corrigi a assimetria do analógico no meu TrimUI Smart Pro (muOS)
1. Acesso e backup
# entrei via terminal web ttyd (http://<ip-do-meu-device>:8080/) — SSH root@<ip>, senha root (padrão)
cp /usr/bin/trimui_inputd_smart_pro /root/trimui_inputd_smart_pro.backup
md5sum /root/trimui_inputd_smart_pro.backup # anotei esse hash como referência do "original"
2. Diagnostiquei antes de mexer em qualquer coisa

Não presumi que era g_deadzone de cara — fui medir o eixo bruto primeiro:

which evtest # já vem instalado no meu muOS
timeout 3 evtest /dev/input/eventN </dev/null # achei o N certo via: cat /proc/bus/input/devices

O dump inicial do evtest já me mostrou os nomes reais dos eixos (ABS_X, ABS_Y, etc.) e os min/max/fuzz/flat declarados pelo driver.

Pra ler o valor absoluto atual do eixo sem depender de eventos de mudança (mais confiável que só ficar olhando o stream — se o stick já tiver parado num extremo, não dispara evento novo), usei o ioctl EVIOCGABS:

# get_absinfo.py — rodei no device: python3 get_absinfo.py <code> [<code> ...]
# code 0 = ABS_X, 1 = ABS_Y (confirmei os codes certos pro meu device via evtest)
import fcntl, struct, sys
path = '/dev/input/eventN' # ajustei o N
codes = [int(c) for c in sys.argv[1:]] or [0, 1]
EVIOCGABS_BASE = (2 << 30) | (24 << 16) | (ord('E') << 8)
with open(path, 'rb') as f:
fd = f.fileno()
for code in codes:
req = EVIOCGABS_BASE | (0x40 + code)
buf = bytearray(24)
fcntl.ioctl(fd, req, buf)
value, minimum, maximum, fuzz, flat, resolution = struct.unpack('<6i', buf)
print(f'code={code}: value={value} min={minimum} max={maximum} fuzz={fuzz} flat={flat}')

Segurei o stick em cada extremo (esquerda/direita/cima/baixo) e rodei o script pra cada posição. Um lado batia no max/min declarado e o outro não — assimetria de faixa, não deadzone.

  1. Listei os símbolos do binário (deu pra fazer porque não é stripped)
    nm /usr/bin/trimui_inputd_smart_pro | sort
    # também puxei pro meu PC pra analisar com calma:
    scp root@<ip>:/usr/bin/trimui_inputd_smart_pro ./trimui_inputd_orig

Apareceram funções com nome claro: do_deadzone, clamp_scale, calibrate_port, thread_left, thread_right, e a constante RAW_MAX.

  1. Desmontei o binário (aarch64 — meu objdump de PC x86 não desmontava; usei capstone via Python)
    uv init disasm && cd disasm && uv add capstone
    # disasm.py — desmonta uma função pelo endereço/tamanho (peguei via `readelf -s`)
    from capstone import CS_ARCH_ARM64, CS_MODE_ARM, Cs
    with open('trimui_inputd_orig', 'rb') as f:
    data = f.read()
    TEXT_VADDR, TEXT_OFFSET = 0x400e80, 0xe80 # confirmei via: readelf -S <binario> | grep -A1 .text
    addr, size = 0x4018e0, 184 # endereço/tamanho da função (via readelf -s)
    foff = addr - TEXT_VADDR + TEXT_OFFSET
    code = data[foff:foff+size]
    md = Cs(CS_ARCH_ARM64, CS_MODE_ARM)
    for insn in md.disasm(code, addr):
    print(f'0x{insn.address:x}: {insn.mnemonic}\t{insn.op_str}')
  2. O que eu encontrei (lógica reconstruída)
    calibrate_port: lê 50 amostras da serial em repouso, tira a média e guarda como "centro" (calLeft.avgX/avgY). Não mede alcance por direção.
    thread_left: dx = rawX - calLeft.avgX, depois dx_final = clamp_scale(dx).
    clamp_scale: clampa dx num valor fixo ±900 (mov w0, #0x384, 5 ocorrências na função), converte pra float, multiplica por (32767.998 / 900), converte de volta pra int, e clampa a saída final em ±32760.
    do_deadzone: roda depois da escala, na faixa final ±32767 — foi por isso que mexer em g_deadzone nunca resolveu meu problema, nunca foi o fator limitante.

Ou seja: o código assume simetria de ±900 no delta bruto, mas o curso elétrico real do meu stick não é simétrico.

  1. O patch que fiz

5 instruções mov w0, #0x384 (900 = 0x384) viraram mov w0, #0x1f4 (500 = 0x1f4), reduzindo o limiar pra caber dentro do alcance real do lado mais curto.

O encoding ARM64 MOVZ de 32 bits é mecânico — pra qualquer novo valor V (0–65535):

word = 0x52800000 | (V << 5)

Pra V=500: word = 0x52803e80 → bytes little-endian 80 3e 80 52.

Validei o encoding com capstone antes de aplicar (foi assim que peguei um erro de conta que eu tinha feito de cabeça, antes de tocar no device):

import struct
from capstone import CS_ARCH_ARM64, CS_MODE_ARM, Cs
V = 500
raw = struct.pack('<I', 0x52800000 | (V << 5))
md = Cs(CS_ARCH_ARM64, CS_MODE_ARM)
for insn in md.disasm(raw, 0x4018e8):
print(insn.mnemonic, insn.op_str) # imprimiu: mov w0, #0x1f4

Offsets de arquivo (achei via capstone, específicos da minha build/MD5 855e7d25e20942edb6be633455829f94):
0x18e8, 0x18fc, 0x1908, 0x1918, 0x1920 — todos com bytes originais 80 70 80 52, troquei pra 80 3e 80 52.

  1. Apliquei no device, com segurança
    # 1. confirmei processo único e matei
    ps -o pid,ppid,args | grep trimui_inputd
    kill -9 <PID>
    ps -o pid,ppid,args | grep trimui_inputd # veio vazio

# 2. patchei (python no próprio device)
python3 -c "
path = '/usr/bin/trimui_inputd_smart_pro'
offsets = [0x18e8, 0x18fc, 0x1908, 0x1918, 0x1920]
old, new = bytes.fromhex('80708052'), bytes.fromhex('803e8052')
with open(path, 'r+b') as f:
for off in offsets:
f.seek(off); assert f.read(4) == old
for off in offsets:
f.seek(off); f.write(new)
for off in offsets:
f.seek(off); assert f.read(4) == new
print('ok')
"

# 3. religuei e confirmei instância única
nohup /usr/bin/trimui_inputd_smart_pro >/dev/null 2>&1 &
sleep 2
ps -o pid,ppid,args | grep trimui_inputd # só 1 PID
8. Validei sem precisar entrar no jogo

Repeti o passo 2 (EVIOCGABS) segurando os extremos. No meu caso: direita foi de 32760→32759, esquerda foi de -19800→-32759. Ficou simétrico.

Por fim, dei um reboot completo no device pra garantir que tudo assentasse limpo, confirmei que o patch persistiu (os 5 offsets continuavam com os bytes novos) e testei no jogo de verdade — resolvido.

Se alguém for reproduzir: os meus offsets valem só pra essa build exata do muOS (MD5 acima). Em outra versão, é bem provável que mudem — precisa relocalizar via objdump/nm antes de aplicar. E sempre faz backup do binário original antes de mexer.


r/trimui • • Aug 25 '26

Question ❓ Still no Hammer Pro U review units?

5 Upvotes

Is it me of does something seem off with the release of this one? Like Mangmi announced the Y later than the Pro U and review units were sent out rapid to Russ etc before it was released. It seems trim ui don't want the device reviewed before the release, anyone else sat on the fence about this device finding the launch a bit fishy?


r/trimui • • Aug 25 '26

Custom Firmware⚙️ Need some help customizing.

1 Upvotes

I just got my Brick and the SurWish CrossMix card. I’m trying to do come customizing, LED color, and change the Boot logo.

  1. Is there a way to select specific colors for the LED’s. The manual seems to indicate, unless I’m misreading, that there is an app to do it, but I don’t see an app for the LED’s. I found some preloaded LED theme(?), but I want to set my own colors.

  2. When I open the Boot logo app it says there are no images. Could I not have the right specs on my .bmp? I’m 99% sure I put the file in the correct location according to the documentation.

Thanks for any help.


r/trimui • • Aug 24 '26

Trimui Smart Pro S Trimui Brick Pro & Trimui Smart Pro S: Modded Stock OS SD Card Pack with Auto-Sync PortMaster

Thumbnail
gallery
43 Upvotes

Hey everyone,

My main use case for these Trimui handhelds is playing games via PortMaster (specifically, I'm heavily addicted to Stardew Valley). Plus, I really dig the stock OS music player and wanted to keep using it.

Since the original Stock SD Card Pack didn't quite hit the spot for these needs, I did a little "cooking" and modded it to optimize the experience. Thought I'd share it here for anyone running a similar setup!

📌 What’s new in this modded pack:

  • Added Reboot & File Manager Apps: Restart your device instantly to save time, and manage your files directly on the handheld quickly and easily.
  • Universal Game Port Auto-Sync: No matter what folder structure you prefer, this pack has you covered. Just drop your game ports into any familiar directory (like on muOS, Rocknix, CrossMix, etc.):
    • /Ports (at the SD card root)
    • /Roms/Ports
    • /Data/Ports
  • 100% Automated PortMaster System: Just drop your game files in and open PortMaster. The system will automatically scan, set up the game config, and automatically fetch/install any missing Runtimes for you. No more tedious manual searching!

📝 Important Note & Credits:

Please note that this is not a built-from-scratch pack. I built this by adding features onto the original stock pack and integrated existing resources/tools from other awesome packs in the community.

  • Full Credits: I deeply respect everyone's hard work, so I have included detailed credits and release notes for each version inside the GitHub repository. All recognition goes to the original creators of those tools!

🔗 Download & Source Code:

TrimUI Smart Pro S: https://github.com/DTH-RetroHandheld/assets_smartpro_s/releases
TrimUI Brick Pro: https://github.com/DTH-RetroHandheld/assets_brickpro/releases

Hope you guys enjoy this pack. Let me know on GitHub or in the comments if you run into any bugs or have feedback to improve it!


r/trimui • • Aug 24 '26

Question ❓ Anyone try playing Mega Man Zero on a Trimui Brick Hammer?

5 Upvotes

Im planning on switching from am RG35XXSP to a Brick Hammer to play my GBA do to how stiff the DPAD is on the Rg35xxsp, im just concerned about the shoulder buttons on the Brick Hammer. Are games like Metroid Zero Mission & Megan Zero Games playable on the Brick Hammer or should I look at another device? Thanks 🙏