Cómo deshabilitar la cámara web integrada y aún poder usar una externa

13

Estoy buscando una manera de desactivar la cámara web que está integrada en mi computadora portátil. La cámara web está utilizando el módulo uvcvideo pero no quiero incluirlo en la lista negra ya que también lo está usando una cámara web externa que tengo.

¿Hay alguna forma de deshabilitar el dispositivo sin tocar la lista de módulos?

Así es como lsusb enumera las cámaras web. El primero es integrado (algunas aplicaciones lo identifican como BisonCam NB Pro), el segundo es el Logitech C525 externo:

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

Ya he comprobado el BIOS: no hay forma de desactivar la cámara web desde allí. Además, me encantaría aprender cómo deshabilitar el dispositivo por ID de todos modos.

¡Gracias!

ÁtomoCorazónPadre
fuente
Crossposted esto en LinuxQuestions. Lo que finalmente hice fue hackear el módulo del núcleo uvc_driver.c forzando un error cuando se encuentra este dispositivo en particular. Esto no es realmente una solución, sino una solución sucia, pero funciona para mí. Lo describí aquí: linuxquestions
AtomHeartFather

Respuestas:

14

Es bastante simple. El trabajo duro es determinar cuál es la ruta al dispositivo USB. Necesitamos comenzar buscando qué dispositivo queremos deshabilitar. Podemos hacer esto con 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)

Cambie 1-6 a los puertos de su dispositivo para deshabilitarlos. El puerto a menudo no es lógico (es físico), pero puede obtener una asignación de puerto lsusb -t. Una vez que crees que lo tienes, puedes probarlo con:

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

Esto me da 0402y 5602, proveedores y productos ID para el dispositivo correcto (como se indica en lsusb).

Ahora que lo hemos encontrado, apagarlo es simple:

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

Después de asegurarse de que funciona según lo deseado, haga que cargue cada inicio (por ejemplo, en /etc/rc.local).

Wildneuro
fuente
1
Solución brillante y limpia. ¡Muchas gracias por compartir eso!
AtomHeartFather
1
Esta técnica ya no parece funcionar en 14.10. No existe el archivo "bConfigurationValue", y si se intenta escribir uno como usuario o root, se deniega el permiso.
lisdexia
No entendí lo que significa 'cambiar 1-6 al puerto de su dispositivo'. No pude encontrar un directorio llamado 1-6
surajck
En Ubuntu 14.04, incluso si lo hago echo "0" > /sys/bus/usb/devices/1-6/bConfigurationValuecon sudo, esto no funciona. El valor no permanece allí, el archivo no contiene nada. La cámara web todavía funciona.
soham
Está bien, funciona después de agregarle echo "0" > /sys/bus/usb/devices/1-6/bConfigurationValuelínea /etc/rc.local.
soham
6

@surjack: 1-6depende de su mapeo de puertos. Si escribe lsusb -t, lo obtendrá y luego lo comparará con la salida de lsusb. Para mí obtengo los siguientes resultados:

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. 

y

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

Ahora solo encuentre el Bus correcto que está 04en mi caso porque Acer, Inces la cámara. El mapeo de puertos muestra que la cámara está ubicada en Bus 04.Port 1. Esto significa que en lugar de usar 1-6tengo que usar 4-1. No soy un experto en Linux / Ubuntu, pero esto me da la impresión de que tienes que usar Bus-Porty simplemente usar los números. Si desea estar 100% seguro, use el catcomando como se describe:

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

y compáralo con lsusb.

En mi caso:

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

que es idéntica a la salida lsusb: 5986:0525.

Ahora encontraste tu cámara web interna.

Pero desafortunadamente la lisdexia es correcta y el comando echo no funciona porque sí Permission denied.

¿Hay otra solución disponible?

DamBedEi
fuente
3
sudo -iy más tarde echo "0" > ....
sygi
O biensudo echo "0" > sudo /sys/bus/usb/devices/...
soham
0

Si desea habilitar solo el externo cuando está conectado, pero tiene habilitado el interno si el externo no está conectado, aquí hay un script para eso. Se basa en la respuesta de Wildneuro, pero puede determinar la ruta del dispositivo para usted dada la identificación.

Lo uso porque algunas aplicaciones de las que dependo no parecen ofrecer una manera de elegir fácilmente su cámara preferida. Puede personalizarlo fácilmente con sus propias ID de cámara (desde lsusb).

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

Shimon Rura
fuente
Dado que el contenido de los enlaces puede cambiar, agregue aquí el contenido relevante de la página vinculada.
Chai T. Rex