How to Inspect USB Controller Topology and Device Speeds in macOS Terminal Using system_profiler

Diagnosing hardware peripheral issues on modern Mac systems—such as external SSDs negotiating slower transfer speeds than expected, high-draw audio interfaces resetting under load, or complex USB-C Thunderbolt docking stations dropping display outputs—demands deep visibility into the USB subsystem. While System Settings provides general summaries, it conceals the low-level bus topology, operational link speeds (e.g. USB 2.0 480 Mb/s versus USB 3.2 10 Gb/s or USB4 40 Gb/s), electrical power allocations, and vendor identifiers (VID/PID). Utilising the native system_profiler command in macOS Terminal allows users and administrators to query the complete I/O Kit USB registry tree directly.

Understanding system_profiler and the SPUSBDataType Class

The macOS system_profiler utility queries hardware specifications recorded by macOS kernel extensions (KEXTs) and DriverKit user-space drivers. By targeting the SPUSBDataType dictionary, you extract real-time data reported by the system’s USB host controllers (including Apple Silicon integrated Type-C controllers, PCIe host adapters, and root hubs).

Querying this data type reveals:

  • USB Controller Host Architecture: Identifies controller drivers (such as AppleUSBXHCIPCI).
  • Negotiated Link Speed: Differentiates between Low-Speed (1.5 Mb/s), Full-Speed (12 Mb/s), High-Speed (480 Mb/s), SuperSpeed (5 Gb/s), and SuperSpeedPlus (10 Gb/s or 20 Gb/s).
  • Electrical Power Telemetry: Documents Current Available (mA), Current Required (mA), and Extra Operating Current allocated via Apple power-delivery handshakes.
  • Hardware Identifiers: Product ID (PID), Vendor ID (VID), Revision code, and hardware Serial Number.

Retrieving the Complete USB Tree in Terminal

To inspect your Mac’s USB architecture, launch Terminal from Applications > Utilities > Terminal (or press Command + Space, type Terminal, and press Enter).

Execute the following command to display the entire USB controller hierarchy:

system_profiler SPUSBDataType

The output prints an indented hierarchical tree representing host controllers, root hubs, external daisy-chained hubs, and connected physical devices. Each connected device block exposes essential diagnostic metrics:

  • Speed: Confirms the exact data throughput negotiated between the accessory and your Mac. If an external NVMe drive capable of 10 Gb/s connects over a substandard charging cable, this field highlights the bottleneck by displaying Up to 480 Mb/s instead of Up to 10 Gb/s.
  • Current Available (mA): Shows the maximum electrical current the host port or powered hub can supply (typically 500 mA for USB 2.0 or 900 mA to 1500 mA for USB 3 / Type-C).
  • Current Required (mA): Indicates the operational current demanded by the device. If required current exceeds available current, the peripheral will fail to initialise or intermittently disconnect.
  • Location ID: A hexadecimal hardware identifier mapping the exact physical port on your Mac’s logic board where the accessory is inserted.

Filtering USB Information with Grep and Awk

Because modern Macs contain internal USB buses for built-in devices (such as the FaceTime camera, ambient light sensor, and keyboard/trackpad controllers on MacBooks), the full report can span dozens of lines. You can filter the output to isolate specific devices and speeds.

Listing Connected USB Device Names and Negotiated Speeds

To quickly view all attached accessories and verify their negotiated bandwidth without scrolling through raw trees, run:

system_profiler SPUSBDataType | grep -E "(^ {4}[A-Za-z0-9]|Speed:)"

Checking Vendor and Product IDs for Driver Identification

When compiling custom software or troubleshooting hardware compatibility, you often need the hex identifiers. Run:

system_profiler SPUSBDataType | grep -E "(Product ID:|Vendor ID:|Manufacturer:)"

Auditing External SSD and Drive Performance

If you connect a fast external solid-state drive and suspect it is underperforming, query its specific storage block within the USB tree:

system_profiler SPUSBDataType | awk '/Media:/, /Speed:/'

Inspect the reported Speed and verify whether the bus is operating at Up to 5 Gb/s, Up to 10 Gb/s, or higher. If the speed reads Up to 480 Mb/s, the physical cable does not possess the high-speed data lanes required for SuperSpeed operation, indicating you must swap the cable for a verified USB-C 3.2 or Thunderbolt cable.

Exporting USB Hardware Inventories to JSON

For fleet maintenance, IT asset auditing, or automated device verification scripts, system_profiler can emit clean JSON structures. Pass the -json flag to capture the report:

system_profiler SPUSBDataType -json > ~/Desktop/usb_inventory.json

The resulting JSON document can be parsed using tools like jq or ingested into configuration management databases (CMDB), enabling automated auditing of connected peripherals, authorized storage devices, and bus health across your environment.

Get the best tech tips delivered straight to your inbox.

Join thousands of readers mastering Apple, Google, Microsoft, and Linux.