Está en la página 1de 37

STAMP_IMX28

IMPLEMENTACIÓN Y MANUAL DE USUARIO

Carlos Eduardo Parra Moya


Estudiante de Maestría en Ingeniería –Ingeniería Electrónica

Jairo Enrique Reyes Gómez


Estudiante de Maestría en Ingeniería –Ingeniería Electrónica

Carlos Andrés Terraza Velásquez


Estudiante de Maestría en Ingeniería –Automatización Industrial

Kevin Darío Patiño Sosa


Estudiante de Maestría en Ingeniería – Ingeniería Electrónica

Universidad Nacional de Colombia


2014-12-02
Contenido

1. Descripción general
1.1. Vista general
1.2. Diagrama de bloques Stamp_IMX28
1.3. _ Vista general del hardware
1.4. _ Dimensiones del módulo
1.5. Características Stamp_IMX28
1.6. Componentes Stamp_IMX28
1.6.1. CPU Principal
1.6.2. DDR2 RAM
1.6.3. i.NAND FLASH
1.6.4. Procesador esclavo ARM CORTEX-M3
2. Interfaces de conexión
2.1. Conexiones i.MX283 conector P1
2.2. Conexiones SAMP conector P4
2.3. Conexiones a puentes H conector P2
2.4. Alimentación
2.4.1. Alimentación externa (Lógica)
2.4.2. Alimentación de motores (Potencia)
2.4.3. Unidad de administración energética de la CPU i.MX283
2.4.4. Regulador LT1117
2.5. Control de operación del i.MX283
2.5.1. Pin PS (Power Switch)
2.5.2. Reset
3. Boot del módulo
3.1. Entradas de hardware de selección de booteo
3.2. OTP eFuses
3.2.1. Bits OTP eFuses relevantes en el booteo
3.2.2. Bits OTP eFuses características especiales el booteo
3.2.3. Configuración Bits OTP eFuses
4. Implementación Software en el sistema Stamp_imx28
4.1. Modificaciones hardware
4.2. Implementación Software para parpadeo de un LED (Blink)
4.3. Uboot
4.4. Soporte SD
5. Imagen Linux Kernel
5.1. Soporte Audio
5.2. Programación OpenOCD
6. Buildroot
7. iNAND
8. Referencias
1. Descripción general

1.1. Vista general


La tarjeta Stamp_imx28 es un sistema en módulo (SOM) rápido, flexible y redituable basado en
la familia de procesadores i.MX28, específicamente el chip i.MX283 de la casa matriz Freescale
Semiconductor®. El chip i.MX283 es la versión básica de la familia i.MX28, optimizado para
rendimiento y consumo energético mínimo. Este chip es ideal para aplicaciones embebidas
tanto industriales como de mercados de consumo. Adicional a esto, se ha integrado un
coprocesador ARM® Cortex®-M3 de la casa matriz Atmel® para la ejecución de tareas de bajo
nivel. Este coprocesador permite la ejecución de tareas en tiempo real, brindándole mayor
capacidad de trabajo y operación.
Algunas posibles aplicaciones de este módulo son:
● Paneles de Interfaces humano maquina (HMI) para la industria y el hogar
● Controladores industriales, como PLCs o controladores robóticos
● Escáneres e impresoras portátiles
● Medidores de consumo y calidad energética
● Aprendizaje de sistemas embebidos
● Desarrollo de plataformas educativas
● Juguetes
● Entre otras más
1.2. Diagrama de bloques Stamp_IMX28
1.3. Vista general del hardware

Las Figuras 2 y 3 muestran la distribución de componentes de componentes del módulo, vista


superior e inferior.
Figura 2. Vistas superior del modulo

Figura 3. Vista inferior del modulo

1.4. Dimensiones del módulo

En la figura 4 se muestran las dimensiones en milímetros de la tarjeta y la respectiva ubicación


de componentes
Figura 4. Dimensiones del módulo. Todas las dimensiones en mm

1.5. Características Stamp_IMX28

Este módulo cuenta con las siguientes características:


● i.MX283 CPU con velocidad de reloj configurable hasta 450 MHz
● Memoria RAM DDR2 a 1.8V y capacidad de 512MB
● i.NAND Flash de hasta 16 GB
● Socket uSD hasta 32 GB clase 10
● Hasta dos conexiones USB2.0 simultaneas (1 x OTG/Device)
● Dos puertos seriales asíncronos UART, uno de ellos para comunicación con el procesador
esclavo
● Un puerto I2C
● Un puerto SPI
● Códec de audio Digital a través de puerto I2S
● Procesador esclavo ARM Cortex-M3 para aplicaciones de bajo nivel con puertos
adicionales como UART, I2C, SPI, ADC entre otros.
● Manejo de hasta dos motores DC mediante puente H con tensión separada
● Jack de audio para micrófono y audífonos
● Características de seguridad tales como:
o Algoritmos de lectura única para medios digitales DRM
o Arranque seguro mediante encriptación AES 128-bit
o Boot seguro mediante HAB4
● Dimensiones de tan solo 70mm*70mm
● Puertos de expansión DIP estándar
● Regulación integrada para 3.3V, 1.8V y 1.5V

1.6. Componentes Stamp_IMX28

Los componentes más importantes que integran este módulo son: la CPU principal, RAM,
i.NAND FLASH, CODEC de audio y el procesador esclavo.

1.6.1. CPU Principal


El i.MX283 (Figura 5) es la versión básica de la familia i.MX28. Optimizado para rendimiento y
consumo energético. El núcleo está conformado por ARM926EJ-S corriendo hasta 454 MHz. Sus
principales características son:
● Núcleo a 454MHz ARM926EJ-S con 16KB/32KB Cache
● PMU integrada de alta eficiencia con conversor DC/DC
● Controladora de LCD hasta 24 bits con soporte para Touchscreen
● Soporte para NAND – SLC/MLC y eMMC 4.4
● Soporte por hardware BCH (hasta 20-bit de corrección)
● Soporte para memoria RAM externa a 200 MHz 16-bit DDR2, LV-DDR2, mDDR
● Soporte USB2.0 con capa PHY embebida
● 8 canales de 12-bit ADC y un HSADC 12 bits hasta 2 Msps
● Sensor de temperatura integrado para protección por sobre temperatura
● Múltiples puertos de comunicación (UARTs, SSP, SDIO, SPI, I2C, I2S)
● Salidas y entradas compatibles con niveles de tensión 3.3V
● 10 años de soporte por la casa Matriz (Industrial)
Para más información visitar el siguiente enlace:
http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=i.MX283#prettyPhoto
Figura 5. Diagrama de bloques general del CPU principal i.MX283

1.6.2. DDR2 RAM


El módulo Stamp_IMX28 soporta una sola memoria RAM AS4C32M16D2 (Alliance Memory)
DDR2 SDRAM de 512 MB. La memoria está conectada a través de un bus de 16-bit al controlador
EMI del i.MX283. La memoria está organizada en 4 bancos x 8MB direccionados con 16 I/Os.
Esta memoria puede alcanzar velocidades de transferencia dobles hasta 800 Mbps/pin
(DDR2-800).
Sus principales características son:
● VDDQ = 1.8V ± 0.1V
● 333MHz fCK para 667Mbps/pin, 400MHz fCK para 800Mbps/ pin
● 4 Bancos
● Latencia CAS programable: 3, 4, 5, 6
● Latencia adaptativa programable: 0, 1, 2, 3, 4, 5
● Latencia de escritura(WL) = Latencia de escritura(RL) -1
● Secuencia programable
● Off-Chip Driver(OCD)
● Impedancia adjustable
● Soporte especial para:
­ 50ohm ODT
­ Tasa de transferencia ajustable a la temperatura
Para más información de este chip visitar el siguiente link
http://www.samsung.com/global/system/business/semiconductor/product/2010/10/5/233138
ds_k4t1gxx4qe_rev112.pdf

1.6.3. i.NAND FLASH


La iNAND es una memoria flash embebida (EFD) diseñada para aplicaciones móviles y
dispositivos de electrónica de consumo. La iNAND es un hibrido que combina un controlador
flash y el estándar para memorias MLC NAND flash soportando el estándar de interfaz e.MMC
HS200 4.51.
Este módulo integra una memoria iNAND ULTRA de la casa SanDisk de hasta 16GB utilizables
como memoria de almacenamiento masivo. Esta memoria incluye un controlador inteligente, el
cual maneja los protocolos de interfaz, almacenamiento y lectura de datos, algoritmos de
corrección de errores (ECC), administración energética y control de reloj. Sus principales
características son:
● Controlador de memoria y NAND flash
● Diseño mecánico cumpliendo la especificación JEDED MO-276C
● Empaquetado TFBGA para e.MMC 4.51 o 11.5mm x 13mm x 1.0mm
● Rango de temperatura: –25C° to +85C°
● Alimentación dual
● Tensión del núcleo (VCC) 2.7-3.6 V
● La tensión I/O (VCCQ), puede ser: 1.7-1.95 V o 2.7-3.6 V
● Hasta 16GB de almacenamiento.
● Soporta 3 anchos de bus: 1bit (por defecto), 4bit, 8bit.
● Cumple con la especificación e.MMC Ver. 4.51 HS200
● Frecuencia de reloj variable 0-20 MHz, 0-26 MHz (por defecto), 0-52 MHz (high-speed),
0-200 MHz (HS200)
● Hasta 200 MB/s de transferencia en el bus , usando 8 bits a 200 MHz, modo HS200
● Corrección de errores en los campos de memoria
● Soporta cache e.MMC

1.6.4. Procesador esclavo ARM CORTEX-M3


El módulo cuenta con un procesador de bajo nivel AT91SAM de ATMEL de la familia SAM3N
(Figura 6), el cual le permite ejecutar aplicaciones en tiempo real. Este procesador cuenta con un
núcleo de 32 bits ARM CORTEX-M3 corriendo hasta 48 MHz. Adicionalmente, tiene múltiples
puertos de comunicación, módulos PWM, TIMERs, RTC y ADC.
Sus principales características son:
● ARM® Cortex®-M3 hasta 48 MHz
● Controlador de interrupciones anidadas
● Memoria Flash de 256 kB, 24 kB de RAM y 16 kB de ROM
● Oscilador interno configurable hasta 12 MHz
● Modos de bajo consumo energético hasta 3 µA
● 2 USART con soporte para RS-485 y IrDA
● 2 ISC o SPI
● 6 Timers de 16 bits
● 4 PWM individuales hasta 16 bits de resolución cada uno
● 1 ADC de 16 canales 10 bits de resolución hasta 384 ksps
● 1 DAC de 10 bits hasta 500 ksps
● Empaquetado 48-LQFP, 7 mm X 7 mm pitch de 0.5 mm

Figura 6. Diagrama general del procesador AT91SAM


Para más información visitar el siguiente enlace:
http://www.atmel.com/products/microcontrollers/arm/sam3n.aspx

2. Interfaces de conexión

El módulo cuenta con tres conectores DIP de separación estándar 0.1”, los cuales permiten
conectar diferentes módulos externos, tales como motores, sensores, comunicación RF, entre
otros.

1.3. Conexiones i.MX283 conector P1

Figura 7. Ubicación del conector P1 en el modulo

PIN FUNCION DESCRIPCION


1 +3.3V Salida de tensión 3.3V regulados, máximo 500mA
2 GND Tierra del modulo
3 RESET_PB Reset general del i.MX283
4 PSWITCH Usado para configurar diferentes modos de uso
5 SSP2_MOSI Pin MOSI del SSP2
6 SSP2_MISO Pin MISO del SSP2
7 SSP2_SS2 Pin de selección S2 del puerto SSP2
8 SSP2_SS1 Pin de selección S1 del puerto SSP2
9 SSP2_SCK Señal de reloj del SSP2
10 SSP2_SS0 Pin de selección S0 del puerto SSP2
11 RX Pin RX del puerto de depuración DUART
12 TX Pin TX del puerto de depuración DUART
13 AUART1_RX Pin RX del puerto UART1
14 GPMI_D05 Pin de propósito general D05
15 AUART1_TX Pin TX del puerto UART1
16 GPMI_D07 Pin de propósito general D05
17 GND Tierra del modulo
18 +3.3V Salida de tensión 3.3V regulados, máximo 500mA
Tabla 1. Asignación de pines para el conector P1

1.4. Conexiones SAMP conector P4

Figura 8. Ubicación del conector P4 en el modulo

PIN FUNCION DESCRIPCION


1 VDD5V Tensión 5V
2 GND Tierra del modulo
3 PB0 Pin PB0 del AT91SAM
4 +3.3V Salida de tensión 3.3V regulados, máximo 500mA
5 PA17 Pin A17 del AT91SAM
6 PB1 Pin B1 del AT91SAM
7 PA19 Pin A19 del AT91SAM
8 PA18 Pin PA18 del AT91SAM
9 PA16 Pin PA16 del AT91SAM
10 PA20 Pin PA20 del AT91SAM
11 PA14 Pin PA14 del AT91SAM
12 PA15 Pin PA15 del AT91SAM
13 PA12 Pin PA12 del AT91SAM
14 PA13 Pin PA16 del AT91SAM
15 PA11 Pin PA11 del AT91SAM
16 PA10 Pin PA13 del AT91SAM
17 PA8 Pin PA8 del AT91SAM (DIR primer puente H)
18 PA9 Pin PA9 del AT91SAM (PWM primer puente H)
19 PA6 Pin PA6 del AT91SAM (DIR segundo puente H)
20 PA7 Pin PA7 del AT91SAM (PWM segundo puente H)
21 PA2 Pin PA8 del AT91SAM (DIR tercer puente H)
22 PA5 Pin PA9 del AT91SAM (PWM tercer puente H)
23 PA0 Pin PA8 del AT91SAM (DIR tercer puente H)
24 PA1 Pin PA9 del AT91SAM (PWM tercer puente H)
Tabla 2. Asignación de pines para el conector P4
1.5. Conexiones a puentes H conector P2

Figura 9. Ubicación del conector P2 en el modulo

PIN FUNCION DESCRIPCION


1 VM Tensión de entrada para los puente H, máximo 12VDC
2 PGND Tierra de potencia para los puente H
3 OUT4_2 Salida + cuarto puente H
4 OUT4_1 Salida - cuarto puente H
5 OUT3_2 Salida + tercer puente H
6 OUT3_1 Salida - tercer puente H
7 OUT2_2 Salida + segundo puente H
8 OUT2_1 Salida - segundo puente H
9 OUT1_2 Salida + primer puente H
10 OUT1_1 Salida - primer puente H
11 I2C_SDA Salida y entrada de datos I2C del i.MX283
12 I2C_SCL Salida de reloj I2C del i.MX283
Tabla 3. Asignación de pines para el conector P2

1.6. Alimentación

Este módulo permite alimentar la sección lógica y de potencia (motores conectados al puente H)
de forma independiente. Los voltajes de alimentación para las componentes son regulados tanto
por la unidad de administración energética de la CPU i.MX283 como por un regulador LT1117 de
3.3V.

1.6.1. Alimentación externa (Lógica)


Este módulo puede ser alimentado desde una fuente externa de energía DC de 5 VDC (entre
4.75 V y 5.25 V) a través de uno de los conectores:
● Jack J1.
● Pin 1 y 2 del conector P4

Modo de alimentación Rango de alimentación Conector


J1
5VDC 4.75 V a 5.25 V
Pin 1 y 2 del conector P4
Tabla 4. Modos de alimentación del modulo

1.6.2. Alimentación de motores (Potencia)


El módulo cuenta con alimentación separada para el manejo de motores o cualquier otra carga a
través de 4 puentes H. Estos puentes H son chips de Texas Instruments de referencia DRV8835,
caracterizados por suministrar hasta 1.5 A de salida por cada puente H. Estos componentes
operan con un rango de tensión entre 0 V hasta 11V de alimentación para la salida de potencia.

1.6.3. Unidad de administración energética de la CPU i.MX283


La memoria DDR2 es alimentada por la unidad de administración energética de la CPU i.MX283 a
1.8V, y adicionalmente, esta unidad genera múltiples tensiones como se muestra en la figura
10. Más información sobre esta unidad de administración energética está disponible en la nota
de aplicación AN4199 de Freescale Semiconductor en el siguiente enlace:
http://cache.freescale.com/files/32bit/doc/app_note/AN4199.pdf
Figura 10. Unidad de administración energética embebida dentro del i.MX283

1.6.4. Regulador LT1117


La alimentación de los componentes tales como el coprocesador SAM3N, puentes H, memoria
SD, memoria i.NAND y CODEC de audio STGL500 está a cargo del regulador LT1117 a 3.3V.

1.7. Control de operación del i.MX283

1.7.1. Pin PS (Power Switch)


Este módulo cuenta con un pin en el conector P1 llamado PS, este pin permite seleccionar
diferentes modos de operación, como por ejemplo, pausar, reanudar, etc. Adicionalmente, este
selector PSWITCH puede ser configurado por software. Para más información revisar el
documento “i.MX28 Applications Processor Reference Manual”.

1.7.2. Reset
Para poder resetear el módulo, el pin dedicado de reset del conector P1 debe ser llevado a 0V
por un mínimo tiempo de 100ms. Esta línea de reset está conectada a través de drenador
abierto.
2. Boot del módulo

La tarjeta diseñada soporta el arranque desde el puerto USB, la memoria iNAND y la memoria
micro SD. El proceso de inicialización comienza con la ejecución de las instrucciones que se
encuentran almacenadas en la ROM (interior del i.MX283) por parte del núcleo ARM. Estas
instrucciones inicialmente determinan la interfaz a la cual se va a acceder para leer los archivos
de arranque. Esta determinación se toma a partir de los bits OTP y de las entradas de hardware
(pines de booteo propios del procesador).

2.1. Entradas de hardware de selección de booteo


En la siguiente figura se observan los pines hardware para seleccionar el dispositivo de booteo,
los cuales corresponden a algunos conectores del LCD.

Seleccionando estos pines de acuerdo a la siguiente tabla se establece la interfaz donde se


encuentran los archivos de arranque del i.MX28.

JP3  JP2  JP1  PUERTO  MODO DE BOOTEO 


(LCD_D3)  (LCD_D1)  (LCD_D0) 
0  0  0  USB0  USB 
0  0  1  I2C0  I2C0 MASTER, 3.3v 
0  1  0  SPI2  SPI MASTER SSP2 , 3.3 V  
1  0  1  SSP0  SD/iNAND MASTER ON 
SSP0, 3.3 V 
Tabla 5 Configuración de entradas de hardware de selección de booteo

2.2. OTP eFuses


El procesador i.MX283 contiene un arreglo de 1280 bits, conocidos como bits OTP eFuse,
algunos de los cuales son usados por la ROM y pueden ser programados por el usuario.

2.2.1. Bits OTP eFuses relevantes en el booteo


En la siguiente tabla se observan algunos bits relevantes para la selección de la interfaz en la
cual se va a acceder a los archivos de arranque.

Bits OTP eFuse Función


(Banco:Dirección:Bit)

HW_OCOTP_ROM0:0x8002C1A0:23:22   SD_MMC_MODE[1:0]  
 
00 = MBR  
01 = RESERVED  
10 = eMMC fast boot 
11 = eSD fast boot  
HW_OCOTP_ROM0:0x8002C1A0:13:12   SD_BUS_WIDTH ­  Ancho de bus SD/MMC card.  
 
00 = 4­bit (Para iniciar desde la memoria SD) 
01 = 1­bit  
10 = 8­bit (Para iniciar desde la memoria iNAND) 
11 = Reserved  
HW_OCOTP_ROM7:0x8002C210:0   ENABLE_PIN_BOOT_CHECK 
 
1   =  Si  este  bit  se  encuentra  en  alto,  se  verifica 
inicialmente  el  pin  LCD_RS  para  determinar  si  el 
modo  de  booteo  se  va  a  seleccionar  a  partir  de  los 
pines hardware.  Si este bit está configurado en 1 y el 
pin  LCD_RS  está  en  alto,  entonces  el  modo  de 
booteo estará determinado por el estado de los pines 
LCD_D[5:0].  
0  = Si  este bit  está establecido  en 0 no se verifica el 
estado  del  pin  LCD_RS  y  el  modo  de  booteo  se 
determina  directamente  leyendo  el  estado  de  los 
pines LCD_D[5:0].   
 
Nota:  En  la  tarjeta  diseñada  el  pin  LCD_RS  está 
conectado a +3.3V.
Tabla 6 Bits OTP relevantes para selección de booteo
2.2.2. Bits OTP eFuses características especiales el booteo
En la ROM también es posible configurar otros bits para activar algunas características
especiales disponibles en la inicialización del procesador.

Bits OTP eFuse (Banco:Dirección:Bit) Función

HW_RTC_PERSISTENT1:0x8005C070: SD_SPEED_ENABLE  ­  Si  este  bit  está  en  alto,  la 


3   ROM  configura  la  velocidad  de  la  memoria 
SD/iNAND en modo high­speed. 
HW_RTC_PERSISTENT1:0x8005C070: FORCE_RECOVERY  ­ Cuando  este bit  esté en alto 
0   el  código  de  la  ROM  forza  el  sistema  a arrancar  en 
modo  de  recuperación.   La  ROM   establece  este  bit 
nuevamente en un estado bajo luego del arranque.
Tabla 7Bits OTP de características especiales en el arranque

2.2.3. Configuración Bits OTP eFuses


La metodología para la configuración de los bits OTP propuesta por el fabricante Freescale se
observa en siguiente figura.

Figura 12 Metodología configuración bits OTP

Para generar el archivo de configuración de los bits OTP se utiliza el script otp_burner.py. Por
defecto el archivo de salida se llamará OtpInit.sb. Adicionalmente se creará un archivo
intermedio, el cual contiene la representación binaria de los registros OTP, este archivo tiene
extensión .dat.
A continuación se presenta la ayuda obtenida mediante el comando “otp_burner.py --help”.

Para nuestro caso se requiere únicamente ejecutar la siguiente instrucción en el intérprete


Python: otp_burner.py -i bit_settigns.txt
El archivo de la entrada al script de Python, contiene la lista de todos los bits OTP que serán
generados en el archivo .sb de salida y que serán configurados en la memoria ROM del i.MX28.
Este archivo inicia con la sentencia "chip family pragma statement", el cual especifica la familia
del dispositivo a programar, en este caso para el i.MX28 será con la sentencia:
*chip-family-mx28*. Cada línea en este archivo de configuración es la asignación de valores a un
rango de bits de un registro OTP a configurar, cuya estructura básica es:
hw_ocotp_cust0 = 1234  
Ejemplo de la sintaxis del archivo de configuración, en configuración de un bit y de un rango de
bits, respectivamente:
# One bit  
hw_ocotp_cust0[12] = 1  
# A bit range  
hw_ocotp_cust1[31:15] = 0xff  

En la siguiente tabla se presenta los nombres de los registros disponibles para el I.MX28:

BANCO 0 BANCO 1 BANCO 2 BANCO 3 BANCO 4


hw_ocotp_hwcap hw_ocotp_lock hw_ocotp_rom hw_ocotp_srk0
hw_ocotp_cust0
0 0
hw_ocotp_hwcap hw_ocotp_ops0 hw_ocotp_rom hw_ocotp_srk1
hw_ocotp_cust1
1 1
hw_ocotp_hwcap hw_ocotp_ops1 hw_ocotp_rom hw_ocotp_srk2
hw_ocotp_cust2
2 2
hw_ocotp_hwcap hw_ocotp_ops2 hw_ocotp_rom hw_ocotp_srk3
hw_ocotp_cust3
3 3
hw_ocotp_crypto hw_ocotp_hwcap hw_ocotp_ops3 hw_ocotp_rom hw_ocotp_srk4
0 4 4
hw_ocotp_crypto hw_ocotp_hwcap hw_ocotp_rom hw_ocotp_srk5
hw_ocotp_un0
1 5 5
hw_ocotp_crypto hw_ocotp_swcap hw_ocotp_rom hw_ocotp_srk6
hw_ocotp_un1
2 6
hw_ocotp_crypto hw_ocotp_custca hw_ocotp_rom hw_ocotp_srk7
hw_ocotp_un2
3 p 7
Tabla 8 Nombre e registros OTP del i.MX283 

Adicionalmente para el i.MX28 existen algunos bits de configuración identificados de forma


específica en la hoja de datos de este procesador. Estos bits pueden especificarse en el archivo
de entrada de configuración. Por ejemplo, para el registro hw_ocotp_rom4 se tienen los
siguientes bits identificados con nombre específico.

NOMBRE EQUIVALENCIA
nand_badblock_marker_reserve hw_ocotp_rom4[31]
nand_read_cmd_code2 hw_ocotp_rom4[23:16]
nand_read_cmd_code1 hw_ocotp_rom4[15:8]
nand_column_address_bytes hw_ocotp_rom4[7:4]
nand_row_address_bytes hw_ocotp_rom4[3:0]
Tabla 9 Nombres bits especificos del registro hw_ocotp_rom4 del i.MX283

Los valores constantes que se pueden emplear para asignar a los bits de los registros se
observan en la siguiente tabla:

NOMBRE CONSTANTE VALOR NOMBRE CONSTANTE VALOR


yes 1 no 0
true 1 false 0
on 1 off 0
Blown 1 unblown 0
Tabla 10 Valores constantes en asignación
Para el caso de la selección del booteo del i.MX28 del módulo a través de los registros OTP, se
identifican las siguientes constantes. En la siguiente tabla no se tiene en consideración los otros
modos de booteo presentes en el procesador pero no aplicables en la tarjeta desarrollada.

NOMBRE CONSTANTE VALOR


boot_mode_usb 00h
boot_mode_i2c_3v3 01h
boot_mode_i2c_1v8 11h
boot_mode_spi_flash_ssp2_3v3 02h
boot_mode_spi_flash_ssp2_1v8 12h
boot_mode_sdmmc_ssp0_3v3 09h
boot_mode_sdmmc_ssp0_1v8 19h
Tabla 11Constante para selección de booteo a través de los bits OTP

Para la placa diseñada el archivo de configuración bit_settings.txt de entrada del script de


Python será el siguiente para booteo desde la memoria micro SD.

*chip-family-mx28*
# HW_OCOTP_ROM0 register

# Boot Mode - choices:


#boot_mode_usb
#boot_mode_i2c_3v3
#boot_mode_i2c_1v8
#boot_mode_spi_flash_ssp2_3v3
#boot_mode_spi_flash_ssp2_1v8
#boot_mode_sdmmc_ssp0_3v3
#boot_mode_sdmmc_ssp0_1v8
boot_mode = boot_mode_sdmmc_ssp0_3v3

# SD Bus Width - choices:


# sd_bus_width_4bit
# sd_bus_width_1bit
# sd_bus_width_8bit
sd_bus_width = sd_bus_width_4bit

# Master Boot Record Boot Mode for SD Boot


sd_mbr_boot = true

Posterior a la generación del archivo de configuración .sb por el script Python otp_burner.py, se
emplea este archivo como parámetro de entrada para la aplicación BitInit.exe. Esta aplicación
programa los registros OTP del i.MX283 a través del puerto USB identificado con PID:066F o
PID:15A2 y VID:xxxx. El uso de esta herramienta se observa en la ayuda generada por el
comando “otpinit.exe /?” como se observa a continuación:

USAGE: otpinit.exe [<timeout> | /loop] [/fw=<filename>] [/?] 
 where: 
 <timeout>  : Specifies number of seconds to wait for a device before 
   exiting the program. The default is 10 seconds. This 
  option will be ignored if /loop is specified. 
  Specify 0 to not wait for the device if it is not present. 
 /loop  : The application will continually program otp registers on 
  devices as they arrive. Press 'Q' to quit. 
 /fw=<filename>    : Specifies the firmware image to load. OtpInit.sb will be 
  loaded if this option is not specified. 
 /?                : Prints this usage screen.  
Para nuestro caso se requiere únicamente ejecutar la siguiente instrucción para programar los
registros OTP del procesador i.MX283: otpinit.exe
3. Implementación Software en el sistema Stamp_imx28

En esta sección se presentan algunas posibles implementaciones software en el sistema


diseñado Stamp_imx28, se enfatiza las modificaciones tanto al hardware como al software para
el correcto funcionamiento de todos los dispositivos y periféricos presentes en la tarjeta
diseñada.

3.1. Modificaciones hardware


Se realizó una modificación al esquemático y al ruteo de la tarjeta PCB, debido a la ausencia de
interconexión de la señal VDDIO33_EMI (N17) del procesador imx28. Esta conexión se requiere
para alimentar la memoria RAM conectada al puerto EMI del procesador. Este inconveniente se
solucionó fabricando nuevamente la tarjeta PCB adicionando esta interconexión, de acuerdo a lo
observado en la siguiente figura.

3.2. Implementación del Primer Programa en el Procesador iMX283


Inicialmente, se implementa una aplicación software en el procesador, como es costumbre el
primer programa es el blink de un led.
El código fuente de este aplicación se encuentra en la carpeta Factory_Test/blinking_led, se
emplea inicialmente para comprobar el funcionamiento de la interfaz USB y además para probar
la ejecución de programas en la IRAM en el Procesador.
Dicho programa enciende y apaga el LED D3 conectado al pin GPMI_D07 del iMX28, además se
activó el puerto serial AUART0 para verificar el envío de datos. Para conectar el puerto serial se
encuentran disponibles dos pines en el conector P1.

Para realizar el proceso de compilación de este programa es necesario tener las herramientas de
cross-compilación para la arquitectura de este procesador. Como se indicó este procesador
tiene arquitectura ARM de 32 bits, para esto se usó las herramientas arm-none-eabi-.
Usando estas herramientas el programa es cross-compilado, generando el archivo blink.elf.
Posteriormente usando la herramienta de freescale elftosb se especifica la dirección de
memoria en la cual se va ejecutar este programa y así crear el archivo boot stream blink.sb.
Este archivo es cargado por el puerto USB a la memoria interna del procesador con la
herramienta de freescale sbloader. Este proceso está descrito en el Makefile en la carpeta
Factory_Test/blinking_led.

3.3. Prueba de la Memoria DDR.


Para verificar el funcionamiento de la memoria RAM externa, se realizó una aplicación que
escriba y lea la memoria, verificando que la información esté correcta.
El código fuente de esta aplicación se encuentra en Factory_Test/mem_test, en donde se realiza
el soporte para configurar los registros del procesador, relacionados con la comunicación de la
memoria externa.
El Proceso de compilación, generación del boot stream y carga al procesador de esta aplicación
se realizó siguiendo los mismos pasos descritos anteriormente.

3.3. Ejecución de Programas desde la SD


Los programas descritos anteriormente se pueden ejecutar desde la memoria SD. Para esto es
necesario utilizar la herramienta mxsboot de Uboot.
Para generar la herramienta mxsboot, se requiere inicialmente definir algunos parámetros
semejantes a los empleados para la tarjeta de desarrollo MX28EVK fabricada por freescale.
Luego se ejecuta el Makefile para compilar las herramientas de u-boot y generar el ejecutable
mxsboot en la carpeta u-boot/tools. Este procedimiento es realizado mediante los siguientes
comandos:
make ARCH=arm CROSS_COMPILE="arm­none­eabi­" mx28evk_defconfig 
make ARCH=arm CROSS_COMPILE="arm­none­eabi­" tools 
Esta herramienta se encarga de adicionar el encabezado al archivo con extensión .sb y
generando un nuevo archivo con extensión .sd. Por ejemplo, para generar el archivo blink.sd del
programa para encender y apagar un LED (blink LED) se ejecuta el comando:
mxsboot sd blink.sd blink.sd
Es necesario que la SD tenga la primera partición en formato OnTrack 53, para crear este
formato se recomienda el uso de fdisk. Lista la tabla de particiones, se guarda el archivo .sd en
la memoria, para esto se ejecuta:
sudo dd if=blink.sd of=/dev/sdb1 

sudo umount /dev/sdb*
3.5 Formato de la Memoria SD
Primero es necesario tener una memoria microSD de al menos 2GB de capacidad. Para darle el
formato se usa la herramienta fdisk. La tabla de particiones debe quedar como se muestra a
continuación:
Device Boot Start End Blocks Id System
/dev/sdb1 2048 411647 204800 53 OnTrack DM6 Aux3
/dev/sdb2 411648 432127 10240 c W95 FAT32 (LBA)
/dev/sdb3 432128 3854335 1711104 83 Linux
Para dar formato a las particiones se ejecutó los siguientes comandos:
sudo mkfs.vfat /dev/sdb2  
sudo mkfs.ext3 /dev/sdb3

3.4. Uboot
El uboot es una implementación software libre de un cargador de arranque (bootloader)
universal para múltiples arquitecturas de procesador entre ellas ARM.
Para la configuración y compilación del U-boot se tomó como base las opciones que se tiene
para la tarjeta de evaluación de iMX28. Sin embargo debido a que la tarjeta tiene componentes
y conexiones diferentes es necesario realizar los siguientes cambios:
⇛ En el archivo uboot/arm/cpu/arm926ejs/mxs/spl_mem_init.c se realizó el cambio para
dar soporte a la memoria RAM.
⇛ En uboot/include/configs/mx28evk.h se cambiaron los argumentos del Boot y dejarlos
de la siguiente manera:
"baudrate=115200\0" \
"bootargs=mem=64M console=ttyAM0,115200n8 rootdelay=2 root=/dev/mmcblk0p3 rw
rootfstype=ext3\0" \
"bootcmd=run mmcboot\0" \
"bootdelay=1\0" \
"image=zimage\0" \
"loadaddr=0x41000000\0" \
"loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}\0" \
"mmcboot=run loadimage; bootz 0x41000000\0" \
"mmcdev=0\0" \
"mmcpart=2\0" \
"prompt=iflab:\0" \
Con las modificaciones de la memoria y de las variables de arranque se compila y carga el
U-Boot la memoria con los siguiente comandos:
make ARCH=arm CROSS_COMPILE="arm-none-eabi-" u-boot.sb
mxsboot sd u-boot.sb u-boot.sd
sudo dd if=u-boot.sd of=/dev/sdb1
sudo umount /dev/sdb*

4. Imagen Linux Kernel


Se usó la versión de Kernel linux-2.6.35.3 y se realizó la modificación del archivo
linux/arch/arm/mach-mx28/emi_setting.c para la memoria de 64 Megabytes, específicamente
se modifica la tabla de direcciones de la memoria.

4.1. Soporte Audio

La tarjeta Stamp_imx28 incluye el integrado SGTL5000 como codec de audio, este integrado
tiene características de baja potencia e incluye un amplificador de audifonos integrado. Este
codec cuenta con una interface de bus serial digital I2S ( inter-IC sound ) usada para transmitir la
información de audio. Por otra parte, este codec también tiene una interface I2C empleada
como puerto de comunicaciones de control. La interconexión electrica de este dispositivo se
observa en la siguiente figura.
La tarjeta tiene una salida de audio estéreo para audífonos en el conector HP1 tipo Jack de
3.5mm. Además esta tarjeta tiene una entrada de audio conecta al integrado SGTL5000
identificada con LINE_IN al conector HP2 de tipo semejante al empleado para salida.
La interconexión desde el procesador iMX28 hacia el integrado SGTL5000, es realizada a través
de las interfases SAIF (Serial audio interface) para transmisión de la información de audio, y la
interface I2C para el control del SGTL5000. La interconexión entre estos dos dispositivos se
observa en el siguiente diagrama.

Para habilitar el soporte de audio por el kernel linux fue necesario realizar algunas
modificaciones a un archivo y a la configuración del kernel. En primera instancia, se edita el
archivo mx28evk_pins.c donde se definen las estructuras asociadas a los pines, ubicado en la
ruta arch/arm/mach-mx28/mx28evk_pins.c dentro del directorio del kernel. Se edita este
archivo deshabilitando los pines asociados al puerto I2C1 y habilitando los pines
correspondientes al puerto SAIF0.
Por otra parte, es necesario inicialmente deshabilitar el puerto AUART4 en la configuración del
kernel como se observa a continuación:
System Type --->
Freescale Application UART: --->
[ ] Application uart 4 enabled

Posteriormente se habilitan las siguientes configuraciones en el kernel asociadas al audio:


Device Drivers --->
<*> I2C support --->
<*> I2C device interface
I2C Hardware Bus support --->
<*> MXS I2C support
[*] Enable I2C0 module
<*> Sound card support --->
<*> Advanced Linux Sound Architecture --->
[*] SPI sound devices →
<*> ALSA for SoC audio support --->
<*> SoC Audio for the MXS chips
<*> SoC Audio support for MXS-EVK SGTL5000
<*> MXS Digital Audio Interface SAIF

Y finalmente se crean los archivos de dispositivo asociados al audio mediante alguno de los
siguientes dos métodos:
● Adición durante la ejecución del kernel: En la consola de linux en el embebido se
ejecutan las siguientes instrucciones.
mknod /dev/snd/controlC0 c 116 0 
mknod /dev/snd/pcmC0D0c c 116 24 
mknod /dev/snd/pcmC0D0p c 116 16 
mknod /dev/snd/seq c 116 1 
mknod /dev/snd/tiemr c 116 33 

● Adición antes de compilar el sistema de archivos: Se adicionan las siguientes lineas al


archivo device_table_dev.txt (listado de archivos de dispositivos utilizado para generar
el sistema de archivos) ubicado en la carpeta system del directorio del buildroot.
/dev/snd d 755 0 29 - - - - -
/dev/snd/controlC0 c 666 0 29 116 0 - - -
/dev/snd/pcmC0D0c c 666 0 29 116 24 - - -
/dev/snd/pcmC0D0p c 666 0 29 116 16 - - -
/dev/snd/seq c 666 0 29 116 1 - - -
/dev/snd/timer c 666 0 29 116 33 - - -

4.2 Soporte para la iNAND


Se realizó el cambio de la revisión de la iNAND de 5 a 6 para que el Kernel la reconociera, esto se
realizó en el archivo drivers/mmc/core/mmc.c.
También se habilitó la interface de 8 bits en el archivo arch/arm/mach-mx28/device.c
Además es necesario habilitar las siguientes configuraciones en el Kernel:
--- MMC/SD/SDIO card support
[ ] MMC debugging
[*] Assume MMC/SD cards are non-removable (DANGEROUS)
*** MMC/SD/SDIO Card Drivers ***
<*> MMC block device driver
[*] Use bounce buffer for simple hosts
< > SDIO UART/GPS class support
< > MMC host test driver
*** MMC/SD/SDIO Host Controller Drivers ***
<*> Secure Digital Host Controller Interface support
<*> SDHCI support on the platform specific bus
<*> MMC/SD/SDIO over SPI
[*] Freescale i.MX Secure Digital Host Controller Interface PIO mode
<*> MXS MMC support
Figura. Fue necesario modificar la interface SSP0 de 4 bits a 8 bits para permitir el funcionamiento de la
memoria iNAND.

Terminada la compilación del kernel se guarda la imagen en la partición FAT.

5. Buildroot
El sistema de archivos se genera ejecutando make en la carpeta del buildroot, como se
mencionó anteriormente, el sistema de archivos generado se encuentra comprimido con el
nombre rootfs.tar que se encuentra en /output/images en la carpeta del buildroot.

Programación OpenOCD
Para dar soporte a OpenOCD para escribir en la memoria Flash del SAM3N por la interfaz JTAG,
para esto es necesario revisar la tabla que relaciona los pines del procesador y el mapa de
memoria.
Así ya se tiene el kernel y el sistema de archivos corriendo desde la SD, de igual forma se tiene el
soporte para escribir en la memoria del SAM3 y el soporte de Audio.
ARRANQUE DESDE LA iNAND

Teniendo en cuenta que los pines de la SD y la iNAND están compartidos, no fue posible
detectar la iNAND cuando el sistema arranca desde la SD. Para eso fue necesario cambiar
los argumentos del arranque de buildroot y poner el sistema de archivos en una memoria
USB.

La metodología que se usó para realizar este proceso fue la siguiente:


1. Cambio de argumentos en el U-Boot, para poder arrancar el sistema de archivos
desde la memoria USB es necesario cambiar
bootargs=mem=64M console=ttyAM0,115200n8 rootdelay=2 root=/dev/mmcblk0p3 rw
rootfstype=ext3
por
bootargs=mem=64M console=ttyAM0,115200n8 rootdelay=2 root=/dev/sda1 rw
rootfstype=ext3
2. Cuando la imagen del kernel termine de descomprimirse, se desconecto la SD, en
este momento toda la ejecución del kernel esta en la memoria RAM. En los LOGS
del kernel se debe verificar que se reconoce la memoria iNAND.
3.

dd if=uboot.sd of=/dev/mmcblk0 

Luego con imx bootlets, en la memoria SD:

En esta parte fue necesario modificar el command_line del archivo


linux_prep/cmdlines/IMX28_EVK.txt para buscar el sistema de archivos en la segunda partición.

Con el sistema de archivos en una USB


Arrancar con la SD y retirarla luego de que el Kernel se haya descomprimido
Crear iNAND

mknod /dev/mmcblk0 b 179 0 
mknod /dev/mmcblk0p1 b 179 1 
mknod /dev/mmcblk0p2 b 179 2 

Se copia ix28_ivt_linux.sd a mmcblk0p1


Se formatea la iNAND con FDISK, mismo proceso de la SD, pero con 2 particiones, esta vez no se
usó UBOOT sino Bootlets. Quedan la partición Ontrack 53 y la del sistema de archivos de Linux
con formato Ext3.
6. Referencias

● FREESCALE SEMICONDUCTOR. "i.MX283: i.MX283 Multimedia Applications Processor".


[En línea
http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=i.MX283#
prettyPhoto]. Consultado el 01 de Julio de 2014.

● FREESCALE SEMICONDUCTOR. “iMX28 Application Processor Reference Manual”,


Document Number: MCIMX28RM, Rev. 1. Chapter 12, Boot Modes, pg. 949. [En línea
http://cache.freescale.com/files/dsp/doc/ref_manual/MCIMX28RM.pdf]

● Freescale Semiconductor. “Application Note, i.MX28 Layout and Design Guidelines”.


Document Number: AN4215, Rev. 0.09. [En línea
http://cache.freescale.com/files/32bit/doc/app_note/AN4215.pdf]

● Freescale Semiconductor, Technical Data, Audio Codec, Low power Stereo Codec with
Headphone Amp SGTL5000, Rev. 6.0, 11/2013. [En línea
http://cache.freescale.com/files/analog/doc/data_sheet/SGTL5000.pdf]

● ATMEL. "SAM3N ARM Cortex-M3 Microcontrollers". [En línea http://www.atmel.com/


products/microcontrollers/arm/sam3n.aspx]. Consultado el 01 de Julio de 2014.

● SAMSUNG. "DDR2". [En línea http://www.samsung.com/global/system/business/


semiconductor/product/2010/10/5/233138ds_k4t1gxx4qe_rev112.pdf]. Consultado el
01 de Julio de 2014.

● FREESCALE SEMICONDUCTOR. "Using the i.MX28 Power Management, Unit and Battery
Charger: Getting Started with Power Supply". AN4199. Rev. 1. [En línea
http://cache.freescale.com/files/32bit/doc/app_note/AN4199.pdf]. 2013

● FREESCALE. "otp_butner.py documentation". i.MX OTP Tools V.1.3.3. [En línea en


http://www.freescale.com/]. Consultado el 01 de Julio de 2014.

También podría gustarte