After a bit of work, I got the sheeva plug working the way I wanted it to. First of all, I grabbed a spare 1G USB flash disk I had laying around and installed Debian squeeze to it by following tbm’s instructions here:
After debian was installed to the USB disk, I removed it from the plug and used dd on my laptop to create an image of the filesystem. I mounted the filesystem as a loopback device and created a jffs2 partition image from it after doing a bit of minor tweaking. I placed the USB disk back in the plug and booted to it. Using this intermediate filesystem and the mtd-tools package, I wrote the new jffs2 image to the NAND mtd device. I then modified the uboot environment to suit, saved, and now have a working setup.
Detailed instructions are below.
Connect the plug to your network with the rj-45/cat5 cable.
Connect a USB flash drive to the plug. I used a 1G drive, but 512M should be sufficient.
Install the ‘tftpd’ package on a machine on your network. You’ll also need screen on the machine that you use to connect to the plug’s serial terminal. I’ll assume these are the same host. You need the IP address of the tftp server. In this example, we will assume that the IP is 192.168.1.2 and that you will assign 192.168.1.200 to the plug.
$ sudo apt-get install tftpd screen
$ sudo wget -O /srv/tftp/uImage http://www.cyrius.com/tmp/beta1/marvell/sheevaplug/uImage
$ sudo wget -O /srv/tftp/uInitrd http://www.cyrius.com/tmp/beta1/marvell/sheevaplug/uInitrd
$ sudo wget -O /srv/tftp/uBoot http://wp.colliertech.org/cj/wp-content/uploads/2010/09/07/uboot.bin
Connecting to the serial console
We are now ready to boot the plug. Note that you have to be quick with the screen command. I recommend you type it out and get ready to press the enter key. You have to interrupt the bootloader in order to enter the u-boot console. Attach the power and immediately enter the following command:
$ screen -S sheeva /dev/ttyUSB0 cs8,ixoff,115200
If you did this right, you should see a prompt like this:
As per tbm’s instructions, you can now update the uboot if needed. Instructions for that are here:
I’ll put them inline here for completeness.
Marvell>> setenv serverip 192.168.1.2 # IP of your TFTP server Marvell>> setenv ipaddr 192.168.1.200 # IP of the plug Marvell>> bubt uboot.bin
be sure to answer ‘n’ to the question about env parameters.
Now reset the device. Don’t forget to interrupt the bootloader so we can get back to the prompt:
Let the device know that you will be running a mainline kernel and set the arcNumber:
Marvell>> setenv mainlineLinux yes Marvell>> setenv arcNumber 2097 Marvell>> saveenv Marvell>> reset
Install Debian to the USB disk
Interrupt the boot process once more. We are now ready to run the debian installer. I’ll leave the details as an exercise for the reader. The following should put you into the installer, which you are probably quite familiar with by now.
NB: I will assume that you will use a single ext3 partition for the entire system. This will make it easier to build a jffs2 image out of the resultant partition on the USB disk.
Marvell>> setenv serverip 192.168.1.2 Marvell>> setenv ipaddr 192.168.1.147 Marvell>> tftpboot 0x01100000 uInitrd Marvell>> tftpboot 0x00800000 uImage Marvell>> setenv bootargs console=ttyS0,115200n8 base-installer/initramfs-tools/driver-policy=most Marvell>> bootm 0x00800000 0x01100000
build a jffs2 image
Once the installation has completed, power down the plug and remove the USB disk. Put the USB disk in the machine you used to get the console on the plug and note what device the kernel assigns to it. In my case, it was given sdc, so debian is installed to /dev/sdc1. I will use these values for this example.
If the filesystem was automatically mounted, unmount it. Create a disk image of the partition and mount it as a loopback device.
$ sudo umount /dev/sdc1 $ dd if=/dev/sdc1 of=/tmp/debian.img $ mkdir /tmp/mnt $ sudo mount -o loop /tmp/debian.img /tmp/mnt
You can now remove the USB disk and return it to the plug.
Modify the /etc/fstab file. The root filesystem will be /dev/mtdblock2 and of fs type jffs2. My fstab file looks like the following:
proc /proc proc defaults 0 0 /dev/mtdblock2 / jffs2 errors=remount-ro 0 1
We can now create a jffs2 image from the mounted and altered fresh install:
$ sudo mkfs.jffs2 -l \ -e 0x20000 \ -X zlib \ --eraseblock=128KiB \ --pad \ --output=/tmp/rootfs.jffs2 \ --compression-mode=priority \ -n \ --squash \ -r /tmp/mnt
write jffs2 to nand
Now that we have an image to flash to the NAND, let’s boot off of the USB disk. It should now be attached to the plug. Power on the plug and use screen to get a console. Interrupt the bootloader and enter the following commands:
Marvell>> setenv bootargs_console console=ttyS0,115200 Marvell>> setenv bootcmd_usb 'usb start; ext2load usb 0:1 0x01100000 /boot/uInitrd; ext2load usb 0:1 0x00800000 /boot/uImage' Marvell>> setenv bootcmd 'setenv bootargs $(bootargs_console); run bootcmd_usb; bootm 0x00800000 0x01100000' Marvell>> run bootcmd
Log in as root with the credentials you configured during the install. You will need to install a few packages in order to complete the nand flash. You can then ssh to the host on which you created the jffs2 image and cat it to stdout, piping this to nandwrite:
$ sudo apt-get install mtd-utils $ ssh firstname.lastname@example.org cat /tmp/rootfs.jffs2 | sudo nandwrite /dev/mtd2 -p -
You now have a jffs2 image on the nand.
One more reboot to set u-boot’s environment, and you will be done. Power down and remove the USB disk. Power on and get the serial console using screen. Break into the bootloader and enter the following commands:
Marvell>> setenv bootargs_console console=ttyS0,115200 Marvell>> setenv mtdpartitions mtdparts=orion_mtd:0x400000@0x100000(uImage),0x1fb00000@0x500000(rootfs) Marvell>> setenv bootargs_root root=/dev/mtdblock2 rw rootfstype=jffs2 Marvell>> setenv bootcmd 'setenv bootargs $(bootargs_console) $(mtdpartitions) $(bootargs_root); nand read.e 0x00800000 0x00100000 0x00400000; bootm 0x00800000' Marvell>> saveenv Marvell>> reset
You should now be good to go.