Difference between revisions of "U-booting Funtoo on the TI AM335x X2 SBC-B2"

From Funtoo
Jump to: navigation, search
m
m
Line 7: Line 7:
 
{{warning|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.}}
 
{{warning|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 ==  
+
== Making the Environment ==
 
+
Edit xcompile_variables to set XC_WORK, XC_LINUX_PREFIX, ARCH, CROSSDEV_TARGET, and STAGE3 variables to taste.
 +
{{console|body=
 
# . xcompile_variables.sh
 
# . xcompile_variables.sh
 
# mkdir -p $CONFIGS $FIRMWARE $LINUX $UBOOTS $STAGE3S
 
# mkdir -p $CONFIGS $FIRMWARE $LINUX $UBOOTS $STAGE3S
 
+
Your current cross compilation environment:
 +
==============================
 +
ARCH
 +
arm
 +
==============================
 +
CROSSDEV_TARGET
 +
arm-linux-gnueabihf
 +
==============================
 +
STAGE3_CFLAGS
 +
-O2 -pipe -march=armv7-a -mfpu=neon -mfloat-abi=hard
 +
...<more output>...
 +
}}
 
== Retrieve Sources ==
 
== Retrieve Sources ==
 
+
{{console|body=
 
# git clone https://github.com/zhengsjgoembed/335x-b4-uboot.git $XC_UBOOT
 
# git clone https://github.com/zhengsjgoembed/335x-b4-uboot.git $XC_UBOOT
 
# git clone https://github.com/zhengsjgoembed/335x-b4.git $XC_KERNEL_SRC
 
# git clone https://github.com/zhengsjgoembed/335x-b4.git $XC_KERNEL_SRC
 
# 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
 
# 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
 
# 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
 
# 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.
 +
{{console|body=
 +
# crossdev -t $CROSSDEV_TARGET --gcc 4.9.3 -P -v
 +
# 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 ==
 
== Kernel Building ==
This is an example of using manufacturer supplier scripts for defconfig generation. Don't forget to adjust the make jobs with -j <N> or just alias make="make -j<N>" to copy paste the commands directly.
+
{{console|body=
 +
# . xcompile_variables
 +
# echo $KERNEL_VERSION
 +
4.1.18
  
 +
}}
 
=== Defconfig Generation ===
 
=== Defconfig Generation ===
 
This is a particular choice of defconfig
 
This is a particular choice of defconfig
 
{{console|body=
 
{{console|body=
 
# cd $XC_KERNEL_SRC
 
# cd $XC_KERNEL_SRC
# ARCH=$ARCH CROSS_COMPILE=$CROSSDEV_TARGET ti_config_fragments/defconfig_builder.sh -t ti_sdk_am3x_release
+
# alias make="make -j<N>"
# ARCH=$ARCH CROSS_COMPILE=$CROSSDEV_TARGET make ti_sdk_am3x_release_defconfig
+
# cp am335x_b4_deconfig $XC_KERNEL_CONFIG
 +
# . 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
 +
# cp XC_KERNEL_OLDCONFIG .config
 +
# ARCH=$ARCH CROSS_COMPILE=$CROSSDEV_TARGET- make zImage dtbs
 
}}
 
}}
  

Revision as of 05:05, February 12, 2017

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 serial consoles, and a lot of patience.

For this article, we are using this board. You can read all about it here but hopefully the steps depicted here will you a 4.1.8 kernel with a Funtoo stage3 running on it. Amazing, hopefully.

   Note

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).

   Warning

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.

root # . xcompile_variables.sh
root # mkdir -p $CONFIGS $FIRMWARE $LINUX $UBOOTS $STAGE3S
Your current cross compilation environment:
==============================
ARCH
arm
==============================
CROSSDEV_TARGET
arm-linux-gnueabihf
==============================
STAGE3_CFLAGS
-O2 -pipe -march=armv7-a -mfpu=neon -mfloat-abi=hard
...<more output>...

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

Defconfig Generation

This is a particular choice of defconfig

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 dtbs


root # ARCH=$ARCH CROSS_COMPILE=$CROSSDEV_TARGET- make uImage  modules LOADADDR=0x82000000

U-Boot Building

Notice the use of O=$XC_LINUX_PREFIX to control output. Remove this directory is you need to clean for a rebuild. DTC is the device tree compiler location. Again, a mystery.

root # wget $UBOOT_URL -O $UBOOTS/$UBOOT
root # cd $UBOOTS
root # mkdir u-boot && tar xf $UBOOT -C u-boot --strip-components 1
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

We set up the boot partion differently. The rest of the steps are the similar. Our board has a hardware clock as well.

root # sed -i "s/\/dev\/sda1.*/\/dev\/mmcblk0p1 \/boot/uboot vfat defaults 0 2/" $XC_STAGE3S/etc/fstab 
root # mkdir -p $XC_STAGE3S/boot/uboot

Copy Over Kernel Files

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  arch/arm/boot/uImage  $XC_STAGE3S/boot/uboot
root # get_kernel_release() { (cd $XC_KERNEL_SRC ; ARCH=$ARCH CROSS_COMPILE=$CROSSDEV_TARGET- make kernelrelease;) }
root # rm $XC_STAGE3S/lib/modules/`get_kernel_release`/{build,source}

Copy Over U-Boot Files

Leave a blank line at the end of the u-boot config. For some reason or other.

root # cp $XC_UBOOT/$XC_LINUX_PREFIX/{MLO,u-boot.img} $XC_STAGE3S/boot/uboot
root # echo "mmcrootfstype=ext4
bootargs=console=ttyO0,115200n8 root=/dev/mmcblk0p2 mem=128M rootwait
bootcmd=mmc rescan; fatload mmc 0 0x82000000 uImage; bootm 0x82000000
uenvcmd=boot
" > $XC_STAGE3S/boot/uboot/uEnv.txt

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/uboot
root # mount /dev/<your_dev>1 /mnt/funtoo/boot/uboot
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