USB hub trên RPi

Bốn cổng Usb + LAN trên RPi thuộc về 1 usb hub: (1-1)

  • LAN + 2 port USB gần cổng Lan thuộc về 1-1.1, trong đó LAN là 1-1.1.1 và 2 port USB lần lượt là 1-1.1.2, 1-1.1.3
  • Hai USB còn lại là 1-1.2 và 1.1.3

Có thể enabled/disabled từng cổng USB hay từng nhóm USB bằng câu lệnh

echo [0|1] > /sys/bus/usb/devices/1-1.x/bConfigurationValue

Thí dụ, disabled cả cổng LAN và 2 USB port gần đó bằng câu lệnh

echo 0 > /sys/bus/usb/devices/1-1.1/bConfigurationValue

Việc disabled cổng USB không dùng đến có thể giảm đáng kể việc tiêu thụ điện của RPi hay dành điện cho các thiết bị khác.

root@raspberrypi:~# lsusb -t
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=dwc_otg/1p, 480M
   |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
      |__ Port 1: Dev 3, If 0, Class=Hub, Driver=hub/3p, 480M
         |__ Port 3: Dev 13, If 0, Class=Mass Storage, Driver=usb-storage, 480M
         |__ Port 1: Dev 12, If 0, Class=Vendor Specific Class, Driver=lan78xx, 480M
      |__ Port 2: Dev 4, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
      |__ Port 2: Dev 4, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M
      |__ Port 3: Dev 5, If 0, Class=Mass Storage, Driver=usb-storage, 480M
root@raspberrypi:~# echo 0 > /sys/bus/usb/devices/1-1.1/bConfigurationValue
root@raspberrypi:~# lsusb -t
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=dwc_otg/1p, 480M
   |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
      |__ Port 2: Dev 4, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
      |__ Port 2: Dev 4, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M
      |__ Port 3: Dev 5, If 0, Class=Mass Storage, Driver=usb-storage, 480M

Một cách khác

#ON
echo '1-1.1' > /sys/bus/usb/drivers/usb/bind &> /dev/null
#OFF
echo '1-1.1' > /sys/bus/usb/drivers/usb/unbind &> /dev/null

Một cách khác giúp bật/tắt toàn bộ 4 port USB + LAN, dùng script sau

#!/bin/bash
SOC_PATH=/sys/devices/platform/soc
SOC_USB=${SOC_PATH}/$(ls $SOC_PATH | grep -Po '^[0-9a-f]+\.usb')
BUSPOWER="$SOC_USB/buspower"
usb_power_on() {
   cat $BUSPOWER | grep "Bus Power = 0x1" &> /dev/null
}
case $1 in
   on)
      usb_power_on || echo 0x1 > $BUSPOWER
      ;;
   off)
      usb_power_on && echo 0x0 > $BUSPOWER
      ;;
   status)
      usb_power_on && echo "USB power is on" || echo "USB power is off"
      ;;
   *)
      echo "Usage: $(basename $0) on|off|status"
      exit 2
      ;;
esac
exit 0

Tuy nhiên, nếu RPi không cấp điện nổi cho HDD/SSD khi khởi động thì chưa chắc giải pháp này giúp khởi động được!

Trên thực tế, các giải pháp disabled hay power off một cổng USB bằng software chỉ giúp tắt hoạt động data trên cổng USB đó nhưng nếu cắm thiết bị có dùng điện vào cổng đó thì điện vẫn cung cấp cho thiết bị như thường.

Comments Off on USB hub trên RPi

Filed under Software

Comments are closed.