Rapsberry Pi - U-Boot and (rpi foundation) kernel
Toolchain
Note: We can't use the linaro toolchain for rpi1, because it's compiled for a newer class of arm processors. We must use either our own toolchain or the toolchain from the raspberry foundation
- RPi 1
wget -Oraspberrypi-tools.tar.gz https://github.com/raspberrypi/tools/archive/master.tar.gz
tar xf raspberrypi-tools.tar.gz
# remove the "-x64" for 32bit systems
export PATH=$PWD/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/:$PATH
wget https://releases.linaro.org/15.02/components/toolchain/binaries/arm-linux-gnueabihf/gcc-linaro-4.9-2015.02-3-x86_64_arm-linux-gnueabihf.tar.xz tar xf gcc-linaro-4.9-2015.02-3-x86_64_arm-linux-gnueabihf.tar.xz export PATH=$PWD/gcc-linaro-4.9-2015.02-3-x86_64_arm-linux-gnueabihf/bin/:$PATH
Firmware tools (bootloader etc):
https://github.com/raspberrypi/firmware
mkdir -p firmware
cd firmware
wget https://github.com/raspberrypi/firmware/raw/master/boot/bootcode.bin
wget https://github.com/raspberrypi/firmware/raw/master/boot/fixup.dat
wget https://github.com/raspberrypi/firmware/raw/master/boot/start.elf
# insert sdcard, mount...
cp bootcode.bin fixup.dat start.elf /run/media/$USER/boot/
U-Boot
Note: we don't really need u-boot to boot the kernel on raspberry, the
bootcode.bin
/start.elf
bootloader is capable of
loading it, but u-boot gives us more flexibility (loading kernels from usb/network,
manually booting with different commandlines without having to edit
config.txt
etc.)
git clone git://git.denx.de/u-boot.git cd u-boot # ls configs/*rpi* export CROSS_COMPILE=arm-linux-gnueabihf- # rpi_2_defconfig for rpi2 make rpi_defconfig make menuconfig time ionice -c3 nice -n10 make -j5 # insert sdcard, mount... # we "pretend" u-boot is kernel ;) cp u-boot.bin /run/media/$USER/boot/kernel.img
Kernel
https://github.com/raspberrypi/linux/wget https://github.com/raspberrypi/linux/archive/rpi-4.1.y.tar.gz tar xf rpi-4.1.y.tar.gz cd linux-rpi-4.1.y/ export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabihf- #defconfig make help | grep omap2 # or # ls arch/arm/configs/bcm* #device tree ls arch/arm/boot/dts/*rpi* # bcm2709_defconfig for rpi2 make bcmrpi_defconfig # for faster build (we don't need modules right now): make -j5 zImage dtbs time ionice -c3 nice -n10 make -j5 # insert sdcard, mount... cp arch/arm/boot/zImage /run/media/$USER/boot/ cp arch/arm/boot/dts/*rpi*.dtb /run/media/$USER/boot
Booting
#load kernel load mmc 0:1 0x00200000 zImage #load device tree load mmc 0:1 0x00000100 bcm2708-rpi-b?????????.dtb # run kernel (finally) setenv bootargs earlyprintk console=ttyAMA0,115200 bootz 0x00200000 - 0x00000100