Inspecting USB-C Power Delivery on Linux: ThinkPads vs Raspberry Pi

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:002

Each 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
done

The 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_now

Values are reported in:

  • microvolts (µV)
  • microamps (µA)

Example:

voltage_now = 20000000
current_now = 1500000

Calculation:

20 V × 1.5 A = 30 W

Quick calculation from shell:

echo $(( $(cat voltage_now) * $(cat current_now) / 1000000000000 )) W

2.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_now

Output is in mW:

29953000  → ~30 W

Or via upower:

upower -i $(upower -e | grep BAT) | egrep "state|energy-rate"

Example:

state: charging
energy-rate: 29.9 W

If 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_throttled

Common values:

  • 0x0 → power OK
  • 0x50000 → undervoltage occurred
  • 0x50005 → undervoltage currently active

Measure input voltage (approximate)

vcgencmd measure_volts

Example:

volt=5.03V

Temperature and frequency (indirect power clues)

vcgencmd measure_temp
vcgencmd measure_clock arm

3.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_adc

Shows:

  • 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 only

Final 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.