I made a setup to boot my Pogoplug V4 kernel from NAND. The reason was that i wanted to attache a SATA multiplier, but when it is attached the Pogoplug cannot boot from it. It has to use either USB or SD card for the boot, which i don't like. This setup allowed me to boot from SATA with the multiplier attached.
WARNING
!!!! This is a destructive change! It will overwrite the content of the onboard FLASH! !!!
It is recommended to have serial access to the plug, otherwise it is hard to debug if it is not booting.
Here is my u-boot setup:
Good luck!
WARNING
!!!! This is a destructive change! It will overwrite the content of the onboard FLASH! !!!
It is recommended to have serial access to the plug, otherwise it is hard to debug if it is not booting.
- 1 Boot to u-boot /w serial connection
- 2 modify u-boot variable
mtdparts
Original value:mtdparts=mtdparts=orion_nand:1M(u-boot),4M(uImage),32M(rootfs),-(data)
New value:setenv mtdparts ‘mtdparts=orion_nand:1M(u-boot),-(data)’
Save the changesaveenv
Rebootreset
- 3 Login to the terminal after boot
Erase and format the mtd1 partitionflash_eraseall -j /dev/mtdblock1
Setup the filesystem
cd /boot ; mkdir flashkernel ; mount -t jffs2 /dev/mtdblock1 /boot/flashkernel/
- 4 Copy the kernel and dtb files to the new directory
cp uImage ./flashkernel/ ; cp uInitrd ./flashkernel/ ; mkdir /boot/flashkernel/dts ; cp dts/kirkwood-pogoplug_v4.dtb ./flashkernel/dts
- 5 test the setup
Reboot to u-boot
Issue the following commands:
chpart data fsload $load_uimage_addr uImage fsload $load_initrd_addr uInitrd fsload $load_dtb_addr dts/kirkwood-pogoplug_v4.dtb run set_bootargs bootm $load_uimage_addr $load_initrd_addr $load_dtb_addr
- 5 If everything goes fine you can update your uboot boot script.
Here is my u-boot setup:
arcNumber=3960 bootargs=console=ttyS0,115200 root=LABEL=rootfs rootdelay=10 mtdparts=orion_nand:1M(u-boot),-(data) bootcmd=run bootcmd_uenv; run scan_disk; run set_bootargs; if test "$bootdev" = "nand"; then run bootcmd_flash_exec; else run bootcmd_exec; fi bootcmd_exec=run load_uimage; if run load_initrd; then if run load_dtb; then bootm $load_uimage_addr $load_initrd_addr $load_dtb_addr; else bootm $load_uimage_addr $load_initrd_addr; fi; else if run load_dtb; then bootm $load_uimage_addr - $load_dtb_addr; else bootm $load_uimage_addr; fi; fi bootcmd_flash_exec=chpart data; run load_nand_uimage; if run load_nand_initrd; then if run_nand_dtb; then bootm 0x800000 0x1100000 0x1c00000; else bootm 0x800000 0x1100000; fi; else if run load_nand_dtb; then bootm 0x800000 - 0x1c00000; fi bootcmd_uenv=run uenv_load; if test $uenv_loaded -eq 1; then run uenv_import; fi bootdelay=10 bootdev=nand device=0:1 devices=usb ide mmc disks=0 1 2 3 dtb_file=/dts/kirkwood-pogoplug_v4.dtb ethact=egiga0 ethaddr=00:25:31:XX:XX:XX fileaddr=800000 filesize=1 if_netconsole=ping $serverip init_ide=ide reset init_mmc=mmc rescan init_usb=usb start ipaddr=192.168.0.231 led_error=orange blinking led_exit=green off led_init=green blinking load_dtb=echo loading DTB $dtb_file...; load $bootdev $device $load_dtb_addr /boot$dtb_file load_dtb_addr=0x1c00000 load_initrd=echo loading uInitrd ...; load $bootdev $device $load_initrd_addr /boot/uInitrd load_initrd_addr=0x1100000 load_nand_dtb=echo loading DTB $dtb_file from nand...; fsload $load_dtb_addr $dtb_file load_nand_initrd=echo loading uInitrd from nand...; fsload 0x1100000 uInitrd load_nand_uimage=echo loading uImage from nand...; fsload 0x800000 uImage load_uimage=echo loading uImage ...; load $bootdev $device $load_uimage_addr /boot/uImage load_uimage_addr=0x800000 machid=f78 mainlineLinux=yes mtdids=nand0=orion_nand mtdparts=mtdparts=orion_nand:1M(u-boot),-(data) partition=nand0,1 preboot_nc=run if_netconsole start_netconsole scan_disk=echo running scan_disk ...; scan_done=0; setenv scan_usb "usb start"; setenv scan_ide "ide reset"; setenv scan_mmc "mmc rescan"; for dev in $devices; do if test $scan_done -eq 0; then echo Scan device $dev; run scan_$dev; for disknum in $disks; do if test $scan_done -eq 0; then echo device $dev $disknum:1; if load $dev $disknum:1 $load_uimage_addr /boot/uImage 1; then scan_done=1; echo Found bootable drive on $dev $disknum; setenv device $disknum:1; setenv bootdev $dev; fi; fi; done; fi; done scan_ide=ide reset scan_mmc=mmc rescan scan_usb=usb start serverip=192.168.0.220 set_bootargs=setenv bootargs console=ttyS0,115200 root=LABEL=rootfs rootdelay=10 $mtdparts $custom_params start_netconsole=setenv ncip $serverip; setenv bootdelay 10; setenv stdin nc; setenv stdout nc; setenv stderr nc; version; stderr=serial stdin=serial stdout=serial uenv_addr=0x810000 uenv_import=echo importing envs ...; env import -t $uenv_addr $filesize uenv_init_devices=setenv init_usb "usb start"; setenv init_ide "ide reset"; setenv init_mmc "mmc rescan"; for devtype in $devices; do run init_$devtype; done; uenv_load=run uenv_init_devices; setenv uenv_loaded 0; for devtype in $devices; do for disknum in 0; do run uenv_read_disk; done; done; uenv_loaded=0 uenv_read=echo loading envs from $devtype $disknum ...; if load $devtype $disknum:1 $uenv_addr /boot/uEnv.txt; then setenv uenv_loaded 1; fi uenv_read_disk=if test $devtype -eq mmc; then if $devtype part; then run uenv_read; fi; else if $devtype part $disknum; then run uenv_read; fi; fi usb_ready_retry=15
Good luck!