Jak wyłączyć zintegrowaną kamerę internetową i nadal móc korzystać z zewnętrznej

13

Szukam sposobu na wyłączenie kamery internetowej zintegrowanej z moim laptopem. Kamera internetowa używa modułu uvcvideo, ale nie chcę jej umieszczać na czarnej liście, ponieważ jest ona również używana przez zewnętrzną kamerę internetową, którą mam.

Czy istnieje sposób na wyłączenie samego urządzenia bez dotykania listy modułów?

W ten sposób lsusb wyświetla listę kamer internetowych. Pierwszy to zintegrowany (jest identyfikowany przez niektóre aplikacje jako BisonCam NB Pro), drugi to zewnętrzny Logitech C525:

Bus 002 Device 004: ID 5986:0361 Acer, Inc 
Bus 003 Device 002: ID 046d:0826 Logitech, Inc. 

Sprawdziłem już BIOS - stamtąd nie można wyłączyć kamery internetowej. Poza tym chciałbym dowiedzieć się, jak wyłączyć urządzenie według ID.

Dzięki!

AtomHeartFather
źródło
Przesłuchałem to na LinuxQuestions. W końcu zrobiłem włamać się do modułu jądra uvc_driver.c, wymuszając błąd po znalezieniu tego konkretnego urządzenia. To nie jest tak naprawdę rozwiązanie, ale brudne obejście, ale działa dla mnie. Opisałem to tutaj: linuxquestions
AtomHeartFather

Odpowiedzi:

14

To całkiem proste. Ciężka praca polega na ustaleniu ścieżki do urządzenia USB. Musimy zacząć od znalezienia urządzenia, które chcemy wyłączyć. Możemy to zrobić za pomocą 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 001 Device 002: ID 0402:5602 ALi Corp. M5602 Video Camera Controller
Bus 001 Device 003: ID 045e:0723 Microsoft Corp. LifeCam VX-7000 (UVC-compliant)

Zmień 1-6 na porty urządzenia, aby je wyłączyć. Port często nie jest logiczny (fizyczny), ale można uzyskać mapowanie portów lsusb -t. Gdy już go masz, możesz go przetestować za pomocą:

cat /sys/bus/usb/devices/1-6/id{Vendor,Product} 

To daje mi 0402oraz 5602identyfikatory dostawcy i produktu dla odpowiedniego urządzenia (wymienione w lsusb).

Teraz go znaleźliśmy, wyłączenie go jest proste:

echo "0" > /sys/bus/usb/devices/1-6/bConfigurationValue

Po upewnieniu się, że działa zgodnie z oczekiwaniami, ładuj go przy każdym uruchomieniu (na przykład w /etc/rc.local.)

Wildneuro
źródło
1
Genialne, czyste rozwiązanie. Dziękuję bardzo za udostępnienie tego!
AtomHeartFather
1
Ta technika nie działa już w 14.10. Nie istnieje plik „bConfigurationValue”, a jeśli ktoś spróbuje napisać go jako użytkownik lub root, uprawnienia zostaną odrzucone.
lysdexia,
Nie rozumiem, co oznacza „zmiana 1-6 na port urządzenia”. Nie mogłem znaleźć
katalogu o
W Ubuntu 14.04, nawet jeśli robię echo "0" > /sys/bus/usb/devices/1-6/bConfigurationValuez sudo, to nie działa. Wartość nie zostaje tam, plik nie zawiera nic. Kamera internetowa nadal działa.
soham
Dobra, działa po dodaniu echo "0" > /sys/bus/usb/devices/1-6/bConfigurationValuewiersza do /etc/rc.local.
soham
6

@surjack: 1-6zależy od mapowania portów. Jeśli wpiszesz lsusb -t, dostaniesz go, a następnie porównaj z wynikiem lsusb. Dla mnie otrzymuję następujące wyniki:

lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 002: ID 5986:0525 Acer, Inc 
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 012: ID 413c:2107 Dell Computer Corp. 

i

lsusb -t
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
    |__ Port 1: Dev 2, If 0, Class=Video, Driver=uvcvideo, 5000M
    |__ Port 1: Dev 2, If 1, Class=Video, Driver=uvcvideo, 5000M
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 480M
    |__ Port 3: Dev 9, If 0, Class=Vendor Specific Class, Driver=hdm_usb, 480M
    |__ Port 4: Dev 10, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 3: Dev 11, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
        |__ Port 4: Dev 12, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M
        |__ Port 3: Dev 4, If 0, Class=Wireless, Driver=btusb, 12M
        |__ Port 3: Dev 4, If 1, Class=Wireless, Driver=btusb, 12M

Teraz po prostu znajdź odpowiedni autobus, który jest 04w moim przypadku, ponieważ Acer, Incto kamera. Mapowanie portów pokazuje, że kamera się znajduje Bus 04.Port 1. Oznacza to, że zamiast używać 1-6muszę użyć 4-1. Nie jestem ekspertem od Linuksa / Ubuntu, ale daje mi to wrażenie, że musisz użyć Bus-Porti po prostu użyć liczb. Jeśli chcesz być w 100% pewien, użyj catpolecenia zgodnie z opisem:

cat /sys/bus/usb/devices/<Bus>-<Port>/id{Vendor,Product} 

i porównaj to z lsusb.

W moim przypadku:

cat /sys/bus/usb/devices/4-1/id{Vendor,Product}
5986
0525

który jest identyczny z wyjściem lsusb: 5986:0525.

Teraz znalazłeś swoją wewnętrzną kamerę internetową.

Ale niestety lysdexia ma rację, a polecenie echo nie działa, ponieważ Permission denied.

Czy jest dostępne inne rozwiązanie?

DamBedEi
źródło
3
sudo -ii później echo "0" > ....
sygi
Lubsudo echo "0" > sudo /sys/bus/usb/devices/...
soham
0

Jeśli chcesz włączyć tylko zewnętrzny, gdy jest on podłączony, ale włącz wewnętrzny, jeśli zewnętrzny nie jest podłączony, oto skrypt na to. Opiera się na odpowiedzi Wildneuro, ale może ustalić ścieżkę urządzenia dla danego identyfikatora.

Używam go, ponieważ niektóre aplikacje, na których polegam, nie oferują sposobu łatwego wyboru preferowanego aparatu. Możesz łatwo dostosować za pomocą własnych identyfikatorów kamery (od lsusb).

Kod tutaj: https://gist.github.com/shimon/12cd1080fb8669549aadc2b5408922bc

Shimon Rura
źródło
Ponieważ treść linków może ulec zmianie, dodaj tutaj odpowiednią treść połączonej strony.
Chai T. Rex