커널 사용자 지정
커널 구성
Yocto Project에서 사용하는 기본 커널 구성 파일은 커널 소스 트리의 일부로 아래 위치에 있다(Yocto Project에서 커널 위치는 <build-dir>/tmp/work-shared/imx8mp-lpddr4-evk/kernel-source/ 이다.).
arch/arm64/configs/imx_v8_defconfig
커널을 구성하기 전에 Yocto Project 작업 순서는 다음과 같다.
repo 설정
// bin 폴더가 있는 경우, 아래 단계는 생략한다.
$ mkdir ~/bin
// repo를 다운로드 받는다.
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
// repo의 실행 권한을 설정한다.
$ chmod a+x ~/bin/repo
// .bashrc 파일에 ~/bin 경로를 PATH 환경 변수에 추가한다.
export PATH=~/bin:$PATH
Yocto Project 설정
- git 설정
// git를 설정한다.
$ git config --global user.name "Your Name"
$ git config --global user.email "Your Email"
// 설정 내용을 확인한다.
$ git config --list
- Yocto Project 설정
// 디렉터리를 생성한다.
$ mkdir <project-dir>
// 생성한 디렉터리로 이동한다.
$ cd <project-dir>
// repo를 사용하여 초기화한다(버전에 맞게 설정한다).
$ repo init -u https://github.com/nxp-imx/imx-manifest -b imx-linux-langdale -m imx-6.1.1-1.0.0.xml
또는
$ repo init -u https://github.com/nxp-imx/imx-manifest -b imx-linux-kirkstone -m imx-5.15.52-2.1.0.xml
// repo를 동기화한다.
$ repo sync
- 빌드 구성
// 빌드 구성을 진행한다(<build-dir>에 원하는 빌드 디렉터리를 설정한다).
$ DISTRO=fsl-imx-wayland MACHINE=imx8mp-lpddr4-evk source imx-setup-release.sh -b <build-dir>
커널 구성
- 커널 menuconfig를 실행하여 필요한 작업을 진행한다(작업을 완료한 후, 저장하고 menuconfig에서 나온다).
// 커널 menuconfig 실행
$ bitbake linux-imx -c menuconfig
또는
$ bitbake -c menuconfig virtual/kernel
.config 커널 구성 파일은 <build-dir>/tmp/work/imx8mp_lpddr4_evk-poky-linux/linux-imx/6.1.y+gitAUTOINC+29549c7073-r0/build/.config에 저장된다(사용하는 커널 버전에 따라 "6.1.y+gitAUTOINC+29549c7073-r0" 디렉터리만 달라진다).
이 시점에서 "bitbake imx-image-full" 커맨드를 사용하여 이미지를 빌드하거나 "bitbake virtual/kernel"이나 "bitbake linux-imx" 커맨드를 사용하여 커널을 빌드할 수 있다. 또는 변경 사항을 영구적으로 적용하기 위해 다음 단계를 수행할 수 있다.
- 변경된 커널 구성 영구 적용
// .config를 defconfig에 적용한다.
$ bitbake -c savedefconfig virtual/kernel
또는
$ bitbake -c savedefconfig linux-imx
.config 커널 구성 파일이 있는 디렉터리에 defconfig 파일이 생성된다.
이 구성을 영구적으로 사용하려면,
- defconfig 파일을 arch/arm64/configs/imx_v8_defconfig 파일에 덮어쓴다(overwrite 한다).
- 커널 레시피에서 소스 트리 외부의 defconfig를 사용하도록 설정한다(커스텀 레이어 사용).
커스텀 레이어 생성 (사용자 정의 defconfig 적용)
참고:
IMXBSPPG와 IMXLXYOCTOUG 문서의 내용으로 커스텀 레이어를 생성하여 사용자 정의 defconfig 파일을 적용하면 imx8mpevk에서는 적용이 안되는 문제가 있다. 그래서 아래의 내용은 직접 찾은 방법을 설명한다.
커스텀 레이어를 생성한다(현재 <build-dir>에 위치한다고 가정한다).
// 커스텀 레이어 생성 (기본 샘플 레이어가 생성된다.)
$ bitbake-layers create-layer ../sources/<custom-layer>
/sources/<custom-layer>/conf/layer.conf 파일의 내용을 아래와 같이 수정한다.
# We have a conf and classes directory, add to BBPATH
BBPATH .= ":${LAYERDIR}"
# We have recipes-* directories, add to BBFILES
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
${LAYERDIR}/recipes-*/*/*.bbappend"
BBFILE_COLLECTIONS += "meta-thermal"
BBFILE_PATTERN_meta-thermal = "^${LAYERDIR}/"
BBFILE_PRIORITY_meta-thermal = "6"
LAYERDEPENDS_meta-thermal = "core"
LAYERSERIES_COMPAT_meta-thermal = "kirkstone langdale"
# 꼭 추가해야 한다(사용할 리눅스를 설정).
PREFERRED_PROVIDER_virtual/kernel_thermal = "linux-imx"
/sources/<custom-layer>/conf/machine 디렉터리를 생성하고, /sources/meta-imx/meta-bsp/conf/machine/imx8mpevk.conf 파일을 /sources/<custom-layer>/conf/machine/<custom-name>.conf로 복사한다.
<build-dir>/conf/bblayers.conf 파일에 <custom-layer>를 아래와 같이 추가한다.
BBLAYERS = " \
${BSPDIR}/sources/poky/meta \
${BSPDIR}/sources/poky/meta-poky \
\
${BSPDIR}/sources/meta-openembedded/meta-oe \
${BSPDIR}/sources/meta-openembedded/meta-multimedia \
${BSPDIR}/sources/meta-openembedded/meta-python \
\
${BSPDIR}/sources/meta-freescale \
${BSPDIR}/sources/meta-freescale-3rdparty \
${BSPDIR}/sources/meta-freescale-distro \
${BSPDIR}/sources/<custom-layer> \
"
/sources/<custom-layer>/recipes-kernel/linux/linux-imx 디렉터리를 생성한다.
// -p 옵션을 주면 하위 디렉터리까지 순차적으로 생성된다.
$ mkdir -p /sources/<custom-layer>/recipes-kernel/linux/linux-imx
defconfig 파일을 복사한다(사용하는 커널 버전에 따라 6.1.y+gitAUTOINC+29549c7073-r0 디렉터리는 변경될 수 있다).
// 커널 레시피가 있는 디렉터리로 이동한다.
$ cd ~/<project-dir>/sources/<custom-layer>/recipes-kernel/linux
// defconfig 파일을 linux-imx 디렉터리에 복사한다.
$ cp ~/<project-dir>/<build-dir>/tmp/work/imx8mp_lpddr4_evk-poky-linux/linux-imx/6.1.y+gitAUTOINC+29549c7073-r0/build/defconfig linux-imx/defconfig
~/<project-dir>/sources/<custom-layer>/recipes-kernel/linux 디렉터리에 linux-imx_6.1.bbappend 파일을 생성하여 아래의 내용을 추가한다(사용하는 커널 버전에 따라 파일 이름이 변경될 수 있다).
# Copyright
# Released under the MIT license (see COPYING.MIT for the terms)
#
# SPDX-License-Identifier: MIT
#
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
# 현재 디렉터리를 얻어오는 방법이 없어서 ${THISDIR}를 기준으로 작업 디렉터리를 설정한다.
CUSTOM_KERNEL_DIR = "${THISDIR}/../../../../<custom-layer>/recipes-kernel/linux/${PN}"
CUSTOM_KERNEL_CONFIG_AARCH64 = "defconfig"
addtask pre_copy_defconfig after do_kernel_configme before do_copy_defconfig
do_pre_copy_defconfig () {
if [ ${DO_CONFIG_V7_COPY:mx8-nxp-bsp} = "no" ]; then
# defconfig를 커널 구성에 사용하기 위해 파일을 복사한다.
mkdir -p ${B}
cp ${CUSTOM_KERNEL_DIR}/${CUSTOM_KERNEL_CONFIG_AARCH64} ${S}/arch/arm64/configs/${IMX_KERNEL_CONFIG_AARCH64}
fi
}
"bitbake -c cleanall linux-imx"을 먼저 실행하여 정리한다.
"MACHINE=<custom-layer> bitbake virtual/kernel"이나 "MACHINE=<custom-layer> bitbake linux-imx"를 실행하여 커스텀 defconfig가 적용이 되는지 확인한다. 확인 방법은 <build-dir>/tmp/work/<custom-layer>-poky-linux/linux-imx/6.1.y+gitAUTOINC+29549c7073-r0/defconfig 파일이 사용자 지정 defconfig 파일과 내용이 같은지 확인한다.
6.1.y+gitAUTOINC+29549c7073-r0 디렉터리는 커널 버전에 따라 변경될 수 있다.
커스텀 레이어 (커널 소스 패치 파일 적용)
참고:
커널 소스 패치 적용에 대한 자세한 내용은 다음 사이트를 참고한다.
Yocto_Customizing_the_Linux_kernel
위 사이트 3가지 방법 중 첫 번째 방법을 적용하는 방법을 설명한다.
먼저 "MACHINE=<custom-layer> bitbake virtual/kernel"이나 "MACHINE=<custom-layer> bitbake linux-imx"를 실행하여 완료한 후라고 가정한다. 현재 디렉터리 위치는 <build-dir> 이다.
// 패치 파일을 찾아 소스코드에 적용한다.
$ MACHINE=<custom-layer> bitbake -c patch virtual/kernel
또는
$ MACHINE=<custom-layer> bitbake -c patch linux-imx
// 커널 소스를 저장할 로컬 저장소 생성(-p 옵션으로 하위 디렉터리까지 생성)한다.
// 로컬 저장소는 <project-dir> 아래 생성된다.
$ mkdir -p ../local_repos/linux-imx
// 커널 소스를 로컬 저장소로 복사한다.
$ cp -a tmp/work-shared/<custom-layer>/kernel-source/. ../local_repos/linux-imx
// 로컬 저장소로 이동한다.
$ cd ../local_repos/linux-imx
// 가장 최근 commit으로 되돌리고, unstaged 상태의 변경 사항을 모두 제거한다.
$ git reset --hard
// untracked(추적되지 않는) 파일(디렉터리)을 삭제한다.
$ git clean -fdx
"local_repos/linux-imx"에서 커널 소스와 관련된 수정 작업을 진행한다.
작업이 완료되면 패치 파일을 생성한다.
// git로 패치 파일을 생성한다.
$ git diff > <custom-name>.patch
"local_repos/linux-imx/<custom-name>.patch" 파일이 생성될 것이다. 해당 파일을 "<project-dir>/sources/meta-imx/meta-bsp/recipes-kernel/linux/linux-imx" 디렉터리에 복사한다.
위에서 작업한 "linux-imx_6.1.bbappend" 파일의 내용을 아래와 같이 수정한다.
# Copyright
# Released under the MIT license (see COPYING.MIT for the terms)
#
# SPDX-License-Identifier: MIT
#
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
SRC_URI += "file://<custom-name>.patch"
# 현재 디렉터리를 얻어오는 방법이 없어서 ${THISDIR}를 기준으로 작업 디렉터리를 설정한다.
CUSTOM_KERNEL_DIR = "${THISDIR}/../../../../<custom-layer>/recipes-kernel/linux/${PN}"
CUSTOM_KERNEL_CONFIG_AARCH64 = "defconfig"
addtask pre_copy_defconfig after do_kernel_configme before do_copy_defconfig
do_pre_copy_defconfig () {
if [ ${DO_CONFIG_V7_COPY:mx8-nxp-bsp} = "no" ]; then
# defconfig를 커널 구성에 사용하기 위해 파일을 복사한다.
mkdir -p ${B}
cp ${CUSTOM_KERNEL_DIR}/${CUSTOM_KERNEL_CONFIG_AARCH64} ${S}/arch/arm64/configs/${IMX_KERNEL_CONFIG_AARCH64}
fi
}
"MACHINE=<custom-layer> bitbake -c cleanall linux-imx"를 사용하여 정리한다.
"MACHINE=<custom-layer> bitbake virtual/kernel"이나 "MACHINE=<custom-layer> bitbake linux-imx"를 사용하여 빌드를 진행한다.
'NXP i.MX SoC Family > Evaluation Kit for the i.MX 8M Plus' 카테고리의 다른 글
i.MX 8M Plus 개발 환경 구축 - Yocto Command 정리 (0) | 2023.05.03 |
---|---|
i.MX 8M Plus 개발 환경 구축 - U-Boot 사용자 지정 (0) | 2023.05.02 |
i.MX 8M Plus 개발 환경 구축 - U-Boot 빌드 (0) | 2023.04.07 |
i.MX 8M Plus 개발 환경 구축 - 커널 빌드 (0) | 2022.11.01 |
i.MX 8M Plus 개발 환경 구축 - 이미지 빌드 (0) | 2022.10.25 |