Skip to content

Instantly share code, notes, and snippets.

@rg3915
Last active September 20, 2026 22:15
Show Gist options
  • Select an option

  • Save rg3915/e76bfe126b0e087c58ec71c4010c0574 to your computer and use it in GitHub Desktop.

Select an option

Save rg3915/e76bfe126b0e087c58ec71c4010c0574 to your computer and use it in GitHub Desktop.
R36S - Instalando Super Mario 64 no R36S

R36S — cartão microSD, manutenção e configuração

Notas de 2026-09-20. Console R36S (Rockchip RK3326) com imagem ArkOS. Leitura/escrita do cartão feita no Dell XPS 9300 (EndeavourOS), pelo slot microSD interno do notebook (mmc0 → /dev/mmcblk0), não pelo leitor USB.

O R36S não vira pendrive quando você liga o cabo USB no PC. A porta USB-C dele é só carga/OTG-host; ArkOS não tem USB gadget mass-storage. Para mexer nos arquivos: tirar o cartão, ou usar rede (SSH/Samba).


1. Identificação do cartão

Campo Valor
Dispositivo /dev/mmcblk0
Tamanho 16.357.785.600 bytes = 15,23 GiB = 31.948.800 setores
Nome (CID) asdfg
Manufacturer ID 0x000005
Serial 0x00000456
Fabricação 06/2025

⚠️ Suspeita de cartão falsificado. O nome asdfg no CID é digitação aleatória (genuínos trazem SD16G, SC16G, USD00) e manfid 0x05 não corresponde a SanDisk (0x03), Samsung (0x1b), Kioxia (0x02) nem Transcend (0x74).

Leituras em 0 / 4096 / 8192 / 15000 MiB deram OK, sem nenhum erro de I/O no dmesg — isso descarta setores mortos, mas não prova capacidade real. Cartão falso costuma ler sem erro devolvendo lixo ou dados espelhados.

Para provar (⚠️ DESTRUTIVO — apaga o cartão):

sudo pacman -S f3
sudo f3probe --destructive --time-ops /dev/mmcblk0

2. Layout do cartão (GPT)

GPT válida e íntegra: primária no setor 1, backup no último setor (0x3cefffe00 = 16357785600 − 512). AlternateLBA = 31.948.799, confere com o tamanho real.

# Nome FS Label LBA início..fim Offset (bytes) Tamanho
1 boot FAT16 BOOT 32.768 .. 147.455 16777216 56 MiB
2 root ext4 root 147.456 .. 13.983.743 75497472 6,60 GiB
3 primary exFAT EASYROMS 13.983.744 .. 31.948.765 7159676928 8,57 GiB

Tamanhos para --sizelimit:

boot     58720256
root   7084179456
roms   9198091264

UUIDs: boot 8B25-5227 · root e139ce78-9841-40fe-8823-96a304a09859 · roms 5D68-21CA


3. ⚠️ PENDENTE — MBR protetivo corrompido

Sintoma: lsblk mostra só mmcblk0, sem p1/p2/p3. fdisk -l e parted dizem "rótulo de disco irreconhecível", mesmo com a GPT intacta.

Causa: a assinatura de boot no fim do setor 0 está errada.

offset 510-511:  c3 5a      ← está assim
                 55 aa      ← deveria ser

O byte 446 é ff (deveria ser 00) e o tipo em 450 é 00 em vez de ee. Sem 55 aa, kernel e libblkid rejeitam o MBR protetivo e nem olham a GPT. O wipefs enxerga a GPT porque sonda assinaturas direto no disco.

Provável culpado: existia um System Volume Information datado de 27/02/2026 na partição de ROMs — diretório criado pelo Windows. Windows que encontra tabela de partição desconhecida oferece "inicializar o disco", e uma inicialização parcial mexe exatamente no setor 0.

Não afeta o console. O boot ROM da Rockchip não usa MBR (lê o IDB em offset fixo), por isso o R36S liga normalmente. Só atrapalha montar o cartão no PC.

Conserto (setor 0 já foi verificado estável em 3 leituras; MD5 a53ee5b…):

sudo dd if=~/r36s/arquivos/mbr-novo.bin of=/dev/mmcblk0 bs=512 count=1
sudo partprobe /dev/mmcblk0
lsblk /dev/mmcblk0          # devem aparecer p1, p2, p3

Reverter:

sudo dd if=~/r36s/arquivos/setor0.bak of=/dev/mmcblk0 bs=512 count=1

Só o setor 0 é tocado. A GPT (setor 1 e o último) não é afetada, e os dados começam no setor 32.768.


4. Como montar o cartão no PC (enquanto o MBR não for consertado)

Sem p1/p2/p3, é preciso losetup com offset.

ROMs (exFAT) — leitura-escrita

L=$(sudo losetup -o 7159676928 --sizelimit 9198091264 -f --show /dev/mmcblk0)
sudo mkdir -p /mnt/r36s-roms
sudo mount -t exfat -o rw "$L" /mnt/r36s-roms
# ... trabalhar ...
sync; sudo umount /mnt/r36s-roms; sudo losetup -d "$L"; sync

Sistema (ext4) — leitura-escrita

L=$(sudo losetup -o 75497472 --sizelimit 7084179456 -f --show /dev/mmcblk0)
sudo e2fsck -fy "$L"                    # replay do journal, obrigatório
sudo mount -o rw "$L" /mnt/r36s-root
# ... trabalhar ...
sync; sudo umount /mnt/r36s-root; sudo losetup -d "$L"; sync

Sistema — somente leitura (seguro, não altera nada)

L=$(sudo losetup -r -o 75497472 --sizelimit 7084179456 -f --show /dev/mmcblk0)
sudo mount -o ro,noload "$L" /mnt/r36s-root

noload é obrigatório no modo somente-leitura. O ext4 se recusa a montar ro quando o journal tem transações pendentes (desligamento sem shutdown), e noload ignora o journal. Sem ele: "não foi possível montar como somente-leitura".

Sempre sync antes de tirar o cartão. Verificar:

losetup -a                                  # deve estar vazio
mount | grep -E 'mmcblk|loop'               # deve estar vazio
grep Writeback: /proc/meminfo               # deve ser 0 kB

5. O sistema instalado

NAME="Ubuntu"  VERSION="19.10 (Eoan Ermine)"
hostname: rg351mp

É ArkOS, mas a imagem é do Anbernic RG351MP, não do R36S. Comum: muitos R36S saem de fábrica com imagem de RG351MP reempacotada (mesmo SoC RK3326).

⚠️ Consequência prática: o nome de botão que aparece na tela pode não corresponder ao botão físico. Se algo parecer trocado sem explicação, provavelmente é isso.

/etc/fstab (referencia mmcblk1 porque no console o cartão é o segundo controlador):

/dev/mmcblk1p2  /      ext4  defaults,noatime  0 1
/dev/mmcblk1p1  /boot  vfat  defaults          0 2
/swapfile       none   swap  sw                0 0

Emuladores standalone em /opt: 351Files, amiberry, drastic, duckstation, gzdoom, hypseus, love2d, mednafen, mupen64plus, ppsspp, scummvm, etc.


6. Controles

IDs dos botões físicos

Dispositivo: play_joystick · GUID 19000f6a706c61795f6a6f7973746900 · driver udev

Botão ID Botão ID
A 0 Select 8
B 1 Start 9
X 2 L3 11
Y 3 R3 12
L1 4 Cima 14
R1 5 Baixo 15
L2 6 Esquerda 16
R2 7 Direita 17

Analógicos: eixos 0/1 (esquerdo), 2/3 (direito).

Hotkeys (lidas do retroarch.cfg, não são chute)

Combinação Ação
Select + X Abre o menu do RetroArch
Select + Start Sai do jogo
input_enable_hotkey_btn = "8"   → Select
input_menu_toggle_btn   = "2"   → X
input_exit_emulator_btn = "9"   → Start

Onde fica cada mapeamento

Camada Arquivo Alcance
Navegação do menu /home/ark/.emulationstation/es_input.cfg EmulationStation
Perfil do controle /home/ark/.config/retroarch/autoconfig/udev/play_joystick.cfg Tem prioridade
Binds globais /home/ark/.config/retroarch/retroarch.cfg Cores 64 bits
Binds globais /home/ark/.config/retroarch32/retroarch.cfg Cores 32 bits
Remap por core /home/ark/.config/retroarch*/config/remaps/<Core>/*.rmp Sobrepõe os globais

⚠️ input_autodetect_enable = "true" e existe play_joystick.cfg. Editar só o retroarch.cfg não basta — o RetroArch redetecta o controle no boot e reaplica o perfil por cima. Sempre editar os três arquivos juntos.

Pelos menus (sem editar arquivo)

  • Menu do console: Start → Configure Input
  • Dentro do jogo: Select + X → Quick Menu → Controls → Port 1 Controls e então salvar: Save Core Remap File (todos os jogos do console) ou Save Game Remap File (só aquele jogo). Sem salvar, perde ao sair.
  • PPSSPP / DraStic: mapeamento interno próprio, não usam RetroArch.

7. Alterações aplicadas em 2026-09-20

Troca L1 ↔ L2 (só nos jogos)

Botão físico 4 (L1) agora é lido como L2, e o 6 (L2) como L1:

retroarch.cfg      input_player1_l_btn = "6"   input_player1_l2_btn = "4"
retroarch32.cfg    input_player1_l_btn = "6"   input_player1_l2_btn = "4"
play_joystick.cfg  input_l_btn         = "6"   input_l2_btn         = "4"
es_input.cfg       NÃO alterado (navegação do menu mantida)

Não alcança dois cores que têm remap próprio de L1/L2:

Flycast.rmp  input_player1_btn_l = "12"  btn_l2 = "-1"   (Dreamcast, gatilhos analógicos)
fuse.rmp     input_player1_btn_l2 = "2"                  (ZX Spectrum, L2 = Select)

Para desfazer: rodar arquivos/r36s-l1l2.sh de novo (a troca é simétrica) ou restaurar de ~/r36s-backup/configs/.

Limpeza (~950 MB liberados)

EASYROMS estava 100% cheia com 64 MB livres; ficou em 89% com 1,1 GB.

Removido Tamanho
psp/Grand Theft Auto - Vice City Stories.cso 896 MB
mame2003/clrmamepro/ (dats do ClrMamePro) ~41 MB
psp/ppsspp/.../UCUS98653_1.00_0.ppst 12,8 MB
n64/*.srm e *.state órfãos (5 arquivos) ~1,5 MB
EUMONBMP.SYS + System Volume Information ~290 KB

Backup em ~/r36s-backup/ (exceto o GTA, que não foi copiado).

Super Mario 64 instalado

/n64/Super Mario 64 (USA).z64
8.388.608 bytes
MD5  20b854b239203baf6c961b850a4a51a2
SHA1 9bef1128717f958171a4afac3ed78ee2bb4e86ce
header 80 37 12 40 (big-endian nativo) · nome interno "SUPER MARIO 64" · country E (USA)

MD5 conferido depois de gravado no cartão. N64 roda em cores libretro (parallel_n64, mupen64plus_next) via /usr/local/bin/n64.sh, então é RetroArch.

Se não aparecer na lista: Start → Game Settings → Update Gamelists. Fica sem capa/descrição porque o gamelist.xml da pasta não o conhece — só estética.

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