Mematikan daya ke port usb. Atau matikan daya ke seluruh subsistem usb

28

Saya memiliki lampu usb yang secara khusus saya beli untuk mematikannya secara terprogram pada waktu tertentu, jadi saya perlu menghapus daya ke port usb-nya.

Saya percaya saya memiliki usb-hub di usb6. Lampu terhubung ke salah satu port di hub ini:

#myhost$ lsusb 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 008 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
...
...
Bus 008 Device 006: ID 050d:0234 Belkin Components F5U234 USB 2.0 4-Port Hub

Inilah yang saya coba:

Ada dua solusi di sini , yang pertama menyarankan:

echo disabled > /sys/bus/usb/devices/usb1/power/wakeup 
echo suspend > /sys/bus/usb/devices/usb1/power/level  # turn off

tapi saya mengerti write error: Invalid argumentketika mencoba menulis ke /sys/bus/usb/devices/usb1/power/level:

$sudo bash -c 'echo disabled > /sys/bus/usb/devices/usb6/power/wakeup'
$echo suspend|sudo tee /sys/bus/usb/devices/usb6/power/level suspend
tee: /sys/bus/usb/devices/usb6/power/level: Invalid argument
$sudo bash -c 'echo suspend> /sys/bus/usb/devices/usb6/power/level'bash: line 0: echo: write error: Invalid argument

Solusi kedua:

sudo bash -c 'echo 0 > /sys/bus/usb/devices/usb6/power/autosuspend_delay_ms; echo auto > /sys/bus/usb/devices/usb6/power/control'

yang tidak mematikan daya ke perangkat usb-hub.

Saya juga mencoba mengikuti ini :

Tetapi hasil dari lsusb -thanya hang:

$lsusb -t
4-1:0.0: No such file or directory
4-1:0.1: No such file or directory
^C

Yang mencegah saya menggunakan metode ini untuk mendapatkan bagian '2-1.1' untuk ini:

echo '2-1.1' > /sys/bus/usb/drivers/usb/unbind

Apakah ada cara alternatif untuk mendapatkan informasi ini?

Atau, apakah ada cara untuk mematikan daya ke seluruh subsistem usb? Sesuatu seperti modprobe -r usb_etc?

Kernel saya adalah:

$uname -r
3.2.0-4-amd64
pengguna84207
sumber
kesalahan sintaks apa? dalam hal ini, tidak perlu mengutip string 'menangguhkan', 'dinonaktifkan'. jika Anda terbiasa mengutip, bagus untuk Anda, tetapi dalam hal ini tidak diperlukan.
user84207
Saya mencoba mengubah lsusb -tpanggilan dan saya tidak menemukan sesuatu yang berguna dalam waktu saya harus men-debug itu. Jujur saya tidak punya waktu sekarang untuk menemukan bug di lsub, dan saya bahkan tidak bisa mereproduksi sekarang, jadi itu mungkin tergantung pada perangkat yang terhubung. Saya harus menunggu untuk pulang untuk mencoba memperbanyaknya.
user84207

Jawaban:

20

Anda dapat menggunakan utilitas baris perintah uhubctl untuk mengontrol daya USB per port untuk hub USB yang kompatibel.

Ini hanya berfungsi pada hub yang mendukung switching daya per-port, tetapi perhatikan bahwa banyak motherboard modern memiliki hub USB yang mendukung fitur ini.

Untuk mengkompilasi:

git clone https://github.com/mvp/uhubctl
cd uhubctl
make

Untuk daftar status semua hub, lokasi dan port-nya yang dapat dikontrol oleh uhubctl:

uhubctl

Untuk mematikan daya pada port 5 dari hub yang kompatibel tunggal:

uhubctl -a 0 -p 5

Jika Anda memiliki lebih dari satu hub yang kompatibel, gunakan -luntuk menentukan lokasi hub untuk mengendalikannya:

uhubctl -a 0 -p 5 -l 3-1.2

Untuk mengaktifkan, matikan, lalu hidupkan:

uhubctl -a 2 -p 5

Perhatikan bahwa hub USB 3.0 juga didukung, dan beberapa hub USB 3.0 baru benar-benar berfungsi dengan baik.

Baca lebih lanjut di sini .

Disclosure - Saya penulis uhubctl.

mvp
sumber
Sedikit lebih banyak informasi akan menyenangkan. Terutama karena Anda penulis dan bukan contoh paket standar tentang cara menggunakannya, bagaimana jika ada kemampuan / keterbatasan yang dimilikinya, berisiko jika ada, hanya jawaban Link yang tidak disukai.
Zachary Brady
2
Baik, salin / tempelkan seluruh file README sepertinya bukan ide yang cemerlang bagi saya. Ini memiliki semua peringatan yang dijelaskan.
mvp
Tidak, keseluruhan readme akan berlebihan. Hanya bagaimana Anda bisa menggunakan program untuk memecahkan masalah yang ditimbulkan dalam pertanyaan. Dan jika ada peringatan untuk kasus penggunaan tertentu, bukan seluruh aplikasi. Maaf jika saya tidak jelas dalam komentar pertama saya.
Zachary Brady
1
FYI: Metode ini berfungsi untuk keluarga pengendali host PCIe-USB Renesas UPD720202. :) Terima kasih.
Wossname
Terima kasih @Wossname. Apakah Anda keberatan menambahkannya sebagai masalah baru di github.com/mvp/uhubctl/issues ? Saya akan memperbarui daftar perangkat yang didukung.
mvp
20

Lihat Mengontrol catu daya USB (on / off) dengan linux , versi singkat, untuk kernel yang lebih baru "menangguhkan" tidak berfungsi lagi:

echo "0" > "/sys/bus/usb/devices/usbX/power/autosuspend_delay_ms"
echo "auto" > "/sys/bus/usb/devices/usbX/power/control"

Tapi itu tidak benar-benar memotong daya, itu memberi sinyal perangkat ke poweroff, terserah perangkat untuk menerapkan manajemen daya dan melakukan hal yang benar.

Anda memiliki banyak detail dalam dokumentasi resmi di kernel, di sana ia menjelaskan berbagai file di dalamnya /sys/bus/usb/devices/.../power/dan cara mengelola perangkat dan porta.

Untuk hal-hal yang bukan perangkat usb nyata (apakah lampu usb Anda muncul di lsusb?) Anda mungkin kurang beruntung, saya telah mencoba sendiri dengan lampu usb dan dengan gps logger yang mengisi baterai dan mentransfer data melalui usb yang menunjukkan sebagai usb cp210x ke serial, dan poweroff juga tidak. Saya dapat "mencabut" gps dengan echo '5-4.6' > /sys/bus/usb/drivers/usb/unbinddan menghubungkan kembali dengan echo '5-4.6' > /sys/bus/usb/drivers/usb/bindtetapi ligth pengisian baterai selalu menyala.

Tetapi tampaknya beberapa hub melakukannya dengan benar .

Jorge Nerín
sumber
0

Hal ini tidak perlu untuk individual edit " autosuspend_delay_ms " file.

USB autosuspend dapat dinonaktifkan secara GLOBAL dan PERSISTEN dengan:

sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="/&usbcore.autosuspend=-1 /' /etc/default/grub

update-grub

systemctl reboot

Hanya butuh beberapa detik untuk menguji perbaikan yang diajukan dan memvalidasi kebenarannya.

Sebuah Ubuntu 18.04 dijelaskan screenshot di bawah ini menggambarkan modifikasi seperti di atas dijelaskan yang menghasilkan tuan rumah reboot dengan SEMUA pengaturan otomatis USB dinonaktifkan:

Ubuntu 18.04 demo secara global menonaktifkan autosuspend USB

F1Linux
sumber