Mengontrol catu daya USB (on / off) dengan Linux

164

Apakah mungkin untuk menghidupkan / mematikan catu daya dari USB secara manual dengan Linux?

Ada kipas pendingin USB eksternal ini (jenis yang Anda gunakan untuk mendinginkan diri sendiri, bukan PC), dan alangkah baiknya dapat mengontrolnya dari terminal, karena saya ingin menempatkan kipas angin di tempat yang jauh.

Saya kira ini juga bisa berguna untuk berbagai hal lain juga, karena ada banyak mainan USB di luar sana. Mungkin pembersih udara, dll. (Saya mendengar mereka tidak benar-benar bekerja).

kamziro
sumber
9
Biarkan saya rekap untuk Linux> = 2.6.38: File power/level sudah ditinggalkan sekarang; gunakan power/control saja . ( power/wakeupok.) Selanjutnya, ia hanya menerima "otomatis" dan "menyala", bukan "menangguhkan" lagi. "auto" cukup pintar, dan jika daya tidak dimatikan saat idle, itu kesalahan perangkat. Lagi pula Anda tidak dapat mematikan daya secara manual. Untuk lebih lanjut, lihat jawaban di bawah ini oleh tlwhitec dan doc kernel: kernel.org/doc/Documentation/usb/power-management.txt
teika kazura
Kemungkinan duplikat dari stackoverflow.com/q/1163824/1967396
Floris
2
Fitur ini sangat layak mendapatkan GUI yang baik
mikebabcock
Apakah itu memerlukan perangkat keras khusus? Tidak begitu jelas dari jawaban,
Vojtěch Dohnal

Jawaban:

63

Catatan. Informasi dalam jawaban ini relevan untuk kernel yang lebih lama (hingga 2.6.32). Lihat jawaban tlwhitec untuk informasi tentang kernel yang lebih baru.

# disable external wake-up; do this only once
echo disabled > /sys/bus/usb/devices/usb1/power/wakeup 

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

(Anda mungkin perlu mengubah usb1 ke usb n )

Sumber: Documentation / usb / power-management.txt.gz

Roman Cheplyaka
sumber
1
Wah, terima kasih untuk itu. Saya berpikir saya harus melalui libUSB tidak peduli apa. Adakah yang tahu bagaimana cara mendapatkan nama-nama perangkat yang terpasang juga?
kamziro
Menurut posting ini, tanpa perangkat keras khusus itu tidak mungkin? blog.andrew.net.au/2009/01/17
NoBugs
7
Saya mendapat izin ditolak kesalahan bahkan jika saya menggunakan sudo!
Wally
3
sama bagi saya "izin ditolak" bahkan setelah menggunakan sudo
Raulp
2
Izin ditolak karena perintah dalam bentuk sudo foo > bardiuraikan sebagai mengarahkan output ke bar, kemudian jalankan foomenggunakansudo . Pengalihan gagal karena terjadi sebelum Anda mendapatkan akses root. Solusinya adalah dengan menggunakan sudo sh -c 'echo disabled > /sys/bus/usb/devices/usb1/power/wakeup', dan seterusnya: mendapatkan root, menjalankan neraka baru untuk melakukan redirect, kemudian mengeluarkan sesuatu ke deskriptor file yang diarahkan.
gali
60

Menurut dokumen , ada beberapa perubahan pada manajemen daya USB dari kernel 2.6.32 , yang tampaknya menetap di 2.6.38 . Sekarang Anda harus menunggu perangkat menjadi diam , yang diatur oleh driver perangkat tertentu. Pengemudi perlu mendukungnya, jika tidak, perangkat tidak akan pernah mencapai kondisi ini. Sayangnya, sekarang pengguna tidak memiliki kesempatan untuk memaksakan ini. Namun, jika Anda beruntung dan perangkat Anda dapat menganggur, maka untuk mematikannya Anda perlu:

echo "0" > "/sys/bus/usb/devices/usbX/power/autosuspend"
echo "auto" > "/sys/bus/usb/devices/usbX/power/level"

atau, untuk kernel sekitar 2.6.38 dan di atasnya:

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

Ini secara harfiah berarti, tunda sementara saat perangkat menjadi idle.

Jadi, kecuali jika kipas Anda adalah sesuatu yang "cerdas" yang dapat dilihat sebagai perangkat dan dikendalikan oleh driver, Anda mungkin tidak akan memiliki banyak keberuntungan pada kernel saat ini.

tlwhitec
sumber
Sepertinya ini akan menyebabkan perangkat USB terus dimatikan ... (?) Bagaimana seharusnya daya dilanjutkan oleh saya, setelah ini berfungsi? Tujuan saya adalah untuk me-restart perangkat sekali, bukan untuk mengubah konfigurasi penangguhannya secara permanen.
matanster
4
Untuk melanjutkan perangkat yang ditangguhkan, Anda dapat menonaktifkan lagi "autosuspend" dengan echo "on" > "/sys/bus/usb/devices/usbX/power/control", tapi saya pikir Anda perlu memahami tujuan aslinya. Fitur autosuspend di sini hanya untuk mengaktifkan perangkat idling untuk memasuki kondisi daya rendah (di mana ia mungkin tampak dimatikan), hanya untuk dilanjutkan nanti ketika diperlukan, baik oleh tuan rumah atau beberapa peristiwa eksternal. Itu terjadi (atau seharusnya terjadi) secara otomatis. Port itu sendiri sebenarnya tidak pernah benar-benar dimatikan. Sungguh, baca dokumen ;)
tlwhitec
4
Saya dapat mengkonfirmasi itu bekerja dengan kernel> 3.10. Hanya harus yakin bahwa perangkat "id" yang Anda gunakan adalah benar: dmesg | grep "usb"dan menggunakan nomor setelah "usb", misalnya: usb 2-4.4: SerialNumber: A0848020Anda akan menggunakan: /sys/bus/usb/devices/2-4.4/power/.... Pastikan juga perangkat tidak digunakan. Saya membuat skrip untuk menyederhanakan proses ini
lepe
Apakah ada cara untuk menyimpan konfigurasi ini sehingga setiap kali dicolokkan di dalamnya tidak akan berubah kembali ke default? Saya memiliki perangkat yang harus saya atur kontrol daya ke "on" agar dapat diisi ulang.
quickblueblur
@quickblueblur terdengar seperti aturan udev bagi saya.
tlwhitec
24

Saya telah menemukan solusi ini yang setidaknya berfungsi untuk chip hub USB Terminus FE 1.1 yang dikonfigurasi dengan benar:

1.Untuk mematikan daya pada semua port USB hub, Anda dapat melepaskan hub dari kernel menggunakan:

echo "1-4.4.4" > /sys/bus/usb/drivers/usb/unbind

untuk menghidupkan kembali - Anda dapat mengikatnya kembali menggunakan

echo "1-4.4.4" > /sys/bus/usb/drivers/usb/bind

2.Mengganti daya di setiap port secara individual lebih sulit: Saya dapat menggunakan hubpower untuk mengontrol setiap port - tetapi ia datang dengan kelemahan: hubpower pertama-tama memutuskan hubungan usbdevfs yang menyebabkan semua perangkat USB terputus dari sistem, setidaknya di ubuntu :

usb_ioctl.ioctl_code = USBDEVFS_DISCONNECT;
rc = ioctl(fd, USBDEVFS_IOCTL, &usb_ioctl);

Dengan ini ioctl dinonaktifkan saya bisa mematikan daya port individual tanpa melepaskan semua perangkat - tetapi daya segera hidup kembali (mungkin karena kernel melihat perangkat yang tidak diinisialisasi) yang menyebabkan perangkat USB hanya untuk melakukan "restart dingin" yang merupakan apa yang saya umumnya ingin dilakukan. Hubpower tambalan saya ada di sini

kakek
sumber
Entri bind / unbind dikonfirmasi untuk bekerja pada kernel linux 2.6.34, chipset ICH8, dan Ubuntu 10.04.
user1357196
5
bind / unbind tidak mematikan port USB terlepas dari chipset. Perangkat masih mendapatkan kekuatan ...
themihai
1
laser mouse mati, jenis keyboard tidak bisa, modem berhenti berkedip - semuanya bagus di platform saya
eri
24

PowerTOP dari Intel memungkinkan Anda untuk beralih perangkat seperti periferal usb secara real-time. Ini disebut 'merdu'.

sudo apt install powertop
sudo powertop
  • Tab ke 'merdu'.
  • Gulir ke bawah ke perangkat Anda.
  • Tekan enter untuk beralih ke mode hemat daya ( Baik / Buruk )

masukkan deskripsi gambar di sini

Perhatikan bahwa Bad berarti perangkat selalu menyala. Beralih ke Baik akan mematikan perangkat setelah waktu hemat yang tidak ditentukan sebelumnya (standarnya adalah 2000 ms).

Lihat dokumen PowerTOP untuk perincian tentang cara membuat perubahan ini permanen.
Ini menghasilkan skrip konfigurasi untuk Anda (seperti dijelaskan oleh poster lain di utas ini).

CATATAN: Skrip ini tidak memengaruhi daya pin USB (yang selalu aktif).
Ini hanya mengirim protokol driver untuk mengaktifkan dan menonaktifkan perangkat.

Jika Anda ingin mengontrol daya pin, Anda bisa menggunakan hub USB pintar yang didukung, atau mikrokontroler .

Dominic Cerisano
sumber
2
Luar biasa! : DI pikir ini adalah cara yang paling ramah pengguna untuk melakukannya (walaupun pada level rendah itu membuat operasi yang sama seperti yang dijabarkan dalam jawaban lainnya.) Terima kasih, dan semoga jawaban Anda mencapai puncak;)
Matyas
1
Terima kasih atas jawaban anda. Di mana saya harus mulai menggali untuk mengubah waktu hemat tidak aktif yang telah ditetapkan?
mikezter
Seperti yang disebutkan oleh poster sebelumnya, docs kernel ada di sini: kernel.org/doc/Documentation/usb/power-management.txt
Dominic Cerisano
10

Anda dapat menggunakan alat saya uhubctl untuk mengontrol daya USB per port untuk hub USB yang kompatibel.

mvp
sumber
alat bagus di osx, tetapi tidak menemukan 'hub pintar yang didukung' di debian untuk saya.
Jitter
1
Di Linux, Anda harus menjalankannya sebagai root (di bawah sudo), atau untuk mengkonfigurasi izin perangkat udev. Mungkin juga host Linux Anda tidak memiliki hub yang kompatibel terhubung.
mvp
itu adalah 'beagle bone green' btw.
Jitter
7

Saya ingin melakukan ini, dan dengan perangkat USB saya, saya tidak bisa. Saya menulis cara hacky bagaimana melakukannya di sini:

http://pintant.cat/2012/05/12/power-off-usb-device/ .

Singkatnya: Saya menggunakan relai USB untuk membuka / menutup V CC kabel USB lain ...

Carles
sumber
5
echo '2-1' |sudo tee /sys/bus/usb/drivers/usb/unbind

berfungsi untuk ubuntu

pengguna3527264
sumber
1
ANDA ADALAH SOLUSI SAJA YANG BEKERJA PADA KASUS SAYA. Saya menggunakan acer make laptop 12.04LTS Ubuntu.
RicoRicochet
1
Tidak mematikan perangkat, hanya menghapusnya dari daftar perangkat. Bagaimana saya bisa mematikan port USB?
rustyx
1
Ini juga satu-satunya solusi yang berhasil bagi saya untuk mematikan tablet Wacom Intuos5 touch M tanpa mencabutnya (pada Fedora 28)
user1738984
2

Daya USB 5v selalu menyala (bahkan ketika komputer dimatikan, pada beberapa komputer dan pada beberapa port.) Anda mungkin perlu memprogram Arduino dengan semacam sakelar, dan mengendalikannya melalui perpustakaan Serial dari USB yang terhubung ke komputer.

Dengan kata lain, kombinasi ini beralih tutorial dan ini tutorial tentang berkomunikasi melalui Serial libary untuk Arduino terpasang di melalui USB.

NoBugs
sumber
2

Alasan mengapa orang memposting pertanyaan seperti ini adalah karena fitur " EVIL " yang menakutkan - USB Auto-Suspend " feature ".

Penangguhan otomatis menurunkan daya ke perangkat USB "idle" dan kecuali jika driver perangkat mendukung fitur ini dengan benar, perangkat dapat menjadi tidak dapat dihubungi. Jadi menyalakan / mematikan port USB adalah gejala dari masalah, bukan masalah itu sendiri.

Saya akan menunjukkan kepada Anda bagaimana secara GLOBAL menonaktifkan secara penangguhan otomatis, meniadakan kebutuhan untuk mengaktifkan & menonaktifkan port USB secara manual:

Jawaban singkat:

Anda TIDAK perlu mengedit " autosuspend_delay_ms " secara individual: USB autosuspend dapat dinonaktifkan secara global dan PERSISTEN menggunakan perintah berikut:

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

update-grub

systemctl reboot

Sebuah Ubuntu 18.04 layar-ambil berikut pada akhir dari "Panjang Jawaban" menggambarkan bagaimana hasil saya dicapai.

Jawaban panjang:

Memang benar bahwa Dokumentasi Kernel Manajemen Daya USB menyatakan autosuspend akan ditinggalkan dan sebagai gantinya " autosuspend_delay_ms " digunakan untuk menonaktifkan autosuspend USB:

"In 2.6.38 the "autosuspend" file will be deprecated
and replaced by the "autosuspend_delay_ms" file."

NAMUN pengujian saya mengungkapkan bahwa pengaturan usbcore.autosuspend=-1di / etc / default / grub seperti di bawah ini dapat digunakan sebagai toggle GLOBAL untuk fungsi autosuspend USB - Anda TIDAK perlu mengedit satu per satu " autosuspend_delay_ms individual file " .

Dokumen yang sama yang ditautkan di atas menyatakan nilai "0" ENABLED dan nilai negatif DISABLED :

power/autosuspend_delay_ms

    <snip> 0 means to autosuspend
    as soon as the device becomes idle, and negative
    values mean never to autosuspend.  You can write a
    number to the file to change the autosuspend
    idle-delay time.

Di layar-ambil Ubuntu 18.04 beranotasi di bawah ini yang menggambarkan bagaimana hasil saya dicapai (dan dapat direproduksi), tolong katakan bahwa standarnya adalah "0" ( diaktifkan ) di autosuspend_delay_ms .

Kemudian perhatikan bahwa setelah pengaturan ONLYusbcore.autosuspend=-1 di Grub, nilai-nilai ini sekarang negatif ( dinonaktifkan ) setelah reboot. Ini akan menyelamatkan saya dari kesulitan mengedit nilai-nilai individual dan sekarang dapat skrip menonaktifkan autosuspend USB.

screengrab: nilai autosuspend Sebelum dan setelah pengeditan global

Semoga ini membuat penonaktifan penonaktifan USB otomatis lebih mudah dan lebih banyak skrip-

F1Linux
sumber
1

Saya mempunyai masalah ketika menghubungkan ponsel Android saya, saya tidak dapat mengisi daya ponsel saya karena tombol power hidup dan mati ... PowerTop biarkan saya menemukan pengaturan ini dan berguna untuk memperbaiki masalah ini (nilai otomatis menyebabkan masalah):

echo 'on' | sudo tee /sys/bus/usb/devices/1-1/power/control
WonderLand
sumber