SoC : : Architecture/: : i.MX

i.MX 9 BSP Porting Guide - Porting Kernel

Jay.P Morgan 2024. 4. 30. 23:34

 

  2.0 Intro

 

  이 장에서는 독립 실행형 (standalone) 환경과 Yocto Project, 두 가지 방법으로 i.MX 커널을 다운로드, 빌드 및 로드하는 방법을 설명합니다.

 

 

  2.1.1 How to build and load Kernel in standalone environment

  독립 실행형 환경에서 커널을 빌드하려면, 먼저 호스트 시스템에 배치하기 위해 컴파일할 툴, 툴 체인 및 작은 rootfs을 포함하는 개발SDK를 생성하세요.

 

1. 다음의 명령을 사용하여 Yocto Project 빌드 환경에서 SDK를 생성하세요. Yocto Project 빌드환경을 설정하려면 i.MX Yocto Project User's Guide (IMXLXYOCTOUG)의 단계를 따르세요.

 

 다음의 명령에서 Target-Machine을 빌드하려는 시스템으로 설정합니다. i.MX Yocto Project User's Guide  (IMXLXYOCTOUG)의 "Build Configurations" 섹션을 참조하세요. populate_sdk는 Yocto Project없이 독립 실행형 환경을 설정하는 스크립트 파일을 생성합니다. 현재 릴리스의 최신 헤더, 도구 체인 및 도구를 선택하려면, 릴리스마다 이 SDK를 업데이트해야 합니다.

DISTRO=Target-Distro MACHINE=Target-Machine bitbake core-image-minimal -c  populate_sdk

 

유용한 DISTRO 옵션을 사용하려면, i.MX Yocto Project User's Guide (IMXLXYOCTOUG)의 "Build Configurations" 섹션을 참조하세요.

 

2. BitBake가 실행된 빌드 디렉터리에서 tmp/deploy/sdk의 .sh 파일을 호스트 머신에 복사하여 빌드하고, 스크립트를 실행하여 SDK를 설치합니다. 기본 설치 위치는 /opt이지만 호스트 시스템의 어디에나 배치할 수 있습니다.

 

Arm v7A 32 bit Arm v8A 64 bit 툴 체인 스크립트와 환경은 아래와 같습니다:

 

   i.MX 6

Toolchain : environment-setup-cortexa9thf-vfp-neon-poky-linux-gnueabi
Linux_Config: imx_v7_defconfig
ARCH=arm
CROSS_COMPILE=arm-poky-linux-gnueabi-

 

   i.MX 7

Toolchain : environment-setup-cortexa7t2hf-neon-poky-linux-gnueabi
Linux_Config: imx_v7_defconfig
ARCH=arm
CROSS_COMPILE=arm-poky-linux-gnueabi-

 

   i.MX 8 and i.MX 93

Toolchain : environment-setup-cortexa53-crypto-poky-linux
Linux_Config: imx_v8_defconfig
ARCH=arm64
CROSS_COMPILE=aarch64-poky-linux-

다음은 호스트 시스템에 독립형 커널 소스를 구축하는 단계입니다.

1. 호스트 터미널 창 툴체인 환경을 설정합니다.
환경 변수는 Environment-setup<toolchain> 스크립트를 실행한 후 터미널 창에 생성됩니다.

i.MX 6, i.MX 7, i.MX 8 툴체인에 대해서는 위의 정보를 참조하세요.

$ source <toolchain install directory>/environment-setup-<toolchain script>

 

i.MX 8 예시:

$ source /opt/fsl-imx-wayland/6-1-mickledore/environment-setup-aarch64-poky-linux
$ echo $LDFLAGS
  -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed
$ unset LDFLAGS   // Remove env variable LDFLAGS

 

타겟 i.MX 8에 대해 새 환경 변수가 올바르게 설정되었는지 확인하세요.

$ echo $ARCH   arm64
$ echo $CROSS_COMPILE   aarch64-poky-linux-

 

 

2. Linux 소스 코드 가져오기

$ git clone https://github.com/nxp-imx/linux-imx

 

git이 clone할 repository에는 모든 NXP 릴리스가 포함되어 있습니다. 다른 릴리스로 작업하려면, "git tag" 명령으로 사용 가능한 릴리스를 표시하고 "git checkout <tag name>"을 사용하여 해당 버전으로 이동하세요.

lf-6.1.36-2.1.0

 

예를 들어 lf-6.1.36-2.1.0 스냅샷을 선택하려면 :     $ git checkout -b lf-6.1.36-2.1.0

 

3.    Initialize the configuration.

$ cd linux-imx
$ make distclean     // delete all generated files
$ make imx_v8_defconfig     // configuration for i.MX 8
                     // see above for i.MX 6 and i.MX 7 configuration name

 

4.    Build the kernel sources.

$ make -j $(nproc)        // -j: number of simultaneous jobs
                  //     use available Host CPUs for number

 

$ Linux kernel generated files in directory arch/arm64/boot  // For i.MX 6 or  i.MX 7, arch/arm/boot
  dts   Image
  Image.gz   install.sh   Makefile

By default, i.MX U-Boot loads kernel image and device tree blob from the first FAT partition. Users can copy their images to this partition. Alternatively, users can flash images to the RAW address for U-Boot loading.

To flash the kernel generated from the build, execute the following commands:

$ sudo dd if=<zImageName> of=/dev/sd<partition> bs=512 seek=2048 conv=fsync &&  sync

 

Note:

For i.MX 8, compressed images are not supported by U-Boot, and Image file must be used, not Image.gz.

To flash the device trees generated from the build, execute the following commands:

$ sudo dd if=<DevicetreeName>.dtb of=/dev/sd<partition> bs=512 seek=20480  conv=fsync

Note:

For i.MX 8QuadMax and i.MX 8QuadXPlus, the kernel image and DTB need to be flashed after the first 6 MB of the SD card.

 

  2.1.2  How to build and load Kernel in Yocto Project

 

Yocto Project에 커널 변경 사항을 통합하려면 다음 단계를 수행하세요:

1. 매니페스트(manifest) 브랜치나 릴리스 레이어의 README 지침에 따라 Yocto Project에서 i.MX Reference Board에 해당하는 SoC를 빌드하기 위한 빌드 환경을 설정합니다. 여기에는 repo 초기화 및 repo 동기화를 사용하여 Yocto 프로젝트 메타 데이터를 다운로드하고 imx-setup-release를 사용하여 빌드 환경을 설정하는 것이 포함됩니다.

2. 해당 SoC용 Reference B'D 커널을 빌드합니다.

아래는 예시입니다. 처음으로 이 빌드는 필요한 모든 도구와 종속성을 빌드하기 때문에 더 긴 시간이 걸립니다.

$ MACHINE=imx6qsabresd bitbake linux-imx

 

3.   사용자 보드 커널 변경 사항을 보관할 커스텀 레이어를 만듭니다. 사용자 정의 레이어를 생성하려면 기존 레이어를 살펴보고, 더 간단한 예를 보려면 XBMC 또는 IOTG용 i.MX 데모를 참조하세요. 사용자 정의 레이어는 <build-dir>/conf 디렉토리의 bblayer.conf에 추가하여 통합됩니다. 레이어에는 레이어 이름을 설명하는 conf/layer.conf 파일이 있어야 합니다.

 

4. 커스텀 보드의 SoC와 연결된 기존 머신 파일을 커스텀 레이어에 복사합니다.

$ cp sources/meta-freescale/conf/machine/imx6qsabresd.conf <new layer>/conf/ machine/<custom_name>.conf

 

5.  KERNEL_DEVICETREE 에 나열된 디바이스 트리로 머신 구성 파일(machine configuration file)을 편집한다.

6.  아래 줄을 conf/local.conf에 추가하여 linux-imx로 빌드할 커널의 기본 버전을 변경한다. 여러 커널 제공자가 있어서, 이로 인해 linux0imx 버전을 지정해서 사용해야 한다.

PREFERRED_PROVIDER_virtual/kernel_<custom_name> = "linux-imx"

 

7.  사용자 머신빌드 

$ MACHINE=<custom_name> bitbake linux-imx

<build-dir>/tmp/work/<custom_name>-poky-linux-gnueabi/linux-imx/에서 확인하세요.
<version>을 사용하여 빌드 출력을 찾습니다. 또한 <build-dir>/tmp/deploy/images/<custom_name>에서 커널 바이너리를 찾으세요.

8. 커널 패치 및 사용자 정의 defconfig는 linux-imx_%.bbappend에 제공되며 이러한 행은 예시로, patch1.patch는 소스/<custom_layer>/recipes-kernel/linux-imx/files에 배치된 패치입니다.

FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
SRC_URI_append = "file://patch1.patch  file://custom_defconfig"