GitHub

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.

Where ported code came from, and the TI families it runs on1 port: Standards and phone apps on Radios1 port: Other vendors on Linux1 port: TI examples and this lab's code, across chips on C20003 ports: TI examples and this lab's code, across chips on MSPM01 port: TI examples and this lab's code, across chips on Radios1 port: Arduino on MSPM01 port: Arduino on MSPM331 port: TI examples and this lab's code, across chips on MSPM331 port: TI examples and this lab's code, across chips on AM131 port: Open-source projects on MSPM01 port: Open-source projects on Radios3 ports: ESPHome on Radios3 ports: Standards and phone apps on Radios1 port: Other vendors on Radios3 ports: Other vendors on MSPM010 ports: Open-source projects on MSPM01 port: Open-source projects on C20003 ports: Arduino on MSPM09 ports: Open-source projects on MSPM331 port: Open-source projects on AM132 ports: Open-source projects on Radios2 ports: STM32 on AM133 ports: STM32 on MSPM02 ports: Zephyr on MSPM01 port: Zephyr on Radios1 port: Zephyr on AM134 ports: TI examples and this lab's code, across chips on MSPM02 ports: TI examples and this lab's code, across chips on MSPM334 ports: TI examples and this lab's code, across chips on AM133 ports: TI examples and this lab's code, across chips on Radios3 ports: TI examples and this lab's code, across chips on Linux1 port: TI examples and this lab's code, across chips on C20001 port: ESP32 on C20001 port: ESP32 on MSPM01 port: ESP32 on Radios1 port: STM32 on MSPM331 port: MicroPython on MSPM01 port: MicroPython on Radios1 port: MicroPython on MSPM331 port: Arduino on Radios1 port: Raspberry Pi Pico on MSPM01 port: Zephyr on LinuxESPHomeYAML devices that join Home Assistant3 portsMicroPythonPython on the chip3 portsESP32ESP-IDF and Arduino-ESP32 projects1 portSTM32ST's HAL and LL examples4 portsRaspberry Pi Picopico-sdk examples1 portZephyrSamples and boards from the Zephyr tree4 portsArduinoSketches, cores and libraries4 portsStandards and phone appsMatter, Zigbee, Bluetooth profiles, BTHome4 portsOther vendorsRenesas, Nordic, WCH and others5 portsTI examples and this lab's code, across chipsAn example for one chip, on another18 portsOpen-source projectsEngines, codecs, models and tools written for other chips19 portsMSPM0Cortex-M0+ kits, 1 kB to 128 kB of RAM33 portsMSPM33Cortex-M33, 160 MHz15 portsRadiosCC23xx, CC27xx, CC35xx and radar19 portsAM13Cortex-R5 real-time control, 200 MHz9 portsC2000Motor and power control4 portsLinuxAM62L and TDA4 processors5 ports

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)

PortFromRuns onStatusWhat changed
ESPHome Wi-Fi device on the LP-EM-CC35X1ESPHome (Wi-Fi, logger, mDNS and native API components)cc35x1WorksA 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 incode
ESPHome Zigbee device on the LP-EM-CC2340R5ESPHome (its Zigbee component)cc2340r5WorksThe cc23xx platform beside cc27xx, sharing the shimcode
ESPHome Zigbee device on the LP-EM-CC2755P10ESPHome (its Zigbee component, written for Nordic chips)cc2755p10WorksAn ESPHome external platform plus a 388-line shim for the Nordic and Zephyr calls ESPHome's Zigbee code makes; no ESPHome file changedcode

MicroPython (3)

PortFromRuns onStatusWhat changed
MicroPython 1.29.0 on the LP-EM-CC2340R5 through upstream's Zephyr portMicroPython v1.29.0 (MIT), Zephyr 4.4.2cc2340r5WorksNo 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-MSPM0G3507MicroPython v1.29.0 (MIT)mspm0g3519, mspm0g3507WorksA 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 portMicroPython v1.29.0 (MIT), Zephyr main 1405adc9a plus open pull requestsmspm33c321aWorksNo 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)

PortFromRuns onStatusWhat changed
ESP32-BLE-Gamepad (a Bluetooth HID gamepad library) on TI, ST and C2000 boardsESP32-BLE-Gamepad by lemmingDev (MIT, commit 65d5178), written for Arduino-ESP32 and NimBLE-Arduinomspm0g3519, f2800137, cc2340r5, cc35x1, nucleo-u083rcWorksNothing 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 patchcode

STM32 (4)

PortFromRuns onStatusWhat changed
Five STM32CubeG0 examples through TI's migration skill on the MSPM0 G3507: 3 ran as written, 2 after fixesST's STM32CubeG0 examples for the NUCLEO-G071RB (commit 446ebe3)mspm0g3507WorksTI'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-AM13E230ST's STM32G4 HAL examples, through TI's STM32G4 HAL layer for AM13am13e230Workscode
STM32 UART DMA receive with idle-line interrupt (MaJerle stm32-usart-uart-dma-rx-tx) on TI boardsstm32-usart-uart-dma-rx-tx by Tilen Majerle (MIT, commit c242589d), written for STM32 LL on the NUCLEO-G071RBnucleo-u083rc, mspm0g3519, mspm0g5187, mspm0l1306, mspm0c1104, mspm33c321a, am13e230, esp32c6WorksThe 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 timeoutcode
STM32 UART Xmodem bootloader (ferenc-nemeth/stm32-bootloader) on the LP-MSPM0G3519stm32-bootloader by Ferenc Nemeth (MIT, commit 8848449), written for STM32 HAL on the STM32VLDISCOVERY (STM32F100)mspm0g3519Worksxmodem.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)

PortFromRuns onStatusWhat changed
Raspberry Pi Pico SDK examples on the MSPM0 G3519raspberrypi/pico-examples 0d62f75 and pico-sdk 2.3.1 (BSD-3-Clause)mspm0g3519WorksA 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)

PortFromRuns onStatusWhat changed
Sub-1 GHz CC1407P radio on an LP-MSPM0G5187, heard by an LP-CC1354P10-1TI's CC1407P BoosterPack host driver, shipped for a Zephyr hostmspm0g5187, cc1354p10WorksTwo Zephyr-only driver files replaced; on the receiver only the channel changedcode
Zephyr in 4 kB of RAM on the LP-MSPM0L1306Zephyr (no upstream board for this chip)mspm0l1306Workscode
Zephyr on the AM62L's Cortex-A53: from on-chip SRAM, and on one core beside LinuxZephyr main a915b2f (its am62l_evm board is written for a start from U-Boot with the DDR up)am62l-evmWorksTwo 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-AM13E230Zephyr main (no board for this chip)am13e230Works

Arduino (4)

PortFromRuns onStatusWhat changed
Arduino display libraries on the LP-MSPM0G3507Arduino libraries (Arduino_GFX, Adafruit_FT6206)mspm0g3507Workscode
Arduino sketches on the LP-EM-CC2340R5 and LP-MSPM0G3519 through the Zephyr-based core: Blink and AnalogReadSerialArduinoCore-zephyr af5b8610f9be (Apache-2.0), ArduinoCore-API 1.5.2, arduino-examples (public domain sketches)cc2340r5, mspm0g3519WorksA 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-MSPM0G3519uLisp ARM 4.9a (MIT), an Arduino sketchmspm0g5187, mspm0g3507, mspm0g3519WorksA 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 MSPM33Arduboy2 API; games Snake (MIT), TileWorld (Apache-2.0), Crate Confusion (MIT)mspm0g3507, mspm0g3519, mspm0g5187, mspm33c321aCould workA 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)

PortFromRuns onStatusWhat changed
Matter smoke and CO alarm over Thread on the LP-EM-CC2755P10Matter's smoke and CO alarm device type from the open-source Matter SDK (TI ships no smoke example)cc2755p10WorksAbout 250 lines on TI's Matter lighting examplecode
Matter thermostat over Wi-Fi on the LP-EM-CC35X1Matter's thermostat and occupancy device types on TI's Matter lighting examplecc35x1Workscode
Zigbee smoke and CO alarm on the LP-EM-CC2340R5The Zigbee IAS Zone standard (TI ships no IAS Zone example)cc2340r5WorksAn IAS Zone device written against the ZBOSS Zigbee headers on TI's Zigbee examplecode
Bluetooth media remote (HID) on the LP-EM-CC2340R5The Bluetooth HID-over-GATT profile (neither TI Bluetooth SDK ships a HID example)cc2340r5Could workcode

Other vendors (5)

PortFromRuns onStatusWhat changed
BitNetMCU handwriting AI on MSPM0BitNetMCU, written for WCH's CH32V002 RISC-V chipmspm0g3507, mspm0l1306WorksThe model code unchanged; a board layer for MSPM0 and a touchscreen democode
Cmsemicon CMS32 examples on the MSPM0 L1306Cmsemicon's CMS32F04x Keil example packmspm0l1306Workscode
Nordic's nRF Blinky and UART services on the CC2340R5Nordic's public LED Button and UART service definitions (no Nordic code)cc2340r5Workscode
Renesas FSP examples (UART, ADC, I2C, GPT timer) on the MSPM0 G3519renesas/ra-fsp-examples c74f31fde (BSD-3-Clause)mspm0g3519WorksA 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-TDA4VMNVIDIA Holoscan (needs CUDA, so the graph was rebuilt from TI parts)tda4vmCould workcode

TI examples and this lab's code, across chips (18)

PortFromRuns onStatusWhat changed
2048 and Minesweeper on the LP-MSPM0G3519 with a 3.5 inch touch displayWritten for this repositorymspm0g3519, mspm0g3507, mspm33c321aWorksWritten 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-TDA4VMTI's radar output format, parser in plain Cam13e230, tda4vmWorkscode
An MSPM0 FFT example on the SK-TDA4VMTI's MSPM0 SDK CMSIS-DSP FFT exampletda4vmWorkscode
C2000 current-loop code on the AM13E230C2000-style motor-control Cam13e230, f2800137Works
DNS ad blocker (sinkhole) on the LP-EM-CC35X1Written for this repository; the idioms follow the ESP-IDF DNS blockerscc35x1WorksNew 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 radarTI's MCU+ SDK examples for AM263Pxiwrl6432boostWorkscode
MSP430FR2433 code examples on the MSPM0 L1306TI MSP430FR243x code examplesmspm0l1306WorksThe 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-AM13E230TI's MSPM0 DriverLib examplesam13e230Workscode
MSPM0 examples moved up and down the familyTI's MSPM0 SDK examplesmspm0l1306, mspm0g3507, mspm0c1104Workscode
MSPM0 examples on the LP-MSPM33C321ATI's MSPM0 SDK DriverLib examplesmspm33c321aWorkscode
OpenOCD flash driver for the LP-EM-CC2340R5 and LP-EM-CC2755P10OpenOCD 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, cc2755p10WorksA 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 SCFGcode
TI AM13 Hall FOC adapted to DRV8376EVMTI AM13 SDK 26.01.00.03 three-shunt Hall FOC for DRV8323RHam13e230WorksDRV8376 interface, reference scaling, guarded commissioning and a Hall six-step recovery controllercode
TI's Jailhouse hypervisor on the AM62L: bare-metal and Linux cells beside LinuxTI's Jailhouse image and Hypervisor page for the AM62L, Linux SDK 12.01.00.05.03am62l-evmWorksNothing 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 GCCTI's MSPM0 SDK gcc makefiles (TI names gcc-arm-none-eabi 9-2019-q4)mspm0g3507, mspm0l1306WorksNothing 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 callcode
BoosterPack drivers (Educational MKII, Sharp128, Audio, Sensors MKII, NPU DSP) on LaunchPad kits of other familiesWritten for this repository from the BoosterPack user guidesmspm0l1306, mspm0c1104, mspm0g3507, mspm0g3519, mspm0g5187, mspm33c321a, am13e230Could workPin maps generated from one pins.json per board; clashes the clash matrix lacked are recorded.code
CC1407P host driver on the LAUNCHXL-F2800137TI's CC1407P BoosterPack host driverf2800137Could workcode
MSPM0 code on the CC2340R5 and CC1354P10 radio chipsTI's MSPM0 SDK driver examplescc2340r5, cc1354p10, mspm0g3507Could workcode
One app, three ways: DriverLib, TI Drivers and ZephyrOur 81-line app over TI's three driver layersmspm0g3507, mspm0l1306Could workcode

Open-source projects (19)

PortFromRuns onStatusWhat changed
BitNetMCU in 1 kB of RAM on the LP-MSPM0C1104BitNetMCUmspm0c1104Workscode
BitNetMCU on a C2000 control chip (LAUNCHXL-F2800137)BitNetMCUf2800137WorksThree 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 rancode
CHIP-8 interpreter and the chip8-test-suite on the LP-MSPM0G3519 touch panelCHIP-8 virtual machine; chip8-test-suite (GPL-3.0, fetched, not stored)mspm0g3519WorksThe 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-MSPM33C321Adoomgeneric (GPL-2.0), a portable fork of Chocolate Doom; rp2040-doom (GPL-2.0 and BSD-3 parts); shareware data not committedcc35x1, mspm33c321aWorksSqueeze 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 G5187CMSIS-DSP style FIR, filter-bank and DFT code, redone as NPU graphsmspm0g5187WorksHand-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-MSPM0L1306FreeRTOS kernelmspm0l1306Works
h264bsd video decoder on TI microcontrollersh264bsd (Apache-2.0, from Android's decoder)mspm33c321a, am13e230Workscode
liblc3 (LC3, the Bluetooth LE Audio codec) on the MSPM33 C321A and MSPM0 G3519liblc3 v1.1.3 96a3af0 (Apache-2.0)mspm33c321a, mspm0g3519WorksNothing 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 C321Alibopus 1.5.2 ddbe483 (BSD-3-Clause)mspm33c321aWorksNothing 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 C321Allama2.c by Andrej Karpathy (MIT); model TinyStories 260K, MIT per its model cardmspm33c321aWorksA 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 G3519minimp3 ea99364 (CC0-1.0)mspm33c321a, mspm0g3519WorksNothing 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 MSPM0minmea (MIT), an NMEA GPS parser in plain Cmspm0g3507, mspm0g3519WorksA 21-line timegm and a 3-line header, force-included; no minmea file editedcode
Peanut-GB Game Boy emulator on MSPM0 and MSPM33Peanut-GB 1.3.0 (MIT)mspm0g3507, mspm0g3519, mspm0g5187, mspm33c321aWorksA 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 C321Apichenettes/eurorack f4cfa76 plaits/ with stmlib e3bd7c9 (MIT)mspm33c321aWorksNothing 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-1mlkem-native and mldsa-native (NIST ML-KEM and ML-DSA)cc1354p10Workscode
Rust (embassy-mspm0) on the MSPM0 L1306embassy-rs embassy-mspm0 (MIT or Apache-2.0), a community projectmspm0l1306WorksNo 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 C321Awasm3 v0.9.0 (MIT)mspm0g3519, mspm0g3507, mspm33c321aWorksA 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 recognizeribaiGorordo/AWR1843-Read-Data-Python-MMWAVE-SDK-3- 66f16c2 (Python reader), radar-lab/ti_mmwave_rospkg cb3255f (ROS 1 driver), vilari-mickopf/mmwave-gesture-recognition 07a1ec8iwrl6432boostCould workThe 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 panelfloooh/chips z80.h (zlib); Spectrum 48K memory map; OpenSE BASIC 3.1.2 (GPL-2.0, reader-supplied, not stored)mspm0g3519Could workA 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.