• 【Yocto2】构建嵌入式Linux系统



    1.定制化嵌入式linux系统

    在实际项目中,一款嵌入式产品往往具有不同的硬件平台和软件需求,因此需要对嵌入式Linux系统进行定制,以满足不同的产品需求。之前的章节中基于Freescale官方提供的例程,构建了运行于imx6ull14x14evk硬件平台上的fsl-imx-fb发行版本,以此熟悉了Yocto的基本原理和工作流程。后续我们将基于Freescale官方的imx6ull14x14evk硬件平台的fsl-imx-fb发行版本,定制化自己的嵌入式Linux系统。一个完整的嵌入式Linux发行版包括U-Boot、Linux Kernel、Device Tree、rootfs。因此,定制化嵌入式Linux系统,将分为三个部分:U-Boot移植、Linux Kernel移植、构建rootfs。(Linux Kernel编译过程中,将同时生成Device Tree)。

    Yocto是通过Metadata(Layers)的方式,确定构建嵌入式Linux系统的所需要的信息。Yocto和Freescale官方提供了很多的Metadata,在定制嵌入式Linux系统时,一般不会直接更改Yocto或Freescale官方提供的Metadata,而是通过创建新的Metadata,以.bb或.bbappend的方式定制自己的嵌入式Linux系统。采用Metadata的最大好处是使得软件功能模块化,把某一功能使用到的软件包或源码放在同一个Layer中,将使得当需要改变某一功能时,只需要改动相应的Metadata,而不会影响到其他功能。

    1.1 创建Metadata

    在sources目录下,创建一个文件夹,例如:meta-bird-imx6ull,用于存放自定义的Metadata,所有对于定制化嵌入式Linux系统所需的配置文件、源文件等都将存放在该目录下。在基于Freescale官方提供的fsl-arm-yocto-bsp Yocto项目构建嵌入式Linux系统发行版时,第一步是使用Freescale提供的imx-setup-release.sh初始化构建环境。在使用imx-setup-release.sh脚本时,采用的是如下命令:DISTRO=fsl-imx-fb MACHINE=imx6ull14x14evk source imx-setup-release.sh -b build

    其中参数fsl-imx-fb对应Linux发行版,imx6ull14x14evk对应Linux硬件平台。他们分别对应位于/sources/meta-imx路径下的meta-sdk/conf/distro下fsl-imx-fb.conf以及meta-bsp/conf/machine/imx6ull14x14evk.conf。因此需要在这两个文件的基础上,通过修改一定的设置,用于构建定制化的嵌入式Linux系统。在meta-bird-imx6ull文件夹中,需要按照Yocto定义的框架,创建一些文件,用于配置嵌入式Linux发行版的构建过程。教程中将以MACHINE=imx6ull-bird-dk,DISTRO=bird-imx-fb为例,构建系统。

    在/sources/meta-bird-imx6ull路径下,创建一个conf文件夹,用于存放配置文件。在conf文件夹下,依次创建distro和machine文件夹。如下图所示:
    在这里插入图片描述
    在这里插入图片描述

    1.1.1 修改layer.conf文件

    在Yocto构建嵌入式Linux系统过程中,通过Layer(meta-xxx文件夹)的方式定义了构建系统所使用的配置文件、源文件等,创建好文件夹(meta-bird-imx6ull)后,通过修改layer.conf文件,将新增加的meta-bird-imx6ull加入到Yocto构建系统过程中。具体来说,将/sources/meta-imx/meta-bsp/conf路径下的layer.conf文件拷贝至/sources/meta-bird-imx6ull/conf路径下,并按照下图所示修改:
    在这里插入图片描述
    修改了BBFILE_xxx变量,用于告诉BitBake构建系统时,采用meta-bird-imx6ull文件夹下的.bb文件。其中,BBFILE_COLLECTIONS += "bird-imx6ull"中的"bird-imx6ull"必须和meta-bird-imx6ull文件夹的后缀bird-imx6ull一致。

    对于新创建的Layer(meta-bird-imx6ull文件夹),是通过meta-bird-imx6ull/conf路径下的layer.conf配置文件配置的,在layer.conf文件中,主要定义了一些变量的值,如下:
    BBPATH:将当前Layer的路径增加到变量BBPATH中。
    BBFILES:在当前Layer(meta-bird-imx6ull)中,有许多的recipes,在recipes中又有各种的.bb或.bbappend文件,这些.bb或.bbappend文件用于定义了参与构建系统过程的软件的基本信息(来源、配置等)。
    BBFILE_COLLECTTIONS:该变量用于定义新增加的layer。
    BBFILE_PATTERN:该变量用于定义bbFILES所定义的值的匹配路径。
    BBFILE_PRIORITY:该变量用于定义Layer的优先级。当有多个相同的recipe存在于多个Layers中时,将用优先级高的那一个。

    此外,在layer.coonf文件中还定义了一些其他的变量,用于控制系统的构建过程,在该文件中有许多与mx6不相关的其他型号的配置变量,可以将其移除,同时需要注意的是,目前在我们构建的系统中,去掉了optee相关的功能,因此,需要将layer.conf中与optee相关的部分去掉,去掉后的layer.conf文件如下所示:

    # We have a conf and classes directory, add to BBPATH
    BBPATH .= ":${LAYERDIR}"
    
    # We have a packages directory, add to BBFILES
    BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
           ${LAYERDIR}/recipes-*/*/*.bbappend"
    
    BBFILE_COLLECTIONS += "bird-imx6ull"
    BBFILE_PATTERN_bird-imx6ull := "^${LAYERDIR}/"
    BBFILE_PRIORITY_bird-imx6ull = "9"
    LAYERSERIES_COMPAT_bird-imx6ull = "warrior zeus"
    
    HOSTTOOLS_NONFATAL_append = " bc rsync xxd"
    
    # optee is no longer a valid distro feature. Use machine feature to remove, like this:
    MACHINE_FEATURES_remove = "optee"
    MACHINE_FEATURES_remove = "optee-client"
    MACHINE_FEATURES_remove = "optee-os"
    MACHINE_FEATURES_remove = "optee-test"
    # DEPRECATED: The ability to remove optee from the build is deprecated and
    # will be removed in some future release.
    
    DISTRO_FEATURES_FILTER_NATIVESDK += "wayland"
    
    MACHINE_USES_VIVANTE_KERNEL_DRIVER_MODULE ?= "0"
    
    MACHINE_SOCARCH_FILTER_append_imxgpu = " opencv"
    
    MACHINE_SOCARCH_FILTER_remove = " imx-parser alsa-lib gstreamer1.0"
    
    # Use latest SDMA firmware from firmware-imx instead of upstream linux-firmware
    MACHINE_FIRMWARE_remove_mx6  = "linux-firmware-imx-sdma-imx6q"
    MACHINE_FIRMWARE_append_mx6  = " firmware-imx-sdma firmware-imx-regulatory"
    
    MACHINE_FIRMWARE_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'bcm4339', 'linux-firmware-bcm4339', '', d)}"
    MACHINE_FIRMWARE_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'bcm43430', 'linux-firmware-bcm43430', '', d)}"
    MACHINE_FIRMWARE_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'bcm43455', 'linux-firmware-bcm43455', '', d)}"
    MACHINE_FIRMWARE_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'bcm4356', 'linux-firmware-bcm4356-pcie', '', d)}"
    MACHINE_FIRMWARE_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'bcm4359', 'linux-firmware-bcm4359-pcie', '', d)}"
    MACHINE_FIRMWARE_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'nxp8987', 'linux-firmware-nxp8987', '', d)}"
    
    # Extra Marvell Wi-Fi & BTE driver and firmware
    MACHINE_EXTRA_RRECOMMENDS_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'mrvl8997', 'packagegroup-imx-mrvl8997', '', d)}"
    
    # Extra NXP Wlan SDK
    MACHINE_EXTRA_RRECOMMENDS_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'nxp8987', 'nxp-wlan-sdk', '', d)}"
    
    MACHINE_GSTREAMER_1_0_PLUGIN_mx6ul ?= "imx-gst1.0-plugin"
    
    PREFERRED_VERSION_weston_mx6 ?= "8.0.0.imx"
    
    PREFERRED_VERSION_wayland-protocols_mx6 = "1.18.imx"
    
    PREFERRED_VERSION_libdrm_mx6 ?= "2.4.99.imx"
    
    PREFERRED_VERSION_isp-imx ?= "4.2.2.2"
    PREFERRED_VERSION_basler-camera ?= "4.2.2.2"
    
    SOC_DEFAULT_IMAGE_FSTYPES_remove = "wic.gz"
    SOC_DEFAULT_IMAGE_FSTYPES_append = " wic.bz2 tar.bz2"
    
    # Remove from upstream
    SDCARD_ROOTFS = "NO_LONGER_USED"
    
    IMAGE_BOOT_FILES_append = " \
    ${@bb.utils.contains('COMBINED_FEATURES', 'xen', 'xen', '', d)} \
    "
    
    IMAGE_INSTALL_append = " \
    ${@bb.utils.contains('COMBINED_FEATURES', 'jailhouse', 'jailhouse', '', d)} \
    ${@bb.utils.contains('COMBINED_FEATURES', 'xen', 'imx-xen-base imx-xen-hypervisor', '', d)} \
    "
    
    MACHINE_FEATURES_append_imx    = " nxp8987"  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74

    1.1.2 创建machine文件

    我们是在Freescale官方imx6ull14x14evk硬件平台基础上修改,因此将/sources/meta-imx/meta-bsp/conf/machine路径下的imx6ull14x14evk.conf文件拷贝至/sources/meta-bird-imx6ull/machine路径下,并将其重命名为imx6ull-bird-dk.conf,作为我们构建系统所使用的硬件平台的配置文件。在imx6ull-bird-dk.conf文件中主要由以下几部分构成:

    include文件:在imx6ull-bird-dk.conf文件中,通过include关键字引用了imx-base.inc和tune-cortexa7.inc文件,如下图所示:
    在这里插入图片描述
    其中imx-base.inc文件位于/sources/meta-freescale/conf/machine/include路径下,主要定义了一些imx系列CPU的默认配置参数,如U-BOOT的入口地址、默认的Linux内核文件定义等。imx6ull属于cortexA7系列的内核,因此引用了tune-cortexa7.inc文件,该文件位于/sources/poky/meta/conf/machine/include路径下,主要定义了一些与cortexA7架构内核相关的定义,对于tune-cortexa7.inc, 我们不需要进行修改。对于imx-base.inc文件,定义了系统构建过程中使用的一些配置信息,我们需要根据实际使用情况进行相应的修改。复制/sources/meta-freescale/conf/machine/include路径下的imx-base.inc文件,拷贝至/sources/meta-bird-imx6ull/conf/machine/include路径下,将其重命名为imx-bird-base.inc

    将imx6ull-bird-dk.conf文件中的include conf/machine/include/imx-base.inc修改为include conf/machine/include/imx-bird-base.inc。同样的在imx-bird-base.inc文件中定义了需要其他芯片imx7等构建过程相关的配置信息,可以将其移除,并且删除imx-bird-base.inc文件中与optee相关的配置信息,修改后的imx-bird-base.inc文件如下所示:

    # Provides the i.MX common settings
    
     include conf/machine/include/fsl-default-settings.inc
     include conf/machine/include/fsl-default-versions.inc
    
     require conf/machine/include/utilities.inc
    
     # Set specific make target and binary suffix
     IMX_DEFAULT_BOOTLOADER = "u-boot-fslc"
     IMX_DEFAULT_BOOTLOADER_mx8 = "u-boot-imx"
    
     PREFERRED_PROVIDER_u-boot ??= "${IMX_DEFAULT_BOOTLOADER}"
     PREFERRED_PROVIDER_virtual/bootloader ??= "${IMX_DEFAULT_BOOTLOADER}"
    
     PREFERRED_PROVIDER_u-boot-mxsboot-native ??= "u-boot-fslc-mxsboot-native"
    
     UBOOT_BINARY ?= "u-boot.${UBOOT_SUFFIX}"
     UBOOT_MAKE_TARGET ?= "u-boot.${UBOOT_SUFFIX}"
    
     UBOOT_SUFFIX ?= "imx"
    
     UBOOT_ENTRYPOINT_mx6ul  = "0x10008000"
     UBOOT_ENTRYPOINT_mx6ull  = "0x10008000"
     UBOOT_ENTRYPOINT_vf = "0x80008000"
    
     PREFERRED_PROVIDER_virtual/xserver = "xserver-xorg"
     XSERVER_DRIVER                  = "xf86-video-fbdev"
     XSERVER_DRIVER_imxgpu2d         = "xf86-video-imx-vivante"
     XSERVER_DRIVER_vf               = "xf86-video-modesetting"
     XSERVER_DRIVER_append_mx8       = " xf86-video-modesetting"
     XSERVER_DRIVER_use-mainline-bsp = "xf86-video-armada"
     XSERVER = "xserver-xorg \
               xf86-input-evdev \
               ${XSERVER_DRIVER}"
    
     # Ship kernel modules
     MACHINE_EXTRA_RRECOMMENDS = "kernel-modules"
    
     # Tunes for hard/soft float-point selection. Note that we allow building for
     # thumb support giving distros the chance to enable thumb by setting
     # ARM_INSTRUCTION_SET = "thumb"
     #
     # handled by software
     # DEFAULTTUNE_mx6 ?= "cortexa9t-neon"
     # handled by hardware
     DEFAULTTUNE_mx6ul  ?= "cortexa7thf-neon"
     DEFAULTTUNE_mx6ull ?= "cortexa7thf-neon"
    
     INHERIT += "machine-overrides-extender"
    
     MACHINEOVERRIDES_EXTENDER_mx6ul  = "imxfbdev:imxpxp"
     MACHINEOVERRIDES_EXTENDER_mx6ull = "imxfbdev:imxpxp:imxepdc"
    
     MACHINEOVERRIDES_EXTENDER_FILTER_OUT_use-mainline-bsp = " \
        mx6ul \
        mx6ull \
     "
    
     # Sub-architecture support
     MACHINE_SOCARCH_SUFFIX ?= ""
     MACHINE_SOCARCH_SUFFIX_mx6ul  = "-mx6ul"
     MACHINE_SOCARCH_SUFFIX_mx6ull = "-mx6ul"
     MACHINE_SOCARCH_SUFFIX_use-mainline-bsp = "-imx"
    
     MACHINE_ARCH_FILTER = "virtual/kernel"
     MACHINE_SOCARCH_FILTER_append_imx = " \
        alsa-lib \
        gstreamer1.0 \
        weston \
     "
     MACHINE_SOCARCH_FILTER_append_imxvpu = " \
        imx-codec \
        imx-parser \
        imx-vpuwrap \
        libimxvpuapi \
        virtual/imxvpu \
     "
     MACHINE_SOCARCH_FILTER_append_imxgpu = " \
        virtual/egl \
        virtual/mesa \
        virtual/libopenvg \
        libdrm \
        cairo \
        libgal-imx \
        pango \
     "
     MACHINE_SOCARCH_FILTER_append_imxgpu2d = " \
        virtual/libg2d \
     "
     MACHINE_SOCARCH_FILTER_append_imxgpu3d = " \
        virtual/libgl \
        virtual/libgles1 \
        virtual/libgles2 \
     "
     MACHINE_SOCARCH_FILTER_append_use-mainline-bsp = " \
        virtual/egl \
        virtual/libopenvg \
        virtual/libg2d \
        virtual/libgl \
        virtual/libgles1 \
        virtual/libgles2 \
        virtual/mesa \
        cairo \
        pango \
        qtbase \
     "
     MACHINE_SOCARCH_FILTER_append_mx6q = " \
        virtual/opencl-icd \
        opencl-headers \
     "
     MACHINE_SOCARCH_FILTER_append_mx8 = " \
        virtual/opencl-icd \
        opencl-headers \
     "
     MACHINE_SOCARCH_FILTER_append_mx8qm = " \
        virtual/libopenvx \
     "
    
     INHERIT += "fsl-dynamic-packagearch"
    
     SIGGEN_EXCLUDE_SAFE_RECIPE_DEPS_append = " \
        imx-gpu-viv->kernel-module-imx-gpu-viv \
        libimxvpuapi->virtual/imxvpu \
        imx-vpuwrap->virtual/imxvpu \
        imx-codec->virtual/imxvpu \
        imx-test->virtual/imxvpu \
     "
    
     # Firmware
     MACHINE_FIRMWARE ?= ""
     MACHINE_FIRMWARE_append_mx6ull = " firmware-imx-epdc"
     MACHINE_FIRMWARE_append_use-mainline-bsp = " linux-firmware-imx-sdma-imx6q linux-firmware-imx-sdma-imx7d firmware-imx-vpu-imx6q firmware-imx-vpu-imx6d"
    
     # FIXME: Needs addition of firmware-imx of official BSPs
     #MACHINE_FIRMWARE_append_mx27 = " firmware-imx-vpu-imx27"
    
     MACHINE_EXTRA_RRECOMMENDS += "${MACHINE_FIRMWARE}"
    
     # Extra audio support
     MACHINE_EXTRA_RRECOMMENDS_append_mx6 = " ${@bb.utils.contains('DISTRO_FEATURES', 'alsa', 'imx-alsa-plugins', '', d)}"
    
     # Extra QCA Wi-Fi & BTE driver and firmware
     MACHINE_EXTRA_RRECOMMENDS_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'qca6174', 'packagegroup-fsl-qca6174', '', d)}"
     MACHINE_EXTRA_RRECOMMENDS_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'qca9377', 'packagegroup-fsl-qca9377', '', d)}"
    
     # Extra udev rules
     MACHINE_EXTRA_RRECOMMENDS += "udev-rules-imx"
    
     # GStreamer 1.0 plugins
     MACHINE_GSTREAMER_1_0_PLUGIN ?= ""
     MACHINE_GSTREAMER_1_0_PLUGIN_mx6ul ?= "gstreamer1.0-plugins-imx-meta"
     MACHINE_GSTREAMER_1_0_PLUGIN_mx6ull ?= "gstreamer1.0-plugins-imx-meta"
    
     # Determines if the SoC has support for Vivante kernel driver
     SOC_HAS_VIVANTE_KERNEL_DRIVER_SUPPORT        = "0"
     SOC_HAS_VIVANTE_KERNEL_DRIVER_SUPPORT_imxgpu = "1"
    
     # Handle Vivante kernel driver setting:
     #   0 - machine does not have Vivante GPU driver support
     #   1 - machine has Vivante GPU driver support
     MACHINE_HAS_VIVANTE_KERNEL_DRIVER_SUPPORT ?= "${SOC_HAS_VIVANTE_KERNEL_DRIVER_SUPPORT}"
    
     # Graphics libraries
     PREFERRED_PROVIDER_virtual/egl      ?= "mesa"
     PREFERRED_PROVIDER_virtual/libgl    ?= "mesa"
     PREFERRED_PROVIDER_virtual/libgles1 ?= "mesa"
     PREFERRED_PROVIDER_virtual/libgles2 ?= "mesa"
    
     PREFERRED_PROVIDER_virtual/egl_imxgpu        ?= "imx-gpu-viv"
     PREFERRED_PROVIDER_virtual/libgl_imxgpu3d    ?= "imx-gpu-viv"
     PREFERRED_PROVIDER_virtual/libgles1_imxgpu3d ?= "imx-gpu-viv"
     PREFERRED_PROVIDER_virtual/libgles2_imxgpu3d ?= "imx-gpu-viv"
     PREFERRED_PROVIDER_virtual/libg2d            ?= "imx-gpu-g2d"
     PREFERRED_PROVIDER_virtual/libg2d_imxdpu     ?= "imx-dpu-g2d"
    
     PREFERRED_VERSION_weston_mx6 ?= "5.0.0.imx"
    
     PREFERRED_VERSION_wayland-protocols_mx6 ?= "1.17.imx"
    
     # Use i.MX libdrm Version
     PREFERRED_VERSION_libdrm_mx6 ?= "2.4.91.imx"
    
     # Handle default kernel
     IMX_DEFAULT_KERNEL = "linux-imx"
     IMX_DEFAULT_KERNEL_mx6ul = "linux-fslc-imx"
     IMX_DEFAULT_KERNEL_mx6ull = "linux-fslc-imx"
     IMX_DEFAULT_KERNEL_use-mainline-bsp = "linux-fslc"
    
     PREFERRED_PROVIDER_virtual/kernel ??= "${IMX_DEFAULT_KERNEL}"
    
     SOC_DEFAULT_IMAGE_FSTYPES = "wic.bmap wic.gz"
     SOC_DEFAULT_IMAGE_FSTYPES_mxs = "uboot-mxsboot-sdcard wic.gz"
    
     # Do not update fstab file when using wic images
     WIC_CREATE_EXTRA_ARGS ?= "--no-fstab-update"
    
    
     IMAGE_FSTYPES ?= "${SOC_DEFAULT_IMAGE_FSTYPES}"
    
     IMAGE_BOOT_FILES ?= " \
        ${KERNEL_IMAGETYPE} \
        ${@make_dtb_boot_files(d)} \
     "
    
     WKS_FILE_DEPENDS ?= " \
        virtual/bootloader \
        \
        e2fsprogs-native \
        bmap-tools-native \
     "
    
     WKS_FILE_DEPENDS_append_mx8 = " imx-boot "
    
     SOC_DEFAULT_WKS_FILE ?= "imx-uboot-bootpart.wks.in"
    
     WKS_FILE ?= "${SOC_DEFAULT_WKS_FILE}"
    
     # Certain machines override the default fsl u-boot with the
     # fslc u-boot. To restore the fsl u-boot, add use-fsl-bsp like this:
     #   MACHINEOVERRIDES_prepend_imx6ulevk = "use-fsl-bsp:"
     UBOOT_MAKE_TARGET_use-fsl-bsp_mx6 = "u-boot.imx"
     UBOOT_SUFFIX_use-fsl-bsp_mx6 = "imx"
     SPL_BINARY_use-fsl-bsp_mx6 = ""
     WKS_FILE_use-fsl-bsp_mx6 = "imx-uboot-bootpart.wks.in"
    
     SERIAL_CONSOLES = "115200;ttymxc0"
     SERIAL_CONSOLES_mxs = "115200;ttyAMA0"
    
     KERNEL_IMAGETYPE = "zImage"
     KERNEL_IMAGETYPE_aarch64 = "Image"
    
     MACHINE_FEATURES = "usbgadget usbhost vfat alsa touchscreen"
    
     # Add the ability to specify _imx machines
     MACHINEOVERRIDES =. "imx:"  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235

    内核设备树定义文件:在imx6ull-bird-dk.conf文件中,通过变量KERNEL_DEVICETREE定义了Linux内核在编译过程中生成的设备树文件。当需要修改Linux内核在编译过程中生成的设备树文件时,除了需要提供相对于的.dtb文件外,还需要修改KERNEL_DEVICETREE变量值。
    在这里插入图片描述
    U-BOOT的配置:在imx6ull-bird-dk.conf文件中,通过配置UBOOT_CONFIG变量,定义了U-Boot在编译过程中所使用的配置文件。
    在这里插入图片描述
    在imx6ull14x14evk.conf配置文件中,官方支持了optee的功能,关于optee功能的配置,需要修改/sources/meta-freescale/recipes-security/optee-imx路径下的optee-os_3.2.0.imx.bb文件,在目前我们的应用中,暂时用不到optee功能,因此先将其屏蔽,不参与嵌入式Linux系统镜像文件的构建过程,屏蔽optee之后的imx6ull-bird-dk.conf文件如下: 关于imx6ull-bird-dk.conf文件内容修改在后面U-Boot移植、Linux Kernel移植过程中会详细描述。
    在这里插入图片描述

    1.1.3 创建distro文件

    distro定义了嵌入式Linux发行版的功能等特性。同样的,我们在官方提供的fsl-imx-fb版本上进行修改。将/sources/meta-imx/meta-sdk/conf/distro下的fsl-imx-fb.conf文件拷贝至/sources/meta-bird-imx6ull/conf/distro/路径下,并将其重命名为bird-imx-fb.conf,并按照下图所示修改:
    在这里插入图片描述
    在bird-imx-fb.conf文件中,通过include conf/distro/include/fsl-imx-base.inc以及include conf/distro/include/fsl-imx-preferred-env.inc包含了fsl-imx-base.inc和fsl-imx-preferred-env.inc两个文件,这两个文件比较重要,定义了对应linux发行版的相关配置。

    将/sources/meta-imx/meta-sdk/conf/distro/include/路径下的fsl-imx-base.inc和fsl-imx-preferred-env.inc两个文件拷贝至/sources/meta-bird-imx6ull/conf/distro/include/路径下,并分别将其重命名为:bird-imx-base.inc和bird-imx-preferred-env.inc

    同时将bird-imx-fb.conf文件中的include conf/distro/include/fsl-imx-base.inc修改为include conf/distro/include/bird-imx-base.inc;将include conf/distro/include/fsl-imx-preferred-env.inc修改为include conf/distro/include/bird-imx-preferred-env.inc

    1.1.4 创建recipe

    machine和distro分别定义了定制化嵌入式Linux系统的硬件和发行版特征,除此之外,构建的系统中所需要的软件包、软件源码等还需要在recipes中添加。该小节以recipes-test为例,创建一个recipe,用以描述recipe的过程。后续在实际使用过程中,将根据需求,创建不同的recipe,以实现增减第三方软件包或自己开发的软件,用来构建最终的嵌入式Linux系统。

    在/sources/meta-bird-imx6ull路径下,创建文件夹recipes-test,recipes-test文件夹中将用于存放需要使用到的软件包(实际上是一些.bb、.bbappend等文件)。创建文件夹recipes-test后,在/sources/meta-bird-imx6ull/recipes-test路径下创建文件夹test,并在test文件夹中创建printfhello.bb文件。在printfhello.bb文件中,输入以下信息:

    # Copyright (C) 2020-2036 XXXX Semiconductor
    
     DESCRPITION = "Prints Hello World"
     LICENSE = "GPLv2+"
     LIC_FILES_CHKSUM = "file://Licenses/README;md5=a2c678cfd4a4d97135585cad908541c6"
    
     PN = "printfhello"
     PV = "1"
    
     addtask TestFun
    
     python do_TestFun(){
       bb.plain("********************");
       bb.plain("* *");
       bb.plain("* Hello, World! *");
       bb.plain("* *");
       bb.plain("********************");
     }  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在printfhello.bb文件中,提供了recipe的描述,包括:名字、版本,并且重写了do_TestFun任务。在构建过程中,当执行了recipes-test中的printfhello.bb文件时,将会通过执行重写的do_TestFun任务,输出一些打印信息。 至此,创建Metadata基本完成,后面章节将对创建的Metadata进行验证。需要特别注意的是,创建的Metadata整体文件架构有严格的要求,须按照下图所示的文件架构进行创建:
    在这里插入图片描述

    1.2 使能新建的Layers

    新创建的Metadata需要在imx-setup-release.sh中将其使能,才能参与到最终的嵌入式Linux发行版的构建。在imx-setup-release.sh脚本中,增加meta-bird-imx6ull即可,如下图所示:
    在这里插入图片描述

    1.3 Metadata测试

    在前面小节中,我们创建了以MACHINE=imx6ull-bird-dk,DISTRO=bird-imx-fb为例的Metadata。创建Metadata后,需要对新创建的Metadata进行测试,确定新创建的Metadata是否符合要求。

    1.3.1 查看machine

    在使用imx-setup-release.sh脚本初始化Yocto构建目录时,imx-setup-release.sh脚本通过调用setup-environment脚本,查找当前支持的machine。因此在/fsl-release-yocto路径下,输入 ./setup-environment -h命令,查看setup-environment脚本帮助信息,该信息列出了Yocto路径下支持的MACHINE。可以看到新增加的machine imx6ull-bird-dk,如下图所示:
    在这里插入图片描述

    1.3.2 imx-setup-release.sh脚本

    在/fsl-release-yocto下,运行imx-setup-release.sh脚本。该脚本用于初始化Yocto构建目录,命令如下:DISTRO=bird-imx-fb MACHINE=imx6ull-bird-dk source imx-setup-release.sh -b build,运行该脚本后,将会根据bird-imx-fb和imx6ull-birk-dk找到对用的bird-imx-fb.conf和imx6ull-bird-dk.conf。如下图所示:
    在这里插入图片描述
    查看/fsl-release-yocto/build/conf下的bblayers.conf文件,将看到新增加的bbLAYERS,如下图所示:
    在这里插入图片描述
    查看/fsl-release-yocto/build/conf下的local.conf文件,将看到新增加的machine和distro,如下图所示:
    在这里插入图片描述

    1.3.3 运行BitBake构建系统

    运行imx-setup-release.sh脚本后,会自动生成一个build文件夹,并自动进入该文件夹。进入build路径下,运行bitbake命令:bitbake imx-image-multimedia,至此由于我们之前新创建的machine(imx6ull-bird-dk.conf)和distro(bird-imx-fb.conf)都是直接拷贝Freescale官方提供的imx6ull14x14evk.conf和fsl-imx-fb.conf文件,所以将构建出和官方一致的嵌入式Linux发行版。后面将分别对imx6ull-bird-dk.conf、bird-imx-fb.conf以及recipe中的.bb等文件进行修改,真正的构建一个完整的定制化的嵌入式Linux系统。同时在/fsl-release-yocto/build/tmp/deploy/images/imx6ull-bird-dk路径下,可以看到生成了相应的image文件:

    此外,我们还需要验证新增加的recipe是否正确。在新增加的recipe中,打印出了相关的测试信息,因此,可以通过该测试信息是否正确打印来确定新增加的recipe是否正确。在/fsl-release-yocto/build路径下,使用如下命令:bitbake printfhello -c TestFun。即可调用recipe printfhello中的TestFun函数,输出如下信息:
    在这里插入图片描述

    1.4 BitBake离线构建系统

    在使用bitbake imx-image-multimedia命令开始构建系统时,可以看到将会先通过网络连接至bitbake服务器做一些验证准备工作,同时,在Bitbake构建系统过程中,会根据.bb文件中定义的资源路径下载相关的源码,进行系统构建。通常来说,构建嵌入式Linux系统是一个不断修改不断迭代的过程,要是每次构建系统都重新连接bitbake服务器、下载一些相关源码,对于开发效率来说影响很大,特别是网络条件不好时。

    因此当通过bitbake imx-image-multimedia命令完成一次系统构建后,构建系统所需要的软件源码等都已经下载至本地的/Yocto/fsl-yocto-release/downloads路径下,也就是说所有参与构建嵌入式系统所需的资源都已经下载至了本地,我们要做的只是在对本地资源进行修改的情况下,可以采用离线构建系统的方式,具体来说通过修改imx-setup-release.sh文件,设置BB_NO_NETWORK变量为1即可,如下所示:
    在这里插入图片描述

    2.U-Boot移植

    一个完整的嵌入式Linux发行版包括U-BootLinux KernelDevice Tree(Linux Kernel编译时相应的Device Tree也会编译出来)以及Rootfs。Linux系统的启动,需要一个BootLoader程序。U-Boot就是BootLoader的一种。通常来说,CPU芯片上电以后先运行一段BootLoader程序。这段bootloader程序会先初始化DDR等外设,然后将Linux内核从flash(NAND,NOR FLASH, SD, MMC 等)拷贝到 DDR 中,最后启动Linux内核。 一般来说对于U-Boot的移植,主要会涉及到:DDR初始化,以太网功能。

    2.1 U-Boot源码下载

    U-Boot是一个遵循GPL协议的开源软件,官方提供了针对不同厂家CPU不同版本的U-Boot。各个CPU厂家从U-Boot官方下载某一特定版本的U-Boot,CPU厂商(如NXP)根据自己的CPU芯片基于该版本维护一个版本的U-Boot。然后基于各厂商CPU的开发板或自己设计的板卡,需要根据CPU厂商维护的U-Boot做相应的修改,以适应自己的板卡。具体关系如下:
    在这里插入图片描述
    在实际项目中,我们通常会参考半导体厂商针对所使用CPU的评估板进行相关的修改(硬件/软件)制作自己产品所使用的硬件平台。因此对于U-Boot,大多数情况下是在基于半导体厂商维护的U-Boot代码,进行相应的调整(适配),使其能够在产品使用的硬件平台上正确的运行。

    对于imx6ull,教程中采用的是NXP官方维护的U-Boot版本是imx_v2020.04_5.4.47_2.2.0,所以我们将在imx_v2020.04_5.4.47_2.2.0版本上进行修改。其下载地址为git://source.codeaurora.org/external/imx/uboot-imx.git,分支为imx_v2020.04_5.4.47_2.2.0。

    U-Boot的最主要目的是启动Linux内核,但除此之外,还可以集成一些其他基础功能,目前的U-Boot已经支持液晶屏、网络、 USB 等高级功能。 就像PC上的BIOS一样,可以直接进入BIOS进行一些配置操作。因此U-Boot中也会涉及到一些外设驱动,这也就是U-Boot移植过程中需要涉及到的工作。

    2.2 增加U-Boot Recipe

    在U-Boot移植(硬件适配)过程中,需要修改相应的U-Boot源码,同样我们不会直接在Yocto中提供的recipe中直接修改,而是在我们新创建的metadata中创建新的recipe的方式来对U-Boot软件编译过程进行配置。

    U-Boot的配置属于distro中的内容。在/sources/meta-bird-imx6ull/conf/distro路径下的bird-imx-fb.conf中,通过include conf/distro/include/bird-imx-preferred-env.inc的方式,引用了bird-imx-preferred-env.inc文件,在该文件中,通过PREFERRED_PROVIDER_virtual/bootloader_imx = "u-boot-imx"变量定义了U-Boot的provider。

    可以看出imx6ull的provider是u-boot-imx,实际上对应的是/sources/meta-imx/meta-bsp/recipes-bsp/u-boot/路径下的u-boot-imx_2020.04.bb文件。因此创建如下路径:/fsl-release-yocto/sources/meta-bird-imx6ull/recipes-bsp/u-boot/,并将/sources/meta-imx/meta-bsp/recipes-bsp/u-boot/路径下的u-boot-imx_2020.04.bb文件及该路径下的其他文件拷贝至/fsl-release-yocto/sources/meta-bird-imx6ull/recipes-bsp/u-boot/路径下,将其重命名为:u-boot-bird_2020.04.bb。

    同时将/sources/meta-bird-imx6ull/conf/distro/include/路径下的bird-imx-preferred-env.inc中的PREFERRED_PROVIDER_virtual/bootloader_imx = "u-boot-imx"修改为PREFERRED_PROVIDER_virtual/bootloader_imx = “u-boot-bird”,修改后的bird-imx-preferred-env.inc如下:
    在这里插入图片描述
    修改后用命令bitbake imx-image-multimedia重新编译,可以看到如下编译过程:
    在这里插入图片描述
    如下两个文件是可直接下载到开发板上运行的文件:
    在这里插入图片描述

    2.3 修改U-Boot Recipe

    对于U-Boot的移植或者说是硬件平台的适配,更多的是需要修改U-Boot源码(相关驱动代码:如EMMC、SD、网口、LCD等),使其能工作于我们自己设计的硬件平台。理论上来说,不同的硬件平台所对应的相关驱动是不一样的,这也导致了不同的硬件平台所使用的U-Boot也是不一样的。

    但是实际过程中,往往在设计硬件平台的时候会参考NXP官方提供的EVK开发板,同时,对于一个CPU,所使用的硬件外设接口相差不大,因此,我们可以在基于官方平台提供的U-Boot版本上做相应的修改即可得到适合自己设计硬件平台的U-Boot。

    同样的,在修改U-Boot源码之前,我们需要将从NXP官方下载的U-Boot源码放在本地,并且将OpenEmbedded编译所使用的U-Boot软件包源码指向我们本地存放的U-Boot,这样,就可以实现只更改本地存储的U-Boot代码,而不至于影响到其他项目。将从NXP官网下载的imx_v2020.04_5.4.47_2.2.0版本解压至/Linux/fsl-release-yocto/bird-imx-uboot路径下,如下图所示:
    在这里插入图片描述
    uboot源码已经下载到本地,在构建的路径下进行相应编译。
    在这里插入图片描述
    将U-Boot源码存放在/Linux/fsl-release-yocto/bird-imx-uboot路径之后,同样的,在本地采用Git管理U-Boot源码,同时,修改/fsl-release-yocto/sources/meta-bird-imx6ull/recipes-bsp/u-boot/u-boot-bird_2020.04.bb文件,将其中的SRC_URI指向本地存放U-Boot的路径。

    LICENSE = "GPLv2+"
    LIC_FILES_CHKSUM = "file://Licenses/gpl-2.0.txt;md5=b234ee4d69f5fce4486a80fdaf4a4263"
    
    SRCBRANCH = "master"
    UBOOT_SRC ?= "git:${BSPDIR}/bird-imx-uboot;protocol=file"
    SRC_URI = "${UBOOT_SRC};branch=${SRCBRANCH}"
    SRCREV = "${AUTOREV}"
    
    #LICENSE = "GPLv2+"
    #LIC_FILES_CHKSUM = "file://Licenses/gpl-2.0.txt;md5=b234ee4d69f5fce4486a80fdaf4a4263"
    
    #NXP_REPO_MIRROR ?= "nxp/"
    #SRCBRANCH = "${NXP_REPO_MIRROR}imx_v2016.03_4.1.15_2.0.0_ga"
    #UBOOT_SRC ?= "git://source.codeaurora.org/external/imx/uboot-imx.git;protocol=https"
    #SRC_URI = "${UBOOT_SRC};branch=${SRCBRANCH}"
    #SRCREV = "a57b13b942d59719e3621179e98bd8a0ab235088"  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述
    其中,LIC_FILES_CHKSUM的md5值和SRCREV的值需要根据实际情况修改,LIC_FILES_CHKSUM的md5值在编译过程中会自动计算,如果出现LIC_FILES_CHKSUM的md5值不匹配的错误,根据错误信息中提供的新的md5值修改LIC_FILES_CHKSUM的md5值即可。

    SRCREV的值指定了所使用代码分支下的版本,可以通过bird-imx-uboot下使用git log查看(commit id),也可以将SRCREV设置为SRCREV="${AUTOREV}"使用代码分支下的最新版本。

    u-boot-bird_2020.04.bb文件用于配置在bird-imx-fb发行版中u-boot的配置。在u-boot-bird_2020.04.bb文件中,通过require u-boot-common.inc引用了u-boot-common.inc文件,在u-boot-common.inc文件中,定义了u-boot的获取地址等,但是在实际编译过程中,会在u-boot-bird_2020.04.bb文件中对u-boot获取的地址及版本号对应的变量UBOOT_SRC、SRCBRANCH重新赋值,因此,u-boot-common.inc文件中的内容,保持原样即可。

    同样的在u-boot-bird_2020.04.bb文件中,同样通过require recipes-bsp/u-boot/u-boot.inc引用了u-boot.inc文件,该文件实际上对应的是/sources/poky/meta/recipes-bsp/u-boot路径下的u-boot.inc文件,在u-boot.inc文件中定义了些与u-boot编译相关的变量值,我们不需要修改,保持原样即可。

    如下之前编译过了,直接用source。
    在这里插入图片描述
    在这里插入图片描述

    2.4 编译U-Boot

    通过修改U-Boot recipe,将OpenEmbedded构建系统使用的U-Boot源码指向了本地U-Boot存放地址,因此编译过程中将编译本地存放的U-Boot源码。在实际工程应用中,需要修改U-Boot源码中的相关配置或驱动代码,使其能在相对应的硬件平台上正常运行。往往这是一个反复迭代、需要多次修改编译的过程。

    2.4.1 编译命令

    采用如下两种方式都可以进行编译:编译整个系统:bitbake imx-image-multimedia
    单独编译U-Boot:bitbake -c compile -f u-boot-bird
    部署编译生成的U-Boot镜像:bitbake -c deploy -f u-boot-bird

    2.4.2 U-Boot编译过程分析

    U-Boot是一个大型复杂的裸机程序。U-Boot的编译,主要是使用gcc交叉编译工具,将U-Boot源码编译为可以在ARM芯片上运行的可执行文件(u-boot-imx.bin、u-boot-imx.imx等文件)。其功能实现和详细的编译过程是相对复杂的过程,但是对于大多数应用场景而言,并不需要我们很复杂的修改U-Boot源码,及掌握U-Boot源码编译的详细过程,我们需要的只是知道U-Boot的工作大体流程及编译过程,目的是为我们后面修改U-Boot的基础配置以及修改U-Boot中涉及到的驱动(ETH【gpio口,单双网口】、SD、Nand、EMMC等)代码而已,因此,在教程中,只会涉及到U-Boot的基本框架及编译过程,不会很深入的研究整个U-Boot。

    对于Yocto,U-Boot的编译过程可以分为两部分:U-Boot recipe编译及U-Boot源码编译。

    2.4.3 U-Boot Recipe编译

    OpenEmbedded构建嵌入式Linux系统时,会根据U-Boot所对应的recipe文件(如u-boot-bird_2020.04.bb)中定义的配置项进行U-Boot的编译。使用单独编译U-Boot命令编译U-Boot recipe,可以看到编译过程如下:

    编译过程中,OpenEmbedded先是构建出编译U-Boot源码需要使用的gcc交叉编译工具,最后再编译u-boot-bird_2020.04.bb。该小节主要描述u-boot-bird_2020.04.bb的编译过程。

    1.u-boot-bird_2020.04.bb:定义了一些全局变量,OpenEmbedded使用这些全局变量编译U-Boot。其中比较重要的几个变量值:SRCBRANCH、UBOOT_SRC、SRC_URI、SRCREV定义了获取U-Boot源码的地址;LICENSE、LIC_FILES_CHKSUM定义了License相关信息。同时,在u-boot-bird_2020.04.bb文件一开始,通过require recipes-bsp/u-boot/u-boot-bird.inc文件,u-boot-bird.inc是一个比较重要的文件,u-boot-bird.inc文件中定义了一些与U-Boot编译相关的信息。

    2.u-boot-bird.inc:u-boot-bird_2020.04.bb通过require关键字引用了u-boot-bird.inc文件,在u-boot-bird.inc文件中,定义的全局变量及重构了一些构建方法同样对于OpenEmbedded编译U-Boot有效。

    全局变量:
    SRCBRANCH = "master"
    UBOOT_SRC、SRC_URI、SRCREV:U-Boot源码存放地址。 
    UBOOT_SUFFIX、UBOOT_IMAGE、UBOOT_BINARY:U-Boot生成文件格式定义。
    UBOOT_MAKE_TARGET:U-Boot编译target,在后面U-Boot的makefile编译中使用该变量值。
    UBOOT_ELF ?= ""
    UBOOT_ELF_SUFFIX、UBOOT_ELF_IMAGE、UBOOT_ELF_BINARY、UBOOT_ELF_SYMLINK:U-Boot输出elf格式文件定义。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    重构方法: do_compile():OpenEmbedded在编译U-Boot时,会通过do_compile task调用do_compile()编译U-Boot。在u-boot-bird_2020.04.bb文件中,重写了do_compile(),如下:

    do_compile () {
      if [ "${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-gold', 'ld-is-gold', '', d)}" = "ld-is-gold" ] ; then
       sed -i 's/$(CROSS_COMPILE)ld$/$(CROSS_COMPILE)ld.bfd/g' config.mk
      fi
    
      unset LDFLAGS
      unset CFLAGS
      unset CPPFLAGS
    
      if [ ! -e ${B}/.scmversion -a ! -e ${S}/.scmversion ]
      then
       echo ${UBOOT_LOCALVERSION} > ${B}/.scmversion
       echo ${UBOOT_LOCALVERSION} > ${S}/.scmversion
      fi
    
        if [ "x${UBOOT_CONFIG}" != "x" ]
        then
            for config in ${UBOOT_MACHINE}; do
                i=`expr $i + 1`;
                for type  in ${UBOOT_CONFIG}; do
                    j=`expr $j + 1`;
                    if [ $j -eq $i ]
                    then
                        oe_runmake O=${config} ${config}
                        oe_runmake O=${config} ${UBOOT_MAKE_TARGET}
                        cp  ${S}/${config}/${UBOOT_BINARY}  ${S}/${config}/u-boot-${type}.${UBOOT_SUFFIX}
                    fi
                done
                unset  j
            done
            unset  i
        else
            oe_runmake ${UBOOT_MACHINE}
            oe_runmake ${UBOOT_MAKE_TARGET}
        fi
     } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    其中,do_compile()中第18~25行,依次取出UBOOT_CONFIG变量所对应文件中的配置,通过oe_runmake 命令编译U-Boot源码文件。UBOOT_CONFIG变量在/fsl-release-yocto/sources/meta-bird-imx6ull/conf/machine路径下的imx6ull-bird-dk.conf文件中定义,如下所示:

    UBOOT_CONFIG ??= "sd"
    UBOOT_CONFIG[sd] = "mx6ull_14x14_evk_config,sdcard"
    UBOOT_CONFIG[emmc] = "mx6ull_14x14_evk_emmc_config,sdcard"
    UBOOT_CONFIG[nand] = "mx6ull_14x14_evk_nand_config,ubifs"
    UBOOT_CONFIG[qspi1] = "mx6ull_14x14_evk_qspi1_config"
    UBOOT_CONFIG[mfgtool] = "mx6ull_14x14_evk_config" 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    可以看出,目前使用的是sd卡启动方式,使用的是mx6ull_14x14_evk_config配置文件。因此,相当于在do_compile()函数中,使用了如下命令编译U-Boot源码:make mx6ull_14x14_evk_config,make all将使用U-Boot源码路径下的makefile,通过gcc交叉编译器arm-poky-linux-gnueabi-gcc编译U-Boot源码,生成目标文件。

    2.4.4 U-Boot源码编译

    在OpenEmbedded编译U-Boot recipe文件u-boot-bird_2020.04.bb的过程中,最终会调用类似:make mx6ull_14x14_evk_config以及make all的命令,使用U-Boot顶层makefile(U-Boot源码路径下的makefile文件)编译U-Boot源码生成所需要的目标文件。
    1.make mx6ull_14x14_evk_config
    该命令将会通过调用U-Boot顶层makefile,按照mx6ull_14x14_evk_config文件中的配置项对U-Boot功能进行配置,并且在U-Boot源码编译工作路径(/fsl-release-yocto/build/tmp/work/imx6ull_bird_dk-poky-linux-gnueabi/u-boot-bird/2016.03-r0/git/mx6ull_14x14_evk_config)下生成.config文件,如下图所示:
    在这里插入图片描述
    在这里插入图片描述
    在.config文件中,定义了U-Boot功能状态(开启/关闭),在编译U-Boot源码时,将根据.config中相关功能状态,编译相对应的U-Boot软件功能。对于.config文件的配置,除了来自make mx6ull_14x14_evk_config命令中指定的mx6ull_14x14_evk_config文件外,还可以通过menuconfig工具进行配置。关于menuconfig工具配置.config的过程,在后续章节中会进行描述。

    2.make all
    该命令通过调用U-Boot顶层makefile,使用gcc交叉编译器arm-poky-linux-gnueabi-gcc编译U-Boot源码,生成u-boot.bin和u-boot.imx文件,同时,可以通过bitbake -c deploy -f u-boot-bird命令将生成的u-boot.bin文件等安装(“复制”)至安装路径下,如:/fsl-release-yocto/build/tmp/deploy/images/imx6ull-bird-dk,如下图所示:
    在这里插入图片描述
    在/fsl-release-yocto/build/tmp/work/imx6ull_bird_dk-poky-linux-gnueabi/u-boot-bird/2016.03-r0/git/mx6ull_14x14_evk_config路径下也会生成相应的目标文件: u-boot.bin,u-boot-sd.imx

    2.5 U-Boot下载验证

    U-Boot实际上是一个裸机程序,在U-Boot的调试测试中,将生成的u-boot.bin文件烧写到SD卡中,设置imx6ull从SD卡启动(设置引脚),当imx6ull上电后,芯片内部的boot rom程序将SD卡中的u-boot.imx文件拷贝到链接地址处,就可以开始运行U-Boot了。但是从u-boot.bin转换为u-boot.imx,并且正确的烧录至SD卡,还需要相应的转换。正点原子提供了imxdownload软件,用于将编译出来的.bin文件烧写到SD卡中。因此,教程中采用正点原子的imxdownload软件烧写的方式进行U-Boot的调试。 imxdownload软件只能在Ubuntu下使用,使用步骤如下:
    1.Ubuntu下创建一个目录,专门用于.bin文件的烧写,如:/Linux/download。将imxdownload软件拷贝至该路径下,并赋予其可执行权限。
    2.将需要烧录的.bin文件拷贝至该路径下,例如:u-boot.bin。(需要烧写的bin文件需要与imxdownload软件在同一路径下)。
    3.插入SD卡,其连接到Ubuntu,在Ubuntu中,使用ls /dev/sd*确定插入的SD卡设备。例如:sdc。
    4.使用imxdownload向SD卡烧写bin文件,命令格式如下:./imxdownload u-boot.bin /dev/sdb
    5.烧写完成后,将SD卡插入嵌入式Linux板卡,配置从SD卡启动的方式,断电复位板卡即可。

    从嵌入式Linux硬件板卡串口输出上电信息,可以看出,新的u-boot编译时间与实际修改U-Boot后编译的时间一致,因此,可以确定实现了通过新建U-Boot recipe的方式,实现了Freescale官方提供的基于mx6ull_evk板卡设置的U-Boot编译过程,后续需要做的,就是修改U-Boot源码或相应的配置文件,编译生成适合于定义的嵌入式Linux硬件平台的U-Boot。

    2.6 U-Boot启动信息

    U-Boot启动后,会输出一些信息,这些信息如下所示:第一行:输出U-Boot的版本号、U-Boot源码版本控制信息(master+gad23b9f4)和编译时间。
    第二行:输出CPU信息,包括CPU型号(IMX6uLL)、版本号(1.0)、主频(528MHz)以及当前运行频率(396MHz)。
    第三行:输出CPU工作温度范围及当前CPU温度。
    第四行:是复位原因,当前复位原因是POR,表示是通过拉低imx6ull芯片上的POR_B引脚复位系统。
    第五行:是板子名字,当前板子名字为MX6ULL 14x14 EVK。
    第六行:提示DRAM大小。
    第七行:表示当前有两个MMC/SD卡控制器:FSL_SDHC(0)和 FSL_SDHC(1)。对于教程使用的EMMC 核心板上 FSL_SDHC(0)接的 SD(TF)卡,FSL_SDHC(1)接的 EMMC。
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    Go通过cobra快速构建命令行应用
    一个AI板卡电脑--香橙派 AIpro
    spring和springMVC的说明
    优思学院|六西格玛黑带的个人成功特质
    npm run build小技巧
    【牛客-剑指offer-数据结构篇】【图解】JZ79 判断是不是平衡二叉树 Java实现
    C++——new和delete关键字
    Flask——基于python完整实现客户端和服务器后端流式请求及响应
    [模型]拉格朗日插值法
    F#奇妙游(35):MVC模式和ADT分析
  • 原文地址:https://blog.csdn.net/weixin_43435675/article/details/124528339