====== U-Boot ====== This page group together all the common LaCie [[http://www.denx.de/wiki/U-Boot|U-Boot]] informations (ie: not related with a specific board) ===== Repository ===== Sources are available in the [[http://git-scm.com|Git]] repository: [[http://git.lacie-nas.org/?p=u-boot-lacie.git;a=summary|u-boot-lacie.git]]. At least, the following branches should be availables: * **stable** is used to build the images distributed via the [[ftp://lacie-nas.org/u-boot|FTP repository]]. * **master** is the main development branch, holding the patches waiting to be merged mainline. Checkout command: git clone http://git.lacie-nas.org/u-boot-lacie.git or git clone git://lacie-nas.org/u-boot-lacie.git ===== Build ===== To compile U-Boot images, you could use the following commands (toolchain path, cross-compiler and board names to be replaced): PATH=/usr/local/x-tools/arm-2010q1/bin/:$PATH CROSS_COMPILE=arm-none-eabi- make netspace_v2_config PATH=/usr/local/x-tools/arm-2010q1/bin/:$PATH CROSS_COMPILE=arm-none-eabi- make u-boot.kwb ===== Downloads ===== For the supported boards, some pre-compiled U-Boot images are availables in the [[ftp://lacie-nas.org/u-boot|FTP repository]]. ===== Install from a LaCie stock U-Boot ===== This section present step by step how to update the stock U-Boot with a mainline version. A Network Space v2 board is used but the process should work with all the other LaCie boards supported by U-Boot mainline. ==== Why ? ==== * The LaCie stock U-Boot comes with a huge limitation: at reset, U-Boot reinitialize the boot environment variables (stored in Flash) with some built-in values. This includes the boot commands sequence. As a consequence, the LaCie system layout (or partition map) can't be changed. By default, U-Boot will load the Linux kernel from partition 10 (update) or from partition 6 as a fallback (default). * Save flash size (a LaCie U-Boot image size is ~450KB against ~230KB for a mainline one). * Boot reliably from USB. * Some command line enhancements: history, completion, scripting ... * Be able to add a new feature. ==== Preparations ==== * Create a work directory $ mkdir /tmp/tools && cd /tmp/tools * Get [[CLUNC|CLUNC]] $ wget ftp://lacie-nas.org/tools/clunc-1.1.tar.gz $ tar xf clunc-1.1.tar.gz * Get U-Boot **netconsole** utility $ wget ftp://lacie-nas.org/tools/u-boot-netconsole.tar.gz $ tar xf u-boot-netconsole.tar.gz * Setup and enable a TFTP server. The configuration really depends on your OS. For example, a Linux distribution could use **inetd** (the configuration file is /etc/inetd.conf). * Install the new u-boot image into the TFTP root directory (could be /var/tftpboot). $ wget ftp://ftp.lacie-nas.org/u-boot/u-boot-netspace_v2.kwb -O /var/tftpboot/u-boot-netspace_v2.kwb ==== Run CLUNC and connect to the LaCie U-Boot console ==== Startup the NS2 and run the following commands: $ cd /tmp/tools/clunc-1.1 $ ./clunc -i Marvell>> version U-Boot 1.1.4 (Jan 17 2011 - 21:48:29) Marvell version: 3.4.16 LaCie 1.5.9 256MB A **serial** link can also be used to connect to U-Boot. For this how-to, the **netconsole** way (the cheaper) is preferred. Mostly, the following steps should be relevant for the **serial** way too. ==== Flash the new U-Boot image ==== Marvell>> bubt u-boot-netspace_v2.kwb Using egiga0 device TFTP from server 192.168.0.13; our IP address is 192.168.0.15 Filename 'u-boot-netspace_v2.kwb'. Load address: 0x2000000 Loading: ########################################## done Bytes transferred = 214220 (344cc hex) Un-Protect Flash Monitor space **Warning** If U-Boot Endiannes is going to change (LE->BE or BE->LE), Then Env parameters should be overriden.. Override Env parameters? (y/n) n Erase 0 - 125 sectors... ................................................................. ............................................................. Copy to Flash... done Protect Flash Monitor space ==== Restart ==== Marvell>> reset ==== Retrieve the NAS IP address ==== U-Boot mainline don't provide a magic packet mechanism to configure the IP address. Instead DHCP is used. It means that [[CLUNC|CLUNC]] becomes useless from this point. Ensure that the NAS is connected to your local network and that a DHCP server is running. Some possible ways to retrieve the NAS IP address: * Use an utility like **dhcpdump**. * Look in the DHCP server log. * Configure and run your own DHCP server. Example with **dhcpdump**: $ sudo dhcpdump -i eth0 ... snip ... TIME: 2011-07-15 16:31:50.686 IP: 0.0.0.0 (2:50:43:7e:8d:94) > 255.255.255.255 (ff:ff:ff:ff:ff:ff) OP: 1 (BOOTPREQUEST) HTYPE: 1 (Ethernet) HLEN: 6 HOPS: 0 XID: 437e9de1 SECS: 6 FLAGS: 0 CIADDR: 0.0.0.0 YIADDR: 0.0.0.0 SIADDR: 0.0.0.0 GIADDR: 0.0.0.0 CHADDR: 02:50:43:7e:8d:94:00:00:00:00:00:00:00:00:00:00 SNAME: . FNAME: . OPTION: 53 ( 1) DHCP message type 3 (DHCPREQUEST) OPTION: 57 ( 2) Maximum DHCP message size 576 OPTION: 54 ( 4) Server identifier 192.168.0.254 OPTION: 50 ( 4) Request IP address 192.168.0.15 --------------------------------------------------------------------------- The IP address is **192.168.0.15** ==== Connect to U-Boot via netconsole ==== The netconsole configuration rely on some environment variables: **ipaddr**, **ncip**, **stdin**, **stdout** and **stderr** (for more information, please refer to the file README.NetConsole included in U-Boot sources). After the update, this variables will be initialized with the default (or built-in) values and the netconsole is configured to broadcast UDP messages. **netcat** don't handle the UDP broadcast messages. The dedicated U-Boot tools **netconsole** and **ncb** must be used. * Run **netconsole** and interrupt boot process (Ctrl-C): $ cd /tmp/tools/u-boot-netconsole $ ./netconsole 192.168.0.15 ^C ns2> version arm-none-eabi-gcc (Sourcery G++ Lite 2010q1-188) 4.4.1 GNU ld (Sourcery G++ Lite 2010q1-188) 2.19.51.20090709 ==== Default configuration ==== * Here is a default environment sample: ns2> print autoload=no baudrate=115200 bootargs=console=ttyS0,115200 bootcmd=dhcp && run netconsole; if run usbload || run diskload; then bootm; fi bootdelay=3 bootfile=uImage diskload=ide reset && ext2load ide 0:1 $loadaddr /boot/$bootfile dnsip=212.27.40.240 ethact=egiga0 ethaddr=02:50:43:92:75:b8 gatewayip=192.168.0.254 ipaddr=192.168.0.15 loadaddr=0x800000 netconsole=set stdin $stdin,nc; set stdout $stdout,nc; set stderr $stderr,nc; netmask=255.255.255.0 stderr=serial,nc stdin=serial,nc stdout=serial,nc usbload=us Environment size: 604/4092 bytes ==== Configure U-Boot to suit your own needs ==== * Modify the U-Boot environment. * Use GPIO button. The **button** command allow to check the GPIO button status. <> ns2> button ns2> echo $? 0 <> ns2> button ns2> echo $? 1 ===== Update U-Boot mainline ===== ns2> tftpboot 0x800000 u-boot-netspace_v2.kwb Using egiga0 device TFTP from server 192.168.0.13; our IP address is 192.168.0.15 Filename 'u-boot-netspace_v2.kwb'. Load address: 0x800000 Loading: ########################################## done Bytes transferred = 214220 (344cc hex) ns2> sf probe 0 SF: Detected MX25L4005 with page size 64 KiB, total 512 KiB ns2> sf erase 0 0x50000 ns2> sf write 0x800000 0 0x50000 ns2> reset resetting ... You can automatize these steps with an u-boot script : ns2> setenv update_uboot 'tftp 0x800000 $UBOOTFILE && sf probe 0 && sf erase 0 0x50000 && sf write 0x800000 0 0x50000' ns2> setenv UBOOTFILE u-boot-netspace_v2.kwb ns2> sav Saving Environment to SPI Flash... And then update the UBOOTFILE variable and launch the script : ns2> setenv UBOOTFILE ns2> sav Saving Environment to SPI Flash... ns2> run update_uboot Using egiga0 device TFTP from server 192.168.1.19; our IP address is 192.168.1.65 Filename 'uboot'. Load address: 0x800000 Loading: ################# done Bytes transferred = 239836 (3a8dc hex) SF: Detected MX25L4005 with page size 64 KiB, total 512 KiB ===== Links ===== * [[http://www.denx.de/wiki/U-Boot|U-Boot project]]