danielrosehill's picture
commit
279efce
# List USB Devices
You are helping the user view all connected USB devices with detailed information.
## Task
1. **Basic USB device listing:**
```bash
# Simple list
lsusb
# With tree structure showing hubs
lsusb -t
# Verbose output
lsusb -v | less
```
2. **Detailed information for each device:**
```bash
# Iterate through all devices
for device in $(lsusb | awk '{print $2":"$4}' | sed 's/:$//' | tr ':' '/'); do
bus=$(echo $device | cut -d'/' -f1)
dev=$(echo $device | cut -d'/' -f2)
echo "=== Device: Bus $bus Device $dev ==="
lsusb -v -s $bus:$dev 2>/dev/null | head -30
echo ""
done
```
3. **Show USB devices by type:**
```bash
echo "=== Input Devices (Keyboards, Mice) ==="
lsusb | grep -iE "keyboard|mouse|input"
echo -e "\n=== Storage Devices ==="
lsusb | grep -iE "storage|disk|flash|card reader"
echo -e "\n=== Audio Devices ==="
lsusb | grep -iE "audio|sound|headset|microphone"
echo -e "\n=== Video Devices ==="
lsusb | grep -iE "camera|video|webcam"
echo -e "\n=== Bluetooth Adapters ==="
lsusb | grep -i bluetooth
echo -e "\n=== Network Adapters ==="
lsusb | grep -iE "network|ethernet|wifi|802.11"
```
4. **USB device details from sysfs:**
```bash
# List all USB devices with details
for dev in /sys/bus/usb/devices/*; do
if [ -f "$dev/manufacturer" ] && [ -f "$dev/product" ]; then
echo "Device: $(cat $dev/product 2>/dev/null)"
echo "Manufacturer: $(cat $dev/manufacturer 2>/dev/null)"
echo "Serial: $(cat $dev/serial 2>/dev/null)"
echo "Speed: $(cat $dev/speed 2>/dev/null) Mbps"
echo "---"
fi
done
```
5. **USB device mount points and block devices:**
```bash
# Show USB storage devices
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,MODEL | grep -i usb
# USB device names in /dev
ls -l /dev/sd* /dev/nvme* 2>/dev/null | grep -E "^b"
# Detailed block device info
lsblk -f
```
6. **USB power consumption:**
```bash
# Check power usage
for device in /sys/bus/usb/devices/*/power/active_duration; do
dev=$(dirname $(dirname $device))
if [ -f "$dev/product" ]; then
echo "$(cat $dev/product): Power: $(cat $dev/power/level) Active: $(cat $device)ms"
fi
done
```
7. **USB device speed and capabilities:**
```bash
# USB version and speed
for dev in /sys/bus/usb/devices/usb*; do
echo "USB Bus $(basename $dev):"
echo " Version: $(cat $dev/version 2>/dev/null)"
echo " Speed: $(cat $dev/speed 2>/dev/null) Mbps"
echo " Max Child: $(cat $dev/maxchild 2>/dev/null) ports"
echo ""
done
```
8. **Create formatted device report:**
```bash
cat > /tmp/usb-devices.txt << EOF
USB Devices Report
==================
Generated: $(date)
Hostname: $(hostname)
=== Connected USB Devices ===
EOF
lsusb >> /tmp/usb-devices.txt
echo -e "\n=== USB Device Tree ===" >> /tmp/usb-devices.txt
lsusb -t >> /tmp/usb-devices.txt
echo -e "\n=== USB Storage Devices ===" >> /tmp/usb-devices.txt
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,MODEL | grep -i usb >> /tmp/usb-devices.txt
echo -e "\n=== USB Device Details ===" >> /tmp/usb-devices.txt
usb-devices >> /tmp/usb-devices.txt
cat /tmp/usb-devices.txt
```
9. **Check USB controller info:**
```bash
# List USB controllers
lspci | grep -i usb
# Detailed controller info
for controller in $(lspci | grep -i usb | cut -d' ' -f1); do
echo "=== Controller $controller ==="
lspci -v -s $controller | head -20
echo ""
done
```
10. **Monitor USB events in real-time:**
```bash
# Watch for USB connect/disconnect
udevadm monitor --subsystem-match=usb
# Or use dmesg
dmesg -w | grep -i usb
```
11. **Check USB autosuspend settings:**
```bash
# Check which devices have autosuspend enabled
for dev in /sys/bus/usb/devices/*/power/control; do
device=$(dirname $(dirname $dev))
if [ -f "$device/product" ]; then
echo "$(cat $device/product): $(cat $dev)"
fi
done
```
12. **Find USB device by vendor/product ID:**
```bash
# Search by ID
# Example: Find device 046d:c52b
lsusb -d 046d:c52b -v
# Find all devices from vendor
lsusb -d 046d: # Logitech devices
```
13. **Check USB permissions:**
```bash
# Show device permissions
ls -l /dev/bus/usb/*/* | head -20
# Find device files for specific bus
ls -l /dev/bus/usb/001/
# Check udev rules for USB
ls -l /etc/udev/rules.d/*usb*
```
## Formatted Output
Create a nice summary:
```bash
cat > /tmp/usb-summary.sh << 'EOF'
#!/bin/bash
echo "╔════════════════════════════════════════════════════════╗"
echo "β•‘ USB Devices Summary β•‘"
echo "β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•"
echo ""
echo "Total USB devices: $(lsusb | wc -l)"
echo ""
echo "--- By Type ---"
echo "Input devices: $(lsusb | grep -ciE 'keyboard|mouse|input')"
echo "Storage devices: $(lsusb | grep -ciE 'storage|disk|flash')"
echo "Audio devices: $(lsusb | grep -ci audio)"
echo "Video devices: $(lsusb | grep -ciE 'camera|video')"
echo "Network devices: $(lsusb | grep -ciE 'network|ethernet|wifi')"
echo "Bluetooth adapters: $(lsusb | grep -ci bluetooth)"
echo ""
echo "--- USB Controllers ---"
lspci | grep -i usb
echo ""
echo "--- Storage Devices ---"
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT | grep -A 10 -E "^sd|^nvme"
echo ""
echo "--- Recent USB Events ---"
journalctl -k --since "1 hour ago" | grep -i usb | tail -10
EOF
chmod +x /tmp/usb-summary.sh
bash /tmp/usb-summary.sh
```
## Troubleshooting
**Device not detected:**
```bash
# Check kernel messages
dmesg | grep -i usb | tail -20
# Check if ports working
cat /sys/kernel/debug/usb/devices
# Rescan USB bus
echo 1 | sudo tee /sys/bus/pci/rescan
```
**Device keeps disconnecting:**
```bash
# Disable autosuspend for problematic device
# Find device path
device_path=$(find /sys/bus/usb/devices/ -name "DEVICE_NAME*")
# Disable autosuspend
echo 'on' | sudo tee $device_path/power/control
```
**Permission denied:**
```bash
# Add user to plugdev group
sudo usermod -aG plugdev $USER
# Create udev rule for device
# /etc/udev/rules.d/50-mydevice.rules
# SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTR{idProduct}=="5678", MODE="0666"
```
## Export Device Information
```bash
# Create detailed report
usb-devices > ~/usb-devices-$(date +%Y%m%d).txt
# Or with lsusb
lsusb -v > ~/usb-devices-verbose-$(date +%Y%m%d).txt
```
## Notes
- USB 1.1: 12 Mbps (Full Speed)
- USB 2.0: 480 Mbps (High Speed)
- USB 3.0: 5 Gbps (SuperSpeed)
- USB 3.1: 10 Gbps (SuperSpeed+)
- USB 3.2: 20 Gbps
- USB 4.0: 40 Gbps
- Vendor ID format: `046d` (Logitech), `8086` (Intel), etc.
- Product ID format: `c52b` (specific device model)
- USB device path: `/dev/bus/usb/BUS/DEVICE`
- Use `usbutils` package for lsusb and usb-devices commands