rambo — the CLI that maps which of a Cortex-M’s SRAM a boot ROM clobbers before your firmware’s first instruction runs — is at v0.1.2. If you’re looking for a new feature, there isn’t one: ### Other - (deps) bump dependencies - add dependabot configuration - chain release binaries from release-plz w…
Read more →Hello, I'm Felipe Balbi.
I build firmware and tools for embedded systems. I work mostly in Rust and C, with detours through Python and shell when the job calls for it. This site is where I keep notes that might be useful to someone other than me.
Embedded systems · Rust · the craft of writing software
Recent posts
- rambo v0.1.2: the boring release is the point
- Tamal: Add, And, and the Taken Branch
The register file handed the datapath two values, and we followed them to the door of the next box. rs1v and rs2v — read through one register port, bound for the other — do not travel straight from the read to the write. Between the two ports sits a layer that turns them into something: the value th…
Read more → - Tamal: Sixteen Registers and a Hardwired Zero
The instruction set closed on a name it declined to open. decode had turned a word into an Instr, pulled the operands out as five-bit Reg fields, and handed them on — and the very next thing the dispatch post watched execInstr do was read the registers those fields named: readReg (regs s) (operandRs…
Read more → - Tamal: The Instruction Set
For three posts we held the leaves shut. We read the engine’s shape, watched it dispatch an instruction, and ran its wire, and all the while decode, dataResult, branchTaken, and the rest were names with one-line jobs and no insides. Now we start opening them — in the order the engine reaches for eac…
Read more → - Tamal: The Wire and the Record
The last post ended four instructions mid-gesture. PUT, GET, TAR, MARK, and WAIT_ON each spent their one cycle in Exec not finishing but arming — a shifter loaded, a beat count set, a write recorded in pending, a phase changed — and then the cycle ended and they handed off to a longer phase. This po…
Read more → - Tamal: One Instruction, One Cycle
The last post drew the map and left every road on it unwalked. We read the engine’s shape — the pure step, the eight phases, the seventeen-field state it threads — and then stopped at the one phase where the work actually happens: Exec, with the instruction word from memory finally valid in hand, de…
Read more → - Tamal: Eight Phases and a Pure Step
The memories closed on a promise: next, we walk through. Every block before them — the CRC, the UART, the loader, the two block RAMs — was read the same way, opened and emptied and set back down, and each ended by pointing at the one door still shut. This is that door. Tamal’s engine is the machine …
Read more → - Tamal: Four Lines and Three Promises
The loader spent its entire length driving two memories. It wrote instruction words into one of them, four bytes at a time, straight through as they came off the wire. It swept the other one out after HALT in seven patient phases, dancing with a one-cycle read latency that it never stopped to explai…
Read more → - Agentic Gallo: Introducing gallo-mcp
Pico de Gallo turns an RP2350 into a USB-attached bridge that lets a host program drive real I²C, SPI, UART, GPIO, PWM, ADC, and 1-Wire straight from your laptop — so you can write and test device drivers in std Rust, C, or Python instead of cross-compiling for an MCU every time. Today there’s a new…
Read more → - Hi, I'm Norbert
Meet Norbert — a small command-line tool I wrote to program SPI NOR flash chips. Its defining trait is patience: it reads and parses the SFDP tables, verifies its work, and would rather wait a second than guess.
Read more →