커널 빌드
여기서는 i.MX 커널을 다운로드/빌드/로드하는 방법을 설명한다. IMXBSPPG 설명을 기반으로 독립 실행형 환경과 Yocto Project로 진행한다.
앞에서 이미 Yocto Project 설정을 했으므로, Yocto Project 설정 부분은 설명 없이 넘어간다.
독립 실행형 환경 (standalone environment)에서 커널 빌드
독립 실행형 환경에서 커널을 빌드하려면, 먼저 호스트 시스템에 설치하여 컴파일하기 위한 개발용 SDK(툴, 툴 체인, 작은 rootfs 포함)를 생성해야 한다.
먼저 이미지를 생성 후, SDK를 생성하는 것을 권장한다. SDK부터 생성하려고 하면 에러가 발생할 수 있다(에러가 발생하는 이유를 찾지 못 했다).
예로, 아래과 같이 먼저 이미지를 생성하고,
$ DISTRO=fsl-imx-wayland MACHINE=imx8mp-lpddr4-evk source imx-setup-release.sh -b bld-full
$ bitbake imx-image-full
아래와 같이 SDK를 생성한다.
$ bitbake imx-image-full -c populate_sdk
SDK가 에러 없이 생성이 되면, 빌드 디렉토리의 tmp/deploy/sdk에서 .sh 파일을 빌드하려는 호스트 시스템으로 복사하고, 해당 파일을 실행하면 SDK를 설치할 수 있다. 기본 설치 위치는 /opt이지만, 호스트 시스템 어디에나 설치할 수 있다.
i.MX 8의 툴 체인 스크립트 환경은 아래와 같다.
Toolchain : environment-setup-cortexa53-crypto-poky-linux
Linux_Config: imx_v8_defconfig
ARCH=arm64
CROSS_COMPILE=aarch64-poky-linux-
SDK 설치 후 커널 소스를 다운로드하여 빌드하는 단계는 아래와 같다.
1. 호스트 터미널 윈도우에서 툴 체인 환경을 설정
틀체인 스크립트를 실행한다. SDK 설치 경로를 기본으로 한 경우, "/opt/fsl-imx-wayland/5.15-kirkstone/" 디렉토리안에 "environment-setup-armv8a-poky-linux" 파일이 툴체인 스크립트이다.
아래와 같은 형식으로 툴체인 스크립트를 실행해야 한다.
$ source <SDK 설치경로>/environment-setup-armv8a-poky-linux
아래와 같이 환경 변수에서 LDFLAGS를 제거 한다.
$ echo $LDFLAGS
-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed
$ unset LDFLAGS
새로운 환경 변수를 확인한다.
$ echo $ARCH
arm64
$ echo $CROSS_COMPILE
aarch64-poky-linux-
2. Linux 소스 코드 가져오기
작업 디렉토리를 생성하고, 생성한 디렉토리로 이동한 후 아래 커맨드를 실행한다.
$ git clone https://github.com/nxp-imx/linux-imx
git에서 클론한 리포지토리에는 NXP의 모든 릴리즈가 포함되어 있다. 작업할 릴리즈 버전을 선택하려면, "git tag" 커맨드로 사용 가능한 릴리즈 버전을 확인한 후, "git checkout <tag name>" 커맨드를 사용하여 릴리즈 버전을 변경한다.
릴리즈 버전을 "lf-5.15.52-2.1.0"로 변경하는 경우 아래와 같이 진행한다.
$ cd linux-imx
$ git tag
...
lf-5.10.35-2.0.0
lf-5.10.52-2.1.0
lf-5.10.72-2.2.0
lf-5.10.72-2.2.2
lf-5.10.72-2.2.3
lf-5.10.y-1.0.0
lf-5.15.32-2.0.0
lf-5.15.5-1.0.0
lf-5.15.52-2.1.0
lf-5.15.71-2.2.0
lf-5.4.47-1.1.0
lf-5.4.y-1.0.0
...
$ git checkout -b lf-5.15.52-2.1.0
Switched to a new branch 'lf-5.15.52-2.1.0'
$
3. 구성 초기화
$ cd linux-imx
$ make distclean // 생성된 모든 파일을 지운다.
$ make imx_v8_defconfig // i.MX 8로 구성한다.
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
HOSTCC scripts/kconfig/confdata.o
HOSTCC scripts/kconfig/expr.o
LEX scripts/kconfig/lexer.lex.c
YACC scripts/kconfig/parser.tab.[ch]
HOSTCC scripts/kconfig/lexer.lex.o
HOSTCC scripts/kconfig/menu.o
HOSTCC scripts/kconfig/parser.tab.o
HOSTCC scripts/kconfig/preprocess.o
HOSTCC scripts/kconfig/symbol.o
HOSTCC scripts/kconfig/util.o
HOSTLD scripts/kconfig/conf
#
# configuration written to .config
#
$
4. 커널 소스 빌드
빌드시 아래의 커맨드를 사용하게 된다.
$ make -j $(nproc)
-j : 동시 작업 수를 $(nproc)에 설정한다. 보통 호스트 CPU의 수를 설정한다.
$ make -j 4
WRAP arch/arm64/include/generated/uapi/asm/kvm_para.h
WRAP arch/arm64/include/generated/uapi/asm/errno.h
WRAP arch/arm64/include/generated/uapi/asm/ioctl.h
WRAP arch/arm64/include/generated/uapi/asm/ioctls.h
WRAP arch/arm64/include/generated/uapi/asm/ipcbuf.h
WRAP arch/arm64/include/generated/uapi/asm/msgbuf.h
WRAP arch/arm64/include/generated/uapi/asm/poll.h
WRAP arch/arm64/include/generated/uapi/asm/resource.h
WRAP arch/arm64/include/generated/uapi/asm/sembuf.h
WRAP arch/arm64/include/generated/uapi/asm/shmbuf.h
WRAP arch/arm64/include/generated/uapi/asm/siginfo.h
WRAP arch/arm64/include/generated/uapi/asm/socket.h
WRAP arch/arm64/include/generated/uapi/asm/sockios.h
WRAP arch/arm64/include/generated/uapi/asm/stat.h
WRAP arch/arm64/include/generated/uapi/asm/swab.h
WRAP arch/arm64/include/generated/uapi/asm/termbits.h
WRAP arch/arm64/include/generated/uapi/asm/termios.h
WRAP arch/arm64/include/generated/uapi/asm/types.h
HOSTCC scripts/dtc/dtc.o
HOSTCC scripts/dtc/flattree.o
HOSTCC scripts/dtc/fstree.o
HOSTCC scripts/dtc/data.o
HOSTCC scripts/dtc/livetree.o
HOSTCC scripts/dtc/treesource.o
HOSTCC scripts/dtc/srcpos.o
HOSTCC scripts/dtc/checks.o
UPD include/config/kernel.release
HOSTCC scripts/dtc/util.o
LEX scripts/dtc/dtc-lexer.lex.c
...
LD [M] sound/soc/fsl/snd-soc-imx-pcm512x.ko
LD [M] sound/soc/fsl/snd-soc-imx-pdm.ko
LD [M] sound/soc/fsl/snd-soc-imx-rpmsg.ko
LD [M] sound/soc/fsl/snd-soc-imx-sgtl5000.ko
LD [M] sound/soc/fsl/snd-soc-imx-spdif.ko
LD [M] sound/soc/sof/imx/imx-common.ko
LD [M] sound/soc/sof/imx/snd-sof-imx8.ko
LD [M] sound/soc/sof/imx/snd-sof-imx8m.ko
LD [M] sound/soc/sof/imx/snd-sof-imx8ulp.ko
LD [M] sound/soc/sof/snd-sof-of.ko
LD [M] sound/soc/sof/snd-sof.ko
LD [M] sound/soc/sof/xtensa/snd-sof-xtensa-dsp.ko
LD [M] sound/usb/snd-usb-audio.ko
LD [M] sound/usb/snd-usbmidi-lib.ko
$
/arch/arm64/boot 디렉토리안에 파일이 생성된다.
$ cd arch/arm64/boot
$ ls -al
total 42896
drwxr-xr-x 3 --- --- 4096 Dec 27 14:57 .
drwxr-xr-x 14 --- --- 4096 Dec 27 14:50 ..
-rw-r--r-- 1 --- --- 143 Dec 27 14:57 .Image.cmd
-rw-r--r-- 1 --- --- 101 Dec 27 14:57 .Image.gz.cmd
-rw-r--r-- 1 --- --- 55 Dec 27 14:23 .gitignore
-rw-r--r-- 1 --- --- 31076864 Dec 27 14:57 Image
-rw-r--r-- 1 --- --- 12958188 Dec 27 14:57 Image.gz
-rw-r--r-- 1 --- --- 960 Dec 27 14:23 Makefile
drwxr-xr-x 33 --- --- 4096 Dec 27 14:23 dts
-rw-r--r-- 1 --- --- 1562 Dec 27 14:23 install.sh
$
dts, Image, Image.gz, install.sh, Makefile 등이 생성되어 있는 것을 볼 수 있다.
Yocto Project에서 커널 빌드
이미 Yocto Project 설정이 완료된 상태이므로 다음 커맨드를 사용하여 빌드 구성 작업을 수행한다.
$ DISTRO=<distro name> MACHINE=<machine name> source imx-setup-release.sh -b <build dir>
DISTRO 목록에는 fsl-imx-wayland, fsl-imx-xwayland, fsl-imx-fb 등이 있다. i.MX 8M Plus에서는 프레임 버퍼를 지원하지 않으므로 <distro name>으로 fsl-imx-wayland를 사용한다. <machine name>으로는 imx8mp-lpddr4-evk를 사용한다. 마지막으로 <build dir>에는 빌드 디렉터리로 사용할 이름을 설정한다.
i.MX 8M Plus EVKit을 빌드 구성하기 위해 아래 커맨드를 입력한다.
$ DISTRO=fsl-imx-wayland MACHINE=imx8mp-lpddr4-evk source imx-setup-release.sh -b build-wayland
다음 커맨드로 이미지를 빌드한다.
$ bitbake imx-image-full
위 커맨드는 머신 러닝 기능을 포함한 오픈 소스 Qt6 이미지를 빌드한다. 빌드 시 오랜 시간이 걸린다. 필요에 따라 imx-image-core나 imx-image-multimedia로 빌드해도 된다.
이미지 빌드가 완료되면, Linux 커널은 다음 경로에서 찾을 수 있다. (\build-wayland는 <build dir>에서 설정한 디렉터리이다.)
\build-wayland\tmp\work-shared\imx8mp-lpddr4-evk\kernel-source\
해당 경로에서 필요한 작업을 한 후 다음 과정을 수행하여 최종 이미지를 업데이트할 수 있다.
먼저 Linux 커널을 빌드하고 최종 빌드 결과를 이미지 배포 디렉토리에 배포한다.
$ bitbake -f -c compile linux-imx
$ bitbake -f -c install linux-imx
$ bitbake -f -c deploy linux-imx
위의 커맨드를 수행하면 \build-wayland\tmp\deploy\images\imx8mp-lpddr4-evk\ 디렉토리에 Image--5.15.71+git0+3313732e99-r0-imx8mp-lpddr4-evk-20230406055219.bin와 같은 바이너리가 배포된다. 이 바이너리를 이름만 Image로 변경하여 사용하면 된다.
다음 커맨드를 수행하여 최종 이미지를 생성한다.
$ bitbake -f -c rootfs imx-image-full
$ bitbake -f -c image_wic imx-image-full
$ bitbake -f -c image_complete imx-image-full
위의 커맨드를 수행하면 \build-wayland\tmp\deploy\images\imx8mp-lpddr4-evk\ 디렉토리에 imx-image-full-imx8mp-lpddr4-evk-20230406060402.rootfs.wic.zst와 같은 최종 이미지가 생성된다.
작업시 주의할 점은 커널 업데이트나 Yocto Project 업데이트 시에 작업한 내용이 사라질 수 있으므로, 꼭 자주 백업을 하는 것이 좋다.
'NXP i.MX SoC Family > Evaluation Kit for the i.MX 8M Plus' 카테고리의 다른 글
i.MX 8M Plus 개발 환경 구축 - 커널 사용자 지정 (0) | 2023.04.24 |
---|---|
i.MX 8M Plus 개발 환경 구축 - U-Boot 빌드 (0) | 2023.04.07 |
i.MX 8M Plus 개발 환경 구축 - 이미지 빌드 (0) | 2022.10.25 |
i.MX 8M Plus 개발 환경 구축 - Yocto Project 설정 (0) | 2022.10.14 |
i.MX 8M Plus 개발 환경 구축 - 호스트 개발 환경 (0) | 2022.10.13 |