The Funtoo Linux project has transitioned to "Hobby Mode" and this wiki is now read-only.
U-booting Funtoo on the TI AM335x X2 SBC-B2
Introduction
Installing Funtoo to a Raspberry Pi is fun, but there are a lot more boards out there. For example, the carrier boards that hold a DIMM mounted AM335x series cpu. To get this going, we need to use the U-Boot bootloader, some knowledge of device tree blobs, and a lot of patience.
For this article, we are using this board. You can read all about it here but the steps depicted here should get you a manufacturer supplied 4.1.8 kernel with a Funtoo stage3 running on it. Possibly.
When you pick a board, documentation is just as important as hardware features. Without it, you WILL be hunting down someone in Shenzhen to explain why the board refuses to boot (you forgot to ground C8, of course).
This is kind of a ridiculous exercise, given the author's limited level and the wild idiosyncrasies of board programming, but it may be instructive. It helps me.
Making the Environment
Edit xcompile_variables to set XC_WORK, XC_LINUX_PREFIX, ARCH, CROSSDEV_TARGET, and STAGE3 variables to taste. For this board, we use:
- CROSSDEV_TARGET="arm-linux-gnueabihf"
- ARCH=arm
- STAGE3=funtoo-current/arm-32bit/armv7a_neon_hardfp
- STAGE3_CFLAGS="-O2 -pipe -march=armv7-a -mfpu=neon -mfloat-abi=hard"
- STAGE3_NAME=stage3-latest.tar.xz
root # . xcompile_variables.sh root # mkdir -p $CONFIGS $FIRMWARE $LINUX $UBOOTS $STAGE3S
Retrieve Sources
root # git clone https://github.com/zhengsjgoembed/335x-b4-uboot.git $XC_UBOOT root # git clone https://github.com/zhengsjgoembed/335x-b4.git $XC_KERNEL_SRC root # wget https://git.ti.com/ti-cm3-pm-firmware/amx3-cm3/blobs/7c6075f28d9fdd633175cdbd8dc287613ce92e5d/bin/am335x-pm-firmware.bin -O $XC_FIRMWARE/am335x-pm-firmware.bin root # wget https://git.ti.com/ti-cm3-pm-firmware/amx3-cm3/blobs/7c6075f28d9fdd633175cdbd8dc287613ce92e5d/bin/am335x-pm-firmware.elf -O $XC_FIRMWARE/am335x-pm-firmware.elf
Crossdev
See Crossdev_Automation for info on how to get crossdev running on Funtoo.
root # crossdev -t $CROSSDEV_TARGET --gcc 4.9.3 -P -v root # gcc-config -l [1] arm-linux-gnueabihf-4.9.3 * [2] arm-linux-gnueabihf-5.2.0 [3] arm-linux-gnueabihf-5.3.0 [4] armv6j-hardfloat-linux-gnueabi-4.8.4 * [5] armv7a-hardfloat-linux-gnueabi-4.8.4 ...<lots of compilers>...
Kernel Building
root # . xcompile_variables root # echo $KERNEL_VERSION 4.1.18 root # cd $XC_KERNEL_SRC root # alias make="make -j<N>" root # cp am335x_b4_deconfig $XC_KERNEL_CONFIG root # . xcompile_variables Your current kernel configs for <XC_LINUX_PREFIX> type builds: Use 4.1.18.kconf as config (y/n)? y Setting XC_KERNEL_OLDCONFIG to /usr/src/fun_kernel/configs/<XC_LINUX_PREFIX>/4.1.18.kconf root # cp XC_KERNEL_OLDCONFIG .config root # ARCH=$ARCH CROSS_COMPILE=$CROSSDEV_TARGET- make zImage am335x-evm.dtb
U-Boot Building
Notice the use of O=$XC_LINUX_PREFIX to control output. Remove this directory if you need to clean for a rebuild. DTC is the device tree compiler location that permits the use of Device Tree Blobs, an absolutely essential tool for managing the wild forest of ARM processors and base boards. See this tutorial on the Device Tree.
root # cd $XC_UBOOT root # ARCH=$ARCH CROSS_COMPILE=$CROSSDEV_TARGET- make mrproper root # ARCH=$ARCH CROSS_COMPILE=$CROSSDEV_TARGET- make distclean root # rm -r ./$XC_LINUX_PREFIX root # ARCH=$ARCH CROSS_COMPILE=$CROSSDEV_TARGET- make O=$XC_LINUX_PREFIX am335x_evm_config root # ARCH=$ARCH CROSS_COMPILE=$CROSSDEV_TARGET- make O=$XC_LINUX_PREFIX DTC=$XC_KERNEL_SRC/scripts/dtc/dtc
Setup Stage3
Follow the steps in Crossdev_Automation#Stage3_Configuration but do not set up a software clock. Our board has a hardware clock.
Copy Over Kernel Files and Firmware
root # cd $XC_KERNEL_SRC root # ARCH=$ARCH CROSS_COMPILE=$CROSSDEV_TARGET- INSTALL_MOD_PATH=$XC_STAGE3S INSTALL_MOD_STRIP=1 make modules_install root # ARCH=$ARCH CROSS_COMPILE=$CROSSDEV_TARGET- INSTALL_FW_PATH=$XC_STAGE3S make firmware_install root # cp $XC_FIRMWARE/* $XC_STAGE3S/lib/firmware root # cp arch/arm/boot/zImage $XC_STAGE3S/boot root # cp arch/arm/boot/dts/*.dtb $XC_STAGE3S/boot root # rm $XC_STAGE3S/lib/modules/`get_kernel_release`/{build,source}
Copy Over U-Boot Files
root # cp $XC_UBOOT/$XC_LINUX_PREFIX/{MLO,u-boot.img} $XC_STAGE3S/boot
Install to the Board
Make an image.
root # dd if=/dev/zero of=/dev/<your_dev> bs=1024 count=1024 root # parted -s /dev/<your_dev> mklabel msdos root # parted -s /dev/<your_dev> unit cyl mkpart primary fat32 -- 0 9 root # parted -s /dev/<your_dev> set 1 boot on root # parted -s /dev/<your_dev> unit cyl mkpart primary ext2 -- 9 -2 root # mkfs.vfat -F 32 -n boot /dev/<your_dev>1 root # mkfs.ext4 -L rootfs /dev/<your_dev>2
Mount and Rsync.
root # mkdir -p /mnt/funtoo root # mount /dev/<your_dev>2 /mnt/funtoo root # mkdir -p /mnt/funtoo/boot root # mount /dev/<your_dev>1 /mnt/funtoo/boot root # rsync -avz --exclude "usr/portage/*" $XC_STAGE3S/{boot,bin,etc,home,lib,mnt,opt,root,run,sbin,srv,tmp,usr,var,dev} /mnt/funtoo root # mkdir -p /mnt/funtoo/{proc,sys} root # umount -R /mnt/funtoo
Moment of truth: do you really know what you are doing?