Compiling New Kernel For Raspberry Pi

From Nearline Storage
Revision as of 16:31, 5 April 2014 by Dlk (talk | contribs) (Created page with "<code> #!/usr/bin/env sh # Cross compiling a new Raspberry Pi kernel following instructions at: # http://elinux.org/RPi_Kernel_Compilation BASE="/storage/pi" PI_HOST="dlk-...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Jump to navigation Jump to search

  1. !/usr/bin/env sh
  1. Cross compiling a new Raspberry Pi kernel following instructions at:
  2. http://elinux.org/RPi_Kernel_Compilation

BASE="/storage/pi" PI_HOST="dlk-rspi"

if [ ! -d "$BASE" ]; then mkdir "$BASE" fi

cd "$BASE"

  1. "if true;" then run this command block, "if false;" then don't

if true; then # Clean up from previous run rm -fr .git &>/dev/null rm -fr kernel &>/dev/null rm -fr tools &>/dev/null rm -fr modules &>/dev/null rm -fr firmware &>/dev/null

# Setup git environment git init [ 0 -ne $? ] && exit $?

# Get patched kernel that was supposed to fix TEAC USB DAC audio problems per # http://volumio.org/forum/fixes-for-common-usb-dac-problems-with-rpi-t328.html # Didn't work #git clone --depth 1 git://github.com/petli/linux.git -b rpi-3.10-usb-sound-backport

# Get the latest stable kernel source git clone --depth 1 git://github.com/raspberrypi/linux.git [ 0 -ne $? ] && exit $? fi

KERNEL_SRC="${BASE}/linux"

  1. "if true;" then download the compiler, "if false;" then don't

if true; then git clone git://github.com/raspberrypi/tools.git [ 0 -ne $? ] && exit $? fi

if [ -d "${BASE}/tools/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin" ]; then CCPREFIX="${BASE}/tools/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin/arm-bcm2708-linux-gnueabi-" else echo "CCPREFIX directory we expected does not exist, please edit script." exit fi

  1. "if true;" then copy .config from $PI_HOST, "if false;" then use the default .config

if true; then echo "Getting /proc/config.gz from $PI_HOST" scp ${PI_HOST}:/proc/config.gz . [ 0 -ne $? ] && exit $? cd "$KERNEL_SRC" make mrproper [ 0 -ne $? ] && exit $? zcat "${BASE}/config.gz" >.config [ 0 -ne $? ] && exit $? rm -f "${BASE}/config.gz" else echo "Using default config from ${KERNEL_SRC}/arch/arm/configs/bcmrpi_defconfig" cd "$KERNEL_SRC" make mrproper [ 0 -ne $? ] && exit $? cp "${KERNEL_SRC}/arch/arm/configs/bcmrpi_defconfig" .config [ 0 -ne $? ] && exit $? fi

  1. Configure

yes | ARCH=arm CROSS_COMPILE="$CCPREFIX" make oldconfig [ 0 -ne $? ] && exit $?

  1. Compile

CPU_COUNT=$(cat /proc/cpuinfo | grep -m 1 siblings | awk '{ print $3 }') CPU_COUNT=$(( $CPU_COUNT + 1 )) ARCH=arm CROSS_COMPILE="$CCPREFIX" make -j$CPU_COUNT [ 0 -ne $? ] && exit $?

  1. Bundle kernel firmward and modules

mkdir "${BASE}/modules" [ 0 -ne $? ] && exit $? ARCH=arm CROSS_COMPILE="$CCPREFIX" INSTALL_MOD_PATH="${BASE}/modules" make -j9 modules_install cd "${BASE}/modules/lib" [ 0 -ne $? ] && exit $? tar -zcvf modules.gz * [ 0 -ne $? ] && exit $?

  1. Create boot image

cd "${BASE}/tools/mkimage" [ 0 -ne $? ] && exit $? ./imagetool-uncompressed.py "${KERNEL_SRC}/arch/arm/boot/zImage"

  1. Get latest boot firmware

cd "$BASE" git clone git://github.com/raspberrypi/firmware.git [ 0 -ne $? ] && exit $?

  1. Install everything on the target

scp "${BASE}/tools/mkimage/kernel.img" root@${PI_HOST}:/boot/ [ 0 -ne $? ] && exit $? scp "${BASE}/modules/lib/modules.gz" root@${PI_HOST}:/var/tmp/ [ 0 -ne $? ] && exit $? ssh root@${PI_HOST} tar -C /lib -zxvf /var/tmp/modules.gz [ 0 -ne $? ] && exit $? scp firmware/boot/bootcode.bin root@{PI_HOST}:/boot/ [ 0 -ne $? ] && exit $? scp firmware/boot/fixup.dat root@{PI_HOST}:/boot/ [ 0 -ne $? ] && exit $? scp firmware/boot/start.elf root@${PI_HOST}:/boot/ [ 0 -ne $? ] && exit $? if $(${CCPREFIX}-gcc -v 2>&1 | grep -qe "--with-float=soft"); then scp -r firmware/opt/* root@${PI_HOST}:/opt/ elif $(${CCPREFIX}-gcc -v 2>&1 | grep -qe "--with-float=hard"); then scp -r firmware/hardfp/opt/* root@${PI_HOST}:/opt/ else echo "Cannot figure out which version of /opt/vc to copy over" fi