pub:mblinux

Microblaze Linux

Tutorial SIlab5: Linux para MicroBlaze en Spartan3E Starter Board

  • 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
  • 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

  • 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

  • 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

  • (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
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
  • XMD> connect mb mdm
  • XMD> dow simpleImage.xilinx
  • XMD> run

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

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
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

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}
} 
  • pub/mblinux.txt
  • Última modificación: 2020/09/28 11:44
  • (editor externo)