
Documents reverse engineering of a TCL Android TV factory layer: 56 kHz IR protocol, tclfactoryos daemon, kernel IR driver, and evidence that software root is unattainable.

π Languages: English (this file) Β· πΉπ· TΓΌrkΓ§e
Eight days, one TCL 65T61C, one Arduino Uno, and hundreds of closed doors. This repo is not a "root guide" β it's a closure report: the TV's factory/service layer was mapped end to end, software root was shown β with evidence β to be unattainable on this firmware, and everything was documented so the next researcher doesn't have to re-walk the graveyard.
The short story: inside the TV runs a root daemon called tclfactoryos, and inside
it runs a command processor with a system() call behind it. Three channels lead
there: IR, UART, and p2p. We fully reverse-engineered the IR protocol (56 kHz!),
disassembled the kernel driver, and proved that the fixed marker bytes of the factory
key sequence simply do not exist in the TV's own key table β no valid sequence can
ever be transmitted. UART is physical; the p2p thread only ever spawns from a valid
IR sequence. The software surface: exhausted. This repo is the whole journey.
A note on languages: this README is in English, and so is the full documentation: the seven phase documents live in
docs/en/(Turkish originals indocs/). Code comments follow English where it matters.
| Model | TCL 65T61C (65", Android TV 12) |
| Platform | Realtek RTD2875P / rtd6748 |
| Firmware | V8-R75PT01-LF1V618 (build STT2.230203.001 release-keys) |
| Kernel | 5.4.284+ Β· security patch 2025-12-05 |
| Remote | RC833A dual-mode (Bluetooth HID + IR) |

The real rig that talked to the TV: Arduino Uno + 2N2222A driver + 940 nm IR LED β photographed during the sessions. This circuit raised and lowered the TV's volume, key by key, and carried every factory probe in docs/04.
The research was done on a device owned by the author, strictly inside their own home network. The TV was never opened; no persistent writes, no key/MID/SN tampering; the device was returned to factory state the moment the work ended.
ADDR(4)|CMD(8)|~ADDR(4)|~CMD(8), bit = 500 Β΅s mark
data/TCL-kumanda-kodlari.md.w19; the key table matches
these values (VOL+ = 0x0b0f4f00, verified byte-for-byte). Factory keys surface as
special type-0x19 input events β and the argument byte comes from the key table,
not the frame.0x01 and 0x0C; those values must come from the table's digit family
({b2,a3,f7,ac,81,58,92,ef}); they don't exist there. No valid sequence can be
constructed. On top of that, the report-mode flag that gates type-0x19 emission
lives behind root-only sysfs.Every claim was verified against logs/getevent/disassembly; sample excerpts:
data/kanit-ornekleri.md Β· raw IR measurement log:
data/tus_kaydi_ham.log Β· the kernel key table itself:
data/ir_table.bin (+ parser: tools/arduino/ir_tablo_parse.py).
docs/ the seven phase documents β Turkish originals
docs/en/ the same seven documents, fully in English
tools/arduino/fabrika/ the universal IR blaster (fabrika.ino + firing script)
tools/arduino/{kumanda,tus_kaydet,ogren_gonder,ses_ac_oto}/ the IR tool-chain sketches
tools/arduino/rcu_hesap.py RCU 13-byte + CRC16-CCITT-FALSE generator (note: legacy word format β docs/04)
tools/factorysock.py client for the 27856 factory socket
tools/p2pclient.py ts-protocol client skeleton
data/ key table + kernel ir_table.bin + raw log + evidence excerpts
assets/ cover GIF + real-rig photo + receiver/TV wiring guide (PDF)
Everything above proves the software doors are shut. Exactly one channel was never tested, and there is no evidence it is closed: the physical UART. The owner of this particular TV couldn't open a family device β but if you can reach the service line on this model or a sibling, this is a genuinely promising path with every piece already prepared: