Microblaze Linux
Tutorial SIlab5: Linux para MicroBlaze en Spartan3E Starter Board
Resumen
- Objetivo y antecedentes
- Configuración del sistema: Plataforma. Mapa de memoria
- Ejecución 123 Microblaze Linux pre-construido
- Guía de compilación Microblaze Linux
Objetivo y antecedentes
- Utilización del Linux kernel, a partir de su código fuente, para el procesador Xilinx MicroBlaze, configurarlo, compilarlo y ejecutarlo en una plataforma hardware basada en FPGA, concretamente la placa Digilent Spartan 3E Starter Board.
- La versión empleada del software de Xilinx es la 13.4
- Se construye un kernel con MMU dado que Xilinx no da soporte para non-MMU.
- Se obtiene un bitstream de configuración de la FPGA y una imagen del Linux kernel.
Antecedentes
MicroBlaze es la primera arquitectura soft-CPU integrada en el Linux Kernel Source tree principal, gracias al trabajo de Simek, Petalogix e Iglesias
Configuración del sistema
- MicroBlaze configurado como Linux MMU en modo virtual y 2 zonas de protección de memoria, cache de datos de 2KB y cache de instrucciones de 8KB
- Un periférico timer TMR doble, con 2 canales de temporización
- Un periférico serie asíncrono UART para la consola
- Un periférico de red Ethernet ETH para comunicación con protocolos TCP/IP
- Un periférico de depuración JTAG MDM
- Un periférico I2C a 100KHz con direccionamiento de 7 bits
- Un controlador de interrupciones INTC para UART, MDM, TMR, ETH e I2C
- Un periférico GPIO de 8 bits asociado a los LEDs de la placa
Plataforma: Digilent Spartan 3E Starter Kit
- Xilinx Spartan 3E FPGA XC3S500E (500K gates)
- Xilinx XCF04 Platform Flash for storing FPGA configurations
- Micron 64MB DDR SDRAM
- Numonyx 16MB StrataFlash
- ST Microelectronics 2MB Serial Flash
- Linear Technologies Power Supplies
- Texas Instruments TPS75003 Triple-Supply Power Management IC
- SMSC LAN83C185 Ethernet PHY
- Guía de usuario:
http://www.digilentinc.com/Data/Products/S3EBOARD/S3EStarter_ug230.pdf
Mapa de memoria
- (0000000000-0x00001fff) dlmb_cntlr dlmb
- (0000000000-0x00001fff) ilmb_cntlr ilmb
- (0x81000000-0x8100ffff) Ethernet_MAC mb_plb
- (0x81400000-0x8140ffff) LEDs_8Bit mb_plb
- (0x81600000-0x8160ffff) xps_iic_0 mb_plb
- (0x82000000-0x8200ffff) xps_intc_0 mb_plb
- (0x83c00000-0x83c0ffff) xps_timer_0 mb_plb
- (0x84000000-0x8400ffff) RS232_DCE mb_plb
- (0x84400000-0x8440ffff) mdm_0 mb_plb
- (0x88000000-0x8bffffff) DDR_SDRAM microblaze_0_DXCL
- (0x88000000-0x8bffffff) DDR_SDRAM microblaze_0_IXCL
- (0x8e000000-0x8effffff) FLASH mb_plb
Ejecución 0123 Microblaze Linux pre-construido
0 - Obtener archivos y descomprimir en workspace
1 - Desde Xilinx SDK descargar el bitstream de bootloop con Program FPGA
2 - Conectar la consola (HyperTerminal, Teraterm, Putty, …) asociada al puerto serie DCE configurado a 115200 bps, 8, N, 1
3 - Conectar con el microprocesador por protocolo JTAG mediante consola XMD y descargar la imagen de Linux precompilada desde la carpeta boot del proyecto
Pruebas Microblaze Linux pre-construido
= Chequeo de archivos de /proc (cpuinfo, meminfo, interrupts) =
- / # more /proc/cpuinfo
- / # more /proc/meminfo
- / # more /proc/interrupts
= Chequeo de la consola =
- / # cp /etc/fstab /dev/console; cat /etc/mtab > /dev/console
= Chequeo de interfaces de red (configuración automática por DHCP) =
/ # ifconfig eth0 Link encap:Ethernet HWaddr 00:0A:35:00:00:00 inet addr:158.49.55.93 Bcast:158.49.55.255 Mask:255.255.255.0 UP BROADCAST RUNNING MTU:1500 Metric:1 RX packets:33367 errors:0 dropped:739 overruns:0 frame:0 TX packets:4725 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:5859747 (5.5 MiB) TX bytes:385896 (376.8 KiB) Interrupt:1 Memory:81000000-8100ffff
= Utilidades de red (ping, telnet, tftp) =
- / # telnet 158.49.55.93
- / # ping -c 4 158.49.55.9
- / # tftp -g -r hello 158.49.55.9
Aplicaciones de usuario sobre Microblaze Linux
Compilación cruzada estática de aplicaciones
- > microblaze-unknown-linux-gnu-gcc -static -o hello hello.c
Transferencia de la aplicación compilada vía TFTP
- > tftp 158.49.55.93 -m binary -c put hello
Recepción vía TFTP y ejecución de aplicación
- / # touch /tmp/hello
- / # chmod a+x /tmp/hello
- / # ./tmp/hello
Hello world!
Test de GPIO mediante comandos de consola (encendido de LED)
- / # echo 248 > /sys/class/gpio/export
- / # echo out > /sys/class/gpio/gpio248/direction
- / # echo 1 > /sys/class/gpio/gpio248/value
Tests GPIO e I2C con aplicaciones de usuario
- / # tftp –g –r gpio.zip 158.49.55.9
- / # unzip gpio.zip
- / # chmod a+x
Guía de compilación Microblaze Linux
0 - Directorios, archivos y variables de entorno
Creamos los siguientes directorios asociados al proyecto hardware, la distribución de Linux y las herramientas necesarias, estableciendo las correspondientes variables de entorno para los directorio base:
- > export XPATH=(directorio de trabajo de hardware)
- > export XUX=(directorio base Linux)
- > export XPRJ=(nombre del proyecto hardware)
- > export XHW=$XPATH/$XPRJ (directorio de proyecto hardware)
- > mkdir -p $XHW $XUX
1 - Generar proyecto en Xilinx EDK (xps) de acuerdo a los requisitos anteriores, y exportando a Xilinx SDK (xsdk) los archivos necesarios
- > cd $PATH; xps&
2 - Obtener e instalar el Device Tree Generator
- > mkdir $XUX/dts_bsp; cd $XUX/dts_bsp
- > git clone git://git.xilinx.com/device‐tree.git bsp/device‐tree_v0_00_x
Añadiremos la ruta $XUX/dts_bsp a los repositorios de XSDK para configurar y generar un BSP en $XHW/$XPRJ_device‐tree_bsp, ruta que posteriormente usaremos.
3 - Obtener e instalar la GNU Toolchain
- > cd $XUX; git clone git://git.xilinx.com/microblaze-gnu.git
- > export MB_GNU=microblaze-gnu/binaries/lin64-microblazeunknown-linux-gnu_14.3_early
- > export PATH=$XUX/$MB_GNU/bin:$PATH
- > export ARCH=microblaze
- > export CROSS_COMPILE=microblaze-unknown-linux-gnu-
4 - Obtener el Linux Kernel
- > cd $XUX; git clone git://git.xilinx.com/linux-xlnx.git master
5 - Obtener una imagen de disco RAM preconstruida y copiarla en las fuentes del Linux kernel
- > cd $XUX; git clone git://git.xilinx.com/xldk/microblaze_v1.0
Para modificar la imagen descomprimir en un directorio temporal:
- > cd $XUX; mkdir initramfs; cd initramfs; gunzip -c ../microblaze_v1.0/initramfs_minimal.cpio.gz | sudo cpio -i
Hacer los cambios necesarios y volver a comprimir:
- > cd $XUX/initramfs; find . | cpio -H newc -o | gzip -9 > $XUX/master/initramfs.cpio.gz
6 - Desde Xilinx SDK (xsdk), donde se ha generado una plataforma hardware de acuerdo a la exportación desde Xilinx EDK (xps) con el nombre $XPRJ_hw_platform, testearemos dicha plataforma con aplicaciones básicas como memory_tests y peripheral_tests sobre un BSP de tipo standalone
Una vez verificado correctamente la operativa del hardware, generaremos el $XHW/$XPRJ_device‐tree_bsp creando un BSP Device‐Tree con los parámetros:
- (bootargs) console=ttyUL0 ip=on root=/dev/ram
- (console device) RS232_DCE
Obtendremos un archivo con extensión .dts necesario para el Linux kernel, por lo que hacemos visible esa ruta:
- > export XDT=${XPRJ}_device-tree_bsp
Y copiamos finalmente el archivo DTS en las fuentes del Linux kernel :
- > cp $XPATH/$XDT/microblaze_0/libsrc/devicetree_v0_00_x/xilinx.dts $XUX/master/arch/microblaze/boot/dts
7 - Configurar el Linux kernel
- > cd $XUX/master
Partir de una configuración por defecto con MMU mediante:
- > make ARCH=microblaze mmu_defconfig
Y configurar el resto de opciones en modo menu textual:
- > make ARCH=microblaze menuconfig
O en modo gráfico estándar:
- > make ARCH=microblaze xconfig
O en modo gráfico Gnome:
- > make ARCH=microblaze gconfig
Finalmente salvar la configuración, se guarda en un archivo .config para poder hacer cambios posteriores
8 - Compilar el kernel, limpiando previamente imágenes generadas anteriormente
- > cd $XUX/master
- > make ARCH=microblaze clean;
- > rm arch/microblaze/boot/simpleImage.*;
- > rm arch/microblaze/boot/linux.*
- > make -j ARCH=microblaze simpleImage.xilinx
- > make -j ARCH=microblaze UIMAGE_LOADADDR=0x88000000 linux.bin
- > cp arch/microblaze/boot/simpleImage.xilinx $XHW/boot
- > cp arch/microblaze/boot/linux.bin $XHW/boot
9 - Configurar la FPGA
- > impact -batch $XHW/etc/download.cmd
O descargar bootloop desde Xilinx SDK (xsdk) Y conectar la consola. Utilizar HyperTerminal, Teraterm o Putty en el puerto adecuado configurado a 115200 bps, 8, N, 1
10 - Cargar el Linux kernel generado
Conectar por JTAG con el microporocesador implementado en la plataforma mediante XMD
- > cd $XHW/boot; xmd -opt $XHW/etc/xmd_microblaze_0.opt
o
- > cd $XHW/boot; xmd
- XMD> connect mb mdm
Carga y arranque de la imagen de Linux kernel generada
- XMD> dow simpleImage.xilinx
- XMD> run
Referencias
Microblaze
http://www.xilinx.com/tools/microblaze.htm
Xilinx Open Source documentation
http://xilinx.wikidot.com
http://www.wiki.xilinx.com
Xilinx GIT server and access portal
http://git.xilinx.com
DENX Embedded Linux Development Kit
http://www.denx.de/wiki/DULG/ELDK
etc
http://devicetree.org
http://buildroot.net
http://cdstahl.org/?p=423
http://es.scribd.com/doc/63732567/Microblaze-Linux-on-Xilinx-ML605
http://m.lemays.org/blog/linuxforxilinxmicroblazeonml605
http://billauer.co.il/blog/2011/08/linux-microblaze-howto-tutorial-primer-1
http://frank.harvard.edu/~coldwell/toolchain
[(:Normark00b)]
Bibliografía
@InProceedings{Normark00b, author = {Kurt N{\o}rmark}, title = {A Suite of WWW-based Tools for Advanced Course Management}, booktitle = {ITiCSE'2000 - Innovation and Technology in Computer Science Education}, pages = {65--68}, year = {2000}, month = {July}, publisher = {ACM Press}, note = {Also Available from http://www.cs.auc.dk/~normark/laml/}, url = {http://www.cs.auc.dk/~normark/laml/papers/educational-applications/www-education-paper.pdf} }
dokuwiki\Exception\FatalException: Allowed memory size of 134217728 bytes exhausted (tried to allocate 4096 bytes)
An unforeseen error has occured. This is most likely a bug somewhere. It might be a problem in the authplain plugin.
More info has been written to the DokuWiki error log.