- 01 Oct 2021
- 4 Minutes to read
- Print
- DarkLight
- PDF
Build Source Code in Ubuntu Virtual Machine
- Updated on 01 Oct 2021
- 4 Minutes to read
- Print
- DarkLight
- PDF
Introduction
The virtual machine is to reduce the complexity of setting up the development environment for building Android, Yocto, and Ubuntu images for TechNexion SOM/baseboards. The virtual machine is based on Ubuntu-20.04 LTS x64 architecture. This virtual machine can be executed under an OS that has VirtualBox 6.1.14 installed.
This build environment supports development of the following software for TechNexion target SOM/baseboards:
Supported Software Builds | Supported Version |
---|---|
FreeRTOS | 1.0.1 for iMX7, and SDK v2.3 for iMX8 |
U-boot | 2018.03 |
Linux kernel | 4.14.98 |
Yocto | 2.5(Sumo)/3.0(Zeus) |
Ubuntu | Ubuntu 20.04 |
Android | Android 9.0 (Pie) |
Note: For older versions of Linux/Android/Yocto, please use previous releases of virtual machine.
DO NOT use the uuu utility or dd utility within the VM if it is running on top of a Ubuntu host OS. There are timing issues with VirtualBox mounted USB device that can cause flashing to fail. This problem has not been seen on Windows or Mac OS hosts. If running on a Linux host, please use the native Linux host OS to run uuu or dd utility to flash images to the target device instead.
Build source code for target board
Toolchains and Cross-compile build environment
There are three toolchains, GCC-7.3.1-none-eabi for building FreeRTOS binaries, GCC-7.4.1-arm for building 32-bit ARM binaries, GCC-7.4.1-aarch64 for building 64-bit AArch64 binaries, in the virtual machine.
By default, these toolchains are located in "/home/technexion/Desktop/Tools" directory.
Recommended toolchain for u-boot/kernel/FreeRTOS for different SoC:
Toochain | SoC |
---|---|
gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-guieabihf | i.MX6/i.MX7 |
gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu | i.MX8 |
gcc-arm-none-eabi-7-2018-q2-update | FreeRTOS |
Before compiling source codes, make sure to setup the build environment by exporting cross-compile environment variables:
For iMX6/iMX7:
technexion@tn-vm:~$ source ~/buildenv.sh 32
arch 32 gnueabihf
technexion@tn-vm:~$
For iMX8:
technexion@tn-vm:~$ source ~/buildenv.sh 64
arch 64
technexion@tn-vm:~$
For FreeRTOS:\
technexion@tn-vm:~$ source ~/buildenv.sh rtos
arch 32 none-eabi
technexion@tn-vm:~$
All TechNexion source codes are located on the TechNexion github:
https://github.com/TechNexion (for main source code distributions)
https://github.com/TechNexion-customization (for customized source code distributions)
https://github.com/technexion-android (for android source code distributions)
Build u-boot
In a command line terminal:
- Download source code:
technexion@tn-vm:~$ git clone https://github.com/TechNexion/u-boot-tn-imx.git
technexion@tn-vm:~$ cd u-boot-tn-imx
technexion@tn-vm:~/u-boot-tn-imx$
- Set the u-boot config:For edm-imx8mq-wizard:
For pico-imx6:
technexion@tn-vm:~/u-boot-tn-imx$ source ~/buildenv.sh 32
technexion@tn-vm:~/u-boot-tn-imx$ make pico-imx6_spl_defconfig
For pico-imx6ul:
technexion@tn-vm:~/u-boot-tn-imx$ source ~/buildenv.sh 32
technexion@tn-vm:~/u-boot-tn-imx$ make pico-imx6ul_spl_defconfig
For pico-imx7:
technexion@tn-vm:~/u-boot-tn-imx$ source ~/buildenv.sh 32
technexion@tn-vm:~/u-boot-tn-imx$ make pico-imx7d_spl_defconfig
For pico-imx8mm:
technexion@tn-vm:~/u-boot-tn-imx$ source ~/buildenv.sh 64
technexion@tn-vm:~/u-boot-tn-imx$ make pico-imx8mm_defconfig
For pico-imx8mq:
technexion@tn-vm:~/u-boot-tn-imx$ source ~/buildenv.sh 64
technexion@tn-vm:~/u-boot-tn-imx$ make pico-imx8mq_spl_defconfig
For edm-imx6:
technexion@tn-vm:~/u-boot-tn-imx$ source ~/buildenv.sh 32
technexion@tn-vm:~/u-boot-tn-imx$ make edm-imx6_spl_defconfig
For edm-imx7:
technexion@tn-vm:~/u-boot-tn-imx$ source ~/buildenv.sh 32
technexion@tn-vm:~/u-boot-tn-imx$ make edm-imx7d_spl_defconfig
For edm-imx8mq:
technexion@tn-vm:~/u-boot-tn-imx$ source ~/buildenv.sh 64
technexion@tn-vm:~/u-boot-tn-imx$ make edm-imx8mq_defconfig
For flex-imx8mm:
technexion@tn-vm:~/u-boot-tn-imx$ source ~/buildenv.sh 64
technexion@tn-vm:~/u-boot-tn-imx$ make flex-imx8mm_defconfig
For xore-imx8mm:
technexion@tn-vm:~/u-boot-tn-imx$ source ~/buildenv.sh 64
technexion@tn-vm:~/u-boot-tn-imx$ make xore-imx8mm_defconfig
For axon-imx8mm:
technexion@tn-vm:~/u-boot-tn-imx$ source ~/buildenv.sh 64
technexion@tn-vm:~/u-boot-tn-imx$ make axon-imx8mm_defconfig
- Compile u-boot:
technexion@tn-vm:~/u-boot-tn-imx$ make
- Build flash.bin for imx8 boards:
For pico-imx8mm-pi/wizard:
technexion@tn-vm:~/u-boot-tn-imx$ ./install_uboot_imx8.sh -c
technexion@tn-vm:~/u-boot-tn-imx$ ./install_uboot_imx8.sh -b imx8mm-pico-pi
For pico-imx8mq-pi/wizard:
technexion@tn-vm:~/u-boot-tn-imx$ ./install_uboot_imx8.sh -c
technexion@tn-vm:~/u-boot-tn-imx$ ./install_uboot_imx8.sh -b imx8mq-pico-pi
For edm-imx8mq-wizard:
technexion@tn-vm:~/u-boot-tn-imx$ ./install_uboot_imx8.sh -c
technexion@tn-vm:~/u-boot-tn-imx$ ./install_uboot_imx8.sh -b imx8mq-edm-wizard
For flex-imx8mm-pi/wizard:
technexion@tn-vm:~/u-boot-tn-imx$ ./install_uboot_imx8.sh -c
technexion@tn-vm:~/u-boot-tn-imx$ ./install_uboot_imx8.sh -b imx8mm-flex-pi
For xore-imx8mm-pi/wizard:
technexion@tn-vm:~/u-boot-tn-imx$ ./install_uboot_imx8.sh -c
technexion@tn-vm:~/u-boot-tn-imx$ ./install_uboot_imx8.sh -b imx8mm-xore-pi
- Locate u-boot binary images:
For imx6/imx6ul/imx7:
technexion\@tn-vm:\~/u-boot-tn-imx\$ find . -name SPL
./SPL
technexion\@tn-vm:\~/u-boot-tn-imx\$ find . -name u-boot.bin
./u-boot.bin
For imx8:
technexion\@tn-vm:\~/u-boot-tn-imx\$ find . -name flash.bin
./imk-mkimage/iMX8M/flash.bin
Detailed instructions for building u-boot:
https://github.com/TechNexion/u-boot-tn-imx/wiki
Build kernel
In a command line terminal:
- Download source code:
technexion@tn-vm:~$ git clone https://github.com/TechNexion/linux-tn-imx.git
technexion@tn-vm:~$ cd linux-tn-imx
technexion@tn-vm:~/linux-tn-imx$
- Set the kernel config:
For imx6, imx6ul, imx7:
technexion@tn-vm:~/linux-tn-imx$ source ~/buildenv.sh 32
technexion@tn-vm:~/linux-tn-imx$ make tn_imx_defconfig
For imx8:
technexion@tn-vm:~/linux-tn-imx$ source ~/buildenv.sh 64
technexion@tn-vm:~/linux-tn-imx$ make tn_imx8_defconfig
- Compile the kernel:
technexion@tn-vm:~/linux-tn-imx/$ make
Compile the kernel modules specifically:
technexion@tn-vm:~/linux-tn-imx/$ make modules
Compile the kernel device trees specifically:
technexion@tn-vm:~/linux-tn-imx/$ make dtbs
- Locate the kernel image, device tree blobs, and kernel modules:
Kernel image:
For imx6, imx6ul, imx7:
technexion@tn-vm:~/linux-tn-imx/$ find . -name zImage
./arch/arm/boot/zImage
For imx8:
technexion@tn-vm:~/linux-tn-imx/$ find . -name Image
./arch/arm64/boot/Image
Device tree blobs:
For imx6, imx6ul, imx7:
technexion@tn-vm:~/linux-tn-imx/$ ls arch/arm/boot/dts/*{edm,pico,tep,tek}*.dtb
arch/arm/boot/dts/imx6dl-edm1-fairy.dtb
…
arch/arm/boot/dts/imx7d-tep1.dtb
For imx8:
technexion@tn-vm:~/linux-tn-imx/$ ls arch/arm64/boot/dts/freescale/*{edm,pico,flex,xore,axon}*.dtb
arch/arm64/boot/dts/freescale/imx8mm-axon-loopbacktest.dtb.dtb
…
arch/arm64/boot/dts/freescale/imx8mq-pico-wizard.dtb
Kernel modules:
For all architectures:
technexion@tn-vm:~/linux-tn-imx/$ make modules_install INSTALL_MOD_PATH=~/modules
INSTALL crypto/crypto_engine.ko
…
INSTALL sound/usb/snd-usbmidi-lib.ko
DEPMOD 4.14.98_2.0.1-g0cac981fa
technexion@tn-vm:~/linux-tn-imx/$ ls ~/modules/lib/modules/4.14.98_2.0.1-g0cac981fa/
build modules.alias modules.builtin modules.builtin.bin modules.order modules.symbols
source kernel modules.alias.bin modules.builtin.alias.bin modules.dep modules.devname
modules.softdep modules.symbols.bin
Build FreeRTOS
In a command line terminal:
- Download source codes:
technexion@tn-vm:~$ git clone https://github.com/TechNexion/freertos-tn.git
- Setup build environment:
technexion@tn-vm:~$ source ~/buildenv.sh rtos
technexion@tn-vm:~$ cd freetos-tn/boards/${board_name}/demo_apps/hello_world/armgcc/
- Build release
technexion@tn-vm:~/freetos-tn/boards/${board_name}/demo_apps/hello_world/armgcc$ ./build_release.sh
- Locate the binary image
technexion@tn-vm:~/freetos-tn/boards/${board_name}/demo_apps/hello_world/armgcc$ find . -name hello_world.bin
./release/hello_world.bin
technexion@tn-vm:~/freetos-tn/boards/${board_name}/demo_apps/hello_world/armgcc$ cp ./release/hello_world.bin ${mounted FAT partition of target board eMMC}
Detailed instructions for building FreeRTOS:
https://github.com/TechNexion/freertos-tn
Build Yocto
In a command line terminal:
- Download source code
technexion@tn-vm:~$ mkdir -p sumo; cd sumo
technexion@tn-vm:~/sumo$ repo init -u https://github.com/TechNexion/tn-imx-yocto-manifest.git -b sumo_4.14.y_GA-stable -m imx-4.14.98-2.0.1_patch.xml –depth=1
technexion@tn-vm:~/sumo$ repo sync
- Configure pico-imx8mm with qca wifi and 5 inch mipi display
technexion@tn-vm:~/sumo$ MACHINE=pico-imx8mm DISTRO=fsl-imx-xwayland WIFI_FIRMWARE=y WIFI_MODULE=qca DISPLAY=mipi5 source edm-setup-release.sh -b build-pico-imx8mm
- Build yocto image
technexion@tn-vm:~/sumo/build-pico-imx8mm$ bitbake fsl-image-qt5-validation-imx
Detailed instructions for building Yocto:
https://github.com/TechNexion/tn-imx-yocto-manifest
To build Yocto 2.5, please follow the instruction on the webpage of the github, and skip the part about using docker.
Build Ubuntu
In a command line terminal:
- Download source code
technexion@tn-vm:~$ git clone https://github.com/TechNexion-customization/ubuntu-tn-imx8.git
technexion@tn-vm:~$ cd ubuntu-tn-imx8
- Build ubuntu:
technexion@tn-vm:~/ubuntu-tn-imx8$ make all
- Location ubuntu image
technexion@tn-vm:~/ubuntu-tn-imx8$ find . -name ubuntu.img
./output/ubuntu.img
For detailed instructions:
https://github.com/TechNexion-customization/ubuntu-tn-imx8
Build Android 9.0 for iMX8
In a command line terminal:
- Download source code:
technexion@tn-vm:~$ mkdir -p android; cd android
technexion@tn-vm:~/android$ repo init -u https://github.com/technexion-android/manifest -b tn-p9.0.0_2.0.1_8m-ga -depth=1
technexion@tn-vm:~/android$ repo sync
- Setup build environment:
technexion@tn-vm:~/android$ source cookers/env.bash.imx8.pico-imx8m-mini.pi.mipi-dsi_ili9881c
technexion@tn-vm:~/android$ merge_restricted_extras
- Build android:
technexion@tn-vm:~/android$ cook -j4
- Package android for distribution:
technexion@tn-vm:~/android$ gen_mp_images
- Locate distribution package:
technexion@tn-vm:~/android$ ls ./auto_test
boot.img dtbo-imx8mq-img flash.bin fsl-sdcard-partition.sh fsl-sdcard-partition-virtual-image.sh partition-table.img partition-table-7GB.img partition-table-13GB.img partition-table-28GB.img partition-table-default.img system.img u-boot-imx8mq.imx u-boot-imx8mq-evk-uuu.imx uuu_imx_android_flash.bat uuu_imx_android_flash.sh vbmeta-imx8mq.img vendor.img
For detailed instruction:
https://github.com/technexion-android/cookers
and follow instructions on the webpage to fetch the source code, compile, and load the image to the hardware. Skip the part about using docker.
Build UUU for programming target device
In a command line terminal:
- Download source code
technexion@tn-vm:~$ git clone https://github.com/TechNexion/imx-mfgtools-tn.git
technexion@tn-vm:~$ cd imx-mfgtools-tn
technexion@tn-vm:~/imx-mfgtools-tn$ git checkout tn-uuu_1.3.154
- Compile uuu for Linux x86_64
technexion@tn-vm:~/imx-mfgtools-tn$ cmake .
technexion@tn-vm:~/imx-mfgtools-tn$ make
- Location uuu executable binary
technexion@tn-vm:~/imx-mfgtools-tn$ find . -name uuu
./uuu
./uuu/uuu
Detailed instructions:
https://github.com/TechNexion/imx-mfgtools-tn/tree/tn-uuu_1.3.154