Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Szukając info na temat tego jak wyłączyć adapter bluetooth do głowy wpadł mi pomysł na wyłączenie portu (albo portów) usb. Mam tylko problem z odczytaniem zapisów urządzeń w katalogu /sys/ . Przykładowo: załóżmy, że chcę wyłączyć port usb w który wpięty jest adapter bluetooth:
morfik:~$ lsusb -t /: Bus 05.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/8p, 480M /: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M |__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M |__ Port 1: Dev 2, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M /: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M |__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M |__ Port 1: Dev 7, If 0, Class=Wireless, Driver=btusb, 12M |__ Port 1: Dev 7, If 1, Class=Wireless, Driver=btusb, 12M /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M morfik:~$ lsusb Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 004 Device 002: ID 046d:c30f Logitech, Inc. Logicool HID-Compliant Keyboard (106 key) Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 003 Device 002: ID 09da:000a A4 Tech Co., Ltd Optical Mouse Opto 510D Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 002 Device 007: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode) Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
To urządzenie siedzi w bus 02 i port 1 . Ale w /sys/bus/usb/devices/ jest coś takiego:
root:/sys/bus/usb/devices# ls -al total 0 drwxr-xr-x 2 root root 0 Oct 19 14:42 ./ drwxr-xr-x 4 root root 0 Oct 19 14:42 ../ lrwxrwxrwx 1 root root 0 Oct 19 14:42 1-0:1.0 -> ../../../devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/ lrwxrwxrwx 1 root root 0 Oct 19 14:42 2-0:1.0 -> ../../../devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/ lrwxrwxrwx 1 root root 0 Oct 19 19:09 2-1 -> ../../../devices/pci0000:00/0000:00:1d.1/usb2/2-1/ lrwxrwxrwx 1 root root 0 Oct 19 19:09 2-1:1.0 -> ../../../devices/pci0000:00/0000:00:1d.1/usb2/2-1/2-1:1.0/ lrwxrwxrwx 1 root root 0 Oct 19 19:09 2-1:1.1 -> ../../../devices/pci0000:00/0000:00:1d.1/usb2/2-1/2-1:1.1/ lrwxrwxrwx 1 root root 0 Oct 19 14:42 3-0:1.0 -> ../../../devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/ lrwxrwxrwx 1 root root 0 Oct 19 14:42 3-1 -> ../../../devices/pci0000:00/0000:00:1d.2/usb3/3-1/ lrwxrwxrwx 1 root root 0 Oct 19 14:42 3-1:1.0 -> ../../../devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/ lrwxrwxrwx 1 root root 0 Oct 19 14:42 4-0:1.0 -> ../../../devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/ lrwxrwxrwx 1 root root 0 Oct 19 14:42 4-1 -> ../../../devices/pci0000:00/0000:00:1d.3/usb4/4-1/ lrwxrwxrwx 1 root root 0 Oct 19 14:42 4-1:1.0 -> ../../../devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/ lrwxrwxrwx 1 root root 0 Oct 19 14:42 4-1:1.1 -> ../../../devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/ lrwxrwxrwx 1 root root 0 Oct 19 14:42 5-0:1.0 -> ../../../devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/ lrwxrwxrwx 1 root root 0 Oct 19 14:42 usb1 -> ../../../devices/pci0000:00/0000:00:1d.0/usb1/ lrwxrwxrwx 1 root root 0 Oct 19 14:42 usb2 -> ../../../devices/pci0000:00/0000:00:1d.1/usb2/ lrwxrwxrwx 1 root root 0 Oct 19 14:42 usb3 -> ../../../devices/pci0000:00/0000:00:1d.2/usb3/ lrwxrwxrwx 1 root root 0 Oct 19 14:42 usb4 -> ../../../devices/pci0000:00/0000:00:1d.3/usb4/ lrwxrwxrwx 1 root root 0 Oct 19 14:42 usb5 -> ../../../devices/pci0000:00/0000:00:1d.7/usb5/
Za bardzo nie wiem co z tego wybrać. Samo 2-1? Czy, któreś z 2-1:1.0, 2-1:1.1 ? Na moją logikę to by było 2-1, no bo bus 2 i port 1, ale co oznaczają te dwie cyfry po dwukropku? Być może to ma coś wspólnego z If 0 i 1 w lsusb. Poza tym czemu w lsusb są dwa wpisy, przecie urządzenie jest jedno. Zmieniłem port by sprawdzić czy coś się zmieni i zmienił się port z 1 na 2. Poza tym lsusb podaje Device 007 , a w tym sys jest tylko jedna 7 — ../../../devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/ . Nie wiem czy ten d.7 to od device 7 ale nic innego mi nie przychodzi do głowy. Z tym, że dalej jest numer 5-0:1.0, co według mojej logiki by odpowiadało bus 5, na którym, nie ma żadnego urządzenia. Patrząc po linkach usb* , to wychodzi na to, że jest to usb5, a że numery są od 1 do 5 to wskazuje to na to, że to jest bus, który w lsusb też ma numery od 1 do 5.
W logach jest taki wpis po podłączeniu urządzenia:
2013-10-19T19:07:47.150035+02:00 morfikownia kernel: [30717.165040] usb 2-1: new full-speed USB device number 7 using uhci_hcd 2013-10-19T19:07:47.306017+02:00 morfikownia kernel: [30717.321075] usb 2-1: New USB device found, idVendor=0a12, idProduct=0001 2013-10-19T19:07:47.306043+02:00 morfikownia kernel: [30717.321085] usb 2-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
Tutaj wskazuje na usb 2-1.
Na dobrą sprawę na necie znalazłem taką linijkę, która pozwala (chyba) na wyłączenie portu usb:
echo suspend | sudo tee /sys/bus/usb/devices/2-1.2/power/level
I generalnie chciałbym sobie to potestować ale trochę mylące są dla mnie te numerki. Czy ktoś się orientuje w nich?
EDIT:
power/control
This file contains one of two words: "on" or "auto".
You can write those words to the file to change the
device's setting.
"on" means that the device should be resumed and
autosuspend is not allowed. (Of course, system
suspends are still allowed.)
"auto" is the normal state in which the kernel is
allowed to autosuspend and autoresume the device.
(In kernels up to 2.6.32, you could also specify
"suspend", meaning that the device should remain
suspended and autoresume was not allowed. This
setting is no longer supported.)
No i se wyłączyłem. xD
Ostatnio edytowany przez morfik (2013-10-19 20:04:49)
Offline
ls -l /sys/bus/usb/drivers/btusb/unbind
?
Podobnie do tej gimnastyki:
http://askubuntu.com/questions/645/how-do-you-reset … -command-line
Ostatnio edytowany przez Jacekalex (2013-10-19 22:53:25)
Offline
To z ubuntu działa. :]
Skompilowałem ten program i podłączyłem bluetootha. Potem dałem stop na demonie, lampka migała, to mu dałem:
# ./usbreset /dev/bus/usb/002/016 Resetting USB device /dev/bus/usb/002/016 Reset successful
I przestała migać.
Po wystartowaniu demona, znowu zaczęła migać. Czyli w sumie tak jak chciałem. xD
A to po co miało być?
# ls -l /sys/bus/usb/drivers/btusb/unbind --w------- 1 root root 4.0K Oct 19 23:02 /sys/bus/usb/drivers/btusb/unbind
Offline
morfik, jeżeli już wiesz, jak wyłączyć i ponownie włączyć usb to napisz jeszcze raz. Przydałoby mi się to do wyłączania bluetooth.
Ostatnio edytowany przez prosze (2013-10-20 17:45:52)
Offline
To nie jest wyłączenie i włączenie usb, bo tego się nie da zrobić i zgodnie z tym co pisze tutaj:
Note
however, that reset followed by re-enumeration is _not_ the same thing
as power-cycle followed by reconnect and re-enumeration.
To się trochę różni, ale grunt, że urządzenie usb się automatycznie nie włącza ponownie po resecie. Musi je coś zainicjować.
Ale jeśli chcesz sprawdzić czy u ciebie to działa, to wklej sobie to do pliku i zapisz go np. usbreset.c :
/* usbreset -- send a USB port reset to a USB device */ #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <sys/ioctl.h> #include <linux/usbdevice_fs.h> int main(int argc, char **argv) { const char *filename; int fd; int rc; if (argc != 2) { fprintf(stderr, "Usage: usbreset device-filename\n"); return 1; } filename = argv[1]; fd = open(filename, O_WRONLY); if (fd < 0) { perror("Error opening output file"); return 1; } printf("Resetting USB device %s\n", filename); rc = ioctl(fd, USBDEVFS_RESET, 0); if (rc < 0) { perror("Error in ioctl"); return 1; } printf("Reset successful\n"); close(fd); return 0; }
Potem dajesz:
$ cc usbreset.c -o usbreset
Wychodzi z tego plik usbreset, któremu dajesz prawa wykonywania i odpalasz z roota podając ścieżkę do urządzenia usb w katalogu dev. A jakie urządzenie to odczytujesz z lsusb. Czyli jak u mnie jest
Bus 002 Device 016: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode
To ścieżka będzie zawierać 002 i 016, czyli dodajesz to do /dev/bus/usb/ i w sumie masz:
# ./usbreset /dev/bus/usb/002/016
To gasi tylko adapter bluetooth i to tylko wtedy gdy demon jest położony, czyli zadziała dopiero wtedy gdy wydasz uprzednio:
/etc/init.d/bluetooth stop
A by włączyć adapter ponownie, to musisz dać:
/etc/init.d/bluetooth start
Co ciekawe, próbowałem to na próbę zrobić z kamerą ale ta nie chce się wyłączyć. xD Sprawdzałem obraz na vlc i po zresetowaniu, obraz z kamery przestaje być odtwarzany ale kamera dalej chodzi. Widać coś ją inicjuje od razu po zresetowaniu, choć nie wiem co.
Offline
O co tu chodzi?
root@debian:/home/nowy/Pulpit# cc usbreset.c usbreset bash: cc: nie znaleziono polecenia root@debian:/home/nowy/Pulpit#
Offline
Nie masz kompilatora. Zainstaluj gcc, ewentualnie build-essential od razu.
Offline
ArnVaker, dzięki :)
morfik, zrobiłem tak:
root@debian:/home/nowy/Pulpit# 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 002 Device 002: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode) root@debian:/home/nowy/Pulpit# /etc/init.d/bluetooth stop [ ok ] Stopping bluetooth: rfcomm /usr/sbin/bluetoothd. root@debian:/home/nowy/Pulpit# ./usbreset /dev/bus/usb/002/002 Resetting USB device /dev/bus/usb/002/002 Reset successful root@debian:/home/nowy/Pulpit#
Tylko, że port usb do którego mam podpięty bluetooth nadal działa. Nawet dioda w bluetooth nie zgasła :)
Offline
prosze napisał(-a):
Tylko, że port usb do którego mam podpięty bluetooth nadal działa. Nawet dioda w bluetooth nie zgasła :)
Bo usbreset jest do resetowania urządzenia usb, a nie wyłączenia.
Tu jest przykład, jak wyłączyć sterownik na danym porcie usb:
http://lwn.net/Articles/143397/
tree /sys/bus/usb/drivers/btusb/ /sys/bus/usb/drivers/btusb/ ├── 5-2:1.0 -> ../../../../devices/pci0000:00/0000:00:1a.2/usb5/5-2/5-2:1.0 ├── 5-2:1.1 -> ../../../../devices/pci0000:00/0000:00:1a.2/usb5/5-2/5-2:1.1 ├── bind ├── module -> ../../../../module/btusb ├── new_id ├── remove_id ├── uevent └── unbind
Wygląda na to, że jakośtam działa ;)
root ~> echo -n '5-2:1.0' >/sys/bus/usb/drivers/btusb/bind nie paź 20 19:40:55 localhost : ~ root ~> hcitool dev Devices: hci0 00:15:83:15:A3:10 nie paź 20 19:40:57 localhost : ~ root ~> echo -n '5-2:1.0' >/sys/bus/usb/drivers/btusb/unbind nie paź 20 19:41:03 localhost : ~ root ~> hcitool dev Devices: nie paź 20 19:41:04 localhost : ~ root ~> echo -n '5-2:1.0' >/sys/bus/usb/drivers/btusb/bind nie paź 20 19:41:17 localhost : ~ root ~> hcitool dev Devices: hci0 00:15:83:15:A3:10 nie paź 20 19:41:19 localhost : ~ root ~>
EDIT:
Jeszcze lepiej to jest opisane tutaj:
https://www.linux.com/community/blogs/133-general-l … from-terminal
Pozdro
;-)
Ostatnio edytowany przez Jacekalex (2013-10-20 20:21:13)
Offline
U mnie lampka na adapterze bluetooth zgasła i zachowuje się tak jakbym wyciągnął go z portu i podłączył przy położonym demonie bluetooth, czyli lampka nie miga. Zaczyna migać dopiero po podniesieniu demona.
Inna sprawa, co oznaczają te numerki 5-2:1.0 -- bus 5, port 2, a pozostałe? I czemu wybrałeś 5-2:1.0 a nie 5-2:1.1 ?
Co do samego sposobu z tym plikiem unbind , to gdzieś na necie mi się to przewineło. Niby po wydaniu
root:~# echo -n "2-1:1.0" > /sys/bus/usb/drivers/btusb/unbind root:~# hcitool dev Devices:
nie widać żadnych urządzeń ale bluetooth dalej pracuje bo lampka miga. xD A mi generalnie zależy na tym by nieużywane urządzenie po prostu wyłączyć, tak jak się to udało zrobić to wcześniej z bluetoothem.
Zobacz na ten poniższy log:
root:/home/morfik/Desktop# /etc/init.d/bluetooth start [ ok ] Starting bluetooth: bluetoothd rfcomm. root:/home/morfik/Desktop# hcitool dev Devices: hci0 00:15:83:4A:CD:C1 root:/home/morfik/Desktop# /etc/init.d/bluetooth stop [ ok ] Stopping bluetooth: rfcomm /usr/sbin/bluetoothd. root:/home/morfik/Desktop# hcitool dev Devices: hci0 00:15:83:4A:CD:C1 root:/home/morfik/Desktop# ./usbreset /dev/bus/usb/002/018 Resetting USB device /dev/bus/usb/002/018 Reset successful root:/home/morfik/Desktop# hcitool dev Devices:
Ostatnio edytowany przez morfik (2013-10-20 20:32:00)
Offline
Wybrałem pierwszy numer z brzegu i poszło.
A najlepiej tak:
root ~> ls /sys/bus/usb/drivers/usb/ 3-1 5-1 bind unbind usb2 usb4 usb6 usb8 4-1 5-2 uevent usb1 usb3 usb5 usb7
Wyłączamy port 5-2:
echo -n 5-2 > /sys/bus/usb/drivers/usb/unbind
ls /sys/bus/usb/drivers/usb/ 3-1 5-1 uevent usb1 usb3 usb5 usb7 4-1 bind unbind usb2 usb4 usb6 usb8
I portu z bluetooth ani śladu.
Włączenie bt nazad:
echo -n 5-2 > /sys/bus/usb/drivers/usb/bind
Jak ktoś ma lapka, to niech zobaczy, czy i o ile spadnie użycie energii (powertop).
Ostatnio edytowany przez Jacekalex (2013-10-20 20:49:55)
Offline
Jacekalex, wyłączenie portu w ten sposób działa tylko w teorii. Mimo tego, że po wyłączeniu portu usb nie widać, to u mnie podłączony do usb bluetooth nadal świeci.
root@userpc:/home/userpc# ls /sys/bus/usb/drivers/usb/ 1-1 bind module uevent unbind usb1 usb2 usb3 usb4 usb5 usb6 root@userpc:/home/userpc# echo -n 1-1 > /sys/bus/usb/drivers/usb/unbind root@userpc:/home/userpc# ls /sys/bus/usb/drivers/usb/ bind module uevent unbind usb1 usb2 usb3 usb4 usb5 usb6 root@userpc:/home/userpc#
Offline
Jeśli w porcie USB jest napięcie, to świeci, ale czy bierze tyle samo prądu,
ile w czasie aktywności?
A teraz, na własną odpowiedzialność, bo właśnie to namierzyłem, i nie wiem, na ile trwałe są zmiany:
echo 1 > /sys/bus/usb/devices/1-1/remove
U mnie zniknął BT, w ogóle nie widać go na lsusb, prawdopodobnie po restarcie będzie. (mam nadzieję) :D
Offline
morfik napisał(-a):
Znikać z lsusb — znika, świecić się — świeci, ale po wyjęciu i wsadzeniu do portu pojawia się w lsusb.
Czyli przynajmniej nic się nie pieprzy na stałe, ok.
W kwestii pojawiania się ponownie, to możesz pozwać do sądu udeva. :D
Offline