====== 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 {{ :imagen1.png?300 |}} ===== 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 {{ :imagen2.jpg?300 |}} * 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 == {{:silab5.zip|}} == 1 - Desde Xilinx SDK descargar el bitstream de bootloop con Program FPGA == {{ :imagen3.png?300 |}} == 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 {{ :imagen4.png?300 |}}{{ :imagen5.png?300 |}} == 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} }