-
FW 2.0.0: 48V@5A is here!
06/16/2026 at 15:21 • 0 commentsRemember that Framework 240W PD3.2 charger I ordered at the end of the last log? It showed up, and I finally got to push PD240W to the power it was named after. Firmware 2.0.0 is the result of evenings and evenings of software development and testing. USB-PD 3.1/3.2 is officially supported, and many new features have been added.
![]()
The headline is full AVS and EPR negotiation, so the board now climbs to 48V instead of topping out in the SPR range. Getting there was quite a journey. When I received the Framework charger, I immediately plugged it in, with a mix of hope and excitement. To my surprise, on the first try, I got a 48V reading on my screen from the INA228, and I thought that this was victory, and that in 30mins I would be done with EPR contracts. Oh boy was I wrong.
The first half of 2.0.0 was about EPR, AVS, and USB-PD 3.2, and almost all of the pain lived in one place: getting out of an EPR contract. Climbing up to 48V is the easy direction; coming back down is where the problems start. The USB-PD spec says that when you leave the EPR range you have to step the voltage down to 5V within a tight time window. Request a big drop directly, say 48V straight to 5V, and a spec-compliant charger without active discharge will simply reset the port, and the board reboots.
What worked is a three-step exit sequence. Instead of jumping straight to the target, I first use an EPR AVS APDO to slide the voltage down to the lowest voltage possible while still inside an EPR contract, then request 5V Fixed to cleanly exit EPR, and only then ask for the real SPR target. The catch is that this trick requires a source advertising an usable AVS APDO, and not every charger does.
There's also a limit to how much the software can do about the timing. Meeting that step-down-to-5V deadline means actually pulling the bus voltage down fast, and from 48V that only happens quickly if something is sinking the rail, which you can't count on. My small bleed resistor wasn't enough. It was sized small on purpose to avoid wasting power. So for the next hardware iteration I'm thinking of adding an active discharge path: a switched load the firmware can fire to yank VBUS down on command, so the board can hit the deadline on its own instead of hoping the charger and the attached load cooperate.
SPR AVS was the other rabbit hole, and the one that hurt the most relative to how small the fix turned out to be. SPR AVS is brand new in USB-PD 3.2, and just discovering it in the source's advertised PDOs was quite a challenge. SPR AVS nominally covers 9–20V, but on my hardware I can only reliably land it between 15 and 20V. Request anything below 15V and the contract collapses back to a 9V fixed rail. My current suspicion is the TPS26750 itself: the silicon was designed before PD3.2, and its AVS-enable bit is really the EPR AVS-enable bit, which the controller enforces down to a hard 15V floor, so sub-15V requests fall back to 9V.
![]()
Apart from that, the software-based constant-current control is essentially finished now: it closes the loop by measuring real output on the INA228 and adjusting the negotiated voltage to hold the current you asked for. That meant forcing the AVS/PPS auto-tuner to step aside while CC is regulating, so the two loops don't fight over the same voltage. Two more bugs came out of reboots: a voltage spike at startup in "last voltage used" mode, fixed by priming a safe contract before the boot screen even draws and clamping to 5V until PDO discovery can restore the real target, and a smarter startup restore so the board comes back into the right state after a reboot or a charger swap. On top of that there's a new basic charger diagnostics screen and a USB serial CLI for remote inspection and scripting, plus a UI pass, PD240W branding, clearer About screens, auto-dim, smoother visuals, and a long tail of bug fixes (badge/cursor restore, noisy logs, menu edge cases, and a lot of AVS/EPR negotiation regressions).
The next step is a new hardware revision. There are quite a few changes to make. Mostly reducing costs by removing unused components from outdated requirements, fixing the USB data lines, and reworking the power switch to make it more robust. The active-discharge rework, as well as adding a proper charging IC from TI, or a proper buck boost are also other things that I might consider, based on some of your feedback. More on that in the next log!
-
KiCad port complete!
03/16/2026 at 01:07 • 0 commentsPorting the PD240W PCB from Altium to KiCad wasn't easy and took a solid 20+ hours to complete. KiCad handles project imports from Altium surprisingly well if you just want to navigate the schematic and inspect the layout or 3D model. However, making your project compile without errors, pass CI/CD tests, and making it fully compliant with your workflow and templates is quite a process.
At the start, I had 999+ errors and 999+ warnings in both ERC and DRC. The most annoying part was syncing the symbols to their footprints without having to manually move a single footprint. I could also mention the grid differences in symbols, awkward placement of values and reference designators, font size mismatches, BOM cleanup, footprint type issues, fabrication layer mismatches, copper pours not having assigned nets, completely absent design rules, and missing layers...
Anyway, it is all done now, and as promised, the schematic for revision V1.0.0 has been pushed to GitHub. I just ordered a Framework 240W PD3.2 charger that should arrive in a week. I will finally be able to push this project to the limits for which it was conceived. Firmware updates will follow. Stay tuned!
Theo Heng
