การควบคุมแหล่งจ่ายไฟ USB (เปิด / ปิด) ด้วย Linux


164

เป็นไปได้หรือไม่ที่จะเปิด / ปิดแหล่งจ่ายไฟจาก USB ด้วยตนเองด้วย Linux?

มีพัดลมระบายความร้อน USB ภายนอก (แบบที่คุณใช้ในการระบายความร้อนด้วยตัวเองไม่ใช่พีซี) และมันก็ดีที่สามารถควบคุมได้จากเทอร์มินัลเพราะฉันต้องการวางตำแหน่งพัดลมในที่ห่างไกล

ฉันคิดว่านี่อาจเป็นประโยชน์สำหรับสิ่งอื่น ๆ อีกมากมายเช่นกันเพราะมีของเล่น USB มากมายอยู่ที่นั่น อาจเป็นเครื่องฟอกอากาศเป็นต้น (ฉันได้ยินมาว่าพวกเขาไม่ได้ทำงานจริงๆ)


9
ให้ฉันสรุปสำหรับ Linux> = 2.6.38: ไฟล์ power/level ถูกคัดค้านในขณะนี้; ใช้ แทนpower/control ( power/wakeupไม่เป็นไร) นอกจากนี้ยังยอมรับเฉพาะ "อัตโนมัติ" และ "เปิด" ไม่ใช่ "ระงับ" อีกต่อไป "อัตโนมัติ" ฉลาดพอและหากไม่ได้ปิดเครื่องขณะไม่มีการใช้งานแสดงว่าเป็นความผิดของอุปกรณ์ อย่างไรก็ตามคุณไม่สามารถปิดเครื่องได้ด้วยตนเอง สำหรับข้อมูลเพิ่มเติมดูคำตอบด้านล่างโดยtlwhitecและ doc ของเคอร์เนล: kernel.org/doc/Documentation/usb/power-management.txt
teika kazura

สำเนาซ้ำที่เป็นไปได้ของstackoverflow.com/q/1163824/1967396
Floris

2
คุณลักษณะนี้สมควรได้รับ GUI ที่ดีจริงๆ
mikebabcock

มันต้องการฮาร์ดแวร์พิเศษหรือไม่? ยังไม่ชัดเจนจากคำตอบ
Vojtěch Dohnal

คำตอบ:


63

บันทึก. ข้อมูลในคำตอบนี้เกี่ยวข้องกับเมล็ดเก่า (สูงสุด 2.6.32) ดูคำตอบของ tlwhitecสำหรับข้อมูลเกี่ยวกับเมล็ดใหม่

# 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

(คุณอาจต้องเปลี่ยน usb1 เป็น usb n )

ที่มา: เอกสารประกอบ / usb / power-management.txt.gz


1
โอ้โหขอบคุณสำหรับสิ่งนั้น ฉันคิดว่าฉันต้องผ่าน libUSB ไม่ว่าจะเกิดอะไรขึ้น มีความคิดวิธีการรับชื่อของอุปกรณ์ที่แนบมาด้วยหรือไม่?
kamziro

ตามโพสต์นี้ถ้าไม่มีฮาร์ดแวร์พิเศษมันเป็นไปไม่ได้เหรอ? blog.andrew.net.au/2009/01/17
NoBugs

7
ฉันได้รับอนุญาตปฏิเสธข้อผิดพลาดแม้ว่าฉันจะใช้ sudo!
Wally

3
กันสำหรับฉัน "การอนุญาตถูกปฏิเสธ" แม้หลังจากใช้ sudo
Raulp

2
ได้รับอนุญาตถูกปฏิเสธเพราะคำสั่งในรูปแบบของsudo foo > barการแยกวิเคราะห์เป็นตรงออกไปbarเรียกใช้แล้วfoosudoใช้ การเปลี่ยนเส้นทางล้มเหลวเนื่องจากเกิดขึ้นก่อนที่คุณจะเข้าถึงรูท ทางออกคือการใช้sudo sh -c 'echo disabled > /sys/bus/usb/devices/usb1/power/wakeup'และอื่น ๆ : ได้รับรากรันนรกใหม่เพื่อดำเนินการเปลี่ยนเส้นทางจากนั้นออกบางสิ่งบางอย่างลงในตัวบอกไฟล์ที่เปลี่ยนเส้นทาง
ขุด

61

ตามที่เอกสารมีการเปลี่ยนแปลงหลายอย่างเพื่อการจัดการพลังงาน USB ออกจากเมล็ด2.6.32ซึ่งดูเหมือนจะเสร็จสมบูรณ์ใน2.6.38 ตอนนี้คุณจะต้องรอให้อุปกรณ์ว่างเปล่าซึ่งควบคุมโดยไดรเวอร์อุปกรณ์โดยเฉพาะ ไดรเวอร์ต้องการการสนับสนุนไม่เช่นนั้นอุปกรณ์จะไม่ถึงสถานะนี้ โชคร้ายที่ตอนนี้ผู้ใช้ไม่มีโอกาสบังคับใช้ อย่างไรก็ตามหากคุณโชคดีและอุปกรณ์ของคุณสามารถใช้งานได้หากต้องการปิดการใช้งานคุณจะต้อง:

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

หรือสำหรับเมล็ดประมาณ 2.6.38 และสูงกว่า:

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

หมายถึงแท้จริงไปหยุดในขณะที่อุปกรณ์ไม่ได้ใช้งาน

ดังนั้นหากแฟนของคุณเป็นสิ่งที่ "ฉลาด" ที่สามารถมองเห็นได้ว่าเป็นอุปกรณ์และควบคุมโดยไดรเวอร์คุณอาจจะไม่โชคดีกับเมล็ดข้าวในปัจจุบัน


ดูเหมือนว่าสิ่งนี้จะทำให้อุปกรณ์ USB นั้นถูกปิดอย่างต่อเนื่อง ... (?) ฉันจะกลับมาทำงานต่อพลังงานได้อย่างไรหลังจากทำงานเสร็จแล้ว? เป้าหมายของฉันคือรีสตาร์ทอุปกรณ์หนึ่งครั้งไม่เปลี่ยนการตั้งค่าการระงับเป็นการถาวร
matanster

4
ถึง ดำเนินการต่ออุปกรณ์ระงับคุณสามารถปิดการใช้งานอีกครั้ง "autosuspend" กับecho "on" > "/sys/bus/usb/devices/usbX/power/control"แต่ฉันคิดว่าคุณต้องเข้าใจวัตถุประสงค์เดิม คุณลักษณะการระงับอัตโนมัติอยู่ที่นี่เพียงเพื่อให้อุปกรณ์ที่ไม่ทำงานเข้าสู่สถานะพลังงานต่ำ (ซึ่งอาจปรากฏปิด) เพื่อดำเนินการต่อในภายหลังเมื่อจำเป็นเท่านั้นโดยโฮสต์หรือเหตุการณ์ภายนอกบางอย่าง ที่เกิดขึ้น (หรือควรเกิดขึ้น) โดยอัตโนมัติ ที่จริงแล้วพอร์ตนั้นไม่เคยถูกปิดอย่างแท้จริง จริงๆแล้วอ่านเอกสาร ;)
tlwhitec

4
ฉันยืนยันได้ว่าใช้งานได้กับเมล็ด> 3.10 เพียงแค่ต้องให้แน่ใจว่าอุปกรณ์ "id" คุณกำลังใช้ถูกต้อง: dmesg | grep "usb"และใช้หมายเลขหลังจากที่ "USB" ตัวอย่างเช่น: คุณจะใช้:usb 2-4.4: SerialNumber: A0848020 /sys/bus/usb/devices/2-4.4/power/...ตรวจสอบให้แน่ใจว่าอุปกรณ์ไม่ได้ใช้งาน ฉันสร้างสคริปต์เพื่อทำให้กระบวนการนี้ง่ายขึ้น
lepe

มีวิธีบันทึกการกำหนดค่านี้เพื่อให้แต่ละครั้งที่เสียบเข้ากับมันจะไม่เปลี่ยนกลับเป็นค่าเริ่มต้นหรือไม่ ฉันมีอุปกรณ์ที่ฉันจำเป็นต้องตั้งค่าการควบคุมพลังงานเป็น "เปิด" เพื่อให้สามารถชาร์จได้
quickblueblur

@quickblueblur ฟังดูเหมือน udev กฎสำหรับฉัน
tlwhitec

24

ฉันได้พบวิธีแก้ไขปัญหาเหล่านี้ที่ทำงานอย่างน้อยสำหรับชิปฮับ USB USB Terminus FE 1.1 ที่ถูกต้อง:

1. ในการปิดไฟบนพอร์ต USB ทั้งหมดของฮับคุณสามารถแยกฮับออกจากเคอร์เนลได้โดยใช้:

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

เพื่อเปิดเครื่องใหม่ - คุณอาจผูกมันกลับมาใช้

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

2. การสลับพลังงานที่แต่ละพอร์ตนั้นยุ่งยากมาก: ฉันสามารถใช้hubpowerในการควบคุมแต่ละพอร์ต - แต่มันมาพร้อมกับข้อเสีย: ฮับอำนาจแรกยกเลิกการเชื่อมต่อ usbdevfs ซึ่งทำให้อุปกรณ์ USB ทั้งหมดแยกจากระบบอย่างน้อยใน Ubuntu :

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

ด้วยสิ่งนี้ ioctlปิดการใช้งานฉันสามารถปิดพอร์ตของแต่ละพอร์ตโดยไม่ต้องถอดอุปกรณ์ทั้งหมด - แต่ไฟก็จะเปิดขึ้นมาใหม่ทันที (อาจเป็นเพราะเคอร์เนลเห็นอุปกรณ์ที่ไม่ได้กำหนดค่า) ซึ่งทำให้อุปกรณ์ USB เพิ่งจะทำการ "เริ่มใหม่อย่างเย็น" โดยทั่วไปต้องการที่จะทำ ศูนย์กลางอำนาจที่แพตช์ของฉันอยู่ที่นี่


รายการ bind / unbind ได้รับการยืนยันว่าทำงานบนเคอร์เนล linux 2.6.34, ชิปเซ็ต ICH8 และ Ubuntu 10.04
user1357196

5
ผูก / unbind ไม่ได้ปิดพอร์ต USB โดยไม่คำนึงถึงชิปเซ็ต อุปกรณ์ยังคงได้รับพลังงาน ...
พวกเขาใน

1
เลเซอร์เมาส์ถูกปิด, ประเภทแป้นพิมพ์ไม่ได้, โมเด็มหยุดกะพริบ - ทั้งหมดดีบนแพลตฟอร์มของฉัน
eri

24

PowerTOPจาก Intel ช่วยให้คุณสามารถสลับอุปกรณ์เช่นอุปกรณ์ต่อพ่วง usb แบบเรียลไทม์ สิ่งเหล่านี้เรียกว่า 'tunables'

sudo apt install powertop
sudo powertop
  • แท็บไปที่ 'tunables'
  • เลื่อนลงไปที่อุปกรณ์ของคุณ
  • กด Enter เพื่อสลับโหมดประหยัดพลังงาน ( ดี / ไม่ดี )

ป้อนคำอธิบายรูปภาพที่นี่

โปรดทราบว่าไม่ดีหมายความว่าอุปกรณ์เปิดอยู่เสมอ การสลับเป็นดีจะปิดอุปกรณ์หลังจากประหยัดเวลาที่ไม่ได้ใช้งานล่วงหน้า (ค่าเริ่มต้นคือ 2000ms)

ดูเอกสารPowerTOPสำหรับรายละเอียดเกี่ยวกับวิธีการเปลี่ยนแปลงเหล่านี้อย่างถาวร
มันสร้างสคริปต์การกำหนดค่าสำหรับคุณ (ค่อนข้างมากตามที่อธิบายโดยผู้โพสต์อื่น ๆ ในหัวข้อนี้)

หมายเหตุ: สคริปต์เหล่านี้ไม่ส่งผลกระทบต่อกำลังไฟของขา USB (ซึ่งเปิดอยู่เสมอ)
สิ่งเหล่านี้จะส่งโปรโตคอลไดรเวอร์เพื่อเปิดใช้งานและปิดใช้งานอุปกรณ์

ถ้าคุณต้องการที่จะมีอำนาจควบคุม pin, คุณสามารถใช้อย่างใดอย่างหนึ่งได้รับการสนับสนุนสมาร์ทฮับ USB หรือดีกว่ายังไมโครคอนโทรลเลอร์


2
! น่ากลัว : DI คิดว่านี่เป็นวิธีที่เป็นมิตรกับผู้ใช้มากที่สุด (แม้ว่าในระดับต่ำจะทำให้การดำเนินการเช่นเดียวกับที่ระบุไว้ในคำตอบอื่น ๆ ) ขอบคุณและคำตอบของคุณอาจถึงด้านบน;)
Matyas

1
ขอบคุณสำหรับคำตอบ. ฉันต้องเริ่มขุดเพื่อเปลี่ยนการประหยัดเวลาที่ไม่ได้ใช้งานที่ตั้งไว้ล่วงหน้าที่ไหน
mikezter

ดังที่โพสต์ก่อนหน้านี้ docs เคอร์เนลอยู่ที่นี่: kernel.org/doc/Documentation/usb/power-management.txt
Dominic Cerisano

10

คุณสามารถใช้เครื่องมือuhubctlของฉันเพื่อควบคุมพลังงาน USB ต่อพอร์ตสำหรับฮับ USB ที่ใช้งานร่วมกันได้


เครื่องมือที่ดีใน osx แต่ไม่พบ 'ศูนย์กลางสมาร์ทที่รองรับ' บน debian สำหรับฉัน
กระวนกระวายใจ

1
บน Linux คุณต้องรันเป็น root (ภายใต้ sudo) หรือกำหนดค่าการอนุญาตอุปกรณ์ udev อาจเป็นไปได้ว่าโฮสต์ Linux ของคุณไม่มีฮับที่ใช้งานร่วมกันได้
mvp

มันเป็น 'บีเกิ้ลกระดูกสีเขียว' btw
กระวนกระวาย

7

ฉันต้องการทำสิ่งนี้และด้วยฮาร์ดแวร์ USB ของฉันฉันทำไม่ได้ ฉันเขียนวิธีแฮ็กวิธีที่นี่:

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

ในระยะสั้น: ฉันใช้รีเลย์ USB เพื่อเปิด / ปิด V CCของสาย USB อื่น ...


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

ใช้งานได้กับ Ubuntu


1
คุณเป็นทางออกเดียวที่ทำงานกับกระเป๋าเงินของฉัน ฉันใช้ acer ทำแล็ปท็อป 12.04LTS Ubuntu
RicoRicochet

1
ไม่ปิดอุปกรณ์ แต่จะลบออกจากรายการอุปกรณ์เท่านั้น ฉันจะปิดพอร์ต USB ได้อย่างไร
rustyx

1
นี่เป็นทางออกเดียวที่ทำงานสำหรับฉันในการปิดแท็บเล็ต Wacom Intuos5 touch M โดยไม่ต้องถอดปลั๊ก (บน Fedora 28)
user1738984

2

พลังงาน USB 5v เปิดอยู่เสมอ (แม้ในขณะที่คอมพิวเตอร์ปิดอยู่ในคอมพิวเตอร์บางเครื่องและในบางพอร์ต) คุณอาจจำเป็นต้องตั้งโปรแกรม Arduino ด้วยสวิตช์บางประเภทและควบคุมผ่านห้องสมุดอนุกรมจาก USB ที่เสียบเข้ากับ คอมพิวเตอร์.

กล่าวอีกนัยหนึ่งการรวมกันของการสอนสวิตช์นี้และการสอนนี้เกี่ยวกับการสื่อสารผ่าน Serial libary กับ Arduino ที่เสียบเข้ากับ USB


2

เหตุผลที่ผู้คนโพสต์คำถามเช่นนี้เกิดจากการหวั่น - แน่นอน "ความชั่วร้าย " - คุณสมบัติ USB "ระงับอัตโนมัติ "

อัตโนมัติระงับการใช้พลังงานให้กับอุปกรณ์ USB "ว่าง" และหากไดรเวอร์ของอุปกรณ์รองรับคุณสมบัตินี้อย่างถูกต้องอุปกรณ์ดังกล่าวจะไม่สามารถติดต่อได้ ดังนั้นการเปิด / ปิดพอร์ต USB เป็นอาการของปัญหาไม่ใช่ปัญหาในตัวเอง

ฉันจะแสดงวิธีการให้ทั่วโลกปิดการใช้งานโดยอัตโนมัติระงับอัตโนมัติโดยไม่ต้องเปิด / ปิดพอร์ต USB ด้วยตนเอง:

คำตอบสั้น ๆ :

คุณไม่จำเป็นต้องแก้ไข " autosuspend_delay_ms " ทีละอย่าง: USB autosuspend สามารถปิดใช้งานได้ทั่วโลกและส่วนบุคคลโดยใช้คำสั่งต่อไปนี้:

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

update-grub

systemctl reboot

Ubuntu 18.04หน้าจอคว้าต่อไปนี้ในตอนท้ายของ "คำตอบยาว" แสดงให้เห็นถึงวิธีการที่ผลของฉันได้ประสบความสำเร็จ

คำตอบยาว:

เป็นความจริงที่สถานะเคอร์เนลการจัดการพลังงาน USB ของเอกสารการบอกเลิกอัตโนมัติจะต้องถูกเลิกใช้และใน 'place " autosuspend_delay_ms " ที่ใช้ในการปิดการใช้งาน USB autosuspend:

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

อย่างไรก็ตามการทดสอบของฉันแสดงให้เห็นว่าการตั้งค่าusbcore.autosuspend=-1ใน/ etc / default / grubดังต่อไปนี้สามารถใช้เป็นGLOBAL toggle สำหรับฟังก์ชั่นการบันทึกอัตโนมัติของ USB ได้คุณไม่จำเป็นต้องแก้ไข " autosuspend_delay_msแต่ละรายการ"ไฟล์

เอกสารเดียวกันที่ลิงก์ด้านบนระบุว่าค่า "0" คือเปิดใช้งานและค่าลบจะถูกปิดใช้งาน :

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.

ในข้อเขียนUbuntu 18.04หน้าจอคว้าด้านล่างแสดงให้เห็นถึงวิธีการที่ผลของฉันกำลังประสบความสำเร็จ (และทำซ้ำได้) โปรดสังเกตเริ่มต้นคือ "0" ( เปิดใช้งาน ) ในautosuspend_delay_ms

จากนั้นให้สังเกตว่าหลังจากตั้งค่าใน Grub เท่านั้นค่าusbcore.autosuspend=-1เหล่านี้จะเป็นค่าลบ ( ปิดใช้งาน ) หลังจากรีบูต นี่จะช่วยให้ฉันไม่ต้องกังวลกับการแก้ไขค่าแต่ละค่าและตอนนี้สคริปต์สามารถปิดใช้งานการปิดอัตโนมัติ USB

screengrab: ค่าการระงับอัตโนมัติก่อนและหลังการแก้ไขร่วม

หวังว่าสิ่งนี้จะทำให้การปิดการใช้งาน USB autosuspend ง่ายขึ้นและสามารถเขียนได้ง่ายขึ้น -


1

ฉันมีปัญหาเมื่อเชื่อมต่อโทรศัพท์ Android ของฉันฉันไม่สามารถชาร์จโทรศัพท์ของฉันได้เนื่องจากสวิตช์เปิดและปิด ... PowerTop ให้ฉันค้นหาการตั้งค่านี้และเป็นประโยชน์ในการแก้ไขปัญหา (ค่าอัตโนมัติเป็นสาเหตุของปัญหา):

echo 'on' | sudo tee /sys/bus/usb/devices/1-1/power/control
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.