This post is a follow up to my original post Building BananaPi LeMaker Kernel.
If you’re just looking for a vanilla Debian or Ubuntu image for your Banana Pi that utilizes a Linux kernel newer than 3.4.xxx, then stop reading and go to this page maintained by Igor Pečovnik. He provides pre-built Debian and Ubuntu images for a variety of Banana Pi boards.
If you want to manually build an image, he has put the build scripts he uses up on his GitHub repository. While I tried to do everything manually starting from my last post, I ended up building a kernel that would not boot. So I shamelessly stole the kernel configuration from Igor, and the resulting kernel boots.
The GMAC driver which required so much patching for the 3.4 kernel was mainlined in 3.17. As such, these instructions should work for any kernel newer than 3.17. I am building 4.1.3 in my script.
Here is the Jenkins/bash script to build the kernel, modules, and boot goodness you need (a direct link to the .sh file is at the end of the post):
if [ ! -d "linux-4.1.3" ]; then wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.1.3.tar.xz tar -Jxvf linux-4.1.3.tar.xz fi cd linux-4.1.3 wget https://watchmysys.com/blog/wp-content/uploads/2015/07/banana-pi-linux-4.1.3-config.txt -O .config make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- clean make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x40008000 zImage dtbs make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=output modules make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=output modules_install mkdir -p output/boot/ cp arch/arm/boot/zImage output/boot/ cp arch/arm/boot/dts/sun7i-a20-bananapi.dtb output/boot/ cat > output/boot/boot.cmd < output/boot/uEnv.txt << EOF fatload mmc 0 0x46000000 zImage fatload mmc 0 0x49000000 sun7i-a20-bananapi.dtb setenv bootargs console=ttyS0,115200 [earlyprintk] root=/dev/mmcblk0p2 rootwait panic=10 rootfstype=ext4 rw ${extra} bootz 0x46000000 - 0x49000000 EOF mkimage -C none -A arm -T script -d output/boot/boot.cmd output/boot/boot.scr cd .. if [ ! -d "u-boot-2015.04" ]; then wget ftp://ftp.denx.de/pub/u-boot/u-boot-2015.04.tar.bz2 tar -jxvf u-boot-2015.04.tar.bz2 fi cd u-boot-2015.04 make -s CROSS_COMPILE=arm-linux-gnueabihf- clean make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- Bananapi_defconfig make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- cp u-boot-sunxi-with-spl.bin ../linux-4.1.3/output/boot/ cd ../linux-4.1.3/ cat > output/boot/uEnv.txt << EOF fatload mmc 0 0x46000000 zImage fatload mmc 0 0x49000000 sun7i-a20-bananapi.dtb setenv bootargs console=ttyS0,115200 [earlyprintk] root=/dev/mmcblk0p2 rootwait panic=10 rootfstype=ext4 rw ${extra} bootz 0x46000000 - 0x49000000 EOF tar -C output -cjvf ../linux-bananapi-4.1.3.tar.bz2 boot/ lib/
Here is what the partition layout of my SDHC card:
root@bpi:~# fdisk -l /dev/mmcblk0 Disk /dev/mmcblk0: 7948 MB, 7948206080 bytes 4 heads, 16 sectors/track, 242560 cylinders, total 15523840 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Device Boot Start End Blocks Id System /dev/mmcblk0p1 * 2048 133119 65536 c W95 FAT32 (LBA) /dev/mmcblk0p2 133120 15523839 7695360 83 Linux
Here is the contents of the boot partition (mmcblk0p1, vfat):
root@bpi:~# ls /boot boot.cmd boot.scr sun7i-a20-bananapi.dtb uEnv.txt zImage
boot.cmd
fatload mmc 0 0x46000000 zImage fatload mmc 0 0x49000000 sun7i-a20-bananapi.dtb setenv bootargs console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rw rootwait panic=10 bootm 0x46000000 - 0x49000000
uEnv.txt
fatload mmc 0 0x46000000 zImage fatload mmc 0 0x49000000 sun7i-a20-bananapi.dtb setenv bootargs console=ttyS0,115200 [earlyprintk] root=/dev/mmcblk0p2 rootwait panic=10 rootfstype=ext4 rw ${extra} bootz 0x46000000 - 0x49000000
You will need to update u-boot on the SD card to v2015.04. If you use the script I provide above, this file is in boot/u-boot-sunxi-with-spl.bin
. You need to write it to the SD card using dd:
dd if=boot/u-boot-sunxi-with-spl.bin of=/dev/mmcblk0 bs=1024 seek=8
More notes:
I was unable to build this kernel running Debian 7 (Wheezy) because binutils is too old. Unfortunately the official repositories do not have a newer version available for Wheezy (slash) I was too lazy to look for a repository that might have a newer version. As such, I upgraded by Jenkins build box to Debian 8 (Jessie) to build this kernel.
Additionally, I had to upgrade from a 1GB SD Card in my Banana Pi to an 8GB SDHC Card because the new u-boot does not seem to like small (non-SDHC) cards.
Banana Pi info:
root@bpi:~# free -m total used free shared buffers cached Mem: 996 72 923 0 4 19 -/+ buffers/cache: 48 948 Swap: 0 0 0 root@bpi:~# uname -a Linux bpi 4.1.3-bananapi #2 SMP Sun Jul 26 15:41:54 CEST 2015 armv7l GNU/Linux root@bpi:~# lsmod Module Size Used by root@bpi:~#
Speed test of the network interface:
# Laptop with Gigabit wired connection, saving to /tmp/ ramdisk [derp@laptop ~]$ nc -lp 5000 | dd of=/tmp/zerofile # Banana Pi root@bpi:~# dd if=/dev/zero bs=1M count=2000 | nc laptop 5000 2000+0 records in 2000+0 records out 2097152000 bytes (2.1 GB) copied, 73.5536 s, 28.5 MB/s
Yes, it is a Gigabit link, but not the fastest. It does seem to be quite stable, and since I am not using my Banana Pi for a bandwidth intensive purpose, this speed is fine for me.
The build script does everything with relative paths, and can be run as a normal user. The output is a tar.bz2 archive containing u-boot binary, boot folder, and kernel modules. You will need sudo/root to install the u-boot bin file with dd as described above.
Download kernel .config: here
Download build script: here
Download u-boot 2015.04: here (SHA1SUM: 8bf4f738ba8aa18ab5d45fca324587f0749f7c10)
Download tar archive with u-boot, kernel, and modules: here (SHA1SUM: d94a8da66ce6d77a1ceb4569740cadf2c8c67e72)