No início de maio recebi do IFPR Campus Ivaiporã uma BTV B13 — uma das várias TV boxes apreendidas pela Receita Federal que chegaram à instituição. A missão proposta pelo Prof. Me. Ronan Anacleto Lopes, coordenador do curso de Sistemas de Informação (no qual estudo), era simples: avaliar o que dava pra fazer com esse hardware. Servir como servidores educacionais? Estações leves? Lixo? Comecei pela BTV E13 e não fui longe. Mudei pra BTV B13 e já tive um começo com bons resultados. Três dias depois, consegui rodar Debian 13 + XFCE direto do eMMC, ligando em 5 segundos, e a ideia tinha crescido — sugestão do Prof. Lucas dos Santos Umeoka — pra mini-desktop portátil capaz de programar Arduino para aulas de robótica na instituição. Esse é o relato do processo, das descobertas técnicas e do que deu pra extrair desse hardware reciclado.
Resumo
- Hardware: BTV B13 (Amlogic S905X4, 4× Cortex-A55, 2GB DDR4, 16GB eMMC)
- Contexto: avaliação técnica de TV boxes apreendidas pela Receita Federal, recebidas pelo IFPR Campus Ivaiporã, pra uso educacional
- O desafio: o u-boot vendor proprietário não boota Linux do eMMC porque o layout de partições é AML (não-MBR), e pendrive permanente não escala num lote de várias TV boxes
- A solução: ESP32 como adaptador UART → acesso ao prompt do u-boot vendor → sequestrar a partição "factory" (originalmente pra DRM) pra carregar um script u-boot custom → bootar Debian do eMMC
- Bônus: otimização do XFCE (GPU estava travada em 1/3 da capacidade)
- Resultado: serve bem como servidor low-power (Apache, NGINX, Node, MQTT) e como mini-desktop portátil pra tarefas leves (programar Arduino, edição de código, atividades educacionais)
- Tudo no GitHub: github.com/gabclima/b13
Como tudo começou
A Receita Federal apreende milhares de TV boxes piratas todo ano. Parte dessas apreensões é destinada a programas de inclusão digital e doação institucional — algumas acabam em escolas, universidades e institutos federais. O IFPR Campus Ivaiporã recebeu um lote desses dispositivos, e o Prof. Me. Ronan Anacleto Lopes, coordenador do curso de Sistemas de Informação, propôs uma análise técnica: dá pra fazer essas TV boxes rodarem Linux e virarem ferramentas úteis pra instituição, em vez de lixo eletrônico?
A pergunta tem peso prático. Cada uma dessas TV boxes recebidas pela gente vem com:
- ARM 64-bit (4 cores Cortex-A35 ou A55)
- 1–2 GB de RAM DDR3/DDR4
- 8–16 GB de eMMC
- Ethernet, HDMI 4K, WiFi, Bluetooth
A custo zero pra instituição, é mais hardware do que um Raspberry Pi básico custa novo. Se conseguir fazer rodar Linux mainline neles.
O problema é que essas TV boxes não têm suporte maduro fora da caixa. O bootloader é proprietário Amlogic, os drivers WiFi são out-of-tree (fechados), o layout de partições não é MBR/GPT padrão. Pra cada modelo, alguém precisa fazer engenharia reversa do boot e mapear os drivers.
Comecei pela BTV E13 (SoC Amlogic S905W2, família Meson S4). Foi um desastre inicial — o suporte mainline pra família S4 ainda é experimental, e não consegui bootar do eMMC. A E13 rodava Debian, mas só em modo live via pendrive USB.
E aí veio o problema institucional real: pendrive permanente não escala. O IFPR tem mais de uma TV box no lote. Se cada uma precisar de um pendrive plugado pra funcionar, é logística ruim (caro) — pendrives somem, quebram, e não vai ter sempre um disponível pra cada estação. Era óbvio que pra essas TV boxes virarem ferramentas reais (servidores, estações de trabalho), o Linux precisava bootar do eMMC interno.
Mudei o foco pra BTV B13 (SoC Amlogic S905X4, família SC2). Suporte mais maduro, hardware mais bem documentado pela comunidade Armbian/LibreELEC. E foi nela que a coisa toda destravou.
Identificando o hardware
A BTV B13 é vendida como "TV Box Android 11" com promessas de 4K, WiFi dual-band, etc. Abrindo a caixa, o hardware real é:
Pela foto da placa dá pra identificar os principais chips:
- SoC: Amlogic S905X4 (família SC2, codename interno
ohm), 4× Cortex-A55 @ 2.0 GHz, Mali-G31 MP2 - RAM: 2 GB DDR4 (chip único Rayson RS512M32LM4)
- eMMC: 16 GB Samsung KLMAG1JETD (11.36 GB úteis no Android, ~12.9 GB livres pro Linux)
- WiFi/BT: Unisoc UWE5621DS (chip combo SDIO — não MediaTek MT7668 como o driver vendor sugere)
- Ethernet: PHY interno do SoC, 100 Mbps somente
- UART: 4 pads expostos com serigrafia GND/TX/RX/3V3, do lado das USBs
Confirmei tudo isso instalando o AIDA64 no Android original e cruzando com fotos da placa:
Notei algo interessante: a caixa diz "Bluetooth 5.0", mas o AIDA64 reporta como Bluetooth 4+. O chip oficialmente suporta 5.1, mas o vendor BTV não habilitou as features 5.x. Esse tipo de inconsistência entre o que o marketing promete e o que o firmware real entrega é a regra, não exceção, em TV box pirata.
O problema real: bootar Linux do eMMC
A primeira tentativa óbvia: gravar uma imagem Debian num pendrive (usei o excelente projeto devmfc/debian-on-amlogic), plugar na B13, acertar o botão UPDATE embaixo da carcaça com um toothpick (veretinha), ligar — Debian boota. Funciona. Mas é a mesma solução da E13, que não atende ao objetivo institucional. Precisava bootar do eMMC.
E aí encontra a parede: o u-boot vendor da Amlogic não
consegue bootar Linux do eMMC. Não porque seja proibido — é
porque o layout de partições do AML (proprietário) não bate com o
MBR/GPT padrão que o Linux espera. Quando o u-boot tenta
fatload mmc 1, ele responde "Unrecognized filesystem type"
e desiste.
Procurei na internet semanas. Achei tutoriais pra modelos próximos (S905X3, S905X2) mas nada pra B13 especificamente. Cada SoC da Amlogic tem peculiaridades no boot vendor, e a S905X4 (SC2) é nova o suficiente pra não ter muito conteúdo.
A solução demandou três descobertas em sequência.
Descoberta 1: ESP32 como adaptador UART
Pra entender o boot vendor, preciso ver o que ele está fazendo. A B13 tem 4 pads UART expostos na placa — mas vêm sem pinos, só furos. Pra acessar, soldei pinos macho header de Arduino:
Pra conversar com o UART precisaria de um adaptador USB-Serial 3.3V. Em vez de comprar um FTDI ou CH340 dedicado, usei um ESP32 que tinha sobrando. ESP32 tem UART2 livre (GPIO16/17), trabalha em 3.3V (mesma tensão do SoC Amlogic — sem level shifter), e um sketch de 20 linhas vira bridge USB-Serial:
void setup() {
Serial.begin(115200);
Serial2.begin(115200, SERIAL_8N1, 16, 17);
}
void loop() {
while (Serial2.available()) Serial.write(Serial2.read());
while (Serial.available()) Serial2.write(Serial.read());
}
Wiring é trivial:
ESP32 GND ─── BTV GND
ESP32 GPIO16 ─── BTV TX
ESP32 GPIO17 ─── BTV RX
Liga a B13, abre Serial Monitor a 115200 baud, e aparece o log de boot do u-boot vendor.
Aperta uma tecla na janela curta de "Hit any key to stop autoboot" e
cai no prompt sc2_ah212#. Agora estou dentro.
Descoberta 2: mapeando as partições AML
No prompt do u-boot, printenv mostra tudo:
bootcmd = run start_autoscript; run storeboot
start_autoscript =
if mmcinfo; then run start_mmc_autoscript; fi;
if usb start; then run start_usb_autoscript; fi;
run start_emmc_autoscript ← este SEMPRE roda no final
E o start_emmc_autoscript por default é:
start_emmc_autoscript = if fatload mmc 1 1020000 emmc_autoscript;
then autoscr 1020000; fi;
Ele tenta carregar um arquivo emmc_autoscript direto da
raiz do eMMC, sem especificar partição — e falha, porque o eMMC tem
layout AML (não tem "raiz" no sentido FAT padrão).
Mas espera: se eu conseguir colocar um arquivo
emmc_autoscript num lugar que o u-boot leia, ele
vai executar. E mmc part mostra as partições AML do
eMMC:
Part Start Sectors Size Name
00 0 8192 4MB bootloader
01 73728 131072 64MB reserved
02 221184 1638400 800MB cache
03 1875968 16384 8MB env
04 1908736 65536 32MB recovery
05 1990656 4096 2MB frp
06 2011136 16384 8MB factory ← 8 MB de FAT12 "KEYBOX PART"!
07 2043904 49152 24MB vendor_boot
...
21 2764800 3276800 1.6GB super ← coincide com /boot FAT32!
22 6057984 24727552 12GB userdata ← coincide com rootfs ext4!
Duas coisas saltam aos olhos:
A partição factory (mmc 1:6) é uma FAT12 de 8 MB com label "KEYBOX PART", originalmente destinada a armazenar chaves DRM do Android. Ela é acessível tanto via Linux quanto pelo u-boot vendor. Caminho perfeito pra colocar nosso script.
As partições super (mmc 1:15 hex = 21 decimal) e userdata (mmc 1:22) começam em setores idênticos ao que o
sfdiskcria pra um MBR Linux comstart=2764800estart=6057984. Isso significa que se eu particionar o eMMC com MBR Linux usando esses offsets exatos, o u-boot vendor consegue ler a FAT32 e ext4 do Linux sem entender MBR, simplesmente apontando prammc 1:15.
Isso era a pista que faltava.
Descoberta 3: o sequestro da factory partition
Com as duas descobertas anteriores juntas, o plano se desenhou:
- Particionar o eMMC com MBR Linux usando os offsets mágicos (sectors 2764800 e 6057984)
- Copiar/boot (FAT32) e rootfs (ext4) Debian pra essas partições
- Escrever um script u-boot
emmc_autoscriptque carrega o bootscript Debian demmc 1:15 - Gravar esse script na factory partition (mmc 1:6)
- Modificar a variável
start_emmc_autoscriptdo u-boot vendor pra apontar prammc 1:6em vez do default genérico - Salvar com
saveenv(persiste entre reboots)
A partição factory é montável via Linux com:
mount -t vfat -o loop,offset=1029701632,sizelimit=8388608 /dev/mmcblk1 /mnt/factory
(1029701632 = sector 2011136 × 512 bytes)
A modificação do env do u-boot é feita pelo prompt do u-boot vendor (acessado via UART):
setenv start_emmc_autoscript 'if fatload mmc 1:6 1020000 emmc_autoscript; then autoscr 1020000; fi;'
saveenv
Boot:
$ uname -a
Linux tvbox 6.18.28-meson64 #1 SMP PREEMPT aarch64 GNU/Linux
$ systemd-analyze
Startup finished in 890ms (kernel) + 3.987s (userspace) = 4.877s
5 segundos do power-on ao login screen, sem pendrive, sem toothpick (ficar apetando o botão UPDATE), sem ESP32 — só ligar na tomada.
Otimizando o XFCE engasgado
Depois do boot autônomo funcionando, abri o XFCE pra ver. Decepção: mouse travado, janelas com lag visível, menus animando aos trancos. Pra um hardware com 4× Cortex-A55 @ 1.8 GHz e Mali-G31, isso não fazia sentido.
Investigando, achei a causa real:
$ cat /sys/class/devfreq/fe400000.gpu/cur_freq
285714281
$ cat /sys/class/devfreq/fe400000.gpu/available_frequencies
285714281 400000000 500000000 666666666 846000000
A GPU Mali-G31 estava travada na frequência mínima
(285 MHz, 1/3 do máximo). O governor padrão do devfreq é
simple_ondemand, tunado pra cargas sustentadas de jogos —
não pra burst de UI. Mover uma janela dura 100ms, abaixo do threshold
pra rampar o clock.
Solução: forçar governor performance:
echo performance > /sys/class/devfreq/fe400000.gpu/governor
Resultado imediato: glxgears subiu, mouse fluido, sensação geral de máquina normal. Persisti via systemd unit pra reaplicar no boot.
Outros ajustes que ajudaram: forçar DRI3 + PageFlip no Xorg
(/etc/X11/xorg.conf.d/20-meson.conf), ligar compositor
XFWM4 com vsync. O tutorial completo do XFCE tá no README do repo.
Uma armadilha que perdi tempo descobrindo: mouses gamer 8000 Hz são incompatíveis com ARM modesto. Tinha um mouse Razer 8K HS plugado por padrão. Xorg saturava 37% de CPU só processando interrupts do mouse. Trocando por um mouse comum Compx 2.4G a 125 Hz, Xorg caiu pra 6-10%. Detalhe pequeno, impacto enorme.
Benchmarks reais
Pra caracterizar a B13 como ferramenta de uso real, rodei testes definitivos:
Térmica (stress-ng 4 cores, 5 min):
- Idle: 40°C
- Stress 100% com EMI shield com folga: pico 58°C
- Stress 100% com shield apertado: pico 51°C
- Sem throttling em nenhum cenário
Rede (iperf3, ethernet 100M):
- Download: 93.4 Mbps
- Upload: 94.1 Mbps
- 1 retransmissão em 60s total
Satura 100% do hardware. Como confirmei via análise dos DTBs, a B13 é 100 Mbps por hardware (PHY interno do SoC, sem PHY gigabit externo).
eMMC (fio com --direct=1, em
/root):
- Read sequencial 4M: 140 MB/s
- Write sequencial 4M: 65 MB/s
- Random read 4k: 16 MB/s / 3940 IOPS
- Random write 4k: 19 MB/s / 4726 IOPS
eMMC midrange/econômico. Bom o suficiente pra workloads de servidor (SQLite, NGINX, Node). Lento pra copiar arquivos grandes.
Tempo de boot total: 4.877 segundos (890ms kernel + 3.987s userspace).
Casos de uso reais — o que a B13 reciclada serve hoje
Depois de tudo testado, com honestidade técnica:
✅ Funciona muito bem como servidor low-power:
- NGINX / Apache (Servidores Web)
- Home Assistant
- MQTT broker (Mosquitto)
- SSH bastion / jump host
- Docker leve (1-2 containers)
- Node de cluster K3s
- Cron jobs, backups, monitoramento
✅ Funciona como mini-desktop portátil pra tarefas leves:
Esta foi a expansão de escopo proposta pelo Prof. Lucas dos Santos Umeoka (IFPR Ivaiporã) quando comentei sobre o XFCE rodar razoavelmente bem depois das otimizações: usar a TV box reciclada pra programar Arduino. Faz total sentido — Arduino IDE é leve, a única exigência real é uma porta USB pra programar o microcontrolador, e a B13 tem 2 portas USB. Casos de uso similares onde a B13 atende:
- Programação Arduino / ESP32 / microcontroladores (Arduino IDE roda razoavelmente em Debian + XFCE)
- Edição de texto/código com editores leves (Geany, nano, vim, micro — VSCode é pesado demais)
- Atividades educacionais de programação básica (Python, Scratch, Thonny)
- Estação SSH terminal pra estudantes acessarem servidores remotos da instituição
- Navegação web leve (Firefox abre, mas Chrome moderno satura — Falkon ou Midori são melhores escolhas)
Vira laboratório portátil de R$0 por estação — em vez de comprar 20 PCs novos pra uma sala de aula de Arduino, recicla 20 TV boxes que iam virar lixo eletrônico.
⚠️ Funciona com limitações:
- WireGuard VPN (~30-50 Mbps, CPU é gargalo na crypto)
- Servidor de arquivos LAN pequena (rede 100M = 12 MB/s teto)
- Nextcloud pessoal leve
❌ NÃO serve pra:
- Desktop com Firefox/Chrome moderno como uso primário
- Mediabox 4K com Kodi (sem decode hardware no Mesa mainline)
- Servidor de mídia com transcoding (Jellyfin/Plex)
- Workstation Linux normal de uso diário
A pergunta natural é: "se no Android original funciona 4K perfeitamente, por que no Debian engasga?". Resposta: mesmo hardware, stacks de software diferentes. O Android tem o driver Mali r25p1 proprietário integrado ao V4L2 (decoder de vídeo do SoC), com zero-copy entre decoder e GPU. No Debian mainline ganhamos OpenGL ES via Panfrost (open-source) — perdemos a integração com V4L2 e algumas extensões proprietárias. A B13 não é pior — a stack mainline genérica é menos otimizada pra esse hardware específico que a stack Android oficial.
O que ficou pendente
Coisas que ainda quero atacar:
- WiFi (Unisoc UWE5621DS): chip detectado pelo kernel
mas com IDs zerados — falta DTB com power-on correto. Driver out-of-tree
uwe5631-amldo CoreELEC existe mas precisa porte pra kernel 6.18. Por enquanto: dongle USB WiFi (R$20) ou ethernet. - Bluetooth: mesmo chip, mesma situação. Controle remoto da B13 é BT, então sem driver não tem controle remoto nativo.
- Áudio HDMI: driver
meson-aiumainline tem suporte parcial pra SC2. Workaround: jack 3.5mm analógico (não testado) ou USB DAC. - Versão 2 do AmlBoot: pendrive auto-installer (sem
precisar de UART). O
setenv start_emmc_autoscriptpode ser feito a partir de um bootscript embutido no pendrive — eliminando a barreira do ESP32 + soldagem. Isso é importante pra escalar pro lote inteiro do IFPR sem precisar abrir e soldar UART em cada TV box. - BTV E13: aplicar a mesma metodologia. Suporte mainline pra família S4 ainda é experimental, mas o approach da factory partition pode funcionar quando o kernel maturar.
Lições do processo
Algumas coisas que ficam pra próxima vez:
1. ESP32 é o adaptador UART perfeito pra hardware ARM 3.3V. Não precisa de FTDI ou CH340 dedicado, não precisa de level shifter, custa R$30. Tem GPIO sobrando pra projetos paralelos.
2. Sempre olhe a foto física do chip antes de assumir baseado no driver. O driver wifi MediaTek empacotado pela devmfc me fez acreditar por dias que o chip era MT7668. Era Unisoc.
3. Mouse gamer 8K HS é incompatível com ARM modesto. Em PC com Xeon ou Ryzen, 8000 Hz é luxo. Em Cortex-A55, é tortura.
4. EMI shield em TV box pirata frequentemente tem folga sobre o SoC. É projetado pra blindagem eletromagnética (compliance FCC/CE), não pra dissipação. Apertar ou colar thermal pad melhora 5-10°C sem custo.
5. A factory partition (mmc 1:6, "KEYBOX PART") da Amlogic é um vetor incrível pra hardware hacking. Originalmente serve pra armazenar chaves DRM do Android, mas é FAT12 escrível via Linux E lível pelo u-boot vendor. Resto da estrutura pode ser similar em outras TV boxes Amlogic.
6. Reciclar pra educar é uma proposta concreta, não filosofia abstrata. Brasil tem milhões de TV boxes piratas instaladas, e a Receita apreende lotes desses todo ano. Com a metodologia de boot autônomo via factory partition, viram mini-PCs Linux com 2GB RAM, 16GB storage, ethernet, HDMI 4K. Casos de uso reais pra ensino de eletrônica (Arduino), Linux, redes — e custo zero pra instituição.
Esse caso de uso — TV box pirata reciclada como ferramenta educacional — já tem precedente brasileiro. O projeto EducaBox do IFMS (Instituto Federal de Mato Grosso do Sul) documentou esse fluxo pra 29 modelos diferentes de TV box, com 3 famílias de SoCs (Amlogic, Allwinner, RockChip). Eles não tinham a BTV B13 nem a BTV E13 no catálogo deles. Esse trabalho preenche esse gap pra B13 e fica como base pra E13. Tem espaço pra uma colaboração entre o IFPR Ivaiporã e o IFMS no futuro — filosofia idêntica, modelos complementares.
Documentação completa
Tudo que descobri tá no repositório:
Lá tem:
- TUTORIAL.md — procedimento passo a passo replicável (~500 linhas)
- DIARIO.md — diário técnico completo com benchmarks, análises de DTB, descobertas detalhadas (~900 linhas)
- scripts/ — bootscripts u-boot, sketch ESP32, config Xorg, systemd unit
- imagens/ — fotos do hardware, screenshots AIDA64, fotos do processo de hacking
Se você tiver uma BTV B13 e quiser tentar, o tutorial é replicável em ~3 horas (incluindo soldagem dos pinos UART). Se tiver outro modelo Amlogic e quiser adaptar a metodologia, o diário tem detalhe suficiente pra você se virar.
Comentários, dúvidas, ou casos de uso interessantes — manda no issues do repo ou aqui mesmo nos comentários.
Agradecimentos
- Prof. Me. Ronan Anacleto Lopes — coordenador do curso de Sistemas de Informação no IFPR Campus Ivaiporã, pela proposta inicial do projeto e por confiar o equipamento pra análise.
- Prof. Lucas dos Santos Umeoka — IFPR Campus Ivaiporã, pela sugestão de expandir o escopo das TV boxes recicladas pra mini-desktops portáteis voltados a programação Arduino e atividades educacionais leves.
- IFPR Campus Ivaiporã — pelo equipamento e pelo contexto institucional que viabilizou esse trabalho.
- Projeto devmfc/debian-on-amlogic — base do pendrive Debian usado nas primeiras tentativas.
- Projeto EducaBox / IFMS — inspiração filosófica e referência metodológica pra reciclagem educacional de TV boxes piratas.
Sobre o autor
Sou Gabriel Cezar Lima (ou apenas Gabriel Lima), discente do Curso de Bacharelado em Sistemas de Informação pelo IFPR Campus Ivaiporã, onde também sou egresso do Curso Técnico em Informática. Trabalho com projetos open-source há mais de 7 anos em áreas como Eletrônica, Robótica, Automação e IoT.
Mais sobre o que faço:
- 🐙 GitHub: github.com/gabclima
- 📝 Blog: blog.gabrielclima.com
Esse foi um daqueles projetos que começam com "vou abrir só pra dar uma olhada" e terminam três dias depois com soldador na mão e backup do u-boot original em quatro lugares diferentes. Valeu cada hora.