Gumstix Setup

Making the root filesystem

First, install debootstrap and qemu (specifically you'll need qemu-arm-static). I don't remember the process, but there is a way for Linux to automatically execute ARM binaries with qemu which you'll need to set up. Then:

mkdir overo
cd overo
debootstrap --arch=armhf --include wget --foreign precise fs

Then prepare to chroot:

cp /usr/bin/qemu-arm-static fs/usr/bin/qemu-arm-static
mount -o bind /proc fs/proc
mount -o bind /sys fs/sys
mount -o bind /dev fs/dev
mount -o bind /dev/pts fs/dev/pts
chroot fs /bin/bash

Now you should be root in the target filesystem.

Finish setting up filesystem

Note that scout and root passwords are both 's'.

locale-gen en_US.UTF-8
/debootstrap/debootstrap --second-stage
groupadd gpio -r
useradd -mU -G sudo,gpio,dialout -s /bin/bash scout
echo "root:s" | chpasswd
echo "scout:s" | chpasswd
chmod u+s /bin/su
chmod u+s /usr/bin/sudo

Adding configuration files

See Gumstix Configuration for more info.

First clone the scoutos repository:

su scout
cd
git clone ssh://roboclub@roboclub.org/home/svn/scoutos
exit

Then copy all of the files in ~/scoutos/scout_gumstix/etc into /etc. At some point we should have a script using rsync which does this conveniently.

Clean up chroot

exit
umount fs/dev/pts
umount fs/dev
umount fs/sys
umount fs/proc

Making the boot files

First, install the gcc-arm-linux-gnueabi toolchain through the package manager. Then, see Building the kernel. Once you're finished with that, download and build the U-Boot source (if you use a different version, be careful that the patch still works correctly):

wget ftp://ftp.denx.de/pub/u-boot/u-boot-2012.07.tar.bz2
tar xvf u-boot-2012.07.tar.bz2
cd u-boot-2012.07
export CROSS_COMPILE=arm-linux-gnueabi-

Apply our patch (replacing ${scoutos} with the location of the repository), so that U-Boot will set the correct pin muxing.

patch -p1 < ${scoutos}/scout_gumstix/u-boot-scout.patch
make omap3_overo_config
make omap3_overo

Next copy generated files into their own directory:

mkdir ../boot
cp MLO u-boot.img ../boot

Finally, copy in the kernel you built:

cd ..
cp linux-3.2/arch/arm/boot/uImage boot

Installing ROS

This should be done as root in the chroot environment (or on the board itself).

First make sure that /etc/apt/sources.list has universe uncommented somewhere. Then add the ROS packages:

echo deb [arch=armel] http://packages.ros.org/ros/ubuntu precise main > /etc/apt/sources.list.d/ros.list
wget http://packages.ros.org/ros.key -O - | apt-key add -
apt-get update

Install ALL the dependencies!

apt-get install openssh-server screen vim
apt-get install gcc g++ make cmake pkg-config
apt-get install libboost.*1.48-dev
apt-get install liblog4cxx10-dev libbz2-dev
apt-get install python-rosinstall python-empy python-rospkg python-rosdep python-nose python-setuptools python-serial

From this point forward, don't be root

su scout

Install the base system according to http://www.ros.org/wiki/fuerte/Installation/Ubuntu/Source

cd
rosinstall --catkin ~/ros-underlay http://ros.org/rosinstalls/fuerte-ros-base.rosinstall
mkdir ros-underlay/build
cd ros-underlay/build
cmake .. -DCMAKE_INSTALL_PREFIX=/opt/ros/fuerte
make -j4
sudo make install

Make sure the scoutos repository has been cloned. Add the following two lines to ~/.bashrc:

source /opt/ros/fuerte/setup.bash
export ROS_PACKAGE_PATH=/home/scout/scoutos:/home/scout/ros:$ROS_PACKAGE_PATH

TODO install rosserial into /home/scout/ros

Then build everything! Except for scoutsim, which we don't need, and which has dependencies we don't want to install.

source ~/.bashrc
roscd scoutsim
touch ROS_NOBUILD
rosmake scout

Writing files to the SD card

Partition the SD card

Run fdisk on the sd card (probably /dev/mmcblk0). Then:

  • (c) Set DOS compatibility so you can put a partition near the beginning of the card.
  • (n p 1 128 +64M) Create a 64MB partition, which will be for booting.
  • (n p 2 131201 [enter]) Create another partition, just after the previous one, with the default size.
  • (a 1) Set the first partition as bootable.
  • (t 1 0c) Set the first partition as W95 FAT32 (LBA)
  • (p) Make sure everything looks good, including that the second partition is 83 Linux
  • (w) Write to disk (or, if you messed up, (q) to quit without modifying the disk)

Run this handy script

Note: it is important that MLO is copied to the boot partition first.

#!/bin/bash

boot=/dev/mmcblk0p1
fs=/dev/mmcblk0p2

mkfs.vfat -F 32 $boot
mkfs.ext3 $fs

mkdir -p sd

mount $boot sd && {
  cp boot/MLO sd
  cp boot/u-boot.img sd
  cp boot/uImage sd
  umount sd
}

mount $fs sd && {
  cp -R --preserve=all fs/* sd
  umount sd
}