Fox Red Labs / Portability
Portability
Code from everywhere runs on TI boards
57 ports ran, 9 ran in part and 0 build so far, from 11 places code comes from. Each path is a port; hover a lane or a family to follow it. A grey lane has nothing yet, and that is the next thing to try.
ran on the boardran in partbuilds, not yet run
Every port
What came from where, what it runs on, and what had to change. The status words: Works ran on the kit and did what it should; Could work means some of it ran; Should work means it builds and only glue is in the way. The port's code is in the repository; its page has the steps and the numbers.
ESPHome (3)
| Port | From | Runs on | Status | What changed | |
|---|---|---|---|---|---|
| ESPHome Wi-Fi device on the LP-EM-CC35X1 | ESPHome (Wi-Fi, logger, mDNS and native API components) | cc35x1 | Works | A cc35xx platform on TI's Wi-Fi SDK and lwIP; ESPHome's API encryption is refused until the chip's hardware random number generator is wired in | code |
| ESPHome Zigbee device on the LP-EM-CC2340R5 | ESPHome (its Zigbee component) | cc2340r5 | Works | The cc23xx platform beside cc27xx, sharing the shim | code |
| ESPHome Zigbee device on the LP-EM-CC2755P10 | ESPHome (its Zigbee component, written for Nordic chips) | cc2755p10 | Works | An ESPHome external platform plus a 388-line shim for the Nordic and Zephyr calls ESPHome's Zigbee code makes; no ESPHome file changed | code |
MicroPython (3)
| Port | From | Runs on | Status | What changed | |
|---|---|---|---|---|---|
| MicroPython 1.29.0 on the LP-EM-CC2340R5 through upstream's Zephyr port | MicroPython v1.29.0 (MIT), Zephyr 4.4.2 | cc2340r5 | Works | No port code: one config file that drops networking, sensors and file systems and sets a 20 kB heap, and one devicetree overlay for four ADC channels. MicroPython and Zephyr files unmodified. | code |
| MicroPython 1.29.0 on the LP-MSPM0G3519 and LP-MSPM0G3507 | MicroPython v1.29.0 (MIT) | mspm0g3519, mspm0g3507 | Works | A new MSPM0 port: UART console, SysTick time, pin table from SysConfig data, PLL start-up with the errata retry, heap from the linker file, hardware machine.SPI on SPI1; two Python files drive the screen and touch chip; MicroPython files unmodified. | code |
| MicroPython 1.29.0 on the LP-MSPM33C321A through upstream's Zephyr port | MicroPython v1.29.0 (MIT), Zephyr main 1405adc9a plus open pull requests | mspm33c321a | Works | No port code: one config file (watchdog off, GPIO, I2C, SPI) and devicetree overlays for the buses, on Zephyr main pinned with two open TI pull requests (UART and clock, GPIO). MicroPython files unmodified. | code |
ESP32 (1)
| Port | From | Runs on | Status | What changed | |
|---|---|---|---|---|---|
| ESP32-BLE-Gamepad (a Bluetooth HID gamepad library) on TI, ST and C2000 boards | ESP32-BLE-Gamepad by lemmingDev (MIT, commit 65d5178), written for Arduino-ESP32 and NimBLE-Arduino | mspm0g3519, f2800137, cc2340r5, cc35x1, nucleo-u083rc | Works | Nothing in the library changed: its report descriptor builder and packer were rewritten as plain C (no Arduino, no NimBLE) by a fresh AI run per board and checked against the unmodified library on the ESP32-C6; the CC2340R5 image replaces the buttons of TI's basic_ble with a HID-over-GATT service, reusing the ble-hid-remote patch | code |
STM32 (4)
| Port | From | Runs on | Status | What changed | |
|---|---|---|---|---|---|
| Five STM32CubeG0 examples through TI's migration skill on the MSPM0 G3507: 3 ran as written, 2 after fixes | ST's STM32CubeG0 examples for the NUCLEO-G071RB (commit 446ebe3) | mspm0g3507 | Works | TI's ti-ccstudio-migrate-to-ti skill wrote all the code; we corrected the button polarity and the ADC DMA address and sample count | |
| ST STM32G4 HAL examples on the LP-AM13E230 | ST's STM32G4 HAL examples, through TI's STM32G4 HAL layer for AM13 | am13e230 | Works | code | |
| STM32 UART DMA receive with idle-line interrupt (MaJerle stm32-usart-uart-dma-rx-tx) on TI boards | stm32-usart-uart-dma-rx-tx by Tilen Majerle (MIT, commit c242589d), written for STM32 LL on the NUCLEO-G071RB | nucleo-u083rc, mspm0g3519, mspm0g5187, mspm0l1306, mspm0c1104, mspm33c321a, am13e230, esp32c6 | Works | The packet parser, ring buffers (lwrb, unchanged) and main loop are upstream's; each board's UART and DMA setup and interrupt handlers were rewritten for TI DriverLib by a fresh AI agent, and the idle-line interrupt is a 1 ms timer poll or the UART receive timeout | code |
| STM32 UART Xmodem bootloader (ferenc-nemeth/stm32-bootloader) on the LP-MSPM0G3519 | stm32-bootloader by Ferenc Nemeth (MIT, commit 8848449), written for STM32 HAL on the STM32VLDISCOVERY (STM32F100) | mspm0g3519 | Works | xmodem.c and xmodem.h are upstream's, byte for byte; uart.c, flash.c and main.c were rewritten for TI DriverLib: a polled UART with a 1 ms SysTick timeout, 1 kB sector erase and 8-byte ECC writes, and a jump that moves the vector table and re-enables interrupts. The button is replaced by a rule: update mode when the first word of the application area is 0xFFFFFFFF. | code |
Raspberry Pi Pico (1)
| Port | From | Runs on | Status | What changed | |
|---|---|---|---|---|---|
| Raspberry Pi Pico SDK examples on the MSPM0 G3519 | raspberrypi/pico-examples 0d62f75 and pico-sdk 2.3.1 (BSD-3-Clause) | mspm0g3519 | Works | A 316-line layer of Pico SDK headers and functions over DriverLib (pico/stdlib, hardware/gpio, uart, i2c, pwm, adc, pico/time) plus 81 lines of board files mapping Pico GPIO numbers to G3519 pins; the real pico-sdk supplies only pico/error.h and pico/binary_info.h. | code |
Zephyr (4)
| Port | From | Runs on | Status | What changed | |
|---|---|---|---|---|---|
| Sub-1 GHz CC1407P radio on an LP-MSPM0G5187, heard by an LP-CC1354P10-1 | TI's CC1407P BoosterPack host driver, shipped for a Zephyr host | mspm0g5187, cc1354p10 | Works | Two Zephyr-only driver files replaced; on the receiver only the channel changed | code |
| Zephyr in 4 kB of RAM on the LP-MSPM0L1306 | Zephyr (no upstream board for this chip) | mspm0l1306 | Works | code | |
| Zephyr on the AM62L's Cortex-A53: from on-chip SRAM, and on one core beside Linux | Zephyr main a915b2f (its am62l_evm board is written for a start from U-Boot with the DDR up) | am62l-evm | Works | Two overlays and two config files in am62l-evm/zephyr/ (one core, EL3 entry, no SCMI or PSCI, UART0 only, 8 translation tables; the DDR build adds a console ring and a patch that leaves the GIC distributor to Linux). Zephyr files unmodified. | code |
| Zephyr on the LP-AM13E230 | Zephyr main (no board for this chip) | am13e230 | Works |
Arduino (4)
| Port | From | Runs on | Status | What changed | |
|---|---|---|---|---|---|
| Arduino display libraries on the LP-MSPM0G3507 | Arduino libraries (Arduino_GFX, Adafruit_FT6206) | mspm0g3507 | Works | code | |
| Arduino sketches on the LP-EM-CC2340R5 and LP-MSPM0G3519 through the Zephyr-based core: Blink and AnalogReadSerial | ArduinoCore-zephyr af5b8610f9be (Apache-2.0), ArduinoCore-API 1.5.2, arduino-examples (public domain sketches) | cc2340r5, mspm0g3519 | Works | A pin-map overlay per board, an app CMake file that includes the .ino as it is, and an optional six-line patch so Serial blocks instead of dropping bytes. The G3519 also needed its ADC12 node switched on in the overlay (driver in Zephyr main only). | code |
| uLisp Lisp interpreter on the LP-MSPM0G5187, LP-MSPM0G3507 and LP-MSPM0G3519 | uLisp ARM 4.9a (MIT), an Arduino sketch | mspm0g5187, mspm0g3507, mspm0g3519 | Works | A build copy of the sketch gets one board block and the pin-mode keywords; function prototypes are written the way the Arduino IDE writes them (about 490). The shim supplies Serial, millis, micros, delay and the three LED pins; analog, tone, SPI and I2C are stubs. | code |
| Arduboy2-compatible layer and three open-source games on MSPM0 and MSPM33 | Arduboy2 API; games Snake (MIT), TileWorld (Apache-2.0), Crate Confusion (MIT) | mspm0g3507, mspm0g3519, mspm0g5187, mspm33c321a | Could work | A reimplemented subset of Arduboy2 (about 700 lines) behind an abstract display, input, tone and clock interface; the games are unmodified. | code |
Standards and phone apps (4)
| Port | From | Runs on | Status | What changed | |
|---|---|---|---|---|---|
| Matter smoke and CO alarm over Thread on the LP-EM-CC2755P10 | Matter's smoke and CO alarm device type from the open-source Matter SDK (TI ships no smoke example) | cc2755p10 | Works | About 250 lines on TI's Matter lighting example | code |
| Matter thermostat over Wi-Fi on the LP-EM-CC35X1 | Matter's thermostat and occupancy device types on TI's Matter lighting example | cc35x1 | Works | code | |
| Zigbee smoke and CO alarm on the LP-EM-CC2340R5 | The Zigbee IAS Zone standard (TI ships no IAS Zone example) | cc2340r5 | Works | An IAS Zone device written against the ZBOSS Zigbee headers on TI's Zigbee example | code |
| Bluetooth media remote (HID) on the LP-EM-CC2340R5 | The Bluetooth HID-over-GATT profile (neither TI Bluetooth SDK ships a HID example) | cc2340r5 | Could work | code |
Other vendors (5)
| Port | From | Runs on | Status | What changed | |
|---|---|---|---|---|---|
| BitNetMCU handwriting AI on MSPM0 | BitNetMCU, written for WCH's CH32V002 RISC-V chip | mspm0g3507, mspm0l1306 | Works | The model code unchanged; a board layer for MSPM0 and a touchscreen demo | code |
| Cmsemicon CMS32 examples on the MSPM0 L1306 | Cmsemicon's CMS32F04x Keil example pack | mspm0l1306 | Works | code | |
| Nordic's nRF Blinky and UART services on the CC2340R5 | Nordic's public LED Button and UART service definitions (no Nordic code) | cc2340r5 | Works | code | |
| Renesas FSP examples (UART, ADC, I2C, GPT timer) on the MSPM0 G3519 | renesas/ra-fsp-examples c74f31fde (BSD-3-Clause) | mspm0g3519 | Works | A 577-line FSP-on-DriverLib layer (about 70 lines map the RA event link and transfer controller onto MSPM0 events and DMA) plus a 189-line board file; five constants in iic_master for the FT6336U instead of the ADXL345. | code |
| NVIDIA Holoscan's camera graph on the SK-TDA4VM | NVIDIA Holoscan (needs CUDA, so the graph was rebuilt from TI parts) | tda4vm | Could work | code |
TI examples and this lab's code, across chips (18)
| Port | From | Runs on | Status | What changed | |
|---|---|---|---|---|---|
| 2048 and Minesweeper on the LP-MSPM0G3519 with a 3.5 inch touch display | Written for this repository | mspm0g3519, mspm0g3507, mspm33c321a | Works | Written from the rules; a gesture layer and an eight-function board layer; dirty-tile redraw with a 3 kB buffer. | code |
| A radar frame parser on the LP-AM13E230 and SK-TDA4VM | TI's radar output format, parser in plain C | am13e230, tda4vm | Works | code | |
| An MSPM0 FFT example on the SK-TDA4VM | TI's MSPM0 SDK CMSIS-DSP FFT example | tda4vm | Works | code | |
| C2000 current-loop code on the AM13E230 | C2000-style motor-control C | am13e230, f2800137 | Works | ||
| DNS ad blocker (sinkhole) on the LP-EM-CC35X1 | Written for this repository; the idioms follow the ESP-IDF DNS blockers | cc35x1 | Works | New firmware on the SDK lwIP raw UDP API; the blocklist table is generated from a hosts file by gen_blocklist.py and linked into flash; DNS IDs come from the chip hardware random generator. | code |
| MCU+ SDK examples on the IWRL6432BOOST radar | TI's MCU+ SDK examples for AM263Px | iwrl6432boost | Works | code | |
| MSP430FR2433 code examples on the MSPM0 L1306 | TI MSP430FR243x code examples | mspm0l1306 | Works | The FRAM variable became an append-only log in one flash sector, each low-power mode became the nearest MSPM0 power state with a named wake source, and the register writes became a SysConfig file. | code |
| MSPM0 DriverLib programs on the LP-AM13E230 | TI's MSPM0 DriverLib examples | am13e230 | Works | code | |
| MSPM0 examples moved up and down the family | TI's MSPM0 SDK examples | mspm0l1306, mspm0g3507, mspm0c1104 | Works | code | |
| MSPM0 examples on the LP-MSPM33C321A | TI's MSPM0 SDK DriverLib examples | mspm33c321a | Works | code | |
| OpenOCD flash driver for the LP-EM-CC2340R5 and LP-EM-CC2755P10 | OpenOCD master (its cc26xx and cc3220sf drivers as the shape; nothing upstream for CC23xx or CC27xx). TI's own OpenOCD fork (github.com/TexasInstruments/ti-openocd, branch ti-release, head cb22a31e of 2026-07-02, GPL-2.0-or-later) already carries cc23xx, cc27xx, mspm33 and am13e230x flash drivers and board files, shipped as Mac builds with TI's VS Code debug extension; upstream OpenOCD master has none of the CC23xx and CC27xx parts. Ours is an upstream-master driver; the survey of 2026-10-18 compares the two. | cc2340r5, cc2755p10 | Works | A new cc23xx flash driver (about 900 lines) and four cfg files on top of upstream OpenOCD: SACI for reset and the debug-port check, the boot ROM's own sector erase and program calls for flash, refusals for chip erase, the CC27xx HSM bank and any change to CCFG or SCFG | code |
| TI AM13 Hall FOC adapted to DRV8376EVM | TI AM13 SDK 26.01.00.03 three-shunt Hall FOC for DRV8323RH | am13e230 | Works | DRV8376 interface, reference scaling, guarded commissioning and a Hall six-step recovery controller | code |
| TI's Jailhouse hypervisor on the AM62L: bare-metal and Linux cells beside Linux | TI's Jailhouse image and Hypervisor page for the AM62L, Linux SDK 12.01.00.05.03 | am62l-evm | Works | Nothing in TI's files. The board booted from a USB stick instead of TI's SD card, with the Jailhouse kernel, device tree, inmate archive and tools copied onto it under new names. | code |
| TI's MSPM0 DriverLib examples built and run with GCC | TI's MSPM0 SDK gcc makefiles (TI names gcc-arm-none-eabi 9-2019-q4) | mspm0g3507, mspm0l1306 | Works | Nothing in the examples: compiler, SysConfig and SDK paths set on the make command line, and three wrapper scripts giving the Zephyr SDK's GCC the arm-none-eabi names the makefiles call | code |
| BoosterPack drivers (Educational MKII, Sharp128, Audio, Sensors MKII, NPU DSP) on LaunchPad kits of other families | Written for this repository from the BoosterPack user guides | mspm0l1306, mspm0c1104, mspm0g3507, mspm0g3519, mspm0g5187, mspm33c321a, am13e230 | Could work | Pin maps generated from one pins.json per board; clashes the clash matrix lacked are recorded. | code |
| CC1407P host driver on the LAUNCHXL-F2800137 | TI's CC1407P BoosterPack host driver | f2800137 | Could work | code | |
| MSPM0 code on the CC2340R5 and CC1354P10 radio chips | TI's MSPM0 SDK driver examples | cc2340r5, cc1354p10, mspm0g3507 | Could work | code | |
| One app, three ways: DriverLib, TI Drivers and Zephyr | Our 81-line app over TI's three driver layers | mspm0g3507, mspm0l1306 | Could work | code |
Open-source projects (19)
| Port | From | Runs on | Status | What changed | |
|---|---|---|---|---|---|
| BitNetMCU in 1 kB of RAM on the LP-MSPM0C1104 | BitNetMCU | mspm0c1104 | Works | code | |
| BitNetMCU on a C2000 control chip (LAUNCHXL-F2800137) | BitNetMCU | f2800137 | Works | Three fixes for a chip with no 8-bit type; the portability matrix rates that effort Could work (row X48), and the card says Works because it ran | code |
| CHIP-8 interpreter and the chip8-test-suite on the LP-MSPM0G3519 touch panel | CHIP-8 virtual machine; chip8-test-suite (GPL-3.0, fetched, not stored) | mspm0g3519 | Works | The interpreter core is portable C with no allocation; the front end redraws only the changed rows through the shared touch-games display layer, and a 4 x 4 key pad maps touch to keys. | code |
| Doom engine (doomgeneric and rp2040-doom's design) on the LP-EM-CC35X1 and the LP-MSPM33C321A | doomgeneric (GPL-2.0), a portable fork of Chocolate Doom; rp2040-doom (GPL-2.0 and BSD-3 parts); shareware data not committed | cc35x1, mspm33c321a | Works | Squeeze patches to doomgeneric and a platform layer for the stock engine; for the rp2040-doom design, a 3-file patch, stand-in headers for the pico-sdk, a virtual game clock, a frame-checksum sink and a demo-end hook. The data file is a section of the signed image. | code |
| Fixed-weight DSP (FIR, filter bank, DFT) on the MSPM0 G5187 | CMSIS-DSP style FIR, filter-bank and DFT code, redone as NPU graphs | mspm0g5187 | Works | Hand-built ONNX graphs with fixed integer weights compiled by TI NNC 2.1.2 with no training; a small harness times each graph on the NPU and on the CPU. | code |
| FreeRTOS in 4 kB of RAM on the LP-MSPM0L1306 | FreeRTOS kernel | mspm0l1306 | Works | ||
| h264bsd video decoder on TI microcontrollers | h264bsd (Apache-2.0, from Android's decoder) | mspm33c321a, am13e230 | Works | code | |
| liblc3 (LC3, the Bluetooth LE Audio codec) on the MSPM33 C321A and MSPM0 G3519 | liblc3 v1.1.3 96a3af0 (Apache-2.0) | mspm33c321a, mspm0g3519 | Works | Nothing in the library. A runner calls it frame by frame on a generated integer test signal, times each call with the cycle counter and checksums every frame outside the timed region. The Arm DSP paths are behind a compiler-version guard that Clang does not meet, so the build defines it. | code |
| libopus 1.5.2 (Opus, RFC 6716) on the MSPM33 C321A | libopus 1.5.2 ddbe483 (BSD-3-Clause) | mspm33c321a | Works | Nothing in the library. The build sets FIXED_POINT, DISABLE_FLOAT_API and VAR_ARRAYS and uses the library's own source lists; the Mac reference is built with the same multiply macros (OPUS_FAST_INT64 follows the host word size). | code |
| llama2.c (TinyStories 260K, int8) on the MSPM33 C321A | llama2.c by Andrej Karpathy (MIT); model TinyStories 260K, MIT per its model card | mspm33c321a | Works | A bare-metal int8 inference file (llama2q.c) with the same arithmetic as the upstream runq.c: static buffers, one embedding row dequantized per token, hand-written string helpers, flash-resident weights, a result block in RAM that the probe reads. | code |
| minimp3 MP3 decoder on the MSPM33 C321A and MSPM0 G3519 | minimp3 ea99364 (CC0-1.0) | mspm33c321a, mspm0g3519 | Works | Nothing in the library; a runner calls the decoder frame by frame from clips in flash, times each call with the cycle counter and checksums every frame outside the timed region. The stack is 32 kB because one call keeps 17.3 kB on it. | code |
| minmea GPS sentence parser on MSPM0 | minmea (MIT), an NMEA GPS parser in plain C | mspm0g3507, mspm0g3519 | Works | A 21-line timegm and a 3-line header, force-included; no minmea file edited | code |
| Peanut-GB Game Boy emulator on MSPM0 and MSPM33 | Peanut-GB 1.3.0 (MIT) | mspm0g3507, mspm0g3519, mspm0g5187, mspm33c321a | Works | A front end over the shared display and input interface; a table scaler in the line callback, DMA row streaming, a line-buffer patch and a 160 MHz clock; two out-of-bounds bugs found by review are patched in the build copy only. | code |
| Plaits synthesis engines (Mutable Instruments, MIT) on the MSPM33 C321A | pichenettes/eurorack f4cfa76 plaits/ with stmlib e3bd7c9 (MIT) | mspm33c321a | Works | Nothing in the source. The runner calls Voice::Render per block, reads the cycle counter around each call and checksums every block outside the timed region; -DTEST goes to the library files only because the SDK header uses that name. | code |
| Post-quantum key exchange and signatures on the LP-CC1354P10-1 | mlkem-native and mldsa-native (NIST ML-KEM and ML-DSA) | cc1354p10 | Works | code | |
| Rust (embassy-mspm0) on the MSPM0 L1306 | embassy-rs embassy-mspm0 (MIT or Apache-2.0), a community project | mspm0l1306 | Works | No port: the embassy-mspm0 community hardware layer is used from a pinned git commit; programs print on the UART because the repository's flash path cannot show debug text over RTT. | code |
| wasm3 (WebAssembly interpreter) on the MSPM0 G3519, MSPM0 G3507 and MSPM33 C321A | wasm3 v0.9.0 (MIT) | mspm0g3519, mspm0g3507, mspm33c321a | Works | A runner that links four host functions (putc, led, delay_ms, print_i32); a fixed-heap, no-float configuration set on the compiler command line; the module is written as WebAssembly text and converted with wabt. Three patches in a build copy: a native-stack check in call_ref, a 64-bit page sum in memory.grow, and a smaller code page. | code |
| Open radar readers on the IWRL6432BOOST: the ROS driver, the Python SDK 3 reader, the gesture recognizer | ibaiGorordo/AWR1843-Read-Data-Python-MMWAVE-SDK-3- 66f16c2 (Python reader), radar-lab/ti_mmwave_rospkg cb3255f (ROS 1 driver), vilari-mickopf/mmwave-gesture-recognition 07a1ec8 | iwrl6432boost | Could work | The Python reader: no source change, NumPy 1.26 and a macOS port wrapper. The ROS driver: C++11 to C++14 in its build file, startup parameters set by hand. The gesture recognizer: not made to run; it needs a format converter and new recordings. | code |
| ZX Spectrum 48K (floooh/chips Z80 core) on the LP-MSPM0G3519 touch panel | floooh/chips z80.h (zlib); Spectrum 48K memory map; OpenSE BASIC 3.1.2 (GPL-2.0, reader-supplied, not stored) | mspm0g3519 | Could work | A machine layer decodes the Z80 pin word each tick, the core is copied to SRAM bank 1 at boot, and the front end sends only the 8-line bands whose bytes changed. The reader supplies the 16 kB system ROM; without one the build runs a test program that holds no Sinclair code. | code |
How a port is done, step by step, and the full card for each one: every port, with what broke. The same C file on eleven TI boards: one app, eleven boards. Code moving between TI families: portability, proven.