User Tools

Site Tools


Writing /var/lib/dokuwiki/data/meta/teaching/ie0117/proyectos/2014/i/userspace_driver_for_ati_tv_wonder_750_hd.meta failed
teaching:ie0117:proyectos:2014:i:userspace_driver_for_ati_tv_wonder_750_hd

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

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

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.


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

virtualbox_logo.jpg

Instrucciones de Instalación de Debian

Para la instalación de Debian, seguir los pasos de la siguiente documentación Instalación de Debian Unstable

Instrucciones de Instalación, información y análisis del EasyCAP sobre Wireshark


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.

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

VLC

Mensajes en consola de interacción con VLC.
Ventana de video.

MPlayer

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.

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.

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

Módulo del EasyCAP para Linux

Documentación útil para el EasyCAP y de como hacerlo funcionar

Transferencia de datos, protocolo USB


teaching/ie0117/proyectos/2014/i/userspace_driver_for_ati_tv_wonder_750_hd.txt · Last modified: 2022/09/20 00:08 (external edit)