UPDATE: A Mastodon friend grabbed one of the noncompliant devices and did a deep analysis. See the “More Technical Detail” section, below, for those details.
UPDATE 2: Adafruit has an upcoming adapter that will solve this very problem.
I own about a half-dozen rechargeable devices that have “USB-C” charge ports. You’ll note I put that in quotes. They mostly amount to things that you could broadly classify as “flashlights” — a couple of LED panel lights for video, a reading lamp, a flashlight headlamp, and the like. They all have USB-C-lookin’ plugs for charging, but they won’t charge with a regular USB-C cable. They only charge using a USB-A to USB-C adapter cable. This has been mildly annoying, but workable, since they’re all portable. Most recently, I bought a rechargeable floor lamp for a spot in the middle of a room that’s kind of awkward (and possibly dangerous) to run an AC extension cord (under a rug) to. I figured I needed to solve this situation, so after some experimentation, I’ll share what did and did not work.
I have a 100+ year old house that’s surprisingly (or perhaps not so) devoid of wall outlets. In the living room is one spot where I have an Anker multi-USB-C charger. It’s next to an endtable and easy chair, which is convenient. But in the center of the room is a sofa and end-table. These exist as an island in the middle of the room, without easy access to an outlet. I really like being able to sit down on the sofa and charge my phone and AirPods. I solved this with a long USB-C cable, run under an area rug. A fire hazard? Perhaps — but 5VDC phone charging is certainly a lot more safe than a cheap 110VAC extension cord under that same rug.
I’ve been doing more crosswords and LEGO sets recently, and the overhead light has two settings: “moody” for watching TV and “blinding” for working on stuff. Adding a directional floor lamp makes for a reasonable compromise when my partner wants to watch TV and I’d like to work on things.
Excuse the terrible graphic design, but the layout looks roughly like this:
- USB-C charger at the wall, plugged into some (not relevant to this blog post) charging stations there. The wall outlets are behind furniture, so are difficult to get to.
- USB-C cable from that charger, under the rug, to the end table.
- Two devices with USB-C ports: a phone/AirPod charger and a floor lamp. Only one of these is truly “USB-C.”
The floor lamp, as you can guess, doesn’t charge with that cable. It’s a USB-A-to-C-only device.
Picking up the floor lamp, moving it to a spot with a USB-A charger (the kitchen), and finding a long enough USB-A-to-C charge cable to reach the floor would be pain, if I even had a charge cable that long. So I have to temporarily scrounge up a USB-A charger, an A-to-C cable, and set it up at a floor-level outlet (which happens to be in the middle of a well-traversed walkway — remember, my old house doesn’t have very many accessible outlets). You have to navigate around the floor lamp while it’s charging. Not optimal.
The Historic USB Charging Situation
Please take some of this with a grain of salt. I only took a couple of courses in electrical engineering in college, didn’t major in it, and most of my USB-specific knowledge is secondhand. This is what (little) I know of USB charging:
- USB-A, by default, provides 100mA of charge. That’s tiny. That will run your keyboard or mouse, if your keyboard doesn’t have a zillion RGB backlit LEDs.
- Vendors used tricks, by adding resistors across the data pins, so that the USB host can look for that specific current drop, and trust that the end device can handle higher amperage. This is a sort of passive negotiation.
- (The proverbial dot-dot-dot goes here, where I stopped paying attention to USB standards.)
- USB-C came along, and now only actively negotiates. It doesn’t use passive resistors. It can negotiate both voltage AND amperage. The negotiation is done through data packets and requires active participation by a microprocessor in the USB data stream. And hopefully that all works. (We had a lot of problems at work with early USB-C Yubikeys appearing to negotiate for something like 24V, frying themselves and sometimes laptops.)
These “dumb” devices that use the A-to-C charge cables don’t have the microprocessors to perform active negotiation because they’re cheap. Instead, they charge with an A-to-C cable, and just use the passive resistors.
EDIT: More Technical Detail!
After publishing this blog post, Dan Egnor reached out to help fill in the technical details. I pointed him to an inexpensive reading light that exhibited the behavior. He performed some analysis and replied in a thread:
Ok the stuff came in and I experimented and then I read some stuff and I think I know for real what’s up with this phenomenon. So if you don’t mind let me correct your explanation? You were going in the right direction (moreso than I was, at first) but not quite right in some details.
USB non-C cables have a physically enforced upstream and downstream. (I’m going to ignore “USB On The Go [OTG]” which is complicated.) The upstream supplies power and controls dataflow.
USB-C cables are symmetrical. In addition to turning each end upside down, you can turn the cable end-for-end. This matches the reality that the world of devices much less clearly relate as “hosts” and “peripherals”, given so many battery-powered semi-independent gadgets…
Any given USB-C connection negotiates “upstream” and “downstream” roles via “configuration channel” (CC) pins CC1 and CC2. This can happen in two ways:
- the easy way: “downstream” devices pull CC1 and CC2 to ground with a 5.6kΩ resistor; “upstream” devices pull CC1 and CC2 up with a resistor whose size depends on current capacity (0.5A, 1.5A, 3A)
- the hard way: a 300kbps digital protocol using CC1/CC2 to negotiate who supplies power at what voltage and current
If you want more than 3A*5V=15W of power OR devices can switch roles, you have to use the “hard way”.
Either way, an important rule is that until a USB-C device is confident that it is upstream (by detecting a pulldown or by talking the protocol), it MUST NOT put power on VBUS. Otherwise you could have two devices trying to push power at once and that wouldn’t go well. So USB-C connectors are unpowered by default (“cold socket”)
USB-C to USB-A/B adapters have fixed direction and don’t need more than 15W so they can just include pullups/pulldowns on CC1/2, no micro needed.
Simple devices (like a reading light, say!) that just want to charge and don’t need more than 15W can just include a pulldown.
If they DON’T, then… they’ll work if connected to a USB-A adapter b/c the adapter will just source 5V (and have pullups). A compliant USB-C charger WON’T work b/c of the “cold socket” rule.
So there’s no actual excuse like “a micro would have been expensive”. They just need a 5.6kΩ resistor or two, which are dirty cheap and tiny and trivial to add. But… they didn’t. They just swapped their old USB-micro-B connector for a USB-C connector, left most of the USB-C pins disconnected, tested with a USB-A to USB-C cable, and shipped it.
To prove this out fully, I just need to find a couple 5.6kΩ resistors and put them across GND to CC1/CC2 and verify it charges…
One more followup (sorry for the spam!)– I was looking into a device with this problem that does have a schematic online: https://docs.m5stack.com/en/accessory/esp32_downloader_kit
The schematic indeed has no resistors, nor can it– the USB-C port they use doesn’t break out CC1/CC2!
If I’m right, anyone who uses such a port in any product WILL have this problem, so that could be part of the issue??https://escaperooms.social/@egnor/109816661761134505
What Didn’t Work
I asked about this situation on a Slack instance I’m on. A few people suggested a “data blocker” USB-C dongle. I’m not sure the logic behind the recommendation, but it didn’t work. And that makes sense, given no negotiation could possibly occur (even if the lamp were able to negotiate).
What DID Work
First off, I don’t know why this works. My assumption is that inside the adapter is a small microprocessor, such as what you’d find in the housing at the end of a Thunderbolt cable, that performs the active negotiation. But honestly, I don’t know, and am not willing to take a hacksaw to it to find out. But on a whim, totally not expecting them to work, I ordered a USB-C female to USB-A female adapter. Apparently this is meant to charge USB-A devices from a USB-C cable, which matches my use case. And you know what? It actually worked!
So my floor lamp lives in its spot next to the sofa. I don’t have to move it. It has its USB-C-to-A cable plugged into it and wrapped around the base. I have this little dongle permanently plugged into USB-A end. And every few weeks, I just unplug the USB-C cord from my phone cradle and plug it into the lamp overnight to top-up its charge. It works great!
I’m still a little fuzzy on the technical details and the “why” behind this, but I wanted to share what worked for me. I’m sure there are folks out there who are more fluent in USB charging standards than I am, who can maybe fill in more detail. If that’s you, I’d love to hear from you. All I know is that this USB-C-to-A dongle/adapter magically worked for me. Your mileage may vary.