====== U-boot ====== U-boot must be cross-compiled on an x86 Linux PC. ===== Toolchain ===== Click one of the site to download toolchain to build U-boot. * [[https://releases.linaro.org/archive/14.09/components/toolchain/binaries/gcc-linaro-aarch64-none-elf-4.9-2014.09_linux.tar.xz|Download #1]] * [[http://dn.odroid.com/toolchains/gcc-linaro-aarch64-none-elf-4.9-2014.09_linux.tar.xz|Download #2]] Once the download is done, extract the tarball to **/opt/toolchains/**. $ sudo mkdir -p /opt/toolchains $ sudo tar xvf gcc-linaro-aarch64-none-elf-4.9-2014.09_linux.tar.xz -C /opt/toolchains/ In order to add the toolchain path to PATH, paste below lines to **$HOME/.bashrc**. export ARCH=arm export CROSS_COMPILE=aarch64-none-elf- export PATH=/opt/toolchains/gcc-linaro-aarch64-none-elf-4.9-2014.09_linux/bin/:$PATH You can apply the change if you login again or import to apply this change, login again or evaluate **$HOME/.bashrc** with source command. $ source ~/.bashrc You can check if the toolchain installed above works properly while checking the version of toolchain. If you can find **gcc version 4.9.2 20140904 (prerelease)** at the end of the line, the toolchain is well installed. $ aarch64-none-elf-gcc -v Using built-in specs. COLLECT_GCC=aarch64-none-elf-gcc COLLECT_LTO_WRAPPER=/opt/toolchains/gcc-linaro-aarch64-none-elf-4.9-2014.09_linux/bin/../libexec/gcc/aarch64-none-elf/4.9.2/lto-wrapper Target: aarch64-none-elf Configured with: /cbuild/slaves/oorts/crosstool-ng/builds/aarch64-none-elf-linux/.build/src/gcc-linaro-4.9-2014.09/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc-linux-gnu --target=aarch64-none-elf --prefix=/cbuild/slaves/oorts/crosstool-ng/builds/aarch64-none-elf-linux/install --with-local-prefix=/cbuild/slaves/oorts/crosstool-ng/builds/aarch64-none-elf-linux/install/aarch64-none-elf --without-headers --with-newlib --enable-threads=no --disable-shared --with-pkgversion='crosstool-NG linaro-1.13.1-4.9-2014.09 - Linaro GCC 4.9-2014.09' --with-bugurl=https://bugs.launchpad.net/gcc-linaro --with-arch=armv8-a --disable-__cxa_atexit --with-gmp=/cbuild/slaves/oorts/crosstool-ng/builds/aarch64-none-elf-linux/.build/aarch64-none-elf/build/static --with-mpfr=/cbuild/slaves/oorts/crosstool-ng/builds/aarch64-none-elf-linux/.build/aarch64-none-elf/build/static --with-mpc=/cbuild/slaves/oorts/crosstool-ng/builds/aarch64-none-elf-linux/.build/aarch64-none-elf/build/static --with-isl=/cbuild/slaves/oorts/crosstool-ng/builds/aarch64-none-elf-linux/.build/aarch64-none-elf/build/static --with-cloog=/cbuild/slaves/oorts/crosstool-ng/builds/aarch64-none-elf-linux/.build/aarch64-none-elf/build/static --with-libelf=/cbuild/slaves/oorts/crosstool-ng/builds/aarch64-none-elf-linux/.build/aarch64-none-elf/build/static --enable-lto --enable-linker-build-id --disable-libmudflap --disable-libgomp --disable-libssp --disable-libstdcxx-pch --enable-multiarch --disable-multilib --enable-languages=c,c++,fortran Thread model: single gcc version 4.9.2 20140904 (prerelease) (crosstool-NG linaro-1.13.1-4.9-2014.09 - Linaro GCC 4.9-2014.09) ===== Checkout & compile ===== You can checkout **U-boot** source tree from **[[https://github.com/hardkernel/u-boot/tree/odroidc-v2011.03|Hardkernel's Github]]**. $ git clone https://github.com/hardkernel/u-boot.git -b odroidc2-v2015.01 Before you compile **U-boot**, you must configure for **ODROID-C2** with following command. $ cd u-boot $ make odroidc2_config And finally you can compile **U-boot**. $ make ===== Installation ===== The bootloader for **ODROID-C2** is consisted with two part, **1st stage bootloader** + **U-boot**. You can find **u-boot.bin** once you compile **U-boot**, as well as **bl1.bin.hardkernel** in the directory **sd_fuse/**. Both binaries must be installed in a card (eMMC or MicroSD). * The 1st stage bootloader, **bl1.bin.hardkernel**, is provided as prebuilt binary only. * The u-boot binary needs to be signed. This is done by an x86-64 executable, **aml_encrypt_gxb**, which is shipped with the u-boot source; source for aml_encrypt_gxb is not available.. ==== Installation to blank card ==== We provide the script, **sd_fuse/sd_fusing.sh**, this helps you to install the bootloader into your blank card eMMC or MicroSD. - Insert your card to USB card reader and attach to USB host port of your desktop. - Check the device path of your USB card reader. - Install the bootloader binaries using **sd_fuse/sd_fusing.sh**. $ cd sd_fuse $ ./sd_fusing.sh You can download and install the latest version of binaries as following. Click the following site to download the boot loader of final release version * [[http://dn.odroid.com/S905/BootLoader/ODROID-C2/c2_boot_release_ubuntu.tar.gz|Download - Ubuntu (update Feb 27, 2017)]] * [[http://dn.odroid.com/S905/BootLoader/ODROID-C2/c2_boot_release_android.tar.gz|Download - Android (update Jun 06, 2017)]] $ tar zxvf c2_boot_xxx_release.tar.gz $ cd c2_boot_xxx_release $ ./sd_fusing.sh ==== Installation using fastboot ==== If you can boot your **ODROID-C2** already and want to install a new **u-boot.bin** built by you. Fastboot helps you to install a **u-boot.bin** into your board. $ sudo fastboot flash bootloader sd_fuse/u-boot.bin If installation is done, you care reboot your **ODROID-C2** with fastboot. $ sudo fastboot reboot ==== Installation from Linux on C2 ==== You can also install U-boot from Linux with **dd** command. After building U-boot, copy **u-boot.bin** into your **ODROID-C2**. Then do the command below in order to flash your U-boot image to MicroSD or eMMC. $ sudo dd if=u-boot.bin of=/dev/mmcblk0 bs=512 seek=97 $ sudo sync * You must use the u-boot.bin binary under the folder, "u-boot/sd_fuse/u-boot.bin" ==== Update from Linux on ODROID-C2 board using u-boot package ==== On ODROID-C2 ubuntu, you can update U-boot with the latest released one using apt-get install command. $ sudo apt-get install u-boot ===== TFTP ===== ==== HOST-PC ==== * **NOTE:** //This step is Ubuntu 14.04 example.// Install the package: $ sudo apt-get install tftpd-hpa Edit config file as follows: $ sudo vi /etc/default/tftpd-hpa TFTP_USERNAME="tftp" TFTP_DIRECTORY="/tftpboot" TFTP_ADDRESS="0.0.0.0:69" TFTP_OPTIONS="-s -c -l" Create TFTP folder: sudo mkdir /tftpboot sudo chmod -R 777 /tftpboot sudo chown -R nobody /tftpboot Restart the app to apply new configuration: sudo service tftpd-hpa restart Copy //Image//, //meson64_odroidc2.dtb// and //uInitrd// files to ///tftpboot// directory. ==== U-Boot ==== **Assumptions:** * TFTP server IP address: //192.168.0.2// * ODROID-C2 IP address: //192.168.0.3// Set the tftp server & board ip address: odroidc2# setenv serverip 192.168.0.2 odroidc2# setenv ipaddr 192.168.0.3 Download images using tftp: odroidc2# tftp 0x1000000 meson64_odroidc2.dtb odroidc2# tftp 0x11000000 Image odroidc2# tftp 0x13000000 uInitrd Booting: odroidc2# setenv condev "console=ttyS0,115200n8 console=tty0" odroidc2# setenv m "1080p60hz" odroidc2# setenv m_bpp "32" odroidc2# setenv bootargs "root=UUID=e139ce78-9841-40fe-8823-96a304a09859 rootwait rw ${condev} no_console_suspend hdmimode=${m} m_bpp=${m_bpp} fsck.fix=yes" odroidc2# booti 0x11000000 0x13000000 0x1000000 ===== How to build u-boot with bl301 firmware ===== Because of the issue of build failure on any platform other than x86-64 and support of buildroot, we've separated bl301 firmware source code from u-boot repository. In the path, u-boot/fip/gxb/, there is a pre-built bl301.bin binary of the latest version, so you can build just u-boot without a re-build bl301 process. If you want to modify and update bl301-related source codes by yourself, please refer to the following. === Checkout and Merge === You can checkout **bl301 firmware** source tree from **[[https://github.com/hardkernel/u-boot_firmware/tree/odroidc2-bl301|Hardkernel's Github]]**. $ git clone https://github.com/hardkernel/u-boot_firmware.git -b odroidc2-bl301 You should merge bl301 with u-boot before build it. $ git clone https://github.com/hardkernel/u-boot.git -b odroidc2-v2015.01 $ git clone https://github.com/hardkernel/u-boot_firmware.git -b odroidc2-bl301 $ cd u-boot $ git remote add u-boot_firmware ../u-boot_firmware/ $ git fetch u-boot_firmware $ git merge --no-commit u-boot_firmware/odroidc2-bl301 === Toolchain for bl301 === bl301.bin source code needs a toolchain, arm-none-eabi-. Click one of the site to download toolchain to build U-boot. * [[http://dn.odroid.com/toolchains/gcc-linaro-arm-none-eabi-4.8-2014.04_linux.tar.xz|Download]] Once the download is done, extract the tarball to **/opt/toolchains/**. $ sudo mkdir -p /opt/toolchains $ sudo tar xvf gcc-linaro-arm-none-eabi-4.8-2014.04_linux.tar.xz -C /opt/toolchains/ In order to add the toolchain path to PATH, paste below lines to **$HOME/.bashrc**. export PATH=/opt/toolchains/gcc-linaro-arm-none-eabi-4.8-2014.04_linux/bin/:$PATH You can apply the change if you login again or import to apply this change, login again or evaluate **$HOME/.bashrc** with source command. $ source ~/.bashrc You can check if the toolchain installed above works properly while checking the version of toolchain. Using built-in specs. COLLECT_GCC=arm-none-eabi-gcc COLLECT_LTO_WRAPPER=/opt/toolchains/gcc-linaro-arm-none-eabi-4.8-2014.04_linux/bin/../libexec/gcc/arm-none-eabi/4.8.3/lto-wrapper Target: arm-none-eabi Configured with: /cbuild/slaves/oorts/crosstool-ng/builds/arm-none-eabi-linux/.build/src/gcc-linaro-4.8-2014.04/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc-linux-gnu --target=arm-none-eabi --prefix=/cbuild/slaves/oorts/crosstool-ng/builds/arm-none-eabi-linux/install --with-local-prefix=/cbuild/slaves/oorts/crosstool-ng/builds/arm-none-eabi-linux/install/arm-none-eabi --without-headers --with-newlib --enable-threads=no --disable-shared --with-pkgversion='crosstool-NG linaro-1.13.1-4.8-2014.04 - Linaro GCC 4.8-2014.04' --with-bugurl=https://bugs.launchpad.net/gcc-linaro --disable-__cxa_atexit --with-gmp=/cbuild/slaves/oorts/crosstool-ng/builds/arm-none-eabi-linux/.build/arm-none-eabi/build/static --with-mpfr=/cbuild/slaves/oorts/crosstool-ng/builds/arm-none-eabi-linux/.build/arm-none-eabi/build/static --with-mpc=/cbuild/slaves/oorts/crosstool-ng/builds/arm-none-eabi-linux/.build/arm-none-eabi/build/static --with-isl=/cbuild/slaves/oorts/crosstool-ng/builds/arm-none-eabi-linux/.build/arm-none-eabi/build/static --with-cloog=/cbuild/slaves/oorts/crosstool-ng/builds/arm-none-eabi-linux/.build/arm-none-eabi/build/static --with-libelf=/cbuild/slaves/oorts/crosstool-ng/builds/arm-none-eabi-linux/.build/arm-none-eabi/build/static --enable-lto --enable-linker-build-id --enable-libmudflap --disable-libgomp --enable-libssp --disable-libstdcxx-pch --enable-multilib --enable-languages=c,c++,fortran --with-multilib-list=aprofile Thread model: single gcc version 4.8.3 20140401 (prerelease) (crosstool-NG linaro-1.13.1-4.8-2014.04 - Linaro GCC 4.8-2014.04) === Build === And finally you can compile u-boot with bl301 firmware. $ cd u-boot $ make distclean $ make odroidc2_config $ make ===== How to check U-Boot version on User Space ===== You can check the U-Boot version using **dd** command as following. === Ubuntu === root@odroid64:/home/odroid# vi getUbootVer.sh #!/bin/sh dd if=/dev/mmcblk0 of=/tmp/temp.bin bs=512 skip=97 count=1334 status=none grep -a -r -E -o ".{0,0}U-Boot 2015.01.{0,50}" /tmp/temp.bin | grep -a "(" rm /tmp/temp.bin root@odroid64:/home/odroid# chmod a+x getUbootVer.sh root@odroid64:/home/odroid# ./getUbootVer.sh U-Boot 2015.01-00167-g095fdbe-dirty (Nov 12 2016 - 16:35:32) === Android === shell@odroidc2:/ $ su root@odroidc2:/ # mount -o rw,remount / root@odroidc2:/ # vi getUbootVer.sh #!/bin/sh dd if=/dev/block/mmcblk0 of=/temp.bin bs=512 skip=97 count=1334 grep -a -r -E -o ".{0,0}U-Boot 2015.01.{0,50}" /temp.bin | grep -a "(" rm /temp.bin root@odroidc2:/ # chmod 755 /getUbootVer.sh root@odroidc2:/ # /getUbootVer.sh 1334+0 records in 1334+0 records out 683008 bytes transferred in 0.014 secs (48786285 bytes/sec) /temp.bin:U-Boot 2015.01-dirty (Jul 06 2017 - 07:47:27)