First setup a tftpd-hpa server. This is just as easy as apt-get install tftpd-hpa and then copy the file to the serving directory, which is /srv/tftp by default. Make sure everyone can read the file copied there. You don't need to configure DHCP to hand out the tftp server's IP address just for testing.
This is what I did to compile my U-Boot. This is based on notes from Always Innovating but using a different configuration.
- Install emdebian cross compilation toolchain which installs /usr/bin/arm-linux-gnueabi-{gcc,as,ld,...}.
- git clone git://git.denx.de/u-boot.git
- cd u-boot && git checkout v2013.04 # use a later release if appropriate.
- To enable ext4, you might want to apply this patch.
- make CROSS_COMPILE=arm-linux-gnueabi- sheevaplug_config
- make CROSS_COMPILE=arm-linux-gnueabi- all
tar jxf pogomv-u-boot.tar.bz2 cd pogomv-u-boot make CROSS_COMPILE=arm-linux-gnueabi- pogoplug2_config make CROSS_COMPILE=arm-linux-gnueabi- all cp u-boot-pogoplug2.bin /srv/tftpOver serial console, power on the device and hit enter as soon as you see:
U-Boot 1.1.4 (Oct 1 2011 - 12:06:06) Cloud Engines 1.1.2 (3.4.27) PHYADDR=0 U-Boot code: 00600000 -> 0067FFF0 BSS: -> 006918B4 Soc: 88F6192 A1 (DDR2) CPU running @ 800Mhz L2 running @ 400Mhz SysClock = 200Mhz , TClock = 166Mhz DRAM CAS Latency = 3 tRP = 3 tRAS = 8 tRCD=3 DRAM CS[0] base 0x00000000 size 128MB DRAM Total size 128MB 16bit width Addresses 8M - 0M are saved for the U-Boot usage. Mem malloc Initialization (8M - 7M): Done NAND:128 MB Flash: 0 kB CPU : Marvell Feroceon (Rev 1) CLOUD ENGINES BOARD: PPV4A3 Streaming disabled Write allocate disabled USB 0: host mode PEX 0: PCI Express Root Complex Interface PEX interface detected Link X1 Net: egiga0 [PRIME] Hit any key to stop autoboot: 0 Do it now!This enters the device's factory default U-Boot prompt (not the one you just compiled).
Let's get the device an IP address. You'll need to hit Ctrl-C to abort loading because my DHCP doesn't give out the correct TFTP server's address. It's using 10.0.5.1 (gateway) as the TFTP but my TFTP is at 10.0.5.33.
CE>> dhcp BOOTP broadcast 1 *** Unhandled DHCP Option in OFFER/ACK: 28 *** Unhandled DHCP Option in OFFER/ACK: 28 DHCP client bound to address 10.0.5.206 *** Warning: no boot file name; using '0A0005CE.img' Using egiga0 device TFTP from server 10.0.5.1; our IP address is 10.0.5.206 Filename '0A0005CE.img'. Load address: 0x2000000 Loading: * # hit Ctrl-C here AbortAt this point your device will forget its IP address, but you can set it back using setenv. Essentially we're using the DHCP command just to get an IP address. Here I'm also setting the correct TFTP server's IP address I want to be using.
CE>> setenv ipaddr 10.0.5.206 CE>> setenv serverip 10.0.5.33And now we can TFTP. We need to specify the filename and the memory location it will be written to once downloaded. The convention is to always chainload to 0x800000. The chainloaded U-Boot will relocate itself back to 0x67FFF0 which is the default CONFIG_SYS_TEXT_BASE.
CE>> tftp 0x800000 u-boot-pogoplug2.bin Using egiga0 device TFTP from server 10.0.5.33; our IP address is 10.0.5.206 Filename 'u-boot-pogoplug2.bin'. Load address: 0x800000 Loading: ################################################################# ############################ done Bytes transferred = 474148 (73c24 hex)When we start executing the chainloaded U-Boot, it will appear as if the device has reset itself, but it's really our newly compiled binary (see the U-Boot compilation date).
CE>> go 0x800000 ## Starting application at 0x00800000 ... U-Boot 1.1.4 (May 11 2013 - 18:53:25) Cloud Engines 1.1.2 (3.4.27) PHYADDR=0 U-Boot code: 00600000 -> 0067FFF0 BSS: -> 006918AC Soc: 88F6192 A1 (DDR2) CPU running @ 800Mhz L2 running @ 400Mhz SysClock = 200Mhz , TClock = 166Mhz DRAM CAS Latency = 3 tRP = 3 tRAS = 8 tRCD=3 DRAM CS[0] base 0x00000000 size 128MB DRAM Total size 128MB 16bit width Addresses 8M - 0M are saved for the U-Boot usage. Mem malloc Initialization (8M - 7M): Done NAND:128 MB Flash: 0 kB CPU : Marvell Feroceon (Rev 1) CLOUD ENGINES BOARD: PPV4A3 Streaming disabled Write allocate disabled USB 0: host mode PEX 0: PCI Express Root Complex Interface PEX interface detected Link X1 Net: egiga0 [PRIME] Hit any key to stop autoboot: 0 do it now!Don't forget to hit any key to stop at this point! And then after setenv serverip and ipaddr again. We can now tftp load the u-boot.bin we compiled for sheevaplug_config.
CE>> setenv serverip 10.0.5.33 CE>> setenv ipaddr 10.0.5.206 CE>> tftp 0x800000 sheevaplug.bin Using egiga0 device TFTP from server 10.0.5.33; our IP address is 10.0.5.206 Filename 'sheevaplug.bin'. Load address: 0x800000 Loading: ################################################################# ############# done Bytes transferred = 397856 (61220 hex) CE>> go 0x800000 ## Starting application at 0x00800000 ... data abort pc : [<008000e8>] lr : [<00800064>] sp : 005ffe10 ip : 006554f9 fp : 00000000 r10: 00000000 r9 : 00673674 r8 : 005fffcc r7 : 00000000 r6 : 00800000 r5 : 00721c24 r4 : 00000002 r3 : f1012000 r2 : 00000020 r1 : e1a03803 r0 : 00625131 Flags: nzcv IRQs off FIQs off Mode SVC_32 Resetting CPU ... 00800064>008000e8>This proves that Pogoplug V4 doesn't like sheevaplug's configuration. I've tested Davy Gravy's patch for pogo_v4_config but couldn't get it to work. I did manage to get the u-boot from ArchLinux's PogoPlug v4 u-boot to work.
Upon closer inspection, I noticed a few things about ArchLinux's U-boot.
- It's probably based on Pogoplug V4's u-boot at 1.1.4, except with USB enabled somehow.
- The ppv4-install.sh script writes ArchLinux u-boot to /dev/mtd0 for 4 blocks at 1MB offset, avoid overwriting the default u-boot.
- The boot script distinguishes factory u-boot from ArchLinux by probing for USB support (this is what "if usb start" is for). The default u-boot has no USB.
I also looked at porting PogoPlug v4 U-boot to a more recent version of U-boot but I gave up. The diff from stock U-boot 1.1.4 to PogoPlug v4 U-boot 1.1.4 reveals that it added a bunch of general purpose Marvell device support. It even included and compiled several files from the Linux kernel such as mv_cesa.c which has no business in U-boot. It's pretty messy.
I also tried the Marvell custodian repo of U-boot without luck. I think ArchLinux's approach is probably as good as it gets ... take the PogoPlug v4 U-boot 1.1.4 and enable USB.
No comments:
Post a Comment