Notes on Elixir, Rust, Python and the Linux command line — written while building things, mostly so I can find the answer again next year.
The engineering here is mine; some of the prose had help. How these posts get written.
Four links of an authenticated boot chain on an STM32MP157F-DK2 — ROM, TF-A, U-Boot FIT and dm-verity — built, signed, broken on purpose and put back, with the one-time-programmable fuses left completely blank the whole way through.
▸ show all 8 partsGetting a real, touchable user interface onto the DK2's 4-inch MIPI DSI panel from Elixir on Nerves, with no GPU — the display stack, host previewing, a drift-free timer, and the Scenic gotchas that compile cleanly and fail on the device.
▸ show all 5 partsCertificates and mTLS are the easy part. The hard part is identity over a device's whole life: first enrolment, rotation, power loss mid-rotation, and a gateway that was offline for two years.
I built this blog to parse every post at compile time, wrote up why it was the right call, and then reversed it three weeks later. Both of my premises were false. Here is what replaced it, and how it keeps every property the compile-time version actually earned.
Writing a custom Nerves base image for a CompuLab IOT-DIN-IMX8PLUS by hand: the packaging bugs, the flashing dead end, and the DDR failure that stopped it booting.
▸ show all 5 partsBuilding a Nerves system from scratch for the STM32MP157F-DK2: the boot chain, device trees, and the first attempt at a working build.
▸ show all 4 partsCarrying everything learned on the lab unit into a real, purpose-built Nerves system — without touching the build running in the field.
▸ show all 5 partsAdding proper secure boot to an industrial IoT gateway, on a disposable lab unit, making every mistake where it costs nothing.
▸ show all 10 parts