#!/bin/sh # Slackware build script for the Raspberry Pi kernel packages # Written by Konstantinos Mantzaris (kmanjaris@gmail.com) # Copyright 2012-2014 Konstantinos Mantzaris # All rights reserved. # # The script is based on David Spencers work. For more information please # visit his project page at http://www.daves-collective.co.uk/raspi/ # Copyright 2012 David Spencer, Baildon, West Yorkshire, U.K. # All rights reserved. # # The kernel configuration used in this script is based on Raspbmc Linux. For # more information please visit the project page at http://www.raspbmc.com/ # # Redistribution and use of this script, with or without modification, is # permitted provided that the following conditions are met: # # 1. Redistributions of this script must retain the above copyright # notice, this list of conditions and the following disclaimer. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. GIT_SRC_LINUX=7193cfe GIT_RPI_FIRMWARE=408bebd PKGNAM_SRC=kernel-source-raspi PKGNAM_MOD=kernel-modules-raspi PKGNAM_FW=kernel-firmware-raspi PKGNAM_HDR=kernel-headers-raspi PKGNAM_INITRD=initrd-raspi PKGNAM_IMAGE=raspi-slackboot PKGVER=3.10.36 VERSION=3.10.36 BUILD=${BUILD:-1} TAG=${TAG:-xsb} # Automatically determine the architecture we're building on: if [ -z "$ARCH" ]; then case "$( uname -m )" in i?86) export ARCH=i486 ;; arm*) export ARCH=arm ;; # Unless $ARCH is already set, use uname -m for all other archs: *) export ARCH=$( uname -m ) ;; esac fi if [ "$ARCH" = "i486" ]; then SLKCFLAGS="-O2 -march=i486 -mtune=i686" LIBDIRSUFFIX="" elif [ "$ARCH" = "i686" ]; then SLKCFLAGS="-O2 -march=i686 -mtune=i686" LIBDIRSUFFIX="" elif [ "$ARCH" = "s390" ]; then SLKCFLAGS="-O2" LIBDIRSUFFIX="" elif [ "$ARCH" = "x86_64" ]; then SLKCFLAGS="-O2 -fPIC" LIBDIRSUFFIX="64" elif [ "$ARCH" = "arm" ]; then SLKCFLAGS="-O2 -pipe -mcpu=arm1176jzf-s -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=softfp -Wno-psabi" LIBDIRSUFFIX="" fi # Perform package generation sanity checks if [ ! -d /usr/src/linux ] ; then echo "ERROR : Could not locate kernel source path /usr/src/linux" echo "ERROR : Please extract the Raspberry Pi kernel source on /usr/src/linux" echo "TIP :: git clone git://github.com/raspberrypi/linux.git /usr/src/linux" echo "TIP :: wget https://github.com/raspberrypi/linux/tarball/master linux-raspi.tar.gz" echo "TIP :: wget https://github.com/raspberrypi/linux/tarball/rpi-3.10.y -O linux-rpi-${PKGVER}.tar.gz" exit 1 fi if [ ! -f $(pwd)/initrd-versatile.img ] ; then echo "ERROR : Could not locate the latest SlackwareARM initrd-versatile.img" echo "ERROR : Please copy the latest SlackwareARM versatile initrd image" echo "ERROR : in $(pwd)" echo "http://www.slackware.org.uk/slackwarearm/slackwarearm-current/isolinux/" exit 1 fi if [ ! -d $(pwd)/firmware ] ; then echo "ERROR : Could not locate Rasbberry Pi firmware path ${pwd}/firmware" echo "ERROR : Please download the Raspberry Pi firmware from GIT under ${pwd}" echo "TIP :: git clone git://github.com/raspberrypi/firmware.git firmware" echo "TIP :: wget https://github.com/raspberrypi/firmware/tarball/master -O firmware.tar.gz" exit 1 fi if [ ! -d $(pwd)/linux-firmware ] ; then echo "ERROR : Could not locate the kernel firmware path ${pwd}/linux-firmware" echo "ERROR : Please download the kernel firmware from GIT under ${pwd}" echo "TIP :: git clone git://git.kernel.org/pub/scm/linux/kernel/git/dwmw2/linux-firmware.git linux-firmware" exit 1 fi if [ ! -f $(pwd)/config-3.10 ] ; then echo "ERROR : Could not locate the Raspberry Pi vanilla kernel config file ${pwd}/config-3.10" echo "ERROR : Please download the Raspberry Pi vanilla kernel config file under ${pwd}" echo "TIP :: wget https://raw.github.com/raspberrypi/linux/rpi-3.10.y/arch/arm/configs/bcmrpi_defconfig -O config-3.10" exit 1 fi CWD=$(pwd) TMP=${TMP:-/tmp} PKG_SRC=$TMP/package-$PKGNAM_SRC PKG_MOD=$TMP/package-$PKGNAM_MOD PKG_FW=$TMP/package-$PKGNAM_FW PKG_HDR=$TMP/package-$PKGNAM_HDR PKG_INITRD=$TMP/package-$PKGNAM_INITRD PKG_IMAGE=$TMP/package-$PKGNAM_IMAGE rm -rf $PKG_SRC rm -rf $PKG_MOD rm -rf $PKG_FW rm -rf $PKG_HDR rm -rf $PKG_INITRD rm -rf $PKG_IMAGE mkdir -p $TMP $PKG_SRC $PKG_MOD $PKG_FW $PKG_HDR $PKG_INITRD $PKG_IMAGE # Patch the rasbmc kernel config with RAID and RTC support cd $CWD cat $CWD/config-3.10 > $CWD/config zcat $CWD/config.SlaXBMCRPi.diff.gz | patch -p0 || exit 1 # Compile the kernel and build/install kernel modules cd /usr/src/linux || exit 1 make mrproper make clean cat $CWD/config > /usr/src/linux/.config || exit 1 make zImage || exit 1 make modules || exit 1 make modules_install cd $CWD if [ ! -d /lib/modules/$VERSION ] ; then echo "ERROR : Could not locate the kernel modules under /lib/modules/$VERSION" echo "ERROR : Please compile/install the Raspberry Pi kernel modules first" exit 1 fi # Bundle Kernel Firmware Package cd $PKG_FW || exit 1 mkdir -p $PKG_FW/lib/firmware cd $CWD/linux-firmware cp -a * $PKG_FW/lib/firmware || exit 1 mkdir -p $PKG_FW/install cat $CWD/slack-desc-firmware > $PKG_FW/install/slack-desc cd $PKG_FW /sbin/makepkg -l y -c n $TMP/$PKGNAM_FW-$VERSION-$ARCH-$BUILD$TAG.txz rm -rf $PKG_FW # Bundle Kernel Headers Package cd $PKG_HDR || exit 1 mkdir -p $PKG_HDR/usr cd /usr/src/linux make INSTALL_HDR_PATH=$PKG_HDR/usr headers_install || exit 1 mkdir -p $PKG_HDR/install cat $CWD/slack-desc-headers > $PKG_HDR/install/slack-desc cd $PKG_HDR /sbin/makepkg -l y -c n $TMP/$PKGNAM_HDR-$VERSION-$ARCH-$BUILD$TAG.txz rm -rf $PKG_HDR # Bundle Kernel Source Package cd $PKG_SRC || exit 1 mkdir -p $PKG_SRC/usr/src/linux-$VERSION cd /usr/src/linux cp -a * .config $PKG_SRC/usr/src/linux-$VERSION || exit 1 cd $PKG_SRC/usr/src ln -s linux-$VERSION linux cd linux-$VERSION make clean #make prepare mkdir -p $PKG_SRC/install cat $CWD/slack-desc-source > $PKG_SRC/install/slack-desc cd $PKG_SRC /sbin/makepkg -l y -c n $TMP/$PKGNAM_SRC-$VERSION-$ARCH-$BUILD$TAG.txz rm -rf $PKG_SRC # Bundle Kernel Modules Package cd $PKG_MOD || exit 1 mkdir -p $PKG_MOD/lib/modules cp -a /lib/modules/$VERSION $PKG_MOD/lib/modules || exit 1 mkdir -p $PKG_MOD/etc/rc.d cat $CWD/rc.modules.new > $PKG_MOD/etc/rc.d/rc.modules-$VERSION.new chmod 755 $PKG_MOD/etc/rc.d/rc.modules-$VERSION.new mkdir -p $PKG_MOD/install cat $CWD/slack-desc-modules > $PKG_MOD/install/slack-desc # Write out the doinst.sh: cat << EOF > $PKG_MOD/install/doinst.sh config() { NEW="\$1" OLD="\$(dirname \$NEW)/\$(basename \$NEW .new)" # If there's no config file by that name, mv it over: if [ ! -r \$OLD ]; then mv \$NEW \$OLD elif [ "\$(cat \$OLD | md5sum)" = "\$(cat \$NEW | md5sum)" ]; then # toss the redundant copy rm \$NEW fi # Otherwise, we leave the .new copy for the admin to consider... } config etc/rc.d/rc.modules-${VERSION}.new # If rc.modules is a real file, back it up: if [ -r etc/rc.d/rc.modules -a ! -L etc/rc.d/rc.modules ]; then cp -a etc/rc.d/rc.modules etc/rc.d/rc.modules.bak fi # Make rc.modules a symlink if it's not already, but do not replace # an existing symlink. You'll have to decide to point at a new version # of this script on your own... if [ ! -L etc/rc.d/rc.modules ]; then ( cd etc/rc.d ; rm -rf rc.modules ) ( cd etc/rc.d ; ln -sf rc.modules-${VERSION} rc.modules ) fi # A good idea whenever kernel modules are added or changed: if [ -x sbin/depmod ]; then chroot . /sbin/depmod -a ${VERSION} 1> /dev/null 2> /dev/null fi EOF cd $PKG_MOD /sbin/makepkg -l y -c n $TMP/$PKGNAM_MOD-$VERSION-$ARCH-$BUILD$TAG.txz rm -rf $PKG_MOD # Prepare initrd.gz boot image based on ARMedSlack initrd-versatile.img cd $PKG_INITRD || exit 1 zcat $CWD/initrd-versatile.img | cpio -iv rm -rf $PKG_INITRD/lib/modules/* cd /usr/src/linux make modules_install INSTALL_MOD_PATH=$PKG_INITRD cd $PKG_INITRD zcat $CWD/initrd.SlaXBMCRPi.diff.gz | patch -p1 || exit 1 cp -a $CWD/rpi_initrd $PKG_INITRD/usr/lib/setup/ || exit 1 find . | cpio -o -v -H newc | gzip -9c > $TMP/initrd.gz cd $TMP rm -rf $PKG_INITRD #read -p "Press [Enter] to bundle the RPi boot image..." # Bundle the Raspberry Pi boot image # Let's work in 512B sectors. # 128 "heads" and 32 "sectors" => 2MiB "cylinders", # That's 4096 sectors per "cylinder". # 4 "cylinders" = 8MiB erase block boundary (or 2*4MiB boundaries). # So keep partition boundaries at 4-cyl multiples for best results. # That's 16384 sectors per erase block. # 944 "cylinders" = 1979711488B, which is < 2MB, so fits on a "2Mb" card. echo "Generating empty image file $TMP/$PKGNAM_IMAGE.img" dd if=/dev/zero of=$TMP/$PKGNAM_IMAGE.img bs=512 count=$(( 128 * 32 * 944 )) # Drop in the prepared MBR. # Partition 1 start 1 end 180223 type 0c # Partition 2 start 180224 end 1032191 type 82 # Partition 3 start 1032192 end 3866623 type 83 echo "Prepending MBR in empty image file $TMP/$PKGNAM_IMAGE.img" dd if=$CWD/mbr of=$TMP/$PKGNAM_IMAGE.img bs=512 count=1 conv=notrunc LOOPDEV=$(losetup -f --show $TMP/$PKGNAM_IMAGE.img) mdadm --build --verbose --force raspimg --level=linear --raid-devices=1 $LOOPDEV sleep 5 mkdosfs -I /dev/md/raspimg1 mkswap /dev/md/raspimg2 mkfs -t ext4 -O ^has_journal -E stride=2,stripe-width=1024 -b 4096 /dev/md/raspimg3 echo "Loading RPi boot data into $TMP/$PKGNAM_IMAGE.img" mount -t vfat /dev/md/raspimg1 $PKG_IMAGE cd $CWD/firmware/boot cp -a * $PKG_IMAGE || exit 1 rm $PKG_IMAGE/kernel.img cp $TMP/initrd.gz $PKG_IMAGE/ cp -v /usr/src/linux/System.map $PKG_IMAGE/ if [ $(echo $VERSION | cut -d. -f2) -le 6 ] ; then cp -v /usr/src/linux/arch/arm/boot/zImage $PKG_IMAGE/kernel.img LOADADDR="0xa00000" SIZE="0x$(printf '%x' $(stat --format='%s' $TMP/initrd.gz))" else cp -v /usr/src/linux/arch/arm/boot/zImage $PKG_IMAGE/kernel-${VERSION}.img fi CMDLINE=$(grep CONFIG_CMDLINE= /usr/src/linux/.config |awk -F"\"" '{print $2}') echo "# Low Risk Overclock Settings" > $PKG_IMAGE/config.txt echo "#arm_freq=850" >> $PKG_IMAGE/config.txt echo "#sdram_freq=450" >> $PKG_IMAGE/config.txt echo "#core_freq=300" >> $PKG_IMAGE/config.txt echo "#---------------------------------" >> $PKG_IMAGE/config.txt echo "# Medium Risk Overclock Settings" >> $PKG_IMAGE/config.txt echo "#arm_freq=900" >> $PKG_IMAGE/config.txt echo "#sdram_freq=450" >> $PKG_IMAGE/config.txt echo "#core_freq=450" >> $PKG_IMAGE/config.txt echo "#---------------------------------" >> $PKG_IMAGE/config.txt echo "# High Risk Overclock Settings" >> $PKG_IMAGE/config.txt echo "#arm_freq=1000" >> $PKG_IMAGE/config.txt echo "#sdram_freq=500" >> $PKG_IMAGE/config.txt echo "#core_freq=500" >> $PKG_IMAGE/config.txt echo "#over_voltage=6" >> $PKG_IMAGE/config.txt echo "#---------------------------------" >> $PKG_IMAGE/config.txt echo "# May The Force Be With You" >> $PKG_IMAGE/config.txt echo "#arm_freq=1200" >> $PKG_IMAGE/config.txt echo "#sdram_freq=550" >> $PKG_IMAGE/config.txt echo "#core_freq=550" >> $PKG_IMAGE/config.txt echo "#force_turbo=1" >> $PKG_IMAGE/config.txt echo "#initial_turbo=30" >> $PKG_IMAGE/config.txt echo "#over_voltage=8" >> $PKG_IMAGE/config.txt echo "#current_limit_override=0x5A000020" >> $PKG_IMAGE/config.txt echo "#---------------------------------" >> $PKG_IMAGE/config.txt echo "framebuffer_depth=24" >> $PKG_IMAGE/config.txt echo "gpu_mem_256=128" >> $PKG_IMAGE/config.txt echo "gpu_mem_512=192" >> $PKG_IMAGE/config.txt echo "start_x=1" >> $PKG_IMAGE/config.txt echo "#overscan_left=??" >> $PKG_IMAGE/config.txt echo "#overscan_right=??" >> $PKG_IMAGE/config.txt echo "#overscan_top=??" >> $PKG_IMAGE/config.txt echo "#overscan_bottom=??" >> $PKG_IMAGE/config.txt if [ $(echo $VERSION | cut -d. -f2) -le 6 ] ; then echo "ramfsfile=initrd.gz" >> $PKG_IMAGE/config.txt echo "ramfsaddr=$LOADADDR" >> $PKG_IMAGE/config.txt echo "$CMDLINE initrd=$LOADADDR,$SIZE" > $PKG_IMAGE/cmdline.txt else echo "kernel=kernel-${VERSION}.img" >> $PKG_IMAGE/config.txt echo "initramfs initrd.gz followkernel" >> $PKG_IMAGE/config.txt echo "$CMDLINE" > $PKG_IMAGE/cmdline.txt fi cd $TMP sleep 5 umount -v $PKG_IMAGE mdadm --stop /dev/md/raspimg losetup -d $LOOPDEV xz -v $TMP/$PKGNAM_IMAGE.img echo "Making RPi boot data available under $PKG_IMAGE" cd $CWD/firmware/boot cp -a * $PKG_IMAGE || exit 1 rm $PKG_IMAGE/kernel*.img cp $TMP/initrd.gz $PKG_IMAGE/ cp -v /usr/src/linux/System.map $PKG_IMAGE/ if [ $(echo $VERSION | cut -d. -f2) -le 6 ] ; then cp -v /usr/src/linux/arch/arm/boot/zImage $PKG_IMAGE/kernel.img LOADADDR="0xa00000" SIZE="0x$(printf '%x' $(stat --format='%s' $TMP/initrd.gz))" else cp -v /usr/src/linux/arch/arm/boot/zImage $PKG_IMAGE/kernel-${VERSION}.img fi CMDLINE=$(grep CONFIG_CMDLINE= /usr/src/linux/.config |awk -F"\"" '{print $2}') echo "# Low Risk Overclock Settings" > $PKG_IMAGE/config.txt echo "#arm_freq=850" >> $PKG_IMAGE/config.txt echo "#sdram_freq=450" >> $PKG_IMAGE/config.txt echo "#core_freq=300" >> $PKG_IMAGE/config.txt echo "#---------------------------------" >> $PKG_IMAGE/config.txt echo "# Medium Risk Overclock Settings" >> $PKG_IMAGE/config.txt echo "#arm_freq=900" >> $PKG_IMAGE/config.txt echo "#sdram_freq=450" >> $PKG_IMAGE/config.txt echo "#core_freq=450" >> $PKG_IMAGE/config.txt echo "#---------------------------------" >> $PKG_IMAGE/config.txt echo "# High Risk Overclock Settings" >> $PKG_IMAGE/config.txt echo "#arm_freq=1000" >> $PKG_IMAGE/config.txt echo "#sdram_freq=500" >> $PKG_IMAGE/config.txt echo "#core_freq=500" >> $PKG_IMAGE/config.txt echo "#over_voltage=6" >> $PKG_IMAGE/config.txt echo "#---------------------------------" >> $PKG_IMAGE/config.txt echo "# May The Force Be With You" >> $PKG_IMAGE/config.txt echo "#arm_freq=1200" >> $PKG_IMAGE/config.txt echo "#sdram_freq=550" >> $PKG_IMAGE/config.txt echo "#core_freq=550" >> $PKG_IMAGE/config.txt echo "#force_turbo=1" >> $PKG_IMAGE/config.txt echo "#initial_turbo=30" >> $PKG_IMAGE/config.txt echo "#over_voltage=8" >> $PKG_IMAGE/config.txt echo "#current_limit_override=0x5A000020" >> $PKG_IMAGE/config.txt echo "#---------------------------------" >> $PKG_IMAGE/config.txt echo "framebuffer_depth=24" >> $PKG_IMAGE/config.txt echo "gpu_mem_256=128" >> $PKG_IMAGE/config.txt echo "gpu_mem_512=192" >> $PKG_IMAGE/config.txt echo "start_x=1" >> $PKG_IMAGE/config.txt echo "#overscan_left=??" >> $PKG_IMAGE/config.txt echo "#overscan_right=??" >> $PKG_IMAGE/config.txt echo "#overscan_top=??" >> $PKG_IMAGE/config.txt echo "#overscan_bottom=??" >> $PKG_IMAGE/config.txt if [ $(echo $VERSION | cut -d. -f2) -le 6 ] ; then echo "ramfsfile=initrd.gz" >> $PKG_IMAGE/config.txt echo "ramfsaddr=$LOADADDR" >> $PKG_IMAGE/config.txt echo "$CMDLINE initrd=$LOADADDR,$SIZE" > $PKG_IMAGE/cmdline.txt else echo "kernel=kernel-${VERSION}.img" >> $PKG_IMAGE/config.txt echo "initramfs initrd.gz followkernel" >> $PKG_IMAGE/config.txt echo "$CMDLINE" > $PKG_IMAGE/cmdline.txt fi