Builroot requiere tener instalados los siguientes tools:
which sed make (version 3.81 or any later) binutils build-essential (only for Debian based systems) gcc (version 2.95 or any later) g++ (version 2.95 or any later) bash patch gzip bzip2 perl (version 5.8.7 or any later) tar cpio python (version 2.6 or 2.7) unzip rsync wget ncurses-dev git bc
En debian/ubuntu(14.04) ejecutar:
sudo apt-get install sed make binutils build-essential gcc g++ bash patch gzip bzip2 perl tar cpio python unzip rsync wget libncurses5-dev git bc
$ git clone https://github.com/ciaa/buildroot.git $ cd buildroot/
$ pwd /home/user/buildroot $ make ciaa_lpc4337_defconfig
$ make
(prepararse unos mates mientras termina)
Buildroot produce varias imágenes:
$ ls output/images/ lpc4337-ciaa.dtb rootfs.cpio u-boot.bin uImage
Solamente necesitamos u-boot.bin y uImage. El u-boot.bin se debe grabar en la flash interna (0x1a000000) y el uImage en SPIFI (0x14000000). Esto no es tan simple, debido a que la configuración de openocd actual no soporta el acceso a SPIFI (falta verificar).
De todos modos, la grabación no es tan trillada. Se puede proceder de la siguiente forma. Se usa openocd y gdb con la configuración CIAA para acceder a la flash interna en 0x1a000000 y grabar u-boot.bin. Los comandos de gdb serían más o menos:
target remote :3333 monitor halt monitor flash erase_sector 0 0 last monitor flash write_image erase unlock /home/user/buildroot/output/images/u-boot.bin 0x1A000000 bin
Una vez hecho esto se puede bootear la CIAA, y usar minicom/microcom para levantar la consola USART2 (la que viene con el USB) a 115200-8-N-1.
Una vez en la consola U-Boot, grabar la imagen Linux (uImage) es muy simple, usando un comando “run update”:
ciaa > run update Auto-negotiation...completed. LPC18XX_MAC: link UP (100/Full) Using LPC18XX_MAC device TFTP from server 192.168.0.45; our IP address is 192.168.0.103 Filename 'uImage-ciaa-nxp'. Load address: 0x28000000 Loading: T ################################################################# ################### done Bytes transferred = 1227114 (12b96a hex)
Cómo se puede ver, el comando transfiere de un servidor TFTP el archivo 'uImage-ciaa-nxp'. Lo único que tenemos que hacer es configurar la dirección IP del servidor TFTP (192.168.0.45 por default) y copiar el archivo uImage al servidor:
$ cp output/images/uImage /srv/tftp/uImage-ciaa-nxp
Se encontrará una guía detallada paso por paso aquí
?? Q: ¿Cómo se instala un servidor TFTP? ?? A: ¡Es muy fácil! Sólo tienes que… http://bit.ly/1pZ5rzo. Usuarios de Debian/Ubuntu pueden ver este tutorial. Recordar que si conectan la CIAA-NXP directo a la PC donde funcionará el servidor TFTP, deberán configurar la conexión Ethernet con IP fija 192.168.0.45.
# dmesg Booting Linux on physical CPU 0x0 Linux version 3.18.0-rc4 (zeta@arch) (gcc version 4.8.2 (OSELAS.Toolchain-2013.12.2) ) #2 Thu Dec 4 17:39:12 ART 2014 CPU: ARMv7-M [410fc241] revision 1 (ARMv7M), cr=00000000 CPU: unknown data cache, unknown instruction cache Machine model: CIAA NXP LPC4337 bootconsole [earlycon0] enabled On node 0 totalpages: 2048 free_area_init_node: node 0, pgdat 281a0efc, node_mem_map 287f0000 Normal zone: 16 pages used for memmap Normal zone: 0 pages reserved Normal zone: 2048 pages, LIFO batch:0 pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768 pcpu-alloc: [0] 0 Built 1 zonelists in Zone order, mobility grouping off. Total pages: 2032 Kernel command line: console=ttyS0,115200 earlyprintk ip=192.168.0.103:192.168.0.45:::ciaa-nxp:eth0:off ethaddr=C0:B1:3C:88:78:93 PID hash table entries: 32 (order: -5, 128 bytes) Dentry cache hash table entries: 1024 (order: 0, 4096 bytes) Inode-cache hash table entries: 1024 (order: 0, 4096 bytes) Memory: 6328K/8192K available (931K kernel code, 77K rwdata, 152K rodata, 476K init, 74K bss, 1864K reserved) Virtual kernel memory layout: vector : 0x00000000 - 0x00001000 ( 4 kB) fixmap : 0xffc00000 - 0xffe00000 (2048 kB) vmalloc : 0x00000000 - 0xffffffff (4095 MB) lowmem : 0x28000000 - 0x28800000 ( 8 MB) .text : 0x28008000 - 0x28116cf8 (1084 kB) .init : 0x28117000 - 0x2818e000 ( 476 kB) .data : 0x2818e000 - 0x281a1520 ( 78 kB) .bss : 0x281a1520 - 0x281b3fed ( 75 kB) NR_IRQS:16 nr_irqs:16 16 sched_clock: 32 bits at 100 Hz, resolution 10000000ns, wraps every 21474836480000000ns Calibrating delay loop... 15.87 BogoMIPS (lpj=79360) pid_max: default: 4096 minimum: 301 Mount-cache hash table entries: 1024 (order: 0, 4096 bytes) Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes) devtmpfs: initialized pinctrl core: initialized pinctrl subsystem NET: Registered protocol family 16 pps_core: LinuxPPS API ver. 1 registered pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it> PTP clock support registered Switched to clocksource lpc3250 timer NET: Registered protocol family 2 TCP established hash table entries: 1024 (order: 0, 4096 bytes) TCP bind hash table entries: 1024 (order: 0, 4096 bytes) TCP: Hash tables configured (established 1024 bind 1024) TCP: reno registered UDP hash table entries: 256 (order: 0, 4096 bytes) UDP-Lite hash table entries: 256 (order: 0, 4096 bytes) Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled console [ttyS0] disabled of_serial 400c1000.serial: ttyS0 at MMIO 0x400c1000 (irq = 19, base_baud = 9000000) is a 16550A console [ttyS0] enabled bootconsole [earlycon0] disabled of_serial 400c2000.serial: ttyS1 at MMIO 0x400c2000 (irq = 20, base_baud = 9000000) is a 16550A stmmaceth 40010000.ethernet: no reset control found stmmac - user ID: 0x11, Synopsys ID: 0x36 Ring mode enabled DMA HW capability register supported Enhanced/Alternate descriptors Enabled extended descriptors RX Checksum Offload Engine supported (type 2) TX Checksum insertion supported Wake-Up On Lan supported Enable RX Mitigation via HW Watchdog Timer libphy: stmmac: probed eth0: PHY ID 0007c0f1 at 1 IRQ POLL (stmmac-0:01) active i2c /dev entries driver TCP: cubic registered Freeing unused kernel memory: 476K (28117000 - 2818e000)
/ # free total used free shared buffers Mem: 6804 2800 4004 0 0 -/+ buffers: 2800 4004
/ # memtester 800K 1 memtester version 4.3.0 (32-bit) Copyright (C) 2001-2012 Charles Cazabon. Licensed under the GNU General Public License version 2 (only). pagesize is 4096 pagesizemask is 0xfffff000 want 0MB (819200 bytes) got 0MB (819200 bytes), trying mlock ...locked. Loop 1/1: Stuck Address : ok Random Value : ok Compare XOR : ok Compare SUB : ok Compare MUL : ok Compare DIV : ok Compare OR : ok Compare AND : ok Sequential Increment: ok Solid Bits : ok Block Sequential : ok Checkerboard : ok Bit Spread : ok Bit Flip : ok Walking Ones : ok Walking Zeroes : ok 8-bit Writes : ok 16-bit Writes : ok Done.
Si bien la CIAA NXP ya bootea y funciona de manera relativamente estable, existen varios interrogantes y tareas que están pendientes. Sin ningún orden particular:
En esta wiki se puede consultar una tabla del estado de cada periférico respecto de su soporte en el kernel oficial o upstream.
[1] Practical Advice on Running uClinux on Cortex-M3/M4
[2] Quad SPI Flash: Benefits and Uses in General Purpose Microcontrollers
[3] Example Driver using On-Chip SRAM
[4] Para más información acerca del análisis y la reducción del footprint de memoria, se puede consultar el proyecto Kernel dynamic memory allocation tracking and reduction, slides.