编译手册 ======== 准备编译环境 ------------ 安装依赖包 ~~~~~~~~~~ .. code-block:: shell # =====> Input: sudo apt install libssh-dev 安装 gcc-linaro 交叉编译工具 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. 准备交叉编译工具文件   可以网盘下载或在线下载。 - 网盘下载方式:   在网盘下载“gcc-linaro-7.5.0-2019.12-x86\_64\_aarch64-linux-gnu.tar.xz”后,把文件传输到 x86_64 Linux 主机中。 - 在线下载方式: .. code-block:: shell # =====> Input: wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz 2. 执行安装 .. code-block:: shell # =====> Input: # 创建安装目录 mkdir ~/work/toolchain/gcc-linaro -p # 安装指令 tar xf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz -C ~/work/toolchain/gcc-linaro 3. 创建交叉编译工具配置文件 .. code-block:: shell # =====> Input: # 创建配置文件 cat << EOF > ~/work/toolchain/gcc-linaro/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.env #!/bin/sh export PATH=${HOME}/work/toolchain/gcc-linaro/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:${PATH} export ARCH=arm64 export CROSS_COMPILE=aarch64-linux-gnu- EOF # 配置可执行权限 chmod +x ~/work/toolchain/gcc-linaro/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.env 4. 配置工具环境变量 .. code-block:: shell # =====> Input: source ~/work/toolchain/gcc-linaro/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.env 5. 检查安装 .. code-block:: shell # =====> Input: ${CROSS_COMPILE}gcc -v 6. 工具信息 .. code:: text 使用内建 specs。 COLLECT_GCC=aarch64-linux-gnu-gcc COLLECT_LTO_WRAPPER=/home/tangbin/work/toolchain/gcc-linaro/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/../libexec/gcc/aarch64-linux-gnu/7.5.0/lto-wrapper 目标:aarch64-linux-gnu 配置为:'/home/tcwg-buildslave/workspace/tcwg-make-release_0/snapshots/gcc.git~linaro-7.5-2019.12/configure' SHELL=/bin/bash --with-mpc=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu --with-mpfr=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gmp=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gnu-as --with-gnu-ld --disable-libmudflap --enable-lto --enable-shared --without-included-gettext --enable-nls --with-system-zlib --disable-sjlj-exceptions --enable-gnu-unique-object --enable-linker-build-id --disable-libstdcxx-pch --enable-c99 --enable-clocale=gnu --enable-libstdcxx-debug --enable-long-long --with-cloog=no --with-ppl=no --with-isl=no --disable-multilib --enable-fix-cortex-a53-835769 --enable-fix-cortex-a53-843419 --with-arch=armv8-a --enable-threads=posix --enable-multiarch --enable-libstdcxx-time=yes --enable-gnu-indirect-function --with-build-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/sysroots/aarch64-linux-gnu --with-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu/aarch64-linux-gnu/libc --enable-checking=release --disable-bootstrap --enable-languages=c,c++,fortran,lto --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu --target=aarch64-linux-gnu --prefix=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu 线程模型:posix gcc 版本 7.5.0 (Linaro GCC 7.5-2019.12) 安装 QT5 SDK ~~~~~~~~~~~~ 1. 准备交叉编译工具文件   在网盘下载 "fsl-imx-xwayland-glibc-x86\_64-imx-image-full-cortexa53-crypto-imx8mp-ddr4-evk-toolchain-5.10-hardknott.sh" 后,把文件传输到 x86\_64 Linux 主机中。 2. 执行安装指令 .. code-block:: shell # =====> Input: ./fsl-imx-xwayland-glibc-x86_64-imx-image-full-cortexa53-crypto-imx8mp-ddr4-evk-toolchain-5.10-hardknott.sh 3. 选择安装路径   出现下面信息时按下 Enter 即可(保持默认安装路径) .. code:: text NXP i.MX Release Distro SDK installer version 5.10-hardknott ============================================================ Enter target directory for SDK (default: /opt/fsl-imx-xwayland/5.10-hardknott): 4. 确认安装路径   出现下面信息时按下 Enter 即可(保持默认选项) .. code:: text You are about to install the SDK to "/opt/fsl-imx-xwayland/5.10-hardknott". Proceed [Y/n] 5. 等待安装   安装过程可能需要数分钟,安装过程可以看到的信息类似如下: .. code:: text Extracting SDK...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................done Setting it up...done SDK has been successfully set up and is ready to be used. Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g. $ . /opt/fsl-imx-xwayland/5.10-hardknott/environment-setup-cortexa53-crypto-poky-linux 6. 配置工具环境变量 .. code:: text # =====> Input: . /opt/fsl-imx-xwayland/5.10-hardknott/environment-setup-cortexa53-crypto-poky-linux 7. 检查安装 .. code-block:: shell # =====> Input: ${CROSS_COMPILE}gcc -v 8. 工具信息 .. code:: text Using built-in specs. COLLECT_GCC=aarch64-poky-linux-gcc COLLECT_LTO_WRAPPER=/opt/fsl-imx-xwayland/5.10-hardknott/sysroots/x86_64-pokysdk-linux/usr/libexec/aarch64-poky-linux/gcc/aarch64-poky-linux/10.2.0/lto-wrapper Target: aarch64-poky-linux Configured with: ../../../../../../work-shared/gcc-10.2.0-r0/gcc-10.2.0/configure --build=x86_64-linux --host=x86_64-pokysdk-linux --target=aarch64-poky-linux --prefix=/usr/local/oe-sdk-hardcoded-buildpath/sysroots/x86_64-pokysdk-linux/usr --exec_prefix=/usr/local/oe-sdk-hardcoded-buildpath/sysroots/x86_64-pokysdk-linux/usr --bindir=/usr/local/oe-sdk-hardcoded-buildpath/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux --sbindir=/usr/local/oe-sdk-hardcoded-buildpath/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux --libexecdir=/usr/local/oe-sdk-hardcoded-buildpath/sysroots/x86_64-pokysdk-linux/usr/libexec/aarch64-poky-linux --datadir=/usr/local/oe-sdk-hardcoded-buildpath/sysroots/x86_64-pokysdk-linux/usr/share --sysconfdir=/usr/local/oe-sdk-hardcoded-buildpath/sysroots/x86_64-pokysdk-linux/etc --sharedstatedir=/usr/local/oe-sdk-hardcoded-buildpath/sysroots/x86_64-pokysdk-linux/com --localstatedir=/usr/local/oe-sdk-hardcoded-buildpath/sysroots/x86_64-pokysdk-linux/var --libdir=/usr/local/oe-sdk-hardcoded-buildpath/sysroots/x86_64-pokysdk-linux/usr/lib/aarch64-poky-linux --includedir=/usr/local/oe-sdk-hardcoded-buildpath/sysroots/x86_64-pokysdk-linux/usr/include --oldincludedir=/usr/local/oe-sdk-hardcoded-buildpath/sysroots/x86_64-pokysdk-linux/usr/include --infodir=/usr/local/oe-sdk-hardcoded-buildpath/sysroots/x86_64-pokysdk-linux/usr/share/info --mandir=/usr/local/oe-sdk-hardcoded-buildpath/sysroots/x86_64-pokysdk-linux/usr/share/man --disable-silent-rules --disable-dependency-tracking --with-libtool-sysroot=/home/HDWD110/yocto/imx-5.10.72-2.2.2-20220712/build--fsl-imx-xwayland/tmp/work/x86_64-nativesdk-pokysdk-linux/gcc-cross-canadian-aarch64/10.2.0-r0/recipe-sysroot --with-gnu-ld --enable-shared --enable-languages=c,c++ --enable-threads=posix --enable-multilib --enable-default-pie --enable-c99 --enable-long-long --enable-symvers=gnu --enable-libstdcxx-pch --program-prefix=aarch64-poky-linux- --without-local-prefix --disable-install-libiberty --disable-libssp --enable-libitm --enable-lto --disable-bootstrap --with-system-zlib --with-linker-hash-style=gnu --enable-linker-build-id --with-ppl=no --with-cloog=no --enable-checking=release --enable-cheaders=c_global --without-isl --with-gxx-include-dir=/not/exist/usr/include/c++/10.2.0 --with-build-time-tools=/home/HDWD110/yocto/imx-5.10.72-2.2.2-20220712/build--fsl-imx-xwayland/tmp/work/x86_64-nativesdk-pokysdk-linux/gcc-cross-canadian-aarch64/10.2.0-r0/recipe-sysroot-native/usr/aarch64-poky-linux/bin --with-sysroot=/not/exist --with-build-sysroot=/home/HDWD110/yocto/imx-5.10.72-2.2.2-20220712/build--fsl-imx-xwayland/tmp/work/x86_64-nativesdk-pokysdk-linux/gcc-cross-canadian-aarch64/10.2.0-r0/recipe-sysroot --enable-poison-system-directories --disable-static --enable-nls --with-glibc-version=2.28 --enable-initfini-array --enable-__cxa_atexit Thread model: posix Supported LTO compression algorithms: zlib gcc version 10.2.0 (GCC) 编译 Boot 文件 -------------- 编译 U-Boot 文件 ~~~~~~~~~~~~~~~~ 1. 准备 U-Boot 源码包文件 |   ① 打开网盘到 “3.2_OS_Linux-5.10.72 -> 02_source”,下载 “uboot-2021.04\*.tar.bz2"。 |   ② 把文件 "uboot-2021.04\*.tar.bz2" 传输到 x86_64 Linux 主机中。 2. 解压源码包 .. code-block:: shell # =====> Input: tar xf uboot-2021.04*.tar.bz2 -C ~/work/linux/imx-linux-5.10.72 3. 配置编译工具环境变量 .. code-block:: shell # =====> Input: source ~/work/toolchain/gcc-linaro/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.env 4. 目标文件编译 .. code-block:: shell cd ~/work/linux/imx-linux-5.10.72/uboot-2021.04 make myimx8mpek314_defconfig O=build cd build make -j24 5. 目标文件说明   u-boot-nodtb.bin, spl/u-boot-spl.bin, arch/arm/dts/myimx8mpek314.dtb 即目标文件,在下一步骤编译 Boot 文件时会依赖这些文件。 编译 Boot 文件 ~~~~~~~~~~~~~~ 1. 准备 Boot 编译工具   把文件 "mkimage-5.10.72\*.tar.bz2" 传输到 x86\_64 Linux 主机中。 2. 解压 Boot 编译工具 .. code-block:: shell # =====> Input: tar xf mkimage-5.10.72*.tar.bz2 -C ~/work/linux/imx-linux-5.10.72 3. 编译 Boot 文件 .. code-block:: shell cd ~/work/linux/imx-linux-5.10.72/mkimage-5.10.72 make SOC=iMX8MP dtbs=myimx8mpek314.dtb flash_ddr4_evk OUTIMG=boot-myimx8mpek314.bin 4. 目标文件说明   iMX8M/boot-myimx8mpek314.bin 即目标文件,可以用编译出来的目标文件替换烧录工具的同名文件。 编译 Linux 内核 --------------- 1. 准备 Linux 源码包文件   把文件 "imx-linux-5.10.72\*.tar.bz2" 传输到 x86\_64 Linux 主机中。 2. 解压源码包 .. code-block:: shell # =====> Input: tar xf linux-5.10.72*.tar.bz2 -C ~/work/linux/imx-linux-5.10.72 3. 配置编译工具环境变量 .. code-block:: shell # =====> Input: source ~/work/toolchain/gcc-linaro/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.env 4. Linux Image 文件编译 - 执行编译 .. code-block:: shell # =====> Input: cd ~/work/linux/imx-linux-5.10.72/linux-5.10.72 make imx_v8_defconfig make Image -j24 - Image 编译过程中输出信息类似如下: .. code:: text WRAP arch/arm64/include/generated/uapi/asm/kvm_para.h WRAP arch/arm64/include/generated/uapi/asm/errno.h ...... KSYMS .tmp_vmlinux.kallsyms2.S AS .tmp_vmlinux.kallsyms2.S LD vmlinux SORTTAB vmlinux SYSMAP System.map OBJCOPY arch/arm64/boot/Image 5. Linux 设备树文件编译 - 执行编译 .. code-block:: shell # =====> Input: make myzr/myimx8mpek314.dtb myzr/myimx8mpek314-ov2775-ov5640.dtb - 设备树首次编译成功时,输出信息类似如下: .. code:: text DTC arch/arm64/boot/dts/myzr/myimx8mpek314.dtb DTC arch/arm64/boot/dts/myzr/myimx8mpek314-ov2775-ov5640.dtb Linux MIPI屏设备树文件编译 - 执行编译 .. code-block:: shell # =====> Input: make myzr/myimx8mpek314-mipi.dtb - 设备树首次编译成功时,输出信息类似如下: .. code:: text DTC arch/arm64/boot/dts/myzr/myimx8mpek314-mipi.dtb - 在arm板上,将 `mmcblk2p1` 进行挂载,如下操作: .. code-block:: shell mount /dev/mmcblk2p1 /mnt/ - 将编译好的 `myimx8mpek314-mipi.dtb` 文件上传到arm板的 `/mnt` 下 - 重新启动arm板,在启动过程中,按 `回车` 进入 `uboot` - 在 `uboot` 里输入如下命令: .. code-block:: shell # =====> Input: setenv fdtfile myimx8mpek314-mipi.dtb saveenv boot 6. Linux 模块编译 - 执行编译 .. code-block:: shell # =====> Input: make modules -j24 - 模块编译成功输出信息类似如下: .. code:: text ...... LD [M] sound/usb/snd-usb-audio.ko LD [M] sound/usb/snd-usbmidi-lib.ko - 安装内核模块到指定目录 .. code-block:: shell # =====> Input: if [ -d modules ]; then rm -rf modules; fi; mkdir modules make modules_install INSTALL_MOD_PATH=./modules - 模块安装输出信息类似如下: .. code:: text ...... INSTALL sound/usb/snd-usbmidi-lib.ko DEPMOD 5.10.72-g5a70c7927261 - 打包内核模块文件 .. code-block:: shell # =====> Input: tar cjf kernel-modules.tar.bz2 -C modules lib 7. 目标文件说明   Image, myimx8mpek314.dtb, myimx8mpek314-ov2775-ov5640.dtb, kernel-modules.tar.bz2 即目标文件,可以用编译出来的目标文件替换烧录工具的同名文件。 -------------------------------------------------------------------------------- .. 20230726 唐斌检查 :: -------------------------------------------------------------------------------- * 珠海明远智睿科技有限公司 * ZhuHai MYZR Technology CO.,LTD. * Latest Update: 2023/7/26 * Supporter: Zhong JiaYi --------------------------------------------------------------------------------