Как отключить встроенную веб-камеру и при этом использовать внешнюю?

13

Я ищу способ отключить веб-камеру, встроенную в мой ноутбук. В веб-камере используется модуль uvcvideo, но я не хочу помещать его в черный список, поскольку он также используется внешней веб-камерой, которая у меня есть.

Есть ли способ отключить само устройство, не касаясь списка модулей?

Вот как веб-камеры перечислены lsusb. Первый - интегрированный (в некоторых приложениях он обозначается как BisonCam NB Pro), второй - внешний Logitech C525:

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

Я уже проверил BIOS - оттуда нет возможности отключить веб-камеру. Кроме того, я хотел бы узнать, как отключить устройство по идентификатору в любом случае.

Благодарность!

AtomHeartFather
источник
Пересекли это в LinuxQuestions. В конечном итоге я взломал модуль ядра uvc_driver.c, вызвав ошибку при обнаружении этого конкретного устройства. Это не совсем решение, а грязный обходной путь, но он работает для меня. Я описал это здесь: linuxquestions
AtomHeartFather

Ответы:

14

Это довольно просто. Тяжелая работа - выяснить, каков путь к USB-устройству. Нам нужно начать с поиска устройства, которое мы хотим отключить. Мы можем сделать это с 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)

Измените 1-6 на порты вашего устройства, которые будут отключены. Порт часто не логичен (он физический), но вы можете получить сопоставление портов lsusb -t. Как только вы думаете, что у вас есть, вы можете проверить это с:

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

Это дает мне 0402и 5602, поставщика и идентификаторы продукта для правильного устройства (как указано в lsusb).

Теперь мы нашли это, отключить это просто:

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

Убедившись, что он работает как нужно, загружайте его при каждом запуске (например, в /etc/rc.local.)

Wildneuro
источник
1
Блестящий, чистый раствор. Большое спасибо за то, что поделились этим!
AtomHeartFather
1
Эта техника больше не работает в 14.10. Файл "bConfigurationValue" не существует, и если попытаться записать его как пользователя или пользователя root, разрешение будет отклонено.
Лиздексия
Я не понял, что означает «изменить 1-6 на порт вашего устройства». Я не смог найти
режиссера с
В Ubuntu 14.04, даже если я делаю echo "0" > /sys/bus/usb/devices/1-6/bConfigurationValueс sudo, это не работает. Значение не остается там, файл ничего не содержит. Веб-камера все еще работает.
Сохам
Хорошо, это работает после того, как я добавлю echo "0" > /sys/bus/usb/devices/1-6/bConfigurationValueстроку в /etc/rc.local.
Сохам
6

@ Surjack: 1-6зависит от вашего сопоставления портов. Если вы напечатаете, lsusb -tвы получите его, а затем сравните с выводом lsusb. Для меня я получаю следующие выводы:

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. 

и

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

Теперь просто найдите правильный автобус, который 04в моем случае, потому что Acer, Incэто камера. Сопоставление портов показывает, что камера расположена в Bus 04.Port 1. Это означает, что вместо использования 1-6я должен использовать 4-1. Я не эксперт по Linux / Ubuntu, но у меня сложилось впечатление, что вы должны использовать Bus-Portи просто использовать цифры. Если вы хотите быть на 100% уверены, используйте catкоманду, как описано:

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

и сравните это с lsusb.

В моем случае:

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

которая тождественно к выходу lsusb: 5986:0525.

Теперь вы нашли свою внутреннюю веб-камеру.

Но, к сожалению, lysdexia прав, и команда echo не работает, потому что Permission denied.

Есть ли другое решение?

DamBedEi
источник
3
sudo -iи позже echo "0" > ....
Сыги
Илиsudo echo "0" > sudo /sys/bus/usb/devices/...
Сохам
0

Если вы хотите включить только внешний, когда он подключен, но включить внутренний, если внешний не подключен, вот скрипт для этого. Он основан на ответе Wildneuro, но может определить путь к устройству для вас с учетом идентификатора.

Я использую его, потому что некоторые приложения, от которых я зависит, похоже, не предлагают способ легко выбрать предпочитаемую камеру. Вы можете легко настроить свои собственные идентификаторы камеры (с lsusb).

Код здесь: https://gist.github.com/shimon/12cd1080fb8669549aadc2b5408922bc

Шимон Рура
источник
Поскольку содержание ссылок может измениться, добавьте соответствующее содержимое связанной страницы здесь.
Чай Т. Рекс