Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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.
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.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.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).
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 = 4bit (Para iniciar desde la memoria SD)
01 = 1bit
10 = 8bit (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.
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”.
En la siguiente tabla se presenta los nombres de los registros disponibles para el I.MX28:
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:
*chip-family-mx28*
# HW_OCOTP_ROM0 register
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
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.
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*
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
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
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.
dd if=uboot.sd of=/dev/mmcblk0
mknod /dev/mmcblk0 b 179 0
mknod /dev/mmcblk0p1 b 179 1
mknod /dev/mmcblk0p2 b 179 2
● 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]
● 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