usage: power.py [-h] [-m [MOD ...]] {cycle,off,on} id
Powers off/on usb devices by id
positional arguments:
{cycle,off,on} action to perform: power-cycle, off or on
id usb device id in the form 'idVendor:idProduct', each id is a hex number from 0 to ffff, e.g., '123:abcd'
options:
-h, --help show this help message and exit
-m [MOD ...], --mod [MOD ...]
kernel module(s) to unload before the action, and to load back after the action
หมายเหตุสคริปต์จะต้องเรียกใช้เป็นรูท
ฉันเขียนสคริปต์ Python นี้หลังจากที่ฉันค้นพบวิธีแก้ปัญหาโดยไม่ได้ตั้งใจโดยใช้ Hub-Ctrl Fork โดย Yi Yu เพื่อสร้างพอร์ตอีเธอร์เน็ตบน Razer Core X Chroma ของฉันใช้งานได้บนแล็ปท็อปที่ใช้ Arch Linux การแก้ไขคือการปิดกั้นพอร์ตซึ่งคอนโทรลเลอร์อีเธอร์เน็ตเชื่อมต่อ (ภายใน) จากนั้นให้พลังงานอีกครั้ง ฉันต้องการทำสิ่งนี้โดยไม่ต้อง usb_control_msg() บัสฮับ/อุปกรณ์ซึ่งเป็นไปไม่ได้ด้วย hub-ctrl hub-ctrl ฉันจึงหันไปใช้ PyUSB เพื่อค้นหาอุปกรณ์โดยผู้ขายและรหัสผลิตภัณฑ์ ฉันยังสังเกตเห็นว่าอะแดปเตอร์ Ethernet Power-cycling สร้างอินเทอร์เฟซเครือข่ายใหม่ที่เรียกว่า eth0 โดยปล่อยให้ชื่อเก่าที่คาดการณ์ได้ วิธีแก้ปัญหาที่ช่วยคือการขนถ่ายโมดูลเคอร์เนล ax88179_178a ก่อนที่จะมีการหมุนเวียนพลังงานแล้วโหลดกลับมาอีกครั้ง ดังนั้นฉันจึงเพิ่มตัวเลือกในการทำสิ่งนี้ด้วยสคริปต์เดียวกันด้วย ตอนนี้ฉันเพิ่งวิ่ง
python power.py cycle 0b95:1790 -m ax88179_178a
ในการบูตระบบและในที่สุดอีเธอร์เน็ตก็ใช้งานได้
สคริปต์มีการพึ่งพาต่อไปนี้:
libusb-1.0-0libusb-0.1-4pyusb > = 1.1.0 มันใช้แบ็กเอนด์ทั้ง libusb1 และ libusb0 ด้วยเหตุผลสองประการ:
libusb0 ไม่ได้ใช้วิธี get_parent ที่ใช้ในการค้นหาฮับซึ่งอุปกรณ์เชื่อมต่อกับlibusb-0.1-4 เพื่อดำเนินการปิด/บนข้อความควบคุมที่ให้ผลลัพธ์ที่ต้องการ libusb1 และ Libusb-compat ไม่ได้ทำเคล็ดลับ libusb-1.0-0 และ pyusb :
sudo pacman -Sy libusb python-pyusb
libusb-0.1-4 จะต้องติดตั้งผ่าน AUR, https://aur.archlinux.org/packages/libusb0, เช่นกับ yay :
yay -Sy libusb0
ใหม่กว่า Ubuntu distros (อย่างน้อยเริ่มต้นจาก 22.04) มี pyusb==1.2.1 ในที่เก็บของ [universe] อย่างเป็นทางการและเพื่อให้การพึ่งพาทั้งหมดสามารถติดตั้งได้ด้วย apt :
sudo apt update
sudo apt install libusb-1.0-0 libusb-0.1-4 python3-usb
หากคุณใช้งาน Ubuntu distro รุ่นเก่าเช่น 20.04 มี pyusb==1.0.2 คุณสามารถติดตั้ง pyusb จาก pypi:
sudo apt update
sudo apt install libusb-1.0-0 libusb-0.1-4 python3-pip
sudo python3 -m pip install pyusb