A couple of weeks ago, Synaptics (who now own Conexant) sent me 22,000+ lines of LGPLv2+ licensed C++ that was capable of updating the firmware of all the CXxxxx
audio devices that exist in various laptops and peripherals. Most of last week was spent reading the code, and refactoring it to be a CX audio plugin in fwupd. There were a few things I could do to reduce the code size considerably:
- Use the abstractions shared with all the other plugins, e.g. SREC file format processing, data chunking and low level USB HID
- Drop support for hardware families which are no longer supported and not likely to receive updates
- Remove the layers of abstractions and the macros-of-macros-of-macros so common with a codebase age measured in decades
- Use helper objects in GLib and GObject rather than having to create everything from scratch
So, after all that we got down to a 1377 line fwupd plugin which is a 16x code reduction. It’s broadly comparable in functionality to the 22,000 line code drop but only works in fwupd as a plugin rather than as a standalone updater. To add support for new hardware to the plugin all we have to do is add an entry to the quirk file, which tells us which CX family the specific USB VID/PID is using. The rest is auto-detected.
I can’t tell you the OEM or the hardware all this work is being driven by, but eagle-eyed readers will work it out :) In some cases you might see an extra device appear in fwupdmgr get-devices
if you’re running the soon-to-be-released fwupd 1.3.2 and hopefully we can get firmware updates which use this new device on the LVFS some time this year.
Wow. Thanks!
Is the company in question have a name that sounds similar to YDN?
Other than the two named ThinkPad Thunderbolt docks which use the Conexant audio chip family, the vendors which I am aware of using the two more modern USB-C audio chips from Synaptics/Conexant are:
CX2098X:
– Essential Phone USB-C to 3.5mm adapter
– LG G7 ThinQ phone
CX2198X:
– Google’s Pixel USB-C earbuds
– Google’s 2nd Gen USB-C to 3.5mm adapter
– Huawei (?)