NXP官方yocto学习(六)kernel内核菜谱

git源码方式

        NXP官方的yocto项目imx-yocto-bsp,默认内核版本4.14.78,使用下载git源码切分支方式。

        代码位置:imx-yocto-bsp/sources/meta-fsl-bsp-release/imx/meta-bsp/recipes-kernel/linux

[wangyb@wangyb-VirtualBox:linux]$ ls
linux-imx  linux-imx_4.14.78.bb  linux-imx-src-4.14.78.inc

        编译时获取bb文件,bitbake编译使用项目名称PN linux-imx不带PV。包含linux-imx.inc和linux-imx-src-${PV}.inc头文件,linux-imx.inc文件位置在meta-freescale,变量会被linux-imx-src-${PV}.inc覆盖。

        需要打的补丁文件位置:linux-imx【PN】/0001-uapi-Add-ion.h-to-userspace.patch

        DEFAULT_PREFERENCE表示版本优先级,在多个版本时,bitbake默认选择最新的版本,但可用这个变量设置优先选择旧版本进行编译。

        addtask增加任务函数copy_defconfig,调用时机在unpack之后和preconfigure之前,就是拷贝内核配置文件defconfig。

        ·B:到BitBake构建一个源包所在的目录的完整路径。通常BitBake解压源包所到的是相同目录:B=${S}。

[wangyb@wangyb-VirtualBox:linux]$ cat linux-imx_4.14.78.bb 
# Copyright (C) 2013-2016 Freescale Semiconductor
# Copyright 2017-2018 NXP
# Released under the MIT license (see COPYING.MIT for the terms)

require recipes-kernel/linux/linux-imx.inc
require recipes-kernel/linux/linux-imx-src-${PV}.inc

SUMMARY = "Linux Kernel provided and supported by NXP"
DESCRIPTION = "Linux Kernel provided and supported by NXP with focus on \
i.MX Family Reference Boards. It includes support for many IPs such as GPU, VPU and IPU."

DEPENDS += "lzop-native bc-native"

SRC_URI += "file://0001-uapi-Add-ion.h-to-userspace.patch"

DEFAULT_PREFERENCE = "1"

DO_CONFIG_V7_COPY = "no"
DO_CONFIG_V7_COPY_mx6 = "yes"
DO_CONFIG_V7_COPY_mx7 = "yes"
DO_CONFIG_V7_COPY_mx8 = "no"

addtask copy_defconfig after do_unpack before do_preconfigure
do_copy_defconfig () {
    install -d ${B}
    if [ ${DO_CONFIG_V7_COPY} = "yes" ]; then
        # copy latest imx_v7_defconfig to use for mx6, mx6ul and mx7
        mkdir -p ${B}
        cp ${S}/arch/arm/configs/imx_v7_defconfig ${B}/.config
        cp ${S}/arch/arm/configs/imx_v7_defconfig ${B}/../defconfig
    else
        # copy latest defconfig to use for mx8
        mkdir -p ${B}
        cp ${S}/arch/arm64/configs/defconfig ${B}/.config
        cp ${S}/arch/arm64/configs/defconfig ${B}/../defconfig
    fi
}

COMPATIBLE_MACHINE = "(mx6|mx7|mx8)"
EXTRA_OEMAKE_append_mx6 = " ARCH=arm"
EXTRA_OEMAKE_append_mx7 = " ARCH=arm"
EXTRA_OEMAKE_append_mx8 = " ARCH=arm64"

#KERNEL_DEVICETREE_remove = "freescale/fsl-imx8mm-evk.dtb freescale/fsl-imx8mm-evk-ak4497.dtb "
#KERNEL_DEVICETREE_remove = "freescale/fsl-imx8mm-evk-m4.dtb freescale/fsl-imx8mm-evk-ak5558.dtb "
#KERNEL_DEVICETREE_remove = "freescale/fsl-imx8mm-evk-audio-tdm.dtb "

        SRC_URI:指定到Linux内核tar包的路径,它可以是远程的或者本地的。另外,变量必须指定一个包含内核配置的defconfig文件【是吗?】。

        S:内核源码被解压到的目录。它必须反映源包的名字。位置在:tmp/work/imx8qxpmek-poky-linux/linux-imx/4.14.78-r0/git/,git目录链接到tmp/work-shared/imx8qxpmek/kernel-source。

        使用git下载源码方式,下载时切换分支到branch,使用SRCREV对应的修订版本,就是分支的最新版本。

[wangyb@wangyb-VirtualBox:linux]$ cat linux-imx-src-4.14.78.inc 
# Copyright 2017-2018 NXP
# Released under the MIT license (see COPYING.MIT for the terms)

LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://COPYING;md5=d7810fab7487fb0aad327b76f1be7cd7"

SRCBRANCH = "imx_4.14.78_1.0.0_ga"
LOCALVERSION = "-${SRCBRANCH}"
KERNEL_SRC ?= "git://source.codeaurora.org/external/imx/linux-imx.git;protocol=https"
SRC_URI = "${KERNEL_SRC};branch=${SRCBRANCH}"
SRCREV = "94da7bdc489ba686d868bcf80678a37cae22673e"

S = "${WORKDIR}/git"
[wangyb@wangyb-VirtualBox:linux-4.14.98]$ git branch 
* imx_4.14.78_1.0.0_ga
  imx_4.14.98_2.0.0_ga
  imx_4.14.98_2.3.0
  imx_5.4.3_2.0.0
[wangyb@wangyb-VirtualBox:linux-4.14.98]$ git log -n 1
commit 94da7bdc489ba686d868bcf80678a37cae22673e
Author: Peng Fan <[email protected]>
Date:   Thu Jan 3 18:50:30 2019 +0800

    MLK-20674 ARM64: dts: imx8mq: enable uart2 clock and disable caam
    
    Enable uart2 clk to let inmate could access uart
    And disable CAAM for inmate
    
    Signed-off-by: Peng Fan <[email protected]>
    Reviewed-by: Jun Li <[email protected]>
    (cherry picked from commit 59e4096c1bf0ef39e94b2b3ea81629f8862b59ec)

        内核编译后目录如下:

[wangyb@wangyb-VirtualBox:build_openwrt]$ ls tmp/work/imx8qxpmek-poky-linux/linux-imx/4.14.78-r0/
0001-uapi-Add-ion.h-to-userspace.patch  defconfig         deploy-rpms  image            linux-imx.spec  packages-split  pseudo          recipe-sysroot-native  temp
build                                   deploy-linux-imx  git          license-destdir  package         pkgdata         recipe-sysroot  sysroot-destdir

        build编译目录不含源文件,git源码目录是个软连接,image编译后的镜像文件,deploy-linux-imx部署文件,deploy-rpms内核模块打包文件,license-destdir许可文件目录,package含内核镜像和模块ko文件。

现成文件方式

        升级版本到4.14.98并使用现成的文件方式,不用去git下载源码切分支。

        linux-imx_4.14.98.bb文件与4.14.78保持一致无改变,增加文件linux-imx-src-4.14.98.inc:

[wangyb@wangyb-VirtualBox:linux]$ cat linux-imx_4.14.
linux-imx_4.14.78.bb  linux-imx_4.14.98.bb  
[wangyb@wangyb-VirtualBox:linux]$ cat linux-imx-src-4.14.98.inc 
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://COPYING;md5=d7810fab7487fb0aad327b76f1be7cd7"

SRCBRANCH = "imx_4.14.98_2.3.0"
LOCALVERSION = "-2.3.2"
#KERNEL_SRC ?= "git://source.codeaurora.org/external/imx/linux-imx.git;protocol=https"
#SRC_URI = "${KERNEL_SRC};branch=${SRCBRANCH}"
#SRCREV = "0347fe7527d062e1762498cb5863bcd5bde0997b"
SRC_URI = "file://kernel-source"

#S = "${WORKDIR}/git"
S = "${WORKDIR}/kernel-source"

        源码文件目录:linux-imx/kernel-source/,bitbake编译时会选项高版本的文件。

[wangyb@wangyb-VirtualBox:build_cx7100]$ ls tmp/work/genvict_imx8qxp-poky-linux/linux-imx/4.14.98-r0/
build             deploy-rpms    license-destdir  packages-split  recipe-sysroot         sstate-install-packagedata        sstate-install-populate_lic      temp
defconfig         image          linux-imx.spec   pkgdata         recipe-sysroot-native  sstate-install-package_qa         sstate-install-populate_sysroot
deploy-linux-imx  kernel-source  package          pseudo          sstate-install-deploy  sstate-install-package_write_rpm  sysroot-destdir

内核配置

        也可使用类似make menuconfig方式配置内核,命令:bitbake linux-imx -c menuconfig

        需要在虚拟机图形界面中打开终端配置,使用xshell打不开终端界面会导致配置失败。使用这个配置前提需要构建过一次内核,如果在构建之前想配置内核命令kernel_configme【没有这个task】。

        配置后的文件修改位置:build/.config,可在其他地方使用make savedefconfig修改原来的defconfig。

        defconfig文件简单的只声明那些没有默认值的选项,这种方式可以保持defconfig小而整洁。其他使用默认的配置最后生成文件.config。

编译问题

        编译MTK T800-SDK,编译optee-os时报python错误:No module named 'Crypto'

	| Traceback (most recent call last):
	|   File "scripts/pem_to_pub_c.py", line 61, in <module>
	|     main()
	|   File "scripts/pem_to_pub_c.py", line 24, in main
	|     from Crypto.PublicKey import RSA
	| ImportError: No module named 'Crypto'
	| mk/subdir.mk:158: recipe for target 

        pem_to_pub_c.py源码,简化如下:

#!/usr/bin/env python3
# SPDX-License-Identifier: BSD-2-Clause
#
# Copyright (c) 2015, Linaro Limited

def main():
    import array
    from Crypto.PublicKey import RSA
    from Crypto.Util.number import long_to_bytes

        sudo pip3 install crypto【安装失败】

        sudo pip install crypto【安装失败】

        把python3改为python就不保存,能import成功,难道是python3没有安装crypto导致的问题。

猜你喜欢

转载自blog.csdn.net/TSZ0000/article/details/124300456