Inspecting USB-C Power Delivery from the Linux Console
Lenovo ThinkPads vs Raspberry Pi (4 & 5)
USB-C is everywhere, but USB-C ≠ USB Power Delivery (PD).
This post documents what you can and cannot see from Linux when inspecting power delivery on:
- Lenovo ThinkPads (with real USB-C PD)
- Raspberry Pi 4 and Raspberry Pi 5 (USB-C connector, no PD)
All examples are from real systems and real measurements.
1. USB-C vs USB Power Delivery (PD)
Important distinction:
- USB-C → physical connector
- USB Power Delivery (PD) → protocol for negotiating voltage/current
A device can have USB-C without supporting PD.
2. Lenovo ThinkPads: Full USB-C PD Visibility
Most modern ThinkPads expose USB-C PD via UCSI (USB Type-C Connector System Software Interface).
2.1 Detecting PD-capable ports
ls /sys/class/power_supply/Typical output:
AC
BAT0
ucsi-source-psy-USBC000:001
ucsi-source-psy-USBC000:002Each ucsi-source-psy-* corresponds to a physical USB-C port.
2.2 Identify the active charging port
for p in /sys/class/power_supply/ucsi-source-psy-*; do
echo "=== $p ==="
cat $p/online
doneThe port returning 1 is currently supplying power.
2.3 Reading negotiated voltage and current
cd /sys/class/power_supply/ucsi-source-psy-USBC000:XXX
cat voltage_now
cat current_nowValues are reported in:
- microvolts (µV)
- microamps (µA)
Example:
voltage_now = 20000000
current_now = 1500000Calculation:
20 V × 1.5 A = 30 WQuick calculation from shell:
echo $(( $(cat voltage_now) * $(cat current_now) / 1000000000000 )) W2.4 Ground truth: battery power input
UCSI values can sometimes be misleading. The most reliable indicator is the battery power rate.
cat /sys/class/power_supply/BAT0/power_nowOutput is in mW:
29953000 → ~30 WOr via upower:
upower -i $(upower -e | grep BAT) | egrep "state|energy-rate"Example:
state: charging
energy-rate: 29.9 WIf you were truly charging at 65 W, you would typically see 50–65 W here.
2.5 Common Lenovo behaviors
- Different USB-C ports may negotiate different power levels
- One port may fall back to 5 V / 3 A (15 W)
- Cable quality (e-marked vs non-e-marked) matters
- Firmware/EC can cap charging dynamically
- UCSI may report capabilities rather than the actual active contract
Always trust BAT0 power_now over raw PD fields.
3. Raspberry Pi 4: USB-C Without Power Delivery
Despite using USB-C, the Raspberry Pi 4:
- ❌ Does not support USB Power Delivery
- ❌ Does not negotiate voltages above 5 V
- ✅ Always runs at 5 V
- ✅ Max power ≈ 15 W (5 V × 3 A)
Even with a 65 W PD charger, the Pi only draws 5 V.
3.1 What you can inspect on Raspberry Pi 4
Undervoltage and throttling (most important)
vcgencmd get_throttledCommon values:
0x0→ power OK0x50000→ undervoltage occurred0x50005→ undervoltage currently active
Measure input voltage (approximate)
vcgencmd measure_voltsExample:
volt=5.03VTemperature and frequency (indirect power clues)
vcgencmd measure_temp
vcgencmd measure_clock arm3.2 What you cannot see (because it does not exist)
- No PD negotiation
- No PD profiles
- No PPS
- No UCSI
- No
/sys/class/power_supply/ucsi-*
4. Raspberry Pi 5: More Power, Still No PD
Raspberry Pi 5 improves power handling but still does not implement USB PD.
Key facts:
| Feature | Raspberry Pi 5 |
|---|---|
| Voltage | 5 V only |
| Max current | ~5 A |
| Max power | ~25 W |
| USB PD | ❌ No |
The official “27 W PSU” is 5 V × 5 A, not PD.
4.1 Additional PMIC diagnostics (Pi 5 only)
vcgencmd pmic_read_adcShows:
- input voltage
- internal rails
- PMIC temperature
Still no PD negotiation involved.
5. Comparison Summary
| Device | USB-C | USB PD | Voltage Range | PD Visibility |
|---|---|---|---|---|
| Lenovo ThinkPad | Yes | Yes | 5–20 V | Full (UCSI) |
| Raspberry Pi 4 | Yes | No | 5 V | No |
| Raspberry Pi 5 | Yes | No | 5 V | No |
6. Key Takeaways
- USB-C does not imply USB Power Delivery
- Lenovo ThinkPads expose real PD data via UCSI
- Battery power rate (
BAT0/power_now) is the most reliable metric - Raspberry Pi 4 and 5 never negotiate PD
- On Raspberry Pi, monitor undervoltage, not PD
7. Useful Commands Cheat Sheet
Lenovo
ls /sys/class/power_supply/
cat /sys/class/power_supply/ucsi-source-psy-*/online
cat /sys/class/power_supply/ucsi-source-psy-*/voltage_now
cat /sys/class/power_supply/ucsi-source-psy-*/current_now
cat /sys/class/power_supply/BAT0/power_now
upower -i $(upower -e | grep BAT)Raspberry Pi
vcgencmd get_throttled
vcgencmd measure_volts
vcgencmd measure_temp
vcgencmd measure_clock arm
vcgencmd pmic_read_adc # Pi 5 onlyFinal note
When debugging power on Linux:
- Trust the battery, not the charger
- Measure what the system receives, not what the adapter advertises
This distinction avoids a lot of false conclusions.