mayfrost-guides/CROSS-COMPILING.md

6.8 KiB

CROSS-COMPILING

Installing a distro for ARM. The distro is CRUX, the target is an Odroid C2. The device will appears as "/dev/mmcblk0" (with "/dev/mmcblk0p1" and "/dev/mmcblk0p2" as the partitions) in the target machine, but it can be seen as "/dev/sdX" in your x86 computer. The unpacking tool is provided by Atool.

TOC

  1. CROSS COMPILATION TOOLS
  2. PARTITIONING
  3. MOUNTING
  4. ROOT PARTITION
  5. BOOT PARTITION
  6. COMPILING KERNEL
  7. BOOTLOADER

CROSS COMPILATION TOOLS

Installing GCC cross compilation tools (for the X86 machine, not target ARM). Includes binutils.

  • OPTION 1: Proportioned by Linaro
wget -c https://releases.linaro.org/components/toolchain/binaries/latest/aarch64-linux-gnu/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz
aunpack gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz
  • OPTION 2: From repository (Devuan example)
    sudo apt-get install gcc-arm-none-eabi
    NOTE: Check your tools are up-to-date to prevent errors like the lack of option "-mgeneral-regs-only".

Name of "CROSS_COMPILE" variable will change depending on the choosen option. This guide assumes cross-compilation tools are from Linaro and therefore will equal to "CROSS_COMPILE=<LINARO_TOOLS_DIRECTORY>/bin/aarch64-linux-gnu-"

PARTITIONING

  • Clear the section for the bootloader
    dd if=/dev/zero of=/dev/sdX bs=1M count=8
  • Enter fdisk
    fdisk /dev/sdX
  • Help
    m
  • Create new MBR partition table
    o
  • Create boot partition
    n
  • Make primary partition
    p
  • Choose partition number
    1
  • Assign start of boot partition at the end of the bootloader space
    3073
  • Assign end of boot partition
    +128M
  • Create root partition
    n
  • Make primary partition
    p
  • Choose partition number
    2
  • Assign start of root partition at the end of the boot partition
    134220802
  • Assign end of root partition (the rest of the drive by default) by pressing ENTER
  • Show the partitions
    p
  • If you agree save and exit
    w
  • If you disagree delete a partition and start from that partition
    d
  • or exit without saving
    q
  • Make root filesystem
    mkfs.<ROOT_FILESYSTEM> /dev/sdX2
  • Make boot filesystem according to supported bootloader (only "mkfs.vfat")
    mkfs.<BOOTLOADER_FILESYSTEM> /dev/sdX1

MOUNTING

  • Mount root filesystem
    mount /dev/sdX2 /mnt
  • Create boot directory
    mkdir /mnt/boot
  • Mount boot filesystem
    mount /dev/sdX1 /mnt/boot

ROOT PARTITION

Can be the rest of the disk.

  • Go to root directory
    cd /mnt/
  • Download CRUX image
    wget -c http://resources.crux-arm.nu/files/devel-test/3.3/crux-arm-rootfs-3.3-64b-RC2.tar.xz
  • Extract CRUX image to root directory
    aunpack crux-arm-rootfs-3.3-64b-RC2.tar.xz --extract-to=/mnt
  • Change network interface with the rules you want (IP, gateway, domain, etc).
    elvis /etc/rc.d/net
  • On the "/etc/resolv.conf.head" file set your preferred DNS provider (this example is from OpenNIC).
    nameserver 185.121.177.177
  • Change the "/etc/fstab" file with appropriate filesystems.
/dev/sda1    /boot    <BOOTLOADER_FILESYSTEM>    defaults 0 1
/dev/sda2    /    <ROOT_FILESYSTEM>      errors=remount-ro,noatime 0 1
  • Uncomment the lines referring to "devpts", "tmp", and "shm" as some programs require it (Firefox), also "USB" and or "cdrom" if using those.
  • Change the font, keyboard, timezone, hostname and services on the "/etc/rc.conf" file. ls /usr/share/kbd/keymaps/

BOOT PARTITION

Must be FAT32 and 64 MB minimum.

  • Clone kernel repo to destination "odroidc2-kernel-folder"
    git clone --depth 1 --single-branch https://github.com/hardkernel/linux.git --branch odroidc2-v3.16.y odroidc2-kernel-folder

  • Enter destination folder
    cd odroidc2-kernel-folder

  • OPTION 1: Make kernel config (oneliner)
    make ARCH=arm64 CROSS_COMPILE=<LINARO_TOOLS_DIRECTORY>/bin/aarch64-linux-gnu- odroidc2_defconfig

  • OPTION 2: Make kernel config

export ARCH=arm64
export CROSS_COMPILE=<LINARO_TOOLS_DIRECTORY>/bin/aarch64-linux-gnu-
make odroidc2_defconfig
  • Refine configuration
    make menuconfig

COMPILING KERNEL

  • Compiling the devicetree blobs
    make -j $(nproc) ARCH=arm64 CROSS_COMPILE=<LINARO_TOOLS_DIRECTORY>/bin/aarch64-linux-gnu- INSTALL_DTBS_PATH=/mnt/boot/dtbs/ dtbs
  • Compiling the kernel
    make -j $(nproc) ARCH=arm64 CROSS_COMPILE=<LINARO_TOOLS_DIRECTORY>/bin/aarch64-linux-gnu- INSTALL_PATH=/mnt/boot/ Image
  • Compiling the modules
    make -j $(nproc) ARCH=arm64 CROSS_COMPILE=<LINARO_TOOLS_DIRECTORY>/bin/aarch64-linux-gnu- INSTALL_MOD_PATH=/mnt/ modules
  • Installing the kernel to destination "/mnt/boot/Image"
    cp arch/arm64/boot/Image /mnt/boot/
  • Creating the devicetree directory
    mkdir /mnt/boot/dtbs/
  • Installing the devicetree blobs to destination "/mnt/boot/dtbs/meson64_odroidc2.dtb"
    cp arch/arm64/boot/dts/meson64_odroidc2.dtb /mnt/boot/dtbs/
  • Installing the modules to destination "INSTALL_MOD_PATH=/mnt/"
    make -j $(nproc) ARCH=arm64 CROSS_COMPILE=<LINARO_TOOLS_DIRECTORY>/bin/aarch64-linux-gnu- INSTALL_MOD_PATH=/mnt/ modules_install
  • Compiling the firmware to destination "INSTALL_FW_PATH=/mnt/lib/firmware/"
    make -j $(nproc) ARCH=arm64 CROSS_COMPILE=<LINARO_TOOLS_DIRECTORY>/bin/aarch64-linux-gnu- INSTALL_FW_PATH=/mnt/lib/firmware/ firmware_install
  • Compiling the kernel C headers to destination "INSTALL_HDR_PATH=/mnt/usr/"
    make -j $(nproc) ARCH=arm64 CROSS_COMPILE=<LINARO_TOOLS_DIRECTORY>/bin/aarch64-linux-gnu- INSTALL_HDR_PATH=/mnt/usr/ headers_install

BOOTLOADER

Minimum 3072 bytes free at the start of the drive and before the boot partition.

  • OPTION 1: Download and extract the binary
wget -c http://mirror.archlinuxarm.org/aarch64/alarm/uboot-odroid-c2-2015.01-17-aarch64.pkg.tar.xz
aunpack uboot-odroid-c2-2015.01-17-aarch64.pkg.tar.xz --extract-to=/mnt/boot
cd /mnt/boot
  • OPTION 2: Compile the bootloader yourself
git clone https://github.com/hardkernel/u-boot.git -b odroidc2-v2015.01
cd u-boot
make ARCH=arm64 CROSS_COMPILE=<LINARO_TOOLS_DIRECTORY>/bin/aarch64-linux-gnu- odroidc2_defconfig
make -j $(nproc)
cd boot
  • Flash the bootloader
chmod +x sd_fusing.sh
./sd_fusing.sh /dev/sdX
  • Notice the target is the device NOT a partition
  • Set resolution by editing file root/boot/boot.ini
  • Might want to comment out the display-autodetect option

And done. Next follow the distro tweaks: https://github.com/mayfrost/guides/blob/master/DISTROS.md Also check the list of software alternative to bloatware and support minimalism https://github.com/mayfrost/guides/blob/master/ALTERNATIVES.md