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导致的问题。