====== Userspace Driver para ATI TV Card ====== ===== Integrantes ===== Guido Armas González\\ Lennon Núñez Meoño\\ Heberth Valverde Gardela\\ ===== Introducción ===== 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.\\ ==== EasyCap USB007 ==== {{ :ie0117_proyectos_i_2014:easycap.jpg?nolink&200 |}} 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. ==== ATI TV Wonder HD750 ==== {{:ie0117_proyectos_i_2014:7_thumb.jpg?nolink&200 |}} 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 {{ :ie0117_proyectos_i_2014:images.jpg?nolink&200|}} 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.\\ \\ \\ ===== Objetivo General ===== Implementar un userspace driver con soporte en Linux para un ATI TV Wonder HD 750 \\ ===== Objetivos especificos ===== ==== Primera parte ==== * Instalar la maquina virtual VirtualBox con la distribucion de Linux, Debian * Instalacion de Wireshark y comprender su funcionamiento * Revisar el protocolo de comunicacion del driver en Windows del ATI TV * Correr EasyCAP con entrada de video y/o audio * Realizar sniffing con Wireshark al driver para Windows del ATI TV ==== Segunda parte ==== * Realizar un diagrama de flujo que explique cómo funciona el programa controlador del EasyCAP * Realizar la ingeniería reversa al protocolo de comunicación del driver en Windows del ATI TV * Realizar un diagrama de bloques de la estructura de datos del protocolo de comunicación del ATI TV ===== Instalacion de la maquina virtual (VirtualBox) ===== 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 \\ {{ ie0117_proyectos_i_2014:virtualbox_logo.jpg }} \\ ==== Instrucciones de Instalación de Debian ==== Para la instalación de Debian, seguir los pasos de la siguiente documentación [[https://wiki.arcoslab.eie.ucr.ac.cr/doku.php/ie0117:experimento_1|Instalación de Debian Unstable]] \\ ===== Instrucciones de Instalación, información y análisis del EasyCAP sobre Wireshark ===== {{ ie0117_proyectos_i_2014:wireshark-logo.png }} \\ 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 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. ===== Instrucciones de Instalación para el funcionamiento del Easycap usb007 ===== ==== Configuracion de Video For Linux 2 ==== === Instalar dependencias === **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 === Configuración del usb007 EasyCAP === **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. === Funcionamiento EasyCAP === Para probar el correcto funcionamiento del EasyCAP se conectó una cámara digital a la entrada de video, interactuando con MPlayer y VLC.\\ == Paquetes de interacción USBTV007 == {{ :ie0117_proyectos_i_2014:snapshot2.png?nolink&300 |}} == VLC == Mensajes en consola de interacción con VLC.\\ {{ :ie0117_proyectos_i_2014:snapshot5.png?nolink&300 |}} Ventana de video.\\ {{ :ie0117_proyectos_i_2014:snapshot4.png?nolink&300 |}} == MPlayer == Mensajes en consola de interacción con MPlayer.\\ {{ :ie0117_proyectos_i_2014:snapshot9.png?nolink&300 |}} Ventana de video MPlayer.\\ {{ :ie0117_proyectos_i_2014:snapshot8.png?nolink&300 |}} 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.\\ ===== Cambios al programa controlador del EasyCAP para realizar el driver del ATI TV ===== ==== Programa: easycap_utv007.py ==== 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 ==== Programa: protocol.py ==== 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ó ==== Programa: utv007_driver.py ==== 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. ===== Estructura Paquetes de Datos USB ===== 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.\\ ==== Header ==== === Sync Packet === Conjunto de 8 bits cuya función es mantener una adecuada sincronización entre el dispositivo conectado y el puerto al cual se conecta. === Packet Identifier === 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. === Address Field === 7 bits designados para el direccionamiento de las funciones. Se usa junto al Endpoint. === Endpoint Field === 4 bits que indican el Endpoint utilizado en el paquete. ==== Payload ==== === Data Field === 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. ==== Trailer ==== === Cyclic Redundancy Check (CRC) === 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. === End of Packet === 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) ===== Tipos de Paquetes USB ===== ==== Token Packets ==== 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". ==== Data Packets ==== 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. ==== Handshake Packets ==== Usados para iniciar con la transmisión de datos y para indicar la situación de la transacción de datos. ==== Start of Frame Packets (SOP) ==== 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. ===== Ingeniería Reversa al Protocolo de Comunicación del ATI TV Wonder 750 HD ===== 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. ===== Referencias ===== Información general\\ * Bauche, D. 2005, Mayo. Ingeniería Inversa en Linux. Guadalajara, Mexico. Recuperado de\\ http://brainoverflow.org/misc/Ingenieria_Inversa_en_Linux_Diego_Bauche_Madero_DIIL.pdf\\ * Lancho, J. 2010, Septiembre. Linux Legal. Linux Magazine, 64. pp. 90-91 Recuperado de\\ https://www.linux-magazine.es/issue/64/090-091_LegalLM64.pdf\\ Módulo del EasyCAP para Linux\\ * Ruiz, F. 2013. usbtv007: Userspace test driver for the Easycap usbtv video capture adapters. Recuperado de\\ https://github.com/memeruiz/usbtv007\\ * http://www.diamondmm.com/tvw750usb-diamond-hd-usb-tv-tuner.html\\ Documentación útil para el EasyCAP y de como hacerlo funcionar * http://www.linuxtv.org/wiki/index.php/Easycap\\ * https://wiki.debian.org/ModuleAssistant\\ * https://www.kernel.org/doc/Documentation/usb/usbmon.txt\\ Transferencia de datos, protocolo USB\\ * http://www.beyondlogic.org/usbnutshell/usb1.shtml#Introduction\\ * http://www.jungo.com/st/support/documentation/windriver/10.2.0/wdusb_manual.mhtml/USB_data_transfer_types.html\\ * http://mspdebug.sourceforge.net/usb.html\\ \\