Como desativar a webcam integrada e ainda poder usar uma webcam externa

13

Estou procurando uma maneira de desativar a webcam integrada ao meu laptop. A webcam está usando o módulo uvcvideo, mas não quero colocá-lo na lista negra, pois também está sendo usada por uma webcam externa que possuo.

Existe alguma maneira de desativar o próprio dispositivo sem tocar na lista de módulos?

É assim que as webcams são listadas por lsusb. O primeiro é um integrado (é identificado por alguns aplicativos como BisonCam NB Pro), o segundo é o Logitech C525 externo:

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

Eu já verifiquei o BIOS - não há como desativar a webcam a partir daí. Além disso, eu adoraria aprender a desativar o dispositivo por ID de qualquer maneira.

Obrigado!

AtomHeartFather
fonte
Colocou isso em cruzamentos no LinuxQuestions. O que finalmente fiz foi hackear o módulo do kernel uvc_driver.c, forçando um erro quando esse dispositivo específico foi encontrado. Esta não é realmente uma solução, mas uma solução alternativa suja, mas funciona para mim. Eu descrevi aqui: linuxquestions
AtomHeartFather 18/10/12

Respostas:

14

É bem simples O trabalho duro é descobrir qual é o caminho para o dispositivo USB. Precisamos começar descobrindo qual dispositivo queremos desativar. Podemos fazer isso com 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)

Altere de 1 a 6 para as portas do dispositivo para desabilitar. A porta geralmente não é lógica (é física), mas você pode obter um mapeamento de porta lsusb -t. Depois de pensar que você o possui, você pode testá-lo com:

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

Isto dá-me 0402e 5602, de fornecedores e produtos IDs para o dispositivo correto (conforme listado na lsusb).

Agora que descobrimos, desativar é simples:

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

Depois de garantir que ele funcione como desejado, faça-o carregar todas as inicializações (por exemplo, em /etc/rc.local.)

Wildneuro
fonte
1
Solução brilhante e limpa. Muito obrigado por compartilhar isso!
AtomHeartFather #
1
Essa técnica não parece mais funcionar em 14.10. Nenhum arquivo "bConfigurationValue" existe e, se alguém tentar gravá-lo como usuário ou raiz, a permissão será negada.
Lysdexia
Não entendi o que significa 'alterar 1-6 na porta do seu dispositivo'. Eu não poderia encontrar um dir chamado 1-6
surajck
No Ubuntu 14.04, mesmo que eu faça echo "0" > /sys/bus/usb/devices/1-6/bConfigurationValuecom o sudo, isso não funciona. O valor não fica lá, o arquivo não contém nada. A webcam ainda funciona.
soham
Ok, funciona depois que eu adiciono uma echo "0" > /sys/bus/usb/devices/1-6/bConfigurationValuelinha a /etc/rc.local.
soham
6

@ Surjack: 1-6depende do seu mapeamento de portas. Se você digitar, lsusb -tirá obtê-lo e compará-lo com a saída de lsusb. Para mim eu recebo as seguintes saídas:

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. 

e

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

Agora, basta encontrar o barramento certo, que está 04no meu caso, porque Acer, Incé a câmera. O mapeamento de portas mostra que a câmera está localizada em Bus 04.Port 1. Isso significa que, em vez de usar 1-6, tenho que usar 4-1. Eu não sou um especialista em Linux / Ubuntu, mas isso me dá a impressão de que você precisa usar Bus-Porte simplesmente usar os números. Se você deseja ter 100% de certeza, use o catcomando conforme descrito:

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

e compare com lsusb.

No meu caso:

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

que é idêntica à saída lsusb: 5986:0525.

Agora você encontrou sua webcam interna.

Infelizmente, a lisdexia está certa e o comando echo não funciona porque Permission denied.

Existe outra solução disponível?

DamBedEi
fonte
3
sudo -ie depois echo "0" > ....
sygi 27/03
Ousudo echo "0" > sudo /sys/bus/usb/devices/...
soham 31/08
0

Se você deseja ativar apenas o externo quando ele estiver anexado, mas ativar o interno se o externo não estiver anexado, aqui está um script para isso. É baseado na resposta de Wildneuro, mas pode descobrir o caminho do dispositivo para você, com o ID.

Uso-o porque alguns aplicativos dos quais dependo não parecem oferecer uma maneira fácil de escolher sua câmera preferida. Você pode personalizar facilmente com seus próprios IDs de câmera (de lsusb).

Código aqui: https://gist.github.com/shimon/12cd1080fb8669549aadc2b5408922bc

Shimon Rura
fonte
Como o conteúdo dos links pode mudar, adicione o conteúdo relevante da página vinculada aqui.
Chai T. Rex