Academico/Embebidos/IrDA SIE
Sistemas Embebidos 2011-I - Universidad Nacional de Colombia sede Bogotá
Integrantes Grupo de trabajo:
Alejandra María Reyes Villamil 261501
Carolina Peña Morales 261494
Leonardo Muñoz Muñoz 261565
Contents |
Descripción Proyecto
El objetivo del proyecto IrDA SIE consiste en establecer la comunicación bidireccional entre un PC y la tarjeta de desarrollo SIE a través del protocolo utilizado en dispositivos Infrarrojo.
Infrared Data Association (IrDA)
Los rayos infrarrojos, son ondas que se encuentran entre la region visible y las microondas, en el espectro electromagnético. Entre sus aplicaciones más comunes se encuentra, la comunicación de datos punto a punto. El IrDA ha definido las normas que rigen la comunicación inalámbrica entre dos dispositivos en los que la información se transmite utilizando la luz infrarroja; el estándar IrDA es un conjunto de especificaciones que provee un estandar universal para la comunicación inalámbrica de datos de dos vías mediante infrarrojos, con base en un costo práctico y un modelo de usuario de corto alcance y conexiones punto a punto. La norma define las características físicas de la interfaz, los protocolos de comunicación para diferentes necesidades, y las velocidades de transmisión en la que se comunica el dispositivo de infrarrojos.
Los dos aspectos básicos de las normas de la comunicación por infrarrojos son:
- IrDA-Data: define el estándar para la transmisión de datos inalámbrica de dos vías por infrarrojos entre dos dispositivos y consiste en un conjunto de protocolos obligatorios: IrPHY, IrLAP y IrLMP.
- IrDA-Control: es el estándar de infrarrojos que permite a los periféricos inalámbricos (teclados, ratones, game pads, joysticks, entre otros) interactuar con muchos tipos de dispositivos hots (Computadores, electrodomésticos, consolas de juegos y TV, dispositivos de audio, entre otros). IrDA-Control tiene su propio conjunto de protocolos obligatorios: IrPHY, MAC (Media Access Control) y LLC (Logical Link Control).
La tecnología IrDA se ha convertido en una de las soluciones inalámbricas más prometedoras, ya que ofrece varias ventajas convincentes sobre otros tipos de interfaces de comunicación inalámbrica; a pesar de que los infrarrojos sólo es aplicable entre dos dispositivos a la vez y no puede transmitir a través de paredes, los aspectos positivos de esta tecnología son muchos.
Hay dos tipos de comunicación por medio de IR: Standard IR (SIR) que suporta una velocidad de transferencia de 115.2 Kbps y Fast IR (FIR) el cual alcanza una velocidad de 4Mbps. En este caso utilizaremos el tipo de conexión SIR, porque vamos a manejar el módulo transceptor TFDU4101, el cual funciona con dicho tipo de comunicación.
La figura muestra una conexión IR en un SoC embebido, teniendo un dongle IR conectado a un sistema UART.
En la imagen se puede ver como se conecta IR en el computador. En la opción de UART1 en el super I/O esta habilitado IR y el transceptor directamente. En la opción UART0, los computadores que no tienen soporte IR dependen de un dongle externo.
Estructura
En IrDA se define una organización en capas:
Cualquier dispositivo que quiera obtener la conformidad de IRDA ha de cumplir los protocolos obligatorios (azul), no obstante puede omitir alguno o todos los protocolos opcionales (verde).
IrPHY
El IrPHY (Infrared Physical Layer Specification) es el primer (el más bajo) nivel de las especificaciones IrDA, las características más importantes son:
- Rango:
- Estándar: 1 m
- Baja Potencia - Baja Potencia: 0,2 m
- Estándar - Baja Potencia: 0,3 m
- Ángulo: Cono de ±15° mínimo
- Velocidad: 2,4 kbit/s hasta 1 Gbit/s
- Longitud de onda: 875 ± 30 nm
IrDA define cuatro clases de enlaces infrarrojos para las diferentes tasas de datos:
- Serial Infrared (SIR): Soporta velocidades por encima de 115.2 Kbps.
- Medium Infrared (MIR): Soporta tasas de datos entre 0.576 Mbps y 1.152 Mbps.
- Fast Infrared (FIR): Soporta una tasa de datos de 4.0 Mbps.
- Very Fast Infrared (VFIR): Soporta una velocidad de 115.2 Kbps a 14.0 Mbps.
IrLAP
IrLAP (infrarrojos Vincular Access Protocol) es el segundo nivel de las especificaciones IrDA, representa la capa de enlace de datos del modelo OSI (Open Systems Interconnection). Las especificaciones más importantes son:
- Control de acceso
- El descubrimiento de los compañeros de comunicación posibles
- El establecimiento de una conexión bidireccional confiable
- La distribución de las funciones del dispositivo primaria / secundaria
- Negociación de los parámetros de calidad de servicio
En la capa IrLAP los dispositivos de comunicación se dividen en un dispositivo de primaria y uno o más dispositivos secundarios. El dispositivo primario controla los dispositivos secundarios. Sólo si las solicitudes de envio de datos entre dispositivos entán habilitadas.
IrLMP
IrLMP (Infrared Link Management Protocol) es la tercera capa de las especificaciones IrDA, se puede dividir de la siguiente forma:
- LM-MUX (Link Management Multiplexer): que se encuentra en la parte superior de la capa de IrLAP y sus características más importantes son:
- Proporcionar múltiples canales lógicos
- Permitir el cambio de primario/secundario en los dispositivos
- LM-IAS (Link Management Information Access Service), que proporciona una lista, donde los proveedores de servicios pueden registrar sus servicios para que otros dispositivos puedan acceder a estos servicios consultando la LM-IAS.
Tiny TP
Tiny TP (Tiny Transport Protocol) se encuentra en la parte superior de la capa de IrLMP y proporciona lo siguiente:
- El transporte de mensajes de gran tamaño por SAR (Segmentation and Reassembly)
- Control de flujo, dando créditos a todos los canales lógicos
IrCOMM
La opción IrCOMM (Infrared Communications Protocol) permite al dispositivo de infrarrojos actuar de forma serial o paralela.
OBEX
La opción OBEX (Object Exchange) posibilita el intercambio de datos arbitrarios (por ejemplo, vCard , vCalendar o incluso aplicaciones) entre dispositivos infrarrojos; se encuentra en la parte superior del protocolo Tiny TP, por lo que Tiny TP es obligatorio para que OBEX pueda trabajar.
IrLAN
La opción IrLAN (Infrared Local Area Network) ofrece la posibilidad de conectar un dispositivo de infrarrojos a una red de área local; hay tres métodos posibles:
- Punto de Acceso
- P2P
- Hosted
Como IrLAN se encuentra en la parte superior del protocolo Tiny TP, el protocolo de Tiny TP debe se implementado para que IrLAN funcione.
Particionamiento de Tareas
Hardware
La parte Hardware del proyecto estaría ubicada en la primera etapa del desarrollo IrDA, es decir, en la capa de IrPHY.
En este diagrama se muestra brevemente como será la interfaz hardware para la comunicación IrDA entre la SIE. En este proyecto utilizaremos el CI (Circuito Integrado) TIR1000 de Texas Instruments (TI) el cual es un encodificador-decodificador independiente cuya comunicación es por medio de interfaz UART y soporta una velocidad de transmisión entre 1200 bps a los 115.2 kbps la cual corresponde a un dispositivo SIR. Este dispositivo se conectará directamente con el CI MAX3223E también de TI presente en la tarjeta de desarrollo SIE. En la parte opto-electrónica se utilizará el modulo TFDU4101 de Vishay el cual ya contiene la etapa de amplificación de la señal recibida y el control de emisión de la señal transmitida, con bajo consumo de potencia. A continuación se muestra el diagrama de bloques de el TFDU4101 proporcionado por el fabricante:
Para la interfaz de usuario se utilizaran 6 pulsadores los cuales tendrán funciones de navegación por la interfaz Software que se desarrolle y acceder a opciones tales como enviar y recibir archivos; estos pulsadores tendrán un modulo de control implementado en la FPGA la cual se conectará con el procesador Ingenic JZ4725 presente en la SIE.
Para poder cumplir con la frecuencia que requiere el TIR100 fue necesario realizar un divisor de frecuencia, que fuera 16 veces mayor que la frecuencia de transmisión del protocolo.
OBSERVACIONES
Debido a una carateristica de funcionamiento, el TFDU4101 permanece en estado 'echo', estado que no pudimos cambiar y por lo tanto al hacer el descubrimiento, el de reconoce a si mismo y no permite que otros dispositivos lo reconozcan. Ese comportamiento lo podemos visualizar en la siguiente imagen, en la que se ve como la direccion del receptor y del transmisor es la misma, por causa de lo que anteriormente explicamos.
Esto nos lleva a la conclusion que el protocolo del IrDA si esta bien montado y que los drivers si son los adecuados para este dispositivo.
Software
Los dongles son dispositivos que se pueden conectar en puertos seriales o usb. En este caso la conexión sería serial.
Cambio de Imagen del SIE
Para cambiar la imagen con la que se inicializa el SIE seguimos los pasos descritos aquí
Después de seguir estos pasos, antes de hacer el make debemos configurar que el logo que se va a compilar es el nuestro, eso se hace en:
$ make kernel_menuconfig Device drivers => Graphics support => Bootup logo
Seleccionamos solo una de las opciones, luego salimos guardando los cambios.
IrDA Drivers
Se encuentran ubicados en: drivers/net/irda
- Sir_dev.ko
- IrTTY irtty.ko
- Dongle driver tir1000-sir.ko
El driver del dongle fue hecho por el grupo de trabajo basándonos en la referencia 1 y en otros drivers que encontramos en el kernel. Principalmente en el driver se definen 4 funciones: open, reset, change_speed y close. La función open se invoca cuando se utiliza la función irattach se asocia a la UART. El dongle es capaz de reconocer velocidades desde 1200bps hasta 115.2Kbps, por lo tanto en la función change_speed lo que hace es reconocer la velocidad que le entra de la UART y establecerla en el dispositivo transceptor, que en este caso es el TIR1000. La función reset establece, por medio de otra función llamada sirdev_set_dtr_rts(dev,dts,rts), que las lineas asociadas la transmision y recepcion de la UART se establezcan en determinado valor durante un cierto tiempo, para que la UART reconozca que se esta reestableciendo el funcionamiento del dongle. Y luego se establece una velocidad determinada de 9600 bps.
LA función close hace que se apaguen las dos señales asociadas a la transmisión y recepción de la UART.
IrDA Stack
Se encuentran ubicados en: net/irda
- irda.ko Este driver tiene el soporte de las capas IrLAP, IrLMP y TinyTP.
- IrCOMM: Emula puertos seriales. Las aplicaciones como emuladores de terminales y protocolos como PPP se pueden ejecutar sin cambios en el interfaz de serial virtual creada por IrComm.
IrCOMM esta implementado con dos modulos relacionados, ircomm.ko e ircomm_tty.ko. El primero provee suporte al protocolo del core, mientras que el segundo crea y administra los nodos del puerto serial emulado /dev/ircommX.
- Redes: hay tres maneras para obtener aplicaciones TCP/IP corriendo sobre IrDA.
1. PPP asincrono sobre IrCOMM. 2. PPP sincrono sobre IrNET. 3. Emular ethernet con IrLAN.
La red con IrCOMM es equivalente a correr PPP asincrono sobre el puerto serial.
Point-to-point protocol (PPP) permite establecer una comunicación a nivel de enlace entre dos computadores, se trata de un protocolo asociado a la pila TCP/IP.
Espacio de usuario
Para darle soporte al espacio de usuario, ya se cuenta con un paquete llamado irda-utils, que se puede descargar del repositorio universal, en nuestro caso utilizamos el irda-utils-0.9.18. En nuestro caso especial debimos acomodar este paquete para nuestras necesidades, por ejemplo acomodarlo para que compilara para mips y le quitamos varios programas que no son utiles para nuestro proyecto.
Utilizamos los programas irattach y dondle_attach.
Irattach nos sirve para "enganchar" el dongle escogido a un puerto serie y comienza el descubrimiento del dongle.
$ /usr/sbin/irattach /dev/ttyS0 -d tir1000 -s $ /usr/sbin/dongle_attach irda0 -d tir1000
Pruebas tarjeta hija:
IrPHY
Esta prueba corresponde al funcionamiento de codificación del chip TIR1000 de TI el cual hace parte de nuestra capa IrPHY para la tarjeta SIE, este chip, como habíamos mencionado, soporta velocidades de transmisión desde los 1200 bps hasta 115,2 Kbps, y su proceso de codificación se hace aplicando un clock (16XCLK) que es 16 veces la velocidad de transmisión o el baudrate, este chip cada 16 ciclos de reloj genera un 1 o alto de tres pulsos de 16XCLK, que es muestra del dato a transmitir (U_TXD) cuando este pin esta en estado bajo ó 0, y se mantiene en bajo cuando U_TXD esta en alto ó 1. A continuación se muestra la gráfica con las formas de onda, proporcionada por TI, que contiene de forma detallada el proceso de codificación de la señal U_TXD:
Esquemas de codificación del TIR1000:
Estos esquemas anteriores coinciden con la prueba hecha al TIR1000 (gráfica a continuación) ya montado en la tarjeta hija IrDA SIE (prueba hecha con U_TXD en bajo), donde se puede observar en la parte inferior un 16XCLK de 1,83 MHz aprox. y en la parte superior una señal de salida IR_TXD con picos cada 16 ciclos de reloj y duración de 3 ciclos de reloj, lo cual equivale a una señal de 114.546 KHz (dato osciloscopio digital Tektronix) que es el baudrate al que corresponde el 16XCLK aplicado ya que es igual a dividir 16XCLK entre 16.
Esquemas de decodificación del TIR1000:
En los videos se puede observar que la codificacion se hace de forma correcta por parte del TIR1000, ya que desde consola, por puerto serial, se envian letras que son emitidas por el ir_led emisor del TFDU4101, y este al mismo tiempo hace un 'echo' por el pin RX con esta señal codificada que llega de nuevo al TIR100 y es decodificada y enviada al puerto serie de SIE mostrando el dato de la tecla presionada en la consola.
Prueba del puerto serial
En este video se muestra como se cargan los modulos de irda en el sie y al final de aprecia como se detectan otros dispositivos.
Diseño de PCB
A continuación se muestra el esquemático de la tarjeta hija y las respectivas capas de la PCB, en la cual se encuentra la interfaz física para la implementación de la comunicación IrDA:
Cronograma de trabajo
Referencias
1. Sreekrishnan Venkateswaran, Essential Linux device drivers, Prentice Hall, Boston, 2008
2. Hoja de datos del decodificador TIR1000 https://docs.google.com/viewer?url=http://focus.ti.com/lit/ds/symlink/tir1000.pdf&embedded=true&chrome=true
3. Hoja de datos del transceptor TFDU4101 https://docs.google.com/viewer?url=http://www.vishay.com/docs/81288/tfdu4101.pdf&embedded=true&chrome=true
Boot process SIE
usbboot
Este es un programa desarrollado por INGENIC para poder programar las memorias NAND asociadas a un procesador serie jz47** la cual fue modificada para poder ser utilizada en Linux. El usbboot se encarga en un principio de escribir en la NAND dos codigos .bin los cuales son stage 1 y stage 2, el primero se descarga al dispositivo al hacer el proceso de boot y este código se encarga de inicializar el PLL, SDRAM y la UART con ciertos parámetros de configuración que se encuentran en el archivo main.c de la carpeta xburst_stage1 el cual se muestra a continuación:
#include "target/jz4740.h"#include "target/configs.h"#include "usb_boot_defines.h"struct fw_args *fw_args;
volatile u32 CPU_ID;
volatile u32 UART_BASE;
volatile u32 CONFIG_BAUDRATE;
volatile u8 SDRAM_BW16;
volatile u8 SDRAM_BANK4;
volatile u8 SDRAM_ROW;
volatile u8 SDRAM_COL;
volatile u8 CONFIG_MOBILE_SDRAM;
volatile u32 CFG_CPU_SPEED;
volatile u32 CFG_EXTAL;
volatile u8 PHM_DIV;
volatile u8 IS_SHARE;
#if 0void test_load_args(void)
{CPU_ID = 0x4760;
CFG_EXTAL = 12000000;
CFG_CPU_SPEED = 252000000;
PHM_DIV = 3;
fw_args->use_uart = 0;
UART_BASE = UART0_BASE + fw_args->use_uart * 0x1000;
CONFIG_BAUDRATE = 57600;
SDRAM_BW16 = 1;
SDRAM_BANK4 = 1;
SDRAM_ROW = 13;
SDRAM_COL = 9;
CONFIG_MOBILE_SDRAM = 0;
IS_SHARE = 1;
fw_args->debug_ops = -1;
}#endifvoid load_args(void)
{fw_args = (struct fw_args *)0x80002008; /* get the fw args from memory */
CPU_ID = fw_args->cpu_id ;
CFG_EXTAL = (u32)fw_args->ext_clk * 1000000;
CFG_CPU_SPEED = (u32)fw_args->cpu_speed * CFG_EXTAL ;
if (CFG_EXTAL == 19000000) {
CFG_EXTAL = 19200000;
CFG_CPU_SPEED = 192000000;
}PHM_DIV = fw_args->phm_div;
UART_BASE = UART0_BASE + fw_args->use_uart * 0x1000;
CONFIG_BAUDRATE = fw_args->boudrate;
SDRAM_BW16 = fw_args->bus_width;
SDRAM_BANK4 = fw_args->bank_num;
SDRAM_ROW = fw_args->row_addr;
SDRAM_COL = fw_args->col_addr;
CONFIG_MOBILE_SDRAM = fw_args->is_mobile;
IS_SHARE = fw_args->is_busshare;
}void c_main(void)
{load_args();
if (fw_args->debug_ops > 0) {
do_debug();
return ;
}switch (CPU_ID) {
case 0x4740:
gpio_init_4740();
pll_init_4740();
serial_init();
sdram_init_4740();
break;
case 0x4760:
gpio_init_4760();
cpm_start_all_4760();
serial_init();
pll_init_4760();
sdram_init_4760();
break;
default:
return;
}#if 1serial_puts("Setup xburst CPU args as:\n");
serial_put_hex(CPU_ID);
serial_put_hex(CFG_EXTAL);
serial_put_hex(CFG_CPU_SPEED);
serial_put_hex(PHM_DIV);
serial_put_hex(fw_args->use_uart);
serial_put_hex(CONFIG_BAUDRATE);
serial_put_hex(SDRAM_BW16);
serial_put_hex(SDRAM_BANK4);
serial_put_hex(SDRAM_ROW);
serial_put_hex(SDRAM_COL);
serial_put_hex(REG_CPM_CPCCR);
#endifserial_puts("xburst stage1 run finish !\n");
if (CPU_ID == 0x4760) {
__asm__ ("li $31, 0xbfc012e0 \n\t""jr $31 \n\t ");
}}
Luego de inicializar se descarga al dispositivo el codigo del stage2 el cual deja el dispositivo en espera de comandos desde el host usb (consola en el PC bajo Linux), ejecuta dichos comandos y no sale de este estado hasta que se resetee.
los valores de configuración del stage1 pueden ser consultados en este manual el cual fue hecho para la aplicación en Windows pero los valores del archivo de configuración son análogos a los de el main.c de el stage1 nuestro.
U-Boot
El U-Boot es el Boot Loader universal, el cual nos permite copiar la imagen del kernel de linux a la SDRAM y luego ejecutarla desde ahi, además del cambio fácil de la misma imagen.
El U-Boot se usa para permitir el cambio fácil de imágenes del kernel y trae mecanismos para poder cargar la imagen del kernel.
El U-Boot es un Bootloader que nos permite cargar archivos desde múltiples periféricos, como por ejemplo la NAND.
Orden de Ejecución del U-Boot
El orden de ejecución se encuentra en el archivo u-boot.map ubicado en:
PATH/openwrt-xburst/build_dir/linux-xburst_qi_lb60/u-boot-qi_lb60/u-boot-2010.06
En este archivo, a partir de la sentencia "Linker script and memory map" se empiezan a describir las diferentes funciones (con sus respectivas direcciones de codigo fuente) que se ejecutan durante el proceso de inicialización, a continuación se describiran estas funciones hasta la inicialización de la memoria NAND.
1. arch/mips/cpu/xburst/start.o
start.S:
1. _start -> board_init_f (esta función se encuentra definida en: ~/openwrt-xburst/build_dir/linux-xburst_qi_lb60/u-boot-qi_lb60/u-boot-2010.06/arch/mips/lib/board.c)
2. relocated_code -> in_ram -> board_init_r
2. arch/mips/lib/libmips.a(board.o)
board.c:
1. board_init_f (Inicializa la RAM desde la memoria Flash y reserva un espacio de memoria para el U-boot) -> relocate_code (addr_sp, id, addr)
2. board_init_r (Se corre desde la RAM, se ejecutan comandos de C normalmente, inicializa la consola) -> nand_init
3. drivers/mtd/nand/libnand.a(nand.o)
nand.c:
1. nand_init (Inicializa la NAND con los valores máximos de tamaño)
Tareas
SRAM
En esta tarea se utilizaron los archivos fuente de la carpeta Examples/hello_sram/build.
Para poder cargar el archivo a la sram por medio del puerto usb es necesario aplicar el siguiente comando:
$ sudo ./usbtool 1 jz_xloader.bin 0x80000000
En donde jz_xloader.bin es el archivo que se va a cargar en la sram y 0x80000000 es la dirección de memoria a la cual se va a cargar.
NAND
En esta tarea se utilizaron los archivos fuente de la carpeta Examples/hello_nand/build.
$ sudo usbboot -c "boot"
Con este comando se establece un puente entre el procesador y el computador.
$ sudo usbboot -f ./usbboot_2gb_nand.cfg -c "boot" $ sudo usbboot -f ./usbboot_2gb_nand.cfg -c "nprog 0 jz_xloader.bin 0 0 -n"
Con estos otros comandos se guarda el archivo en la nand y se ejecuta desde la sram.
CONSOLA
En esta tarea se habilita la consola del U-Boot, para la cual se usaron las versiones u-boot-2009.11.1 y u-boot-2010.06.
En primer instancia se logro habilitar la consola en ambas versiones del u-boot, pero no se podia dar booteo desde la NAND solo lo hacia al programar directamente sobre la SRAM, usando el comando:
sudo xbboot -u 0x80100000 u-boot.bin
En segundo lugar, se logro el booteo desde la NAND y el soporte al LCD usando los pasos recomendados en esta pagina, así pues, se obtuvo lo siguiente:


