Cámara Digital con efectos de imagen

From Qi-Hardware
Jump to: navigation, search

Contents

[edit] Calificación

Porcentaje Presentación 20% Informe 30% Funcionamiento 50%
1 Entrega 10% 0.5 0.5 0.5
2 Entrega 30% 1 1 1
3 Entrega 30% 1 1 3


4 Entrega 30% 2 2 2

[edit] Descripción del proyecto

Utilizando la plataforma SIE, que cuenta con el procesador Xburst de ingenic Jz4725 y una FPGA Spartan3E, además de conexiones y puertos de e/s, se planea adaptar un sensor de imagen Toshiba, de 1.3 MP con máxima resolución de 1300x1040 diseñando una tarjeta hija (PCB) con las correspondientes conexiones y elementos adicionales, que se conectará a SIE. Dicho sensor se comunica mediante protocolo I2C, punto que favorece el uso del sensor, pues el procesador JZ4725 incluye un controlador para periféricos que usan este protocolo.

File:Camara.png
Sensor de imagen TCM8240MD

Adicionalmente, en la FPGA se implementará parte del driver para controlar la cámara para tomar fotos y como dispositivo de video(/dev/video). Tanto la imagen original como sus modificaciones podrán verse en la pantalla LCD que incluye SIE. Además, sería posible posteriormente portar aplicaciones en linux (SIE corre GNU/Linux de manera nativa) existentes que utilicen o aprovechen las funcionalidades de un sensor de imagen; queda abierta asimismo la posibilidad de añadir más efectos a la plataforma.

[edit] Hardware

A grandes rasgos, los componentes hardware necesarios para el proyecto son:

  • Plataforma embebida SIE
  • Sensor de imagen CMOS SEN-08668 de Toshiba.
  • PCB tarjeta hija que soporte el sensor y permita comunicación con SIE (Procesador/FPGA)

[edit] Restricciones

  • Para mostrar correctamente la imagen completa en el dispositivo, se utilizará resolución de 320x240 px tanto para la imagen como para el video; siendo así, cada foto ocupa un espacio de (320 * 240 * 16) / (8 * 1024) = 150 kB.

[edit] Esquemáticos

[edit] v1

En los siguientes enlaces pueden verse los esquemáticos del PCB al cual se conecta el sensor. Dicho PCB se conecta a su vez a uno mayor desde el cual se realiza la conexión con SIE.


Los siguientes enlaces proporcionan tanto el esquematico como el pcb de la tarjeta hija el cual fue diseñado empleando kicad, este pcb consta de dos capas, junto con tres pines headers principales, los cuales de arriba a abajo en el PCb son el del teclado matricial de 16 teclas, el que va conectado a la FPGA y el de la cámara. El pin header deoble que aparece en el extremo derecho es el encargado de la comunicación I2C con el procesador, mientras que el otro pin header doble es un jumper que se colocó debido a las restricciones que se presentaron al diseñar el PCB. El que es sólo un pin header es la alimentación de 5V mientras que los pines no utilizados en el arreglo de arriba aparecen porque el elemento con solo 8 pines en una fila no se encontraba en la biblioteca de Kicad, esto se extiende a los pines sobrantes de los otros dos arreglos. Las resistencias que no son superficiales aparecen de manera transitoria ya que no fue posible debido a cruces de caminos colocar resistencias superficiales.



[edit] v2

A continuación se muestra la v2 del esquemático del PCB de la tarjeta hija. Se hicieron modificaciones para lograr un acople directo entre SIE y la tarjeta hija, así como cambio del teclado matricial que se pensó utilizar inicialmente por pulsadores de 6mm. Los archivos del PCB pueden descargarse de aqui(formato kicad)

Esquemático de la tarjeta hija, v2

Algunas capturas del PCB también se muestran: Las capas de Cobre y una vista de la tarjeta completa.

[edit] Software

  • Xilinx ISE web pack: Simulación y síntesis del módulo en HDL, implementable en la FPGA.
  • Kicad GPL PCB suite : Diseño del PCB
  • Icarus Verilog: Simulación de código HDL
  • Xc3sprog: Utilidad para programar la FPGA desde consola en linux [1].

[edit] División de tareas

Dado que la idea es realizar operaciones tanto en software (procesador) como en hardware(FPGA), a continuación se muestra la división de tareas seleccionada en el proyecto:

[edit] Tareas software

  1. Interfaz sensor-SIE: Driver de la cámara con la configuración que se transmite mediante I2C.
  2. Flujo de datos procesador(GNU/Linux) - FPGA(Módulos de procesamiento de la imagen).
  3. COntrol LCD de SIE, para mostrar la imagen capturada, y la imagen procesada.
  4. Almacenamiento de la imagen en la NAND o en una MMC(microSD).

[edit] Tareas hardware

  1. Manejo / Driver teclado matricial para interfaz cámara/usuario, se han pensado implementar alrededor de 6 botones.
  2. Interfaz sensor/SIE, que permita utilizarlo como dispositivo de video.

[edit] Diagrama de Bloques

En la figura se muestra el diagrama de bloques general del dispositivo, modificación del diagrama general de SIE, agregando los módulos concretos de la cámara.

SIE+camera.svg

[edit] Comunicación entre el procesador y la FPGA

Como en este proyecto se necesitan dos periféricos, teclado matricial y sensor CMOs, al analizar lo que se necesita para el control de estos, se ve que dado que en un primer momento se va a intentar configurar el puerto I2c directamente desde el procesador, no se necesita la para de la comunicación encargada del proceso de escrituta entre el procesador y la FPGA, incluyendo el generador del pulso de escritura. Mientras que el ciclo de lectura especificado en la imagen, se componen de un Address decoder encargado por medio de los dos bits mas significativos de la dirección, escoger el dispositivo del cual se quiere leer. El dispositivo PIC genera la señal de IRQ que selecciona en un multiplexor de cual dispositivo se esta generando la interrupción, lo que indica que este está solicitando una operación de lectura. La señal de ncs2 es la que activa todo el proceso de lectura de los periféricos.

Comunicación procesador y FPGA

[edit] Drivers

Para lograr un correcto funcionamiento del sensor como dispositivo de video en SIE, que corre la distribución de GUN/linux OpenWRT, el driver se divide en dos secciones: Una parte SW, que reconoce el dispositivo al ser conectado, lo detecta como un sensor de imagen y permite utilizarlo en el espacio de usuario; y una parte HW, en la cual se adecúan las señales necesarias provenientes del sensor para su conexión con SIE. Los códigos respectivos se encuentran en códigos camara sie.

[edit] Soft Drivers

[edit] I2C drivers

Es una modificación del driver genérico I2C para el procesador ingenic JZ47xx; los archivos originales se encuentra en drivers I2C JZ47xx . En conjunto para que el protocolo I2C sea utilizable y puedan conectarse periféricos que lo utilicen, son necesarios varios drivers, como se describe a continuación.

[edit] i2c-core.c

Como su nombre indica, es la base de los drivers que dan soporte al protocolo i2c en GNU/linux; en él se implementan varias rutinas y funciones principales de configuración de dispositivos, transferencia de datos y algunas pruebas. Este archivo (driver) es utilizado como base por el driver específico para el hardware, en este caso el i2c-jz47xx.c que utiliza algunas funciones que se definen aquí, como i2c_add_numbered_adapter() o i2c_del_adapter() que montan y desmontan, respectivamente, un adaptador que utiliza i2c.

[edit] i2c-jz47xx.c

Este es el driver del bus (bus driver), en el cual se crea una estructura correspondiente a la arquitectura en hardware que da el soporte i2c, en este caso el procesador JZ4725, e implementa funciones relacionadas con la detección, la adición y remoción de dispositivos que puedan estar presentes en el sistema. Aquí también se hace una revisión de las funciones I2C y SMbus soportadas mediante la función llamada i2c_get_functionality() y se prueba cada dispositivo antes de montarlo.

[edit] i2c-dev.c

Este driver se utiliza para permitir acceder a dispositivos I2C desde espacio de usuario, de lo contrario las funciones quedarían limitadas al espacio de kernel(bajo nivel). Se necesita porque la cámara se comunica con I2C, a excepción de los datos de la imagen que se envían por separado, pero por ejemplo, acciones como tomar una foto, o empezar a grabar(fotos sucesivas a 15 fps, valor máximo del sensor) se indican desde el programa que se ejecuta en espacio de usuario.

  • Según se explica en git kernel i2c dev interface, los dispositivos I2C se manejan con un driver tipo caracter con major device number 89.
  • Al hacer la compilación del driver, se debe utilizar el parametro '-O', debido a las funciones internas que utiliza.

Respecto a la implementación del driver, es útil observar los apuntes mencionados en Linus kernel tree, en la documentación de i2c:


 Implementation details
173 ======================
174
175 For the interested, here's the code flow which happens inside the kernel
176 when you use the /dev interface to I2C:
177
178 1* Your program opens /dev/i2c-N and calls ioctl() on it, as described in
179 section "C example" above.
180
181 2* These open() and ioctl() calls are handled by the i2c-dev kernel
182 driver: see i2c-dev.c:i2cdev_open() and i2c-dev.c:i2cdev_ioctl(),
183 respectively. You can think of i2c-dev as a generic I2C chip driver
184 that can be programmed from user-space.
185
186 3* Some ioctl() calls are for administrative tasks and are handled by
187 i2c-dev directly. Examples include I2C_SLAVE (set the address of the
188 device you want to access) and I2C_PEC (enable or disable SMBus error
189 checking on future transactions.)
190
191 4* Other ioctl() calls are converted to in-kernel function calls by
192 i2c-dev. Examples include I2C_FUNCS, which queries the I2C adapter
193 functionality using i2c.h:i2c_get_functionality(), and I2C_SMBUS, which
194 performs an SMBus transaction using i2c-core.c:i2c_smbus_xfer().
195
196 The i2c-dev driver is responsible for checking all the parameters that
197 come from user-space for validity. After this point, there is no
198 difference between these calls that came from user-space through i2c-dev
199 and calls that would have been performed by kernel I2C chip drivers
200 directly. This means that I2C bus drivers don't need to implement
201 anything special to support access from user-space.
202
203 5* These i2c-core.c/i2c.h functions are wrappers to the actual
204 implementation of your I2C bus driver. Each adapter must declare
205 callback functions implementing these standard calls.
206 i2c.h:i2c_get_functionality() calls i2c_adapter.algo->functionality(),
207 while i2c-core.c:i2c_smbus_xfer() calls either
208 adapter.algo->smbus_xfer() if it is implemented, or if not,
209 i2c-core.c:i2c_smbus_xfer_emulated() which in turn calls
210 i2c_adapter.algo->master_xfer().
211
212 After your I2C bus driver has processed these requests, execution runs
213 up the call chain, with almost no processing done, except by i2c-dev to
214 package the returned data, if any, in suitable format for the ioctl. 
[edit] i2c.h, jz4740.h

Estos son archivos que definen valores de funciones y registros que se utilizan en los drivers, como i2c-jz47xx y en el i2c-core. Permiten que los drivers trabajen con prototipos sin valores específicos de clientes o dispositivos, los cuales se definen desde espacio de usuario, al realizar la respectiva configuración. Específicamente el archivo jz4740.h define valores no solo referentes a i2c sino varios registros sobre el procesador en general, y sus demás módulos.

[edit] otros headers

Además de los mencionados anteriormente son necesarios varios archivos adicionales que definen algunas estructuras prototipo, funciones y constantes, empleadas por los archivos de los drivers para el protocolo I2C. Algunos de estos archivos se refieren a dicho protocolo únicamente, y otros son archivos del sistema operativo en general, que son necesarios pues el driver forma parte de un sistema más complejo.

[edit] Sensor Driver

Permite identificar el sensor como una cámara y acceder a él desde espacio de usuario. Se encarga de la gestión de los datos de la imagen que envía la cámara en paquetes de 8 bits, y se procesan el la parte HW del driver.

[edit] HW driver

Se implementa en la FPGA y se encarga de recibir los datos que envía la cámara y ..

[edit] Cronograma de trabajo

En la figura adjunta se muestra un diagrama de Gantt con las tareas a realizar y el tiempo estimado del proyecto.

Diagrama de Gantt del proyecto.

[edit] Referencias

  1. I2C, kernel GIT.
  2. I2C Drivers, part I. By Greg Kroah-Hartman
Personal tools
Namespaces
Variants
Actions
Navigation
interactive
Toolbox
Print/export