DreamPlug

Starting with dreamplug

Where can i find it ?

what is it ?

It's a linux server in a plug not so big (like a desktop power adapter).

I bought mine on http://www.newit.co.uk and i received it one week later, one day from England to France and FIVE days from Orly(airport) to Paris, yes the last twenty km was very hard for the french delivery (La Poste).

I am very interested in this one rather than D2plug because there are 2 ethernets (Gigabits) interfaces, and it's more interesting for making a firewall. In fact there are 3/4 interfaces because we can use wireless network (802.11b/g and 802.15). I think i'll only use wifi, not bluetooth on it.

Don't forget to buy the JTAG, because this is the only way for accessing the boot console (aka BIOS).

JTAG or not JTAG?

First, i thought i will never use JTAG (very old system for accessing hardware).

The JTAG device have two connectors, UART and JTAG. UART is for accessing the console, boot command and ttyS0, and JTAG for debugging and hardware commands. So i only use UART at first, and thouht JTAG is not for me (i was so naive).

But after i have rebuilt a kernel, and reboot the system, this kernel was not very usefull. Or when i crashed the OS, i have the same conclusion, i can't reset the hardware and must move to my dreamplug, but it s not what i want.

Original system

Nice but not for me, it's an ubuntu 9.04, i am not a huge fan of ubuntu, but it's enought for many things. But ubuntu drop support for this architecture. That's why we can found the new release on google code. And change to ubuntu again (i am wrong, ubuntu didn't dropped ARM architecture).

I do not modify any bit of the main system, it's only for recover. i will use another system on USB or SD card, at first it's a dump of the main system, and i will use another distrib.

Can i create/use my own distrib ?

Yes, sure. First, we can use the google code distrib on a usb drive.

So on another system (your main computer for example), do these steps.

download dreamplug_debian_v0.2.tar.gz
curl http://dreamplug.googlecode.com/files/dreamplug_debian_v0.2.zip.001 >dreamplug_debian_v0.2.zip
curl http://dreamplug.googlecode.com/files/dreamplug_debian_v0.2.zip.002 >>dreamplug_debian_v0.2.zip
7z x dreamplug_debian_v0.2.zip

Now use a USB key and create a disk label and two partitions (like on the dreamplug) and create the new fs and system.

I suppose that your usb key is on /dev/sdf

create  2 partitions on usb disk
/dev/sdf1 >128M fat16
/dev/sdf2 >2Go ext3/ext4
mkdosfs /dev/sdf1
mkfs.ext3 -L /dream_root /dev/sdf2
mount /dev/sdf2 /mnt
tar xvf dreamplug_debian_v0.2.tar.gz -C /mnt 
edit and make change on /mnt/root/init_setup.sh
umount /mnt
mount /dev/sdf1 /mnt
curl http://dreamplug.googlecode.com/files/uImage >/mnt/uImage-2.6
cp /mnt/uImage-2.6 /mnt/uImage-2.6.orig
umount /mnt

Now plug the USB key on the device and you must use UART/JTAG connector for accessing uboot parameters.

For now we can test and not save parameters that our distrib and kernel are correct. Start the DP and stop the boot proccess (hit a key)

I saved the boot image twice, uImage-2.6 and uImage-2.6.orig. This kernel is a valid kernel and we can allways recover with this kernel in future when a problem on the file (wrong update, rm,...)

Marvell>> usb start
Marvell>> fatls usb 2
Marvell>> fatload usb 2 0x6400000 uImage-2.6
Marvell>> setenv bootargs console=ttyS0,115200 root=/dev/sdc2 rootdelay=10
Marvell>> bootm 0x6400000

Now you can login with root/nosoup4u, and you can make many flavours of this distro.

In boot parameters i'll allways use uImage-2.6 and when i'll upgrade the kernel i have to update this file on the FAT partition of my usb key.

The boot command and parameters

The original boot command is starting network, try to boot from DHCP and USB and try to boot on it. So i prefer a simpler way, just start usb.

Marvell>> setenv x_bootcmd_usb usb start
Marvell>> setenv x_bootcmd_kernel fatload usb 2 0x6400000 uImage-2.6
Marvell>> setenv x_bootargs root=/dev/sdc2 rootdelay=10 console=ttyS0,115200
Marvell>> setenv bootcmd ${x_bootcmd_usb}; ${x_bootcmd_kernel};setenv bootargs ${x_bootargs};bootm 0x6400000;
Marvell>> saveenv

debootstrap for debian

Same as before, plug a new USB key in your DP, and use debootstrap/cdebootstrap for making your distro.

First install debootstrap or cdebootstrap on your DP or another computer if you have an ARM crossdev or emulator.

you can find the last pre-compiled kernel at sheeva kernel site.

# CHROOT="/data/DebianDream"
# PKG="openssh-server,curl,rsync,localepurge,ntp,ntpdate,sudo,lsb-core"
# mkdir -p $CHROOT
# cd $CHROOT
# cdebootstrap --flavour=standard --include=$PKG squeeze $CHROOT
# sed -i 's/^#T0/T0/' $CHROOT/etc/inittab
# sed -i 's/squeeze main$/squeeze main non-free/' $CHROOT/etc/apt/sources.list
# chroot $CHROOT aptitude install libertas-firmware
# chroot $CHROOT passwd
# cp /usr/bin/uaputl $CHROOT/usr/bin/uaputl
# curl -O $CHROOT/boot/uImage-2.6 http://sheeva.with-linux.com/sheeva/2.6.39/2.6.39.2/dream-2.6.39.2-uImage
# curl -O /tmp/modules.tar.gz http://sheeva.with-linux.com/sheeva/2.6.39/2.6.39.2/sheeva-2.6.39.2-Modules.tar.gz
# tar xvf /tmp/modules.tar.gz -C $CHROOT
# rm /tmp/modules.tar.gz

Now you can use this new distrib. /data/DebianDream can be a mount point of a new partition./device. or an archive for next release, and you can dump/restore to another device.

And now for Gentoo

As usual you can create a cross dev environment or start from your DP.

# CHROOT="/data/GentooDream"
# mkdir -p $CHROOT
# wget -O /tmp/gentoo.stage3.tar.bz2 http://mirrors.kernel.org/gentoo/releases/arm/autobuilds/current-stage3-armv5tel/stage3-armv5tel-20110624.tar.bz2
# tar xvf /tmp/gentoo.stage3.tar.bz2 -C $CHROOT
# wget -O /tmp/portage.tar.bz2 http://mirrors.kernel.org/gentoo/releases/snapshots/current/portage-latest.tar.bz2
# tar xvf /tmp/portage.tar.bz2 -C $CHROOT/usr
# rm /tmp/gentoo.stage3.tar.bz2 /tmp/portage.tar.bz2
# curl -O $CHROOT/boot/uImage-2.6 http://sheeva.with-linux.com/sheeva/2.6.39/2.6.39.2/dream-2.6.39.2-uImage
# curl -O /tmp/modules.tar.gz http://sheeva.with-linux.com/sheeva/2.6.39/2.6.39.2/sheeva-2.6.39.2-Modules.tar.gz
# tar xvf /tmp/modules.tar.gz -C $CHROOT
# rm /tmp/modules.tar.gz
# rc-config add net.eth0
# rc-config add sshd
# sed -i 's/\(^s0.*\) \([0-9]*\)/\1 115200/ /etc/inittab
# passwd

Now you can use this new distrib. /data/GentooDream can be a mount point of a new partition./device. or an archive for next release, and you can dump/restore to another device

For JTAG users

openocd is your friend

Firs install openocd on your computer, the one connected to the JTAG device by USB cable.

# echo dev-embedded/openocd ftdi usb >/etc/portage/package.use/jtag
# echo dev-embedded/openocd >/etc/portage/package.keywords/jtag
# emerge openocd

After, you must select and create a valid config file and start the openocd server

# cat /usr/share/openocd/scripts/interface/sheevaplug.cfg >/etc/openocd.cfg
# cat /usr/share/openocd/scripts/board/sheevaplug.cfg >>/etc/openocd.cfg
# openocd -f /etc/openocd.cfg

some basics use of JTAG

On another terminal, conect to the localhost port 4444

# telnet 127.0.0.1 4444
> reset halt

With this command you can reset and halt to Marvell>> prompt at the UART console. Very usefull on crash or hang system.

Playing with kernel

Initrd and uInitrd

Now we want to boot on a new type of File System like btrfs or ext4, so we must or we want to use initrd image.

Create an initramfs/initrd file

# uname -r
2.6.39.2
# update-initramfs -c -k 2.6.39.2
update-initramfs: Generating /boot/initrd.img-2.6.39.2
# mkimage -A arm -O linux -T ramdisk -C gzip -a 0x0 -e 0x0 -n "Debian ramdisk 2.6.39.2" -d /boot/initrd.img-2.6.39.2 /media/usb2/uInitrd-2.6

Add boot prameters

Marvell>> setenv x_bootcmd_initrd fatload usb 2 0x6900000 uinitrd-2.6
Marvell>> setenv bootcmd ${x_bootcmd_usb}; ${x_bootcmd_kernel}; ${x_bootcmd_initrd}; setenv bootargs ${x_bootargs} ${x_bootargs_root}; bootm 0x6400000 0x6900000;

Create a New kernel

The first time, get the sources

Get the kernel via git on the kernel.org site and compile with the actual config.

You must download the patch libertas AP from marvell, and apply.

# git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
# mkdir Patches
# cd linux
# 

# export PatchList="linux-3.0-SDIO-micro-AP 0002-Driver-for-Marvell-Libertas-8688-SDIO-micro-AP-suppo-3.2 0003-Initial-defconfig linux-3.0.4-LIBERTAS-WEXT_PRIV mvsdio-1-2.6.30 mvsdio-2 sheeva-3-leds"

#
# for P in $PatchList;do
#   wget -O ../Patches/${P}.patch http://sheeva.with-linux.com/sheeva/3/3.2/3.2/source/${P}.patch
    patch -p1 < ../Patches/${P}.patch
# done
#

The version of patches must be changed to suit yours.

Config and compile

To start, you can use the actual config from /proc, and modify some parameters.

# cd linux
# zcat /proc/config.gz >.config
# make menuconfig
# make uImage
# make modules
# make modules_install
# cp arch/arm/boot/uImage /boot

And now you can use it and it works very well.

# uname -a
Linux sheevaplug-debian 3.0.0-rc5-dirty #3 PREEMPT Sun Jul 3 00:29:23 UTC 2011 armv5tel GNU/Linux