
USB-C PD Confusion: A Field Guide to Getting Negotiation Wrong
USB Power Delivery negotiation looks simple in the spec and feels impossible on real hardware. Three boards, two oscilloscopes, and one blown FUSB302.
Microcontroller programming, real-time systems, IoT development, and firmware engineering

Nordic deprecated its legacy nRF5 SDK in favor of nRF Connect SDK. The migration is mostly mechanical but the Kconfig model and west manifests require new habits.

USB Power Delivery negotiation looks simple in the spec and feels impossible on real hardware. Three boards, two oscilloscopes, and one blown FUSB302.

You don't need to understand elliptic curve mathematics to use it correctly. You do need to understand nonce reuse, timing channels, and authenticated encryption. Those three things.

Gorilla compression from Facebook's time-series paper is simple to implement and achieves 1.5–3x compression on typical sensor data. An implementation guide for embedded use.

MQTT's persistent connections suit devices with stable connectivity. CoAP's stateless request-response suits intermittent links. The CC2652 running Zephyr is a fair test bed.

MCUboot is well-documented in theory. The devil is in image slot alignment, key provisioning, and what happens during a failed upgrade on constrained flash.

Ed25519 is fast on 32-bit MCUs and simple to implement correctly. RSA-2048 is not. A comparison of signature schemes with measured verification times on Cortex-M4.

A/B partition, signature check, rollback counter — every decision I got wrong the first time, and what I'd do differently today.

A linker script is a program. Reading it as configuration leads to mistakes that are hard to diagnose without understanding the MEMORY, SECTIONS, and symbol resolution model.

Pull-up too weak, clock stretch timeout, address collision — each failure leaves a distinct fingerprint on a 24 MHz capture. Here is what to look for.

Wireshark's USB capture and usbmon reveal descriptor negotiation failures that lsusb hides. A systematic approach to USB enumeration failures on Linux.

Unity is a minimal C test framework that runs on target and host. The hard part is not the framework — it's designing seams in firmware code that was never meant to be tested.