Guido Armas González
Lennon Núñez Meoño
Heberth Valverde Gardela
En los sistemas basados en Linux, la interacción entre dispositivos y computador lo realizan los comandos del espacio kernel. Los módulos de kernel son fragmentos de código (instrucciones) que le indican al sistema que tareas realizar. El lenguaje de programación más común sobre el que se desarrollan módulos es C. Estos módulos se pueden cargar al sistema y compilarlos para dar soporte a cierto dispositivo. En Linux, los módulos que se cargan cuando se inicia el sistema se encuentran en el directorio /lib/modules, por lo que si se desean agregar módulos y que estos cargen automáticamente al iniciar el sistema se deben colocar en esta dirección. Los módulos pueden ser tipo fs (filesystem) o net (network).
Los módulos pueden ser de espacio usuario o de kernel. En el espacio kernel se encuentran los drivers que se encargan de manejar los recursos de la máquina y ofrecen al usuario una interfaz fácil de usar para programación. En el espacio usuario, se encuentran las aplicaciones con las que todo usuario se comunica, como lo son los editores de texto, reproductores de video, la consola, etc. Estas aplicaciones interactúan con el computador, pero no de una manera directa, lo hacen por medio de funciones localizadas en el espacio kernel. El driver que se realizará del ATI TV Card es un driver de espacio usuario, con soporte en sistemas basados en Linux ya que actualmente solo hay soporte para este en Windows.
El EasyCAP es un dispositivo genérico que permite conectar al computador cualquier dispositivo de video con conector RCA o S-video, lo cual permite por ejemplo quemar un video en formato VHS a DVD, además de que incluye Dynno Video Streaming Editing y Burning Software para editar el video.
El ATI TV Wonder HD 750 es un dispositivo que captura señales de audio y video y, además se puede implementar para grabar audio y video, sin mencionar que permite
sintonizar frecuencias de ondas de radio. Su control se facilita mediante el uso de una interfaz gráfica incluida con el producto. Otra alternativa para Windows es el uso de Windows Media Center.
Este dispositivo actualmente carece de soporte para Linux, por lo que se busca desarrollar un driver en espacio usuario para el ATI TV al tomar como base el driver del kernel del EasyCAP.
Implementar un userspace driver con soporte en Linux para un ATI TV Wonder HD 750
Para el proyecto se trabajará en una máquina virtual, se usará VirtualBox. Para instalarlo, desde la consola, descargue el paquete
sudo apt-get install virtualbox
Luego, abrir el programa y saldrá la siguiente pantalla
(poner img1)
Dar click en Next, luego dar un nombre a la máquina virtual, en Type, elegir Linux y en Version, elegir Debian 32 o 64 bits, dependiendo de la arquitectura de su computador (poner img2)
Luego, elegir una cantidad de memoria RAM para dedicar a la máquina virtual. Posterior a esto, elegir la opción Create virtual hard drive, luego elegir VDI (virtualbox disk image) y después, elegir Dinammically Allocated y luego de esto, se podrá instalar Debian, teniendo previamente un archivo iso de este
Para la instalación de Debian, seguir los pasos de la siguiente documentación Instalación de Debian Unstable
Para este proyecto, se usará el programa Wireshark como interfaz para analizar los protocolos de comunicacion USB entre la máquina y el EasyCAP para obtener la información necesaria para la elaboración del driver. Para instalar Wireshark, desde la consola de Debian, descargar Wireshark:
sudo apt-get install wireshark
Cuando se abra Wireshark, no se podrán capturar protocolos de interfaces por la configuración del programa, por lo tanto, se deben dar los permisos de superusuario al programa. Para eso se reconfigurarán los permisos de Wireshark:
sudo dpkg-reconfigure wireshark-common
Con lo cual, los miembros del grupo Wireshark pueden utilizar el programa con permisos de root, entonces se deberá agregar el usuario que se está usando al grupo Wireshark:
sudo adduser <usuario> wireshark
Ahora, para poder capturar paquetes de dispositivos con protocolo de comunicación USB como un mouse, celulares, incluso el EasyCAP, se ocupa una función para “conectar” datos enviados por USB y los paquetes de respuesta del computador, algo similar a un “network socket”. Por lo tanto, se usará el paquete usbmon. Esta herramienta permite reportar sobre solicitudes de comunicación que envía el dispositivo conectado mediante USB al controlador de la computadora. Para usar usbmon, hay que prepararlo (correr los siguientes comandos como root o con “sudo”):
mount -t debugfs none_debugs /sys/kernel/debug
y cargar el módulo al kernel:
modprobe usbmon
Para verificar que la comunicación está establecida, revisar que los “sockets” de USB estén presentes, (continuar con permisos de superusuario):
ls /sys/kernel/debug/usb/usbmon
y debería aparecer información similar a la siguiente:
0s 0u 1s 1t 1u 2s 2t 2u 3s 3t 3u 4s 4t 4u
Estos son los sockets disponibles, y donde el “0u” es el que captura los paquetes de todos los puertos. Una vez hecho esto, está todo listo para iniciar el análisis de protocolo de comunicación USB usando Wireshark.
NOTA: Se requiere permisos de root o sudo para poder analizar con wireshark
En el análisis del protocolo de comunicación del EasyCAP, se usan los protocolos USB y USBMS para todo el intercambio de datos en los buses del computador. Primeramente, se hacen pedidos de ingreso a la computadora, y la computadora responde pidiendo información del dispositivo USB.
Luego, se da el tipo de transferencia de Control para darle soporte a las configuraciones y todo tipo de operaciones provenientes del USB. Luego, el proceso SCSI (small computer system interface) que, durante el intercambio de información, va a estar pidiendo y revisando aspectos como que la unidad esté lista para usar, revisar su capacidad antes de realizar alguna transferencia de información, estar preparada para una interrupción inesperada, etc.
Luego se lleva a cabo el proceso Bulk, cuando se pone en funcionamiento el EasyCAP, ya que se manda gran cantidad de información a la computadora y se ocupa aprovechar todo el “ancho de banda” que posea el proceso en ese momento, para dar el mejor rendimiento. La transferencia Bulk se da en dos fases. La fase Bulk Out pide datos como la dirección de envío de información, mediante la secuencia de bits llamada “bmRequestType” y a su vez crea un EndPoint (nodo de información) el cual tiene una dirección que se guarda ya que será la dirección usada para el retorno de los datos pedidos, acción realizada en la otra fase del intercambio Bulk. Esta fase, Bulk In, devuelve la información de la dirección del envío y la dirección del endpoint hacia donde se mandarán los datos.
Finalmente, al desconectar el EasyCAP de la computadora, Wireshark indica que hay un fallo en la respuesta del dispositivo, debido a que este se ha desconectado. Entonces, ahí termina el intercambio de datos entre puerto USB y máquina.
Actualizar los repositorios del sistema
Primero se deberá actualizar los repositorios del sistema para evitar paquetes desactualizados (Se requiere permisos de root o sudo):
aptitude update
Instalar las depencias de v4l2loopback
aptitude install linux-headers-$(uname -r) module assistant aptitude install v4l2loopback-source
Preparar el módulo Video for linux 2 loopback (v4l2):
hay que instalar y compilar module-assistant (herramienta para preparar en entorno de construcción del kernel) para preparar el modulo v4l2 e instalar posteriomente el módulo v4l2loopback-source
apt-get install module-assistant m-a prepare m-a update m-a a-i v4l2loopback-source
Una vez instalado el módulo, se debe cargar al kernel, ya que es un kernel driver, para esto se usará modprobe
, que es un comando de administración del sistema en Linux hecho para la gestión de módulos cargables al kernel
modprobe v4l2loopback
Para corroborar que se cargó el módulo, usamos el comando lsmod
que enlista los módulos de la computadora, y buscamos v4l2loopback
lsmod | grep v4l2loopback
En la pantalla debería aparecer la siguiente información (datos numéricos pueden variar):
v4l2loopback 26526 1 videodev 90856 5 usbtv, v4l2loopback, v4l2_common,videobuf2_core
Se procede a encontrar el nodo de video correspondiente al EasyCAP (el EasyCAP debe estar conectado a algùn puerto USB)
ls /dev/video*
Para evitar realizar los procedimientos anteriores cada vez que se reinicia el sistema, agregue v4l2 a los módulos de la computadora para que se carge automaticamente al iniciar el sistema, para esto hay que logearse como root
sudo -i echo “v4l2loopback” >> /etc/modules
Y se reinicia el equipo para guardar los cambios
reboot
Instalar dependencias
Para los siguientes comandos es necesario tener los privilegios de root o sudo:
git clone git://github.com/vpelletier/python-libusb1.git
Entramos a la nueva carpeta python-libusb1/ e ingresamos los siguientes comandos:
python setup.py install apt-get install python-setuptools easy_install v4l2 apt-get install python-numpy apt-get install python-imaging
Descargar userspace test driver for the Easycap usbtv007
Disponible en http://github.com/memeruiz/usbtv007
git clone git://github.com/memeruiz/usbtv007.git
Para el siguiente código debemos ingresar al directorio usbtv007
./utv007_driver.py -d /dev/video1
Descargar la aplicación para mostrar la salida del EasyCAP
sudo apt-get install mplayer mplayer tv:// -tv device=/dev/video1
También se puede usar otro reproductor de video y montarlo gráficamente, por ejemplo VLC:
sudo apt-get install vlc vlc
En VLC media player ir a “Media”, seleccionar “Open Capture Device”, en “Capture mode” seleccionar “TV – analog” y en “Device name” elegir la ubicacion donde se encuentra el dispositivo, en nuestro caso “/dev/video1”. Ademas escoger “NTSC” en la opcion “Video standard”. Luego ya se puede correr el video.
Para probar el correcto funcionamiento del EasyCAP se conectó una cámara digital a la entrada de video, interactuando con MPlayer y VLC.
Mensajes en consola de interacción con VLC.
Ventana de video.
Mensajes en consola de interacción con MPlayer.
Ventana de video MPlayer.
Nota: las advertencias (“warnings”) que aparecen en la consola informan que no es posible cambiar el tamaño de la ventana de video, al ponerla en modo pantalla completa se traba y deja de funcionar, y que no se encuentra audio, ambos son limitaciones del presente driver para el EasyCAP.
Se debe cambiar los códigos idVendor y idProduct de acuerdo a los asignados para el ATI TV, para eso, se usa el comando lsusb en consola. Es necesario cambiar esos codigos de acceso ya que el programa posteriormente busca esos códigos y se asegura que sean los del dispositivo correcto, con el fin de asegurarse de que no ocurran errores en el programa por incompatibilidad
De este programa, se tiene que modificar los paquetes escritos en las listas. Por ejemplo, en la clase del easycap007, se llaman a las tuplas preinit e init, las cuales contienen los paquetes que se usan durante el inicio de los protocolos de comunicación en Windows. Para Linux, se descubrió que se usan los mismos paquetes, excepto que cambia el endpoint de la transferencia isócrona ya que el nuevo será 0x81.
Posteriormente, se pide acceso a los datos de una lista de búfer. Esa lista es compuesta por los primeros 4 bytes de informacion del paquete de información isócrono.
Por último, se necesita cambiar el tipo de transferencia que se da en el protocolo, donde crvw es la transferencia Isócrona y cwrd es Interrupt. Las letra c representa transferencia de tipo Control, w representa escritura, y v video.
Cuando se corre el programa con el ATI TV conectado, se muestra en error cuando se ejecuta el driver, en la inicialización del dispositivo. Dicho problema proviene de protocol.py, en la inicialización (preinit, init) en la cual el endpoint es diferente para EasyCAP y ATI TV. Por lo tanto se cambió dicho dato pero no funcionó
Este programa simplemente importa la clase de protocolo y easycap007 y llama a los métodos de estas, para inicializar el EasyCAP con su respectivo nodo de video, función y estado.
Los paquetes de datos que se reciben por medio de un puerto USB tienen una estructura estandarizada que permite un fácil ensamblaje del dispositivo conectado.
Conjunto de 8 bits cuya función es mantener una adecuada sincronización entre el dispositivo conectado y el puerto al cual se conecta.
Se conforma de 4 bits de datos de identificación especíifica del dispositivo como idVendor, idProduct, Endpoints, entre otros, y otros 4 bits “extra” de identificación complementaria.
7 bits designados para el direccionamiento de las funciones. Se usa junto al Endpoint.
4 bits que indican el Endpoint utilizado en el paquete.
Paquete de entre 0 y 8192 bits (1024 bytes) de información o datos “útiles” de la transmisión. En una transmisión de tipo Isocrónica suelen ser paquetes de 1024 bytes.
Usada para corrección de errores en la transmisión. Existen dos: el primero es de 5 bits y se usa con los “token packets” y el “frame packet”. El segundo es de 16 bits y se emplea con la data.
Conjunto de bits que marca el final del paquete con 2 bits para un cero (SE0) y otro para una J (equivalente a 1 bit)
Se conforma de la información específica de la identificación del dispositivo (idVendor, idProducto, distribution, Type Product, Request Type). Se utilizan para iniciar con el “Handshake”.
Son los paquetes con bytes de datos de la transmisión referentes a los contenidos brutos que el driver se encarga de transformar y redireccionar a otro software que les usará para alguna función, por ejemplo los datos de imagen que se transformaran a un ISO de video para poder ser leídos por un programa de reproducción de video.
Usados para iniciar con la transmisión de datos y para indicar la situación de la transacción de datos.
Indica cuando comienza un “frame”, con lo que ayuda a que se de una adecuada sincronización de la transmisión. Se envía cada ims en un puerto full speed USB y cada 257us en un high-speed USB.
Cuando se conecta el dispositivo comienza el Handshake, el driver principal lee la información específica del dispositivopaso se utilizan losToken Packets y los protocolos init y pre-init ddel driver. El dispositivo es identificado como una tarjeta compuesta ATI de video con el idProduct: ac14, y el idVendor: 0438. Para estos procesos utiliza transmisión Bulk/Transfer, enviando 12 data bytes (60 03 00 20 04 00 00 80 9F FC FF DF) y recibiendo de ellos 4 (20 00 20 40), indicando que se puede proceder con los siguientes paquetes. Se procede a recibir paquetes por medio de una transferencia isocrónica (Isochronus Transfer), con paquetes de 1024 bytes, de los cuales al eliminar los headers, los CRC y End of Packet quedan 960 bytes de datos de imagen. Cada cierto tiempo aparecen nuevamente los Bulk/Interrupt, siendo estos los Handshake Packets para asegurarse que la transmisión es contínua y permitir corrección de errores de haberlos.
Información general
Módulo del EasyCAP para Linux
Documentación útil para el EasyCAP y de como hacerlo funcionar
Transferencia de datos, protocolo USB