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 →Posts
- Hi, I'm Norbert
- Tamal: The Loader's Three Lives
Yesterday we read two pure step functions and made the same promise about each of them, the promise we have been making all series: the codec describes what one byte does to the state, and someone else owns the register that makes it sequential. Someone else holds the clock. We made that promise for…
Read more → - Tamal: The COBS codec
The transmitter and receiver built a byte pipe; yesterday we sealed the two halves into a single word — the UART — and left four wires hanging at the loader’s door. Today we walk through that door. But the first thing behind it is not a state machine. It is an answer to a question the pipe cannot an…
Read more → - Tamal: Wiring Uart Through Composition
The receiver we read yesterday closed the keystone. It wired the transmitter’s line into its own, shared one tick between them, fed a random byte in one end and got the same byte, bit-for-bit, out the other — first with an always-true tick, then with the real fractional-3.125 heartbeat the baud gene…
Read more → - Tamal: The receiver
The transmitter we read yesterday drove a wire. It owned the line: it held each level for sixteen ticks, and it made every output a pure function of its own state, so the serial output sat rock-steady between bit boundaries and never once twitched. That was a luxury, and we spent most of the post ad…
Read more → - Tamal: The transmitter
The baud generator we read last time produces a heartbeat — a Bool that says now sixteen times a bit — and nothing else. It had no state machine at all, just a phase accumulator counting against a modulus. That was the point: the smallest possible clocked block, a register fed back through some arit…
Read more → - Tamal: The baud generator
The CRC unit we read last time was pure combinational logic — a truth table wearing a Haskell type, the same output for the same input, no memory, no clock. It was the gentlest possible first block precisely because time never entered into it. The primer closed by promising that the next rung up was…
Read more → - Tamal: The CRC block
As mentioned before Tamal is an FPGA eSPI exerciser with its gateware written in Haskell and compiled to verilog with Clash. In a previous post we presented a very short introduction on Haskell, just enough such that the code blocks below don’t look too foreign. Today we start looking at one of the …
Read more → - Enough Haskell to Read Tamal
Tamal is an FPGA eSPI exerciser, and its gateware — the UART, the cycle engine, the ALU, the CRC unit, the loader, the trace ring — is written in Haskell and compiled straight to hardware by Clash. This is the first post in a series that opens up that gateware one block at a time and reads each one …
Read more → - Tamal: an eSPI exerciser
mole is an FPGA bit-cycle engine for exercising I²C and I³C — you write a little program, it drives the bus edge by edge, legal or illegal, and hands you back a structured trace of what happened. Tamal is that same idea aimed at a different, meaner bus: Intel’s Enhanced Serial Peripheral Interface (…
Read more → - From 'it works' to 'I trust it': two torture loops on a NOR driver
The FlexSPI NOR driver for the NXP MCXA5xx already worked. The blocking self-test was green, the examples ran, I could erase a sector, program a page, read it back, and watch the same bytes come out of the memory-mapped window. By the usual bar for “the driver works,” it worked. That bar is too low.…
Read more → - Pico de Gallo: Release Announcement
Pico de Gallo turns an RP2350 into a USB-attached bridge that lets a host program drive real I²C, SPI, GPIO, PWM, ADC, UART, and 1-Wire from std Rust, C, or Python — so you can write and test device drivers on your laptop instead of cross-compiling for an MCU every time. Today’s release moves the wh…
Read more → - I3C target mode on MCXA: three things the datasheet didn't warn me about
I spent the last several weeks bringing up an I3C target driver for the NXP MCXA family (MCXA2xx and MCXA5xx share the same I3C IP) inside the embassy HAL. “Target” is what I3C calls the role I²C calls “slave”: the device that sits on the bus, responds to a controller, and can also raise an in-band …
Read more → - Examples that run
Most driver crates I reach for ship an examples/ directory that I have to port before I can read it. Wrong PAC for my dev board, wrong linker script, a #[entry] macro from a runtime I don’t have checked out, a loop { wfi() } at the end I need to delete because I’m hosting the binary myself. By the t…
Read more → - Waking up without a critical section
A GPIO interrupt fires. The handler’s job is small: flip a status bit, call waker.wake(), return. The task that was parked on that pin is now ready to run, and the executor will get to it on the next poll. Until you look at what waker.wake() actually did. On every embassy target, until very recently…
Read more → - What did the boot ROM just do to my RAM?
A while back I was trying to get teleprobe to run a test suite on an RT685-EVK. Teleprobe’s trick is that it takes your test, compiled as a standalone firmware binary linked to execute directly from SRAM, loads it into the target’s RAM over the probe, and runs it from there — flash never gets touche…
Read more → - Writing embedded drivers without an MCU
Let me clarify the title up front: there is an MCU. There’s a Raspberry Pi Pico 2 sitting on my desk. What I mean is that the MCU isn’t in my dev loop. I don’t flash it. I don’t reset it. I don’t attach a probe to it. I treat it like a USB peripheral that happens to speak the buses I need — I²C, SPI…
Read more → - Hello, world
This is the first post on the new version of balbi.sh. The previous incarnation was a single HTML file with one link; this one is built with Zola and styled after ef-melissa-light — a warm, legible Emacs theme by Protesilaos Stavrou. Body text is set in Aporetic Serif, headings and UI in Aporetic Sa…
Read more →