From 33e6f2c2bef3992acd91ac465955938f0292a430 Mon Sep 17 00:00:00 2001
From: Bob Mottram <bob.mottram@codethink.co.uk>
Date: Tue, 28 Jun 2016 17:18:15 +0100
Subject: [PATCH] Beginning of support for odroid c2

---
 README.md                            |   2 +-
 man/freedombone-image.1.gz           | Bin 3377 -> 3383 bytes
 src/freedombone-image-hardware-setup | 243 ++++++++++++++++-----------
 src/freedombone-image-make           |  16 ++
 src/freedombone-image-makefile       |  11 ++
 5 files changed, 176 insertions(+), 96 deletions(-)

diff --git a/README.md b/README.md
index 49eb69d41..023772762 100644
--- a/README.md
+++ b/README.md
@@ -51,7 +51,7 @@ To build a 64bit Qemu image:
 
     freedombone-image -t qemu-x86_64 -s 8G
 
-Other supported boards are cubieboard2, cubietruck, olinuxino-lime, olinuxino-lime2 and olinuxino-micro.
+Other supported boards are cubieboard2, cubietruck, olinuxino-lime, olinuxino-lime2, olinuxino-micro and odroid-c2.
 
 If the image build fails with an error such as "/Error reading from server. Remote end closed connection/" then you can specify a debian package mirror repository manually with:
 
diff --git a/man/freedombone-image.1.gz b/man/freedombone-image.1.gz
index 497cc86f9736ef4d2fa00b0966c3fd0562576c82..0b97ff4d04713765baca84ba4bbd140761b6d98d 100644
GIT binary patch
delta 3339
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
VRQkG`Hy@rA{RgU90v6LA000YGY2E+;

delta 3319
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
BaY_IH

diff --git a/src/freedombone-image-hardware-setup b/src/freedombone-image-hardware-setup
index 1d6b82a0e..f22d7fc90 100755
--- a/src/freedombone-image-hardware-setup
+++ b/src/freedombone-image-hardware-setup
@@ -32,27 +32,27 @@ export TEXTDOMAIN=${PROJECT_NAME}-image-hardware-setup
 export TEXTDOMAINDIR="/usr/share/locale"
 
 enable_serial_console() {
-    # By default, spawn a console on the serial port
-    device="$1"
-    echo $"Adding a getty on the serial port"
-    echo "T0:12345:respawn:/sbin/getty -L $device 115200 vt100" >> /etc/inittab
+	# By default, spawn a console on the serial port
+	device="$1"
+	echo $"Adding a getty on the serial port"
+	echo "T0:12345:respawn:/sbin/getty -L $device 115200 vt100" >> /etc/inittab
 }
 
 beaglebone_setup_boot() {
-    # Setup uEnv.txt
-    if grep -q btrfs /etc/fstab ; then
-        fstype=btrfs
-    else
-        fstype=ext4
-    fi
-    kernelVersion=$(ls /usr/lib/*/am335x-boneblack.dtb | head -1 | cut -d/ -f4)
-    version=$(echo $kernelVersion | sed 's/linux-image-\(.*\)/\1/')
-    initRd=initrd.img-$version
-    vmlinuz=vmlinuz-$version
-
-    # uEnv.txt for Beaglebone
-    # based on https://github.com/beagleboard/image-builder/blob/master/target/boot/beagleboard.org.txt
-    cat >> /boot/uEnv.txt <<EOF
+	# Setup uEnv.txt
+	if grep -q btrfs /etc/fstab ; then
+		fstype=btrfs
+	else
+		fstype=ext4
+	fi
+	kernelVersion=$(ls /usr/lib/*/am335x-boneblack.dtb | head -1 | cut -d/ -f4)
+	version=$(echo $kernelVersion | sed 's/linux-image-\(.*\)/\1/')
+	initRd=initrd.img-$version
+	vmlinuz=vmlinuz-$version
+
+	# uEnv.txt for Beaglebone
+	# based on https://github.com/beagleboard/image-builder/blob/master/target/boot/beagleboard.org.txt
+	cat >> /boot/uEnv.txt <<EOF
 mmcroot=/dev/mmcblk0p2 ro
 mmcrootfstype=$fstype rootwait fixrtc
 mmcrootflags=subvol=@
@@ -79,17 +79,17 @@ mmcargs=setenv bootargs console=tty0 console=\${console} root=\${mmcroot} rootfs
 uenvcmd=run loadfiles; run mmcargs; bootz \${loadaddr} \${initrd_addr}:\${initrd_size} \${fdtaddr}
 EOF
 
-    mkdir -p /boot/dtbs
-    cp /usr/lib/linux-image-*-armmp/* /boot/dtbs
+	mkdir -p /boot/dtbs
+	cp /usr/lib/linux-image-*-armmp/* /boot/dtbs
 }
 
 beaglebone_flash() {
-    # allow flash-kernel to work without valid /proc contents
-    # ** this doesn't *really* work, since there are too many checks
-    #    that fail in an emulated environment!  We'll have to do it by
-    #    hand below anyway...
-    export FK_MACHINE="TI AM335x BeagleBone"
-    apt-get install -y flash-kernel
+	# allow flash-kernel to work without valid /proc contents
+	# ** this doesn't *really* work, since there are too many checks
+	#    that fail in an emulated environment!  We'll have to do it by
+	#    hand below anyway...
+	export FK_MACHINE="TI AM335x BeagleBone"
+	apt-get install -y flash-kernel
 }
 
 beaglebone_repack_kernel() {
@@ -105,50 +105,99 @@ beaglebone_repack_kernel() {
 # on the kernel command line is completely ignored!  repack the initrd
 # to remove this evil...
 
-    echo "info: repacking beaglebone kernel and initrd"
+	echo "info: repacking beaglebone kernel and initrd"
 
-    kernelVersion=$(ls /usr/lib/*/am335x-boneblack.dtb | head -1 | cut -d/ -f4)
-    version=$(echo $kernelVersion | sed 's/linux-image-\(.*\)/\1/')
-    initRd=initrd.img-$version
-    vmlinuz=vmlinuz-$version
+	kernelVersion=$(ls /usr/lib/*/am335x-boneblack.dtb | head -1 | cut -d/ -f4)
+	version=$(echo $kernelVersion | sed 's/linux-image-\(.*\)/\1/')
+	initRd=initrd.img-$version
+	vmlinuz=vmlinuz-$version
 
-    mkdir /tmp/initrd-repack
+	mkdir /tmp/initrd-repack
 
-    (cd /tmp/initrd-repack ; \
-    zcat /boot/$initRd | cpio -i ; \
-    rm -f conf/param.conf ; \
-    find . | cpio --quiet -o -H newc | \
-    gzip -9 > /boot/$initRd )
+	(cd /tmp/initrd-repack ; \
+	zcat /boot/$initRd | cpio -i ; \
+	rm -f conf/param.conf ; \
+	find . | cpio --quiet -o -H newc | \
+	gzip -9 > /boot/$initRd )
 
-    rm -rf /tmp/initrd-repack
+	rm -rf /tmp/initrd-repack
 
-    (cd /boot ; \
-    cp /usr/lib/$kernelVersion/am335x-boneblack.dtb dtb ; \
-    cat $vmlinuz dtb >> temp-kernel ; \
-    mkimage -A arm -O linux -T kernel -n "Debian kernel ${version}" \
-    -C none -a 0x80200000 -e 0x80200000 -d temp-kernel uImage ; \
-    rm -f temp-kernel ; \
-    mkimage -A arm -O linux -T ramdisk -C gzip -a 0x81000000 -e 0x81000000 \
-    -n "Debian ramdisk ${version}" \
-    -d $initRd uInitrd )
+	(cd /boot ; \
+	cp /usr/lib/$kernelVersion/am335x-boneblack.dtb dtb ; \
+	cat $vmlinuz dtb >> temp-kernel ; \
+	mkimage -A arm -O linux -T kernel -n "Debian kernel ${version}" \
+	-C none -a 0x80200000 -e 0x80200000 -d temp-kernel uImage ; \
+	rm -f temp-kernel ; \
+	mkimage -A arm -O linux -T ramdisk -C gzip -a 0x81000000 -e 0x81000000 \
+	-n "Debian ramdisk ${version}" \
+	-d $initRd uInitrd )
+}
+
+odroidc2_setup_boot() {
+	dtb="$1"
+
+	# Setup uEnv.txt
+	if grep -q btrfs /etc/fstab ; then
+		fstype=btrfs
+	else
+		fstype=ext4
+	fi
+	kernelVersion=$(ls /usr/lib/*/${dtb}.dtb | head -1 | cut -d/ -f4)
+	version=$(echo $kernelVersion | sed 's/linux-image-\(.*\)/\1/')
+	initRd=initrd.img-$version
+	vmlinuz=vmlinuz-$version
+
+	# based on http://odroid.com/dokuwiki/doku.php?id=en:c2_building_u-boot
+	cat >> /boot/uEnv.txt <<EOF
+mmcroot=/dev/mmcblk0p2 ro
+mmcrootfstype=$fstype rootwait fixrtc
+mmcrootflags=subvol=@
+
+console=ttyO0,115200n8
+
+kernel_file=$vmlinuz
+initrd_file=$initRd
+
+loadaddr=0x11000000
+initrd_addr=0x13000000
+fdtaddr=0x1000000
+
+initrd_high=0xffffffff
+fdt_high=0xffffffff
+
+loadkernel=load mmc \${mmcdev}:\${mmcpart} \${loadaddr} \${kernel_file}
+loadinitrd=load mmc \${mmcdev}:\${mmcpart} \${initrd_addr} \${initrd_file}; setenv initrd_size \${filesize}
+loadfdt=load mmc \${mmcdev}:\${mmcpart} \${fdtaddr} /dtbs/\${fdtfile}
+
+m="1080p60hz"
+m_bpp="32"
+
+loadfiles=run loadkernel; run loadinitrd; run loadfdt
+mmcargs=setenv bootargs rootwait rw console=tty0 console=\${console} root=\${mmcroot} rootfstype=\${mmcrootfstype} rootflags=\${mmcrootflags} no_console_suspend hdmimode=${m} m_bpp=${m_bpp} fsck.fix=yes
+
+uenvcmd=run loadfiles; run mmcargs; booti \${loadaddr} \${initrd_addr}:\${initrd_size} \${fdtaddr}
+EOF
+
+	mkdir -p /boot/dtbs
+	cp /usr/lib/linux-image-*-armmp/* /boot/dtbs
 }
 
 a20_setup_boot() {
-    dtb="$1"
-
-    # Setup boot.cmd
-    if grep -q btrfs /etc/fstab ; then
-    fstype=btrfs
-    else
-    fstype=ext4
-    fi
-    kernelVersion=$(ls /usr/lib/*/$dtb | head -1 | cut -d/ -f4)
-    version=$(echo $kernelVersion | sed 's/linux-image-\(.*\)/\1/')
-    initRd=initrd.img-$version
-    vmlinuz=vmlinuz-$version
-
-    # Create boot.cmd
-    cat >> /boot/boot.cmd <<EOF
+	dtb="$1"
+
+	# Setup boot.cmd
+	if grep -q btrfs /etc/fstab ; then
+	fstype=btrfs
+	else
+	fstype=ext4
+	fi
+	kernelVersion=$(ls /usr/lib/*/$dtb | head -1 | cut -d/ -f4)
+	version=$(echo $kernelVersion | sed 's/linux-image-\(.*\)/\1/')
+	initRd=initrd.img-$version
+	vmlinuz=vmlinuz-$version
+
+	# Create boot.cmd
+	cat >> /boot/boot.cmd <<EOF
 setenv mmcdev 0
 setenv mmcpart 1
 
@@ -179,42 +228,46 @@ setenv mmcargs setenv bootargs console=\${console} root=\${mmcroot} rootfstype=\
 run loadfiles; run mmcargs; bootz \${loadaddr} \${initrd_addr}:\${initrd_size} \${fdtaddr}
 EOF
 
-    # boot.scr for Allwinner A20 based device
-    mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr
+	# boot.scr for Allwinner A20 based device
+	mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr
 
-    # Copy all DTBs
-    mkdir -p /boot/dtbs
-    cp /usr/lib/$kernelVersion/* /boot/dtbs
+	# Copy all DTBs
+	mkdir -p /boot/dtbs
+	cp /usr/lib/$kernelVersion/* /boot/dtbs
 
-    # extra boot modules
-    echo "rtc_sunxi" >> /etc/initramfs-tools/modules
+	# extra boot modules
+	echo "rtc_sunxi" >> /etc/initramfs-tools/modules
 }
 
 case "$MACHINE" in
-    beaglebone)
-    beaglebone_setup_boot
-    beaglebone_flash
-    beaglebone_repack_kernel
-    enable_serial_console ttyO0
-    ;;
-    cubietruck)
-    a20_setup_boot sun7i-a20-cubietruck.dtb
-    enable_serial_console ttyS0
-    ;;
-    a20-olinuxino-lime)
-    a20_setup_boot sun7i-a20-olinuxino-lime.dtb
-    enable_serial_console ttyS0
-    ;;
-    a20-olinuxino-lime2)
-    a20_setup_boot sun7i-a20-olinuxino-lime2.dtb
-    enable_serial_console ttyS0
-    ;;
-    a20-olinuxino-micro)
-    a20_setup_boot sun7i-a20-olinuxino-micro.dtb
-    enable_serial_console ttyS0
-    ;;
-    cubieboard2)
-    a20_setup_boot sun7i-a20-cubieboard2.dtb
-    enable_serial_console ttyS0
-    ;;
+	beaglebone)
+	beaglebone_setup_boot
+	beaglebone_flash
+	beaglebone_repack_kernel
+	enable_serial_console ttyO0
+	;;
+	odroid-c2)
+	odroidc2_setup_boot meson64_odroidc2
+	enable_serial_console ttyO0
+	;;
+	cubietruck)
+	a20_setup_boot sun7i-a20-cubietruck.dtb
+	enable_serial_console ttyS0
+	;;
+	a20-olinuxino-lime)
+	a20_setup_boot sun7i-a20-olinuxino-lime.dtb
+	enable_serial_console ttyS0
+	;;
+	a20-olinuxino-lime2)
+	a20_setup_boot sun7i-a20-olinuxino-lime2.dtb
+	enable_serial_console ttyS0
+	;;
+	a20-olinuxino-micro)
+	a20_setup_boot sun7i-a20-olinuxino-micro.dtb
+	enable_serial_console ttyS0
+	;;
+	cubieboard2)
+	a20_setup_boot sun7i-a20-cubieboard2.dtb
+	enable_serial_console ttyS0
+	;;
 esac
diff --git a/src/freedombone-image-make b/src/freedombone-image-make
index 25ab91aa4..c614237a1 100755
--- a/src/freedombone-image-make
+++ b/src/freedombone-image-make
@@ -83,6 +83,9 @@ logrotate module-init-tools netbase rsyslog udev debian-archive-keyring"
 # Packages needed on the beaglebone
 beaglebone_pkgs="linux-image-armmp u-boot-tools u-boot"
 
+# Packages needed on the Odroid C2 devices:
+odroidc2_pkgs="linux-image-armmp-lpae u-boot-tools u-boot"
+
 # Packages needed on the Allwinner A20 devices:
 a20_pkgs="linux-image-armmp-lpae u-boot-tools u-boot u-boot-sunxi"
 
@@ -103,6 +106,19 @@ case "$MACHINE" in
  --no-extlinux \
  --foreign /usr/bin/qemu-arm-static \
  --roottype btrfs \
+"
+		;;
+    odroid-c2)
+		extra_pkgs="$odroidc2_pkgs"
+		extra_opts="\
+ --variant minbase \
+ --bootoffset=2mib \
+ --bootsize 128M \
+ --boottype ext2 \
+ --no-kernel \
+ --no-extlinux \
+ --foreign /usr/bin/qemu-arm-static \
+ --roottype btrfs \
 "
 		;;
     cubietruck | a20-olinuxino-lime | a20-olinuxino-lime2 | a20-olinuxino-micro | cubieboard2)
diff --git a/src/freedombone-image-makefile b/src/freedombone-image-makefile
index 0d7610272..c66839aba 100755
--- a/src/freedombone-image-makefile
+++ b/src/freedombone-image-makefile
@@ -89,6 +89,17 @@ beaglebone: prep
 	$(SIGN)
 	@echo "Build complete."
 
+# build Odroid C2 SD card image
+odroid-c2: prep
+	$(eval ARCHITECTURE = aarch64)
+	$(eval MACHINE = odroid-c2)
+	$(MAKE_IMAGE)
+	@rm -f $(ARCHIVE)
+	$(XZ) $(IMAGE)
+	@echo ""
+	$(SIGN)
+	@echo "Build complete."
+
 # build Cubieboard2 SD card image
 cubieboard2: prep
 	$(eval ARCHITECTURE = armhf)
-- 
GitLab