4 Booting Linux OS
i.MX 보드에서 Linux OS 커널을 부팅하기 전에, 부트 디바이스로 이미지(U-Boot, Linux Kernel, Device Tree, rootfs)를 복사하고 부트 디바이스가 부팅할 수 있도록 부트 스위치를 설정한다. 다양한 보드, 부트 디바이스 그리고 원하는 결과를 얻기 위해 Linux OS를 부팅하는 다양한 방법이 있다. 이 섹션에서는 부트 디바이스를 준비하는 방법, 메모리 맵에서 파일이 있어야 하는 위치, 부팅하기 위한 스위치 설정 방법 그리고 U-Boot에서 Linux OS를 부팅하는 방법을 설명한다.
4.1 Software overview
이 섹션은 보드에서 Linux OS를 부팅하고 실행하는 데 필요한 소프트웨어에 대해 설명한다.
i.MX 6과 i.MX 7에서 Linux 이미지를 부팅하려면, 다음 요소들이 필요하다:
- 부트로더 (U-Boot)
- Linux 커널 이미지 (zImage)
- 보드에서 사용중인 디바이스 트리 파일 (.dtb)
- 특정 Linux 이미지에 대한 루트 파일 시스템 (rootfs)
- i.MX 7ULP에 대한 Arm Cortex-M4 이미지
i.MX 8QuadMax, i.MX 8QuadXPlus와 i.MX 8DXL에서 Linux 이미지를 부팅하려면, 여러 요소들이 필요하다:
- i.MX 8QuadMax/i.MX 8QuadXPlus B0와 i.MX 8DXL A1부터 U-Boot, Arm Trusted Firmware, DCD 파일, 시스템 컨트롤 펌웨어 그리고 SECO 펌웨어를 포함하는 부트로더 (imx-mkimage에 의해 빌드된 imx-boot는 i.MX 8용 부트로더를 생성하기 위해 펌웨어와 U-Boot를 결합하는 도구로 생성).
- (선택 사항) Arm Cortex-M4 이미지
- Linux Kernel 이미지 (linux-imx에 의해 빌드된 이미지)
- 보드에서 사용중인 디바이스 트리 파일 (.dtb)
- 특정 Linux 이미지에 대한 루트 파일 시스템 (rootfs)
i.MX 8M Quad, i.MX 8M Mini, i.MX 8M Nano와 i.MX 8M Plus에는 여러 요소들이 필요하다:
- SPL, U-Boot, Arm Trusted Firmware, DDR Firmware를 포함하는 imx-boot (imx-mkimage에 의해 빌드)
- HDMI 펌웨어 (i.MX 8M Quad에서만 지원)
- Linux Kernel 이미지
- 보드에서 사용중인 디바이스 트리 파일 (.dtb)
- 특정 Linux 이미지에 대한 루트 파일 시스템 (rootfs)
i.MX 8ULP에서는 네 가지 요소가 필요하다:
- SPL, U-Boot, Arm Trusted Firmware, OP-TEE, uPower Firmware, Sentinel Firmware, and Arm Cortex-M33 이미지를 포함하는 imx-boot (imx-mkimage에 의해 빌드)
- Linux Kernel 이미지
- 보드에서 사용중인 디바이스 트리 파일 (.dtb)
- 특정 Linux 이미지에 대한 루트 파일 시스템 (rootfs)
i.MX 93에서는 여러 요소들이 필요하다:
- SPL, U-Boot, Arm Trusted Firmware, OP-TEE, Sentinel Firmware, DDR PHY Firmware를 포함하는 imx-boot (imx-mkimage에 의해 빌드)
- Linux Kernel 이미지
- (선택 사항) Arm Cortex-M33 이미지
- 보드에서 사용중인 디바이스 트리 파일 (.dtb)
- 특정 Linux 이미지에 대한 루트 파일 시스템 (rootfs)
시스템은 특정 그래픽 백엔드로 구성할 수 있다. i.MX 8의 경우, 그래픽 백엔드는 XWayland이다. i.MX 7ULP의 경우, 기본 백엔드는 XWayland이다.
4.1.1 Bootloader
U-Boot는 i.MX 6과 i.MX 7에서 부트로더로 권장되는 도구이다. i.MX 8과 i.MX 9에서는 U-Boot와 아래에 설명된 다른 컴포넌트가 포함된 부트로더가 필요하다. 디바이스를 부팅하려면, U-Boot를 디바이스로 로드해야 한다. U-Boot 이미지는 보드별로 다르며, 다양한 소스에서 부팅을 지원하도록 구성할 수 있다.
미리 빌드된 또는 Yocto Project의 기본 부트로더 이름은 "u-boot-[platform][board]_[machine_configuration].bin"와 같이, 부트로더의 이름으로 시작하고 그 다음에 플랫폼과 보드 이름이 오고 그 다음에 해당 이미지가 부팅하도록 구성된 디바이스의 이름이 온다. 부팅 디바이스를 지정하지 않으면, SD/MMC에서 부팅된다.
제조 도구는 i.MX 6과 i.MX 7이 있는 모든 디바이스에서 U-Boot를 로드하도록 사용할 수 있다. U-Boot는 Linux dd 커맨드를 사용하여 SD 카드에 직접 로드할 수 있다. U-Boot는 다른 디바이스로 U-Boot 이미지를 로드하는 데 사용할 수 있다.
i.MX 8에서, U-Boot는 자체적으로 디바이스를 부팅할 수 없다. 미리 빌드된 i.MX 8 이미지 또는 Yocto Project의 기본 부트로더는 imx-mkimage에 의해 생성된 SD 카드용 imx-boot이다. imx-boot 바이너리는 U-Boot, Arm Trusted Firmware, DCD 파일(8QuadMax/8QuadXPlus/8DXL), System Controller Firmware (8QuadMax/8QuadXPlus/8DXL), SPL (8M SoC), DDR Firmware (8M), HDMI Firmware (8M Quad) 그리고 SECO Firmware (8QuadMax/8QuadXPlus/8DXL)를 포함된다.
i.MX 8M SoC에서, 두 번재 프로그램 로더(SPL: Second Program Loader)는 U-Boot에서 활성화된다. SPL은 TCML에서 실행되는 첫 번째 레벨 부트로더로 구현된다(i.MX 8M Nano와 i.MX 8M Plus의 경우, 첫 번째 레벨 부트로더는 OCRAM에서 실행된다). DDR을 초기화하고 U-Boot, U-Boot DTB, Arm Trusted Firmware 그리고 TEE OS(선택 사항)를 부트 디바이스에서 메모리로 로드하는 데 사용된다. SPL이 이미지 로드를 완료하면, Arm Trusted Firmware BL31로 직접 이동한다. BL31은 커널 부팅을 진행하기 위해 선택적 BL32(TEE OS)와 BL33(U-Boot)을 시작한다.
imx-boot에서, SPL은 DDR Firmware와 함께 패키징되어 있어서, ROM이 Arm Cortex-M4 TCML 또는 OCRAM(i.MX 8M Nano와 i.MX 8M Plus에만 해당)에 로드할 수 있다. U-Boot, U-Boot DTB, Arm Trusted Firmware 그리고 TEE OS(선택 사항)는 FIT 이미지에 패키징되며, 최종적으로 imx-boot에 포함된다.
4.1.2 Linux kernel image and device tree
i.MX BSP에는 Linux 커널 5.15.71 버전을 기반으로 미리 빌드된 커널 이미지와 각 플랫폼과 관련된 디바이스 트리 파일이 포함되어 있다.
이름이 zImage인 동일한 커널 이미지가 모든 i.MX 6과 i.MX 7에 사용된다. 디바이스 트리는 트리 데이터 구조로, 일반적인 커널을 핀을 다르게 설정하여 다른 보드나 구성으로 부팅할 수 있도록 허용하는 하드웨어 구성을 설명한다. 디바이스 트리 파일은 .dtb 확장자를 사용한다. 디바이스 트리에 대한 구성은 Linux 소스 코드 아래 arch/arm/boot/dts에서 *.dts로 찾을 수 있다.
i.MX Linux에서 제공되는 패키지에는 i.MX 보드용으로 다양한 구성의 미리 빌드된 디바이스 트리 파일이 포함되어 있다. 미리 빌드된 이미지 파일 이름은 Image-[platform]-[board]-[configuration].dtb이다. 예를 들어, i.MX 8QuadMax MEK 보드의 디바이스 트리 파일은 Image-imx8qm-mek.dtb이다.
i.MX 6과 i.MX 7의 경우, *ldo.dtb 디바이스 트리가 활성화된-LDO 기능 지원에 사용된다. 기본적으로 LDO 바이패스가 활성화되어 있다. LDO 바이패스 모드는 1.2GHz의 CPU에서는 지원되지 않기 때문에, 보드의 CPU가 1.2GHz로 설정되어 있으면 기본 값 대신 *ldo.dtb 디바이스 트리를 사용해야 한다. 디바이스 트리 *hdcp.dtb는 핀 충돌로 인해 HDCP 기능을 활성화하는 데 사용되며, 빌드 시에 구성해야 한다.
i.MX 8, i.MX 8M, i.MX 8ULP 그리고 i.MX93의 커널은 64비트이고, 디바이스 트리는 arch/arm64/boot/dts/freescale 폴더에 있으며 dts 확장자를 사용한다.
커널은 릴리스 패키지에 제공된 linux-imx 소프트웨어와 Image로 시작하는 파일 이름을 사용하여 빌드된다.
4.1.3 Root file system
루트 파일 시스템 패키지(또는 rootfs)는 busybox, 공통 라이브러리 그리고 기타 기본적인 요소를 제공한다.
i.MX BSP 패키지에는 여러 루트 파일 시스템이 포함되어 있다. [image name]-[backend]-[platform][board].[ext4|wic] 규칙에 따라 이름이 지정된다. ext4 확장자는 표준 파일 시스템을 나타낸다. NFS로 마운트하거나, 그 내용을 SD/MMC 카드와 같은 부트 미디어에 저장할 수 있다.
사용할 그래픽 백엔드도 rootfs에 의해 정의된다.
4.2 Universal update utility
Universal Update Utility(UUU)는 Windows 또는 Linux OS 호스트에서 실행되며, i.MX 보드의 다른 디바이스로 이미지를 다운로드하는 데 사용된다.
4.2.1 Downloading UUU
https://github.com/NXPmicro/mfgtools/releases에서 UUU 버전 1.4.243 이상을 다운로드한다.
4.2.2 Using UUU
i.MX 6, i.MX 7, i.MX 8 그리고 i.MX 9에서 UUU를 사용하려면, 아래 지침을 따른다:
- 다운로드 링크를 위해 컴퓨터에서 보드의 USB OTG/TYPE C(또는 보드에 따라 Micro-B) 포트로 USB 케이블을 연결한다.
- 콘솔 출력을 위해 OTG-to-UART 포트에서 컴퓨터로 USB 케이블을 연결한다.
- 터미널 에뮬레이터 프로그램을 실행한다. 이 문서의 "Section 3"을 참조한다.
- 부트핀을 시리얼 다운로드 모드로 설정한다. 이 문서의 "Section 4.5.11"을 참조한다.
i.MX 8ULP EVK에서 UUU를 사용하려면, 아래 지침을 따른다:
- 단일 부팅 이미지와 rootfs를 eMMC에 기록하려면, 다음 커맨드를 실행한다:
uuu -b emmc_all imx-boot-imx8ulpevk-sd.binflash_singleboot_m33 <rootfs.wic.zst>
- 단일 부팅 이미지를 FlexSPI2 NOR 플래시에 기록하려면, 다음 커맨드를 실행한다:
uuu -b qspi imx-boot-imx8ulpevk-fspi.binflash_singleboot_m33_flexspi
- 이중 부팅 이미지와 rootfs를 eMMC와 FlexSPI0 NOR 플래시에 기록하려면, 다음 단계를 수행한다:
- imx-boot-imx8ulpevk-sd.bin-flash_singleboot_m33, imx-boot-imx8ulpevk-sd.bin-flash_dualboot, imx-boot-imx8ulpevk-sd.bin-flash_dualboot_m33 그리고 <rootfs.wic>를 준비한다.
- 위 이미지의 파일 경로와 이름으로 UUU 스크립트 파일 uuu_8ulp_dual.auto를 업데이트한다.
- 'uuu mfgtools/scripts/samples/uuu_8ulp_dual.auto'를 실행한다.
UUU의 자세한 사용법은 github.com/NXPmicro/mfgtools/wiki를 참조한다.
예를 들어, 다음 커맨드는 eMMC에 rootfs.wic를 기록한다.
uuu -b emmc_all <bootloader> <rootfs.wic>
다음 커맨드는 zst 파일의 압축을 풀고 eMMC에 기록한다:
uuu -b emmc_all <bootloader> <rootfs.wic.zst/*>
다음 커맨드는 USB로 다운로드과 부트로더(SPL과 U-Boot)를 실행한다:
uuu -b spl <bootloader>
다음 커맨드는 eMMC로 기록한다(해당 릴리스 패키지에서 하나의 보드만 지원되고 보드가 eMMC 칩을 지원하는 경우):
uuu <release package>.zip
참고:
i.MX 8QuadXPlus B0의 경우, UUU는 32KB 오프셋으로 eMMC 이미지를 부트 파티션으로 플래시한다. 모든 eMMC 디바이스와 호환되지 않을 수 있다. eMMC fastboot 모드를 활성화하고 UUU 커널 버전 스크립트를 사용하여, eMMC 이미지를 오프셋 0인 부트 파티션에 플래시하는 것이 좋다.
4.3 Preparing an SD/MMC card to boot
이 섹션에서는 i.MX 보드를 부팅(boot up)하기 위해 Linux 호스트 머신에서 SD/MMC 카드를 준비하는 단계를 설명한다. 이 지침은 간결함을 위해 SD와 MMC 카드에 적용되며, 일반적으로 SD 카드로 설명한다.
Linux 이미지를 실행할 수 있으려면, 4개의 개별 부분이 필요하다:
- Linux OS 커널 이미지 (zImage, Image)
- 디바이스 트리 파일 (*.dtb)
- 부트로더 이미지
- 루트 파일 시스템 (예: EXT4)
Yocto Project 빌드는 직접 플래시할 수 있는 SD 카드 이미지를 생성한다. 이것은 하나의 커맨드로 필요한 모든 것을 카드에 로드하는 가장 간단한 방법이다.
.wic 이미지에는 SD 카드에 맞게 구성된 4개의 이미지가 모두 포함되어 있다. 릴리스에는 미리 빌드된 .wic 이미지가 포함되어 있다. 이것은 하나의 보드 구성에 대해 특별히 빌드된 것이다. 이것은 Wayland 그래픽 백엔드를 실행한다. U-Boot, 디바이스 트리 그리고 rootfs가 변경되지 않는 한, 다른 보드에서는 실행되지 않는다.
더 많은 유연성이 필요한 경우, 개별 컴포넌트를 별도로 로드할 수 있으며 해당 지침(instruction)도 여기에 포함된다. SD 카드는 개별 컴포넌트를 하나씩 로드하거나 .wic 이미지를 로드하고 개별 파트를 특정 컴포넌트로 덮어쓸 수 있다.
기본 .wic 이미지의 rootfs는 4GB 미만으로 제한되지만, rootfs를 다시 파티션닝하고 다시 로딩하면 카드의 용량까지 늘어날 수 있다. 사용되는 그래픽 백엔드를 지정하기 위해 rootfs를 변경할 수도 있다.
디바이스 트리 파일(.dtb)에는 커널에 대한 보드와 구성별 변경 사항이 포함되어 있다. 다른 i.MX 보드나 구성으로 커널을 변경하려면 디바이스 트리 파일을 변경해야 한다.
기본으로 릴리스는 SD 카드의 이미지에 대해 다음 레이아웃을 사용한다. 커널 이미지와 DTB는 SD 카드의 고정된 원시 주소 사용하지 않고 FAT 파티션을 사용하도록 이동(move)한다. 고정된 원시 주소가 필요한 경우, 사용자는 U-Boot 부트 환경을 변경해야 한다.
Table 1. Image layout
Start address (sectors) | Size (sectors) | Format | Description |
---|---|---|---|
0x400 bytes (2) | 0x9FFC00 바이트 (20478) |
RAW | i.MX 6과 i.MX 7 U-Boot, 그리고 예약 영역 |
0x8400 (66) | 0x9F7C00 (20414) | RAW | i.MX 8M Quad와 i.MX 8M Mini imx-boot 예약 영역 |
0x8000 (64) | 0x9F800 (20416) | RAW | i.MX 8QuadMax/8QuadXPlus/8M Nano/8M Plus/8DXL/8DualX/8ULP, i.MX 93 |
0xa00000 바이트 (20480) |
500 MB (1024000) | FAT | Kernel 이미지와 DTB |
0x25800000 바이트 (1228800) |
남은 공간 | Ext3/Ext4 | Rootfs |
4.3.1 Preparing the card
USB 카드 리더기와 같은 SD/MMC 카드 리더기가 필요하다. 이것은 부트로더와 커널 이미지를 전송하고 파티션 테이블을 초기화하고 루트 파일 시스템을 복사하는 데 사용된다. 지침을 단순화하기 위해, 4GB SD/MMC 카드가 사용된다고 가정한다.
모든 Linux 배포판은 다음 절차로 사용할 수 있다.
Linux 호스트에서 실행되는 Linux 커널은 SD/MMC 카드 리더기에 디바이스 노드를 할당한다. 커널은 디바이스 노드 이름을 결정하거나 udev 규칙을 사용할 수 있다. 다음 지침에서는 udev가 사용되지 않는다고 가정한다.
SD/MMC 카드에 할당된 디바이스 노드를 식별하려면, 다음 커맨드를 실행한다:
$ cat /proc/partitions
major minor #blocks name
8 0 78125000 sda
8 1 75095811 sda1
8 2 1 sda2
8 5 3028221 sda5
8 32 488386584 sdc
8 33 488386552 sdc1
8 16 3921920 sdb
8 18 3905535 sdb1
이 예제에서 할당된 디바이스 노드는 /dev/sdb이다(블럭은 1024바이트).
참고
디바이스 노드가 SD/MMC 카드에 대한 것이 맞는지 확인해야 한다. 그렇지 않으면, 운영 체제나 컴퓨터 데이터가 손상될 수 있다.
4.3.2 Copying the full SD card image
SD 카드 이미지(확장자 .wic 포함)에는 U-Boot, Linux 이미지와 디바이스 트리, 4GB SD 카드용 rootfs가 포함되어 있다. 유연성이 필요하지 않은 경우, 이미지는 하나의 커맨드로 SD 카드에 설치할 수 있다.
다음 커맨드를 실행하여, SD/MMC 카드에 SD 카드 이미지를 복사한다. 아래의 sdx를 SD 카드에서 사용하는 것과 일치하도록 변경해야 한다.
$ sudo dd if=<image name>.wic of=/dev/sdx bs=1M && sync
SD 카드의 전체 내용이 교체된다. SD 카드가 4GB보다 크면, 추가 공간에는 액세스할 수 없다.
4.3.3 Partitioning the SD/MMC card
전체 SD 카드 이미지에는 이미 파티션이 포함되어 있다. 이 섹션에서는 파티션을 수동으로 설정하는 방법을 설명한다. 부트로더, 커널 그리고 rootfs를 개별적으로 로드하려면, 이 작업을 수행해야 한다.
SD 카드를 파티션하는 다양한 방법이 있다. 기본적으로, 부트로더 이미지는 카드의 시작 부분에 있어야 하며, 그 뒤에 Linux 이미지와 디바이스 트리 파일이 있어야 한다. 이들은 별도의 파티션에 있을 수도 있고 그렇지 않을 수도 있다. 루트 파일 시스템은 Linux 섹션 다음에 시작하는 파티션에 있어야 한다. 각 섹션에 충분한 공간이 있는지 확인해야 한다. 아래 예제에서는 두 개의 파티션을 만든다.
대부분의 Linux 호스트 운영 체제에서, SD 카드는 장착 시 자동으로 마운트된다. 따라서 fdisk를 실행하기 전에, SD 카드가 이전에 마운트된 경우(sudo umount /dev/sdx를 사용해) 마운트 해제되었는지 확인해야 한다.
루트 권한으로 fdisk 실행을 시작한다. 위의 지침을 사용하여 카드 ID를 확인한다. 여기서는 sdx를 예로 사용하고 있다.
$ sudo fdisk /dev/sdx
다음 파라미터를 입력한다(각각 뒤에 <ENTER>가 있음):
p [lists the current partitions]
d [to delete existing partitions. Repeat this until no unnecessary partitions are reported by the 'p' command to start fresh.]
n [create a new partition]
p [create a primary partition - use for both partitions]
1 [the first partition]
20480 [starting at offset sector]
1024000 [ending position of the first partition to be used for the boot images]
p [to check the partitions]
n
p
2
1228800 [starting at offset sector, which leaves enough space for the kernel, the bootloader and its configuration data]
<enter> [using the default value will create a partition that extends to the last sector of the media]
p [to check the partitions]
w [this writes the partition table to the media and fdisk exits]
4.3.4 Copying a bootloader image
이 섹션에서는 전체 SD 카드 이미지를 사용하지 않고, 부트로더 이미지만 로드하는 방법을 설명한다. 다음 커맨드를 실행하여 U-Boot 이미지를 SD/MMC 카드에 복사한다.
$ sudo dd if=<U-Boot image> of=/dev/sdx bs=1k seek=<offset> conv=fsync
오프셋은 다음과 같다:
- 1 - i.MX 6이나 i.MX 7용
- 33 - i.MX 8QuadMax A0, i.MX 8QuadXPlus A0, 그리고 i.MX 8M Quad와 i.MX 8M Mini용
- 32 - for i.MX 8QuadXPlus B0, i.MX 8QuadMax B0, i.MX 8DualX, i.MX 8DXL, i.MX 8M Nano, i.MX 8M Plus, i.MX 8ULP 그리고 i.MX 9용
파티션 테이블을 포함하는 SD/MMC 카드의 처음 16KB는 예약되어 있다.
4.3.5 Copying the kernel image and DTB file
이 섹션에서는 전체 SD 카드 이미지를 사용하지 않고, 커널 이미지와 DTB를 로드하는 방법을 설명한다. 미리 빌드된 SD 카드 이미지는 커널 이미지와 DTB를 저장하기 위해 VFAT 파티션을 사용한다. 그리고 Linux 드라이브로 마운트되고 파일을 복사하는 데 VFAT 파티션이 필요하다. 이는 선호되는 방법이다.
사용할 수 있는 또 다른 방법은 사용자가 dd 커맨드를 사용하여 커널 이미지와 DTB를 SD 카드의 고정된 원시 주소에 넣는 것이다. 이 방법은 커널 이미지와 DTB를 로드하기 위해 U-Boot 기본 환경 변수를 수정해야 한다.
기본 값: VFAT 파티션
- 다음 커맨드를 사용하여, VFAT로 카드의 파티션 1을 포맷한다:
$ sudo mkfs.vfat /dev/sdx1
- 다음 커맨드를 사용하여, 포맷된 파티션을 마운트한다:
$ mkdir mountpoint
$ sudo mount /dev/sdx1 mountpoint
- cp를 사용하여 zImage와 *.dtb 파일을 mountpoint에 복사한다. 디바이스 트리 이름은 U-Boot에서 지정한 변수가 사용하는 이름과 일치해야 한다. 다음 커맨드로 파티션을 마운트 해제한다:
$ sudo umount mountpoint
대안: 미리 정의된 원시 주소
다음 커맨드를 사용하여 커널 이미지를 SD/MMC 카드에 복사할 수 있다:
i.MX 6과 i.MX7의 경우, 다음 커맨드를 사용:
$ sudo dd if=zImage_imx_v7_defconfig of=/dev/sdx bs=512 seek=2048 conv=fsync
i.MX 8의 경우, 다음 커맨드를 사용:
$ sudo dd if=Image-imx8qmsabreauto.bin of=/dev/sdx bs=512 seek=2048 conv=fsync
각각 미디어의 오프셋 1MB(bs x seek = 512 x 2048 = 1 MB)로 커널을 복사한다. zImage_imx_v7_defconfig 파일은 i.MX 6과 i.MX 7 SoC를 모두 지원하는 imx_v7_defconfig 구성 파일을 사용할 때 생성되는 zImage 파일을 가리킨다.
i.MX DTB 이미지는 복사 커맨드를 사용하여 파일을 두 번째 파티션에 복사하거나 dd 커맨드를 사용하여 i.MX DTB 이미지를 SD/MMC 카드에 복사할 수 있다.
보드에 해당하는 커맨드를 선택해야 한다:
$ sudo dd if=zImage-imx6qp-sabreauto.dtb of=/dev/sdx bs=512 seek=20480 conv=fsync
$ sudo dd if=zImage-imx6qp-sabresd.dtb of=/dev/sdx bs=512 seek=20480 conv=fsync
$ sudo dd if=zImage-imx6q-sabreauto.dtb of=/dev/sdx bs=512 seek=20480 conv=fsync
$ sudo dd if=zImage-imx6q-sabresd.dtb of=/dev/sdx bs=512 seek=20480 conv=fsync
$ sudo dd if=zImage-imx6sl-evk.dtb of=/dev/sdx bs=512 seek=20480 conv=fsync
$ sudo dd if=zImage-imx7d-sdb.dtb of=/dev/sdx bs=512 seek=20480 conv=fsync
i.MX 6과 i.MX 7의 경우, 다음 커맨드를 사용하여 i.MX 6UltraLite EVK와 i.MX 6ULL EVK 같은 보드에 커널 이미지를 복사할 수 있다:
$ sudo dd if=zImage-imx6ul-14x14-evk.dtb of=/dev/sdx bs=512 seek=20480 conv=fsync
$ sudo dd if=zImage-imx6ull-14x14-evk.dtb of=/dev/sdx bs=512 seek=20480 conv=fsync
i.MX 6과 i.MX 7의 경우, 보드별 .dtb 파일을 미디어의 오프셋 10MB(bs x seek = 512 x 20480 = 10 MB)에 복사한다.
4.3.6 Copying the root file system (rootfs)
이 섹션에서는 전체 SD 카드 이미지를 사용하지 않고, rootfs 이미지를 로드하는 방법을 설명한다.
대상 파일 시스템을 rootfs만 포함하는 파티션에 복사한다. 이 예에서는 rootfs로 파티션 2를 사용한다. 먼저, 파티션을 포맷한다. 파일 시스템 ext3나 ext4 형식은 내장된 저널링으로 이동식 미디어에 적합한 선택 사항이다. sdx를 구성에 사용 중인 파티션으로 변경한다.
$ sudo mkfs.ext3 /dev/sdx2
Or
$ sudo mkfs.ext4 /dev/sdx2
대상 파일 시스템을 파티션에 복사한다:
$ mkdir /home/user/mountpoint
$ sudo mount /dev/sdx2 /home/user/mountpoint
rootfs 패키지를 디렉터리로 추출한다(예: imx-image-multimedia-imx7ulpevk.tar.zst를 /home/user/rootfs로 추출):
$ cd /home/user/rootfs
$ tar -jxvf imx-image-multimedia-imx7ulpevk.tar.zst
rootfs 디렉토리는 수동으로 생성해야 한다.
루트 파일 시스템 파일이 이전 단계에서와 같이 /home/user/rootfs에 있다고 가정한다:
$ cd /home/user/rootfs
$ sudo cp -a * /home/user/mountpoint
$ sudo umount /home/user/mountpoint
$ sync
이제 파일 시스템 내용이 미디어에 있다.
참고:
rootfs의 크기에 따라 파일 시스템을 복사하는 데 몇 분이 걸린다.
4.4 Downloading images
부트 디바이스에 이미 로드된 U-Boot 이미지를 사용하거나 Manufacturing Tool UUU를 사용하여 디바이스에 이미지를 다운로드할 수 있다. i.MX 보드와 통신하기 위해 터미널 프로그램을 사용한다.
4.4.1 Downloading images using U-Boot
다음 섹션에서는 U-Boot 부트로더를 사용하여 이미지를 다운로드하는 방법을 설명한다.
아래에 설명된 커맨드는 일반적으로 U-Boot를 사용할 때 유용하다. 추가적인 커맨드와 정보는 U-Boot 프롬프트에 help를 입력하여 찾을 수 있다.
U-Boot의 print 커맨드는 환경 변수 값을 확인하는 데 사용할 수 있다.
setenv 커맨드는 환경 변수 값을 설정하는 데 사용할 수 있다.
4.4.1.1 Flashing an Arm Cortex-M4 image on QuadSPI
i.MX 6SoloX SABRE-SD, i.MX 7ULP EVK와 i.MX 7Dual SABRE-SD 보드에는 이미지를 플래시하는 데 사용할 수 있는 Arm Cortex-M4 프로세서와 QuadSPI 메모리가 있다.
참고:
i.MX 7ULP의 전체 기능을 활성화하려면, Arm Cortex-M4 이미지를 QuadSPI에 저장한다. MFGTool 스크립트 uuu LF5.15.71_2.2.0_images_ MX7ULPEVK.zip\uuu_sd_m4.auto를 사용하여 BSP와 Arm Cortex-M4 이미지를 저장하는 것이 좋다.
i.MX U-Boot는 i.MX 7Dual SABRESD와 i.MX 6SoloX SABRE-SD에서 레퍼런스 스크립트를 제공하여, SD 카드에서 Arm Cortex-M4 이미지를 플래시한다. 스크립트를 실행하려면 다음 단계를 수행한다:
- Arm Cortex-M4 이미지를 부트 SD 카드의 첫 VFAT 파티션에 복사한다. 파일 이름을 m4_qspi.bin로 지정한다.
- SD 카드에서 부팅한다.
- SD 카드의 Arm Cortex-M4 이미지를 i.MX 6SoloX SABRE-SD 보드의 QuadSPI2 PortB CS0 또는 i.MX 7Dual SABRE-SD 보드의 QuadSPI1 PortA CS0 오프셋 1MB의 NOR 플래시로 플래시한다.
U-Boot > run update_m4_from_sd
또는 사용자는 다음 단계를 수행하여 TFTP에서 Arm Cortex-M4 이미지를 플래시할 수 있다:
- SD 카드에서 부팅한다.
- Arm Cortex-M4 이미지 TFTP.
U-Boot > tftp ${loadaddr} m4_qspi.bin
- i.MX 6SoloX SABRE-SD 보드의 QuadSPI2 PortB CS0에서 NOR 플래시를 선택한다.
U-Boot > sf probe 1:0
i.MX 7Dual SABRE-SD 보드와 i.MX 7ULP EVK 보드의 QuadSPI1 PortA CS0에서 NOR 플래시를 선택한다.
U-Boot > sf probe 0:0
- 선택한 NOR 플래시에 Arm Cortex-M4 이미지를 플래시한다. 지우기 크기는 ${filesize}이며, 약 64KB이다. 이 예에서는 128KB라고 가정한다.
U-Boot > sf erase 0x0 0x20000 U-Boot > sf write ${loadaddr} 0x0 ${filesize}
i.MX 7Dual SABRE-SD는 Arm Cortex-M4 이미지를 1MB 오프셋으로 프로그램해야 한다. 처음 1MB는 QuadSPI의 U-Boot 이미지에서 사용하기 때문이다.
U-Boot > sf erase 0x100000 0x20000 U-Boot > sf write ${loadaddr} 0x100000 ${filesize}
참고:
i.MX 7Dual SABRE-SD에서, QuadSPI의 Arm Cortex-M4 이미지는 U-Boot 이미지가 QuadSPI에서 U-Boot에 의해 부팅된 대상 mx7dsabresd_qspi1_defconfig에 의해 빌드된 경우에만 지원된다.
i.MX 7Dual SABRESD 보드의 기본 U-Boot는 SD 카드의 Cortex-M4 이미지를 사용하고 OCRAM에서 실행한다.
i.MX 7ULP EVK에서 Arm Cortex-M4 이미지를 프로그래밍해야 한다. 그렇지 않으면 부팅되지 않는다.
4.4.1.2 Downloading an image to MMC/SD
이 섹션에서는 부팅에 사용된 카드가 아닌 다른 MMC/SD 카드에 U-Boot를 다운로드하는 방법을 설명한다.
MMC/SD 카드를 SD 카드 슬롯에 장착한다. 이것은 i.MX 6 SABRE에서 SD3, i.MX 6UltraLite EVK와 i.MX 6ULL EVK에서 SD2, i.MX 7Dual SABRE-SD와 i.MX 7ULP EVK(MicroSD)에서 SD1, i.MX 8QuadMax MEK, 8QuadXPlus MEK 그리고 i.MX 8M Quad EVK에서 SD1이다.
참고
i.MX 7ULP의 전체 기능을 활성화하려면, Arm Cortex-M4 이미지를 QuadSPI에 기록(burn)해야 한다. MfgTool 스크립트 uuu LF5.15.71_2.2.0_images_MX7ULPEVK.zip\uuu_sd_m4.auto를 사용하여 BSP와 Arm Cortex-M4 이미지를 기록(burn)하는 것이 좋다.
i.MX 7ULP의 경우, Arm Cortext-M4 이미지를 QuadSPI에 기록(burn)하려면 다음 단계를 수행한다:
- Arm Cortext-M4 이미지를 SD 카드 vfat 파티션에 복사하고, SD 카드를 장착한 다음 U-Boot 콘솔로 부팅한다.
- U-Boot에서 Quad SPI를 찾고(probe하고), 이 Arm Cortext-M4 이미지를 위해 충분히 큰 크기의 QuardSPI 플래시 공간을 삭제한다.
U-Boot > sf probe U-Boot > sf erase 0x0 0x30000;
- Arm Cortext-M4 이미지(SD 카드의 첫 번째 vfat 파티션에 있는)를 메모리 주소로 읽는다. 여기서 Arm Cortext-M4 이미지 이름은 sdk20-app.img이다.
U-Boot > fatload mmc 0:1 0x62000000 sdk20-app.img;
- Arm Cortext-M4 이미지를 QuardSPI에 쓴다.
U-Boot > sf write 0x62000000 0x0 0x30000
원본 U-Boot를 플래시하려면, Section 4.3을 참조한다.
U-Boot 부트로더는 TFTP 서버에서 RAM으로 이미지를 다운로드하고 RAM에서 SD 카드로 저장할 수 있다. 이 작업을 위해, Ethernet 인터페이스가 사용되며 네트워크 통신을 위해 U-Boot 환경 변수가 초기화된다.
부트 미디어에는 전원을 켤 때 실행되는 U-Boot가 포함되어 있다. U-Boot 환경 변수 bootdelay의 값이 감소하기 전 그리고 시간이 초과 되기 전에 아무 키나 누른다. U-Boot 프롬프트를 표시하는 기본 설정은 3초이다.
- MMC/SD에 저장된 환경 변수를 기본값으로 정리하려면, U-Boot 콘솔에서 다음 커맨드를 실행한다:
U-Boot > env default -f -a U-Boot > saveenv U-Boot > reset
- 네트워크 통신을 위한 U-Boot 환경을 구성한다. 다음은 예제이다. 앞의 "#" 문자가 있는 라인은 주석이며 아무 효과도 없다.
U-Boot > setenv serverip <your TFTPserver ip> U-Boot > setenv bootfile <your kernel zImage/Image name on the TFTP server> U-Boot > setenv fdtfile <your dtb image name on the TFTP server>
MAC 주소가 포함되지 않은 경우, 사용자는 ethaddr 환경으로 가짜 MAC 주소를 설정할 수 있다.
U-Boot > setenv ethaddr 00:01:02:03:04:05 U-Boot > save
- zImage/Image를 TFTP 서버에 복사한다. 그런 다음 RAM에 다운로드한다:
U-Boot > dhcp
- MMC/SD 카드 정보를 조회한다.
U-Boot > mmc devU-Boot > mmcinfo
- mmc 커맨드의 사용법을 확인한다. blk#는 <the offset of read/write>/<block length of the card>와 같다. cnt는 <the size of read/write>/<block length of the card>와 같다.
U-Boot > help mmc mmc - MMC sub system Usage: mmc read addr blk# cnt mmc write addr blk# cnt mmc erase blk# cnt mmc rescan mmc part - lists available partition on current mmc device mmc dev [dev] [part] - show or set current mmc device [partition] mmc list - lists available devices
- ${loadaddr}의 RAM에 있는 커널 zImage/Image를 SD 카드로 프로그램한다. 예를 들어, 크기가 0x800000인 이미지를 ${loadaddr}에서 microSD 카드의 오프셋 0x100000에 저장하는 커맨드이다. MMC 파라미터 정의에 대해 다음 예를 참조한다.
blk# = (microSD Offset)/(SD block length) = 0x100000/0x200 = 0x800 cnt = (image Size)/(SD block length) = 0x800000/0x200 = 0x4000
이 예제에서는 커널 이미지가 0x800000와 같다고 가정한다. 커널 이미지가 0x800000를 초과하면, 이미지 길이를 늘린다. TFTP 커맨드를 실행한 후, U-Boot 환경 변수의 filesize는 전송된 바이트 수로 설정된다. 이것은 계산에 필요한 올바른 크기를 결정하기 위해 확인할 수 있다. 값을 보려면 U-Boot 커맨드 printenv를 사용한다.
U-Boot > mmc dev 2 0 U-Boot > tftpboot ${loadaddr} ${bootfile} ### Suppose the kernel zImage is less than 8M. U-Boot > mmc write ${loadaddr} 0x800 0x4000
- ${fdt_addr}의 RAM에 있는 dtb 파일을 microSD에 프로그램한다.
U-Boot > tftpboot ${fdt_addr} ${fdtfile} U-Boot > mmc write ${fdt_addr} 0x5000 0x800
- i.MX 6 SABRE 보드에서는 디스플레이로 HannStar LVDS를 사용하는, SD 카드의 rootfs를 사용해 시스템을 부팅할 수 있다. 커널 MMC 모듈은 이제 uSDHC 슬롯에 대해 고정된 mmcblk 인덱스를 사용한다. SD3 슬롯은 i.MX 6 SABRE 보드에서 mmcblk2를 사용하고, SD1 슬롯은 i.MX 7Dual SABRE-SD 보드에서 mmcblk0을 사용하고, SD2 슬롯은 i.MX 6UltraLite와 i.MX 6ULL EVK 보드에서 mmcblk1을 사용한다. SD1 슬롯은 i.MX 8 MEK와 i.MX 8M 보드에서 mmcblk1을 사용한다.
- 보드를 부팅한다.
U-Boot > setenv bootcmd_mmc 'run bootargs_base mmcargs;mmc dev; mmc read ${loadaddr} 0x800 0x4000; mmc read ${fdt_addr} 0x5000 0x800; bootz ${loadaddr} - ${fdt_addr}' U-Boot > setenv bootcmd 'run bootcmd_mmc' U-Boot > saveenv
4.4.1.3 Using eMMC
i.MX SABRE 보드, i.MX 8 MEK와 EVK 보드, i.MX 8M EVK 보드 그리고 i.MX 8ULP EVK 보드에는 eMMC 칩이 있다. i.MX 6 SABRE 보드의 SDHC4, i.MX 7Dual SABRE-SD 보드의 SDHC3, i.MX 8 MEK/EVK 보드와 i.MX 8M EVK 보드의 SDHC1 그리고 i.MX 8ULP EVK 보드의 SDHC0을 사용하여 액세스할 수 있다. i.MX 7ULP EVK 보드는 MicroSD 포트에서 eMMC 재작업도 지원한다. 다음 단계에서는 이 메모리 디바이스를 사용하는 방법을 설명한다.
참고
i.MX 7ULP의 전체 기능을 활성화하려면, Arm Cortex-M4 이미지를 QuadSPI에 저장(burn)한다. MfgTool 스트립트 uuu LF5.15.71_2.2.0_images_MX7ULPEVK.zip\uuu_sd_m4.auto를 사용하여 BSP와 Arm Cortex-M4 이미지를 저장(burn)하는 것이 좋다.
- U-Boot 콘솔에서 다음 커맨드를 실행하여, eMMC에 저장된 환경을 정리한다:
U-Boot > env default -f -a U-Boot > save U-Boot > reset
- 부트 핀을 구성한다. 보드의 전원을 켜고 필요에 따라 U-Boot 환경 변수를 설정한다. 예를 들어,
U-Boot > setenv serverip <your tftpserver ip> U-Boot > setenv bootfile <your kernel zImage/Image name on the tftp server> U-Boot > setenv fdtfile <your dtb image name on the tftp server> ### The user can set fake MAC address via ethaddr enviroment if the MAC address is not fused U-Boot > setenv ethaddr 00:01:02:03:04:05 U-Boot > save
- zImage를 TFTP 서버에 복사한다. 그런 다음 RAM에서 다운로드한다:
U-Boot > dhcp
- eMMC 칩에 대한 정보를 쿼리한다.
U-Boot > mmc dev U-Boot > mmcinfo
- mmc 커맨드의 사용법을 확인한다. blk#는 <the offset of read/ write>/<block length of the card>와 같다. cnt는 <the size of read/write>/<block length of the card>와 같다.
mmc read addr blk# cnt mmc write addr blk# cnt mmc erase blk# cnt mmc rescan mmc part - lists available partition on current mmc device mmc dev [dev] [part] - show or set current mmc device [partition] mmc list - lists available devices
- eMMC로 커널 zImage/Image를 프로그램한다. 예를 들어, 아래 커맨드는 ${loadaddr}에서 크기 0x800000의 이미지를 eMMC 칩의 오프셋 0x100000에 저장한다. 여기서는 0x800 =0x100000/0x200, 0x4000=0x800000/0x200 등식이 사용된다. 이 카드의 블럭 크기는 0x200이다. 이 예에서는 커널 이미지가 0x800000 바이트 미만이라고 가정한다. 커널 이미지가 0x800000를 초과하면, 이미지 길이를 확대한다.
### Select mmc dev 2 (USDHC4) on the i.MX 6 SABRESD board: U-Boot > mmc dev 2 0 ### Select mmc dev 1 (USDHC3) on the i.MX 7Dual SABRESD board: U-Boot > mmc dev 1 0 ### Select mmc dev 1 (USDHC2) on the i.MX 6UltraLite EVK board: U-Boot > mmc dev 1 0 ### Select mmc dev 0 (USDHC1) on the i.MX 7ULP EVK board: U-Boot > mmc dev 0 0 ### Select mmc dev 0 (eMMC0) on the i.MX 8QuadMax MEK, i.MX 8QuadXPlus MEK, i.MX 8M Quad, 8DualX, and 8DXL boards: U-Boot > mmc dev 0 0 ### select mmc dev 2 (USDHC3) on the i.MX 8M Mini EVK, i.MX 8M Nano EVK, and i.MX 8M Plus EVK: U-Boot > mmc dev 2 0 ### select mmc dev 0 (USDHC0) on the i.MX 8ULP EVK U-boot > mmc dev 0 ### Suppose kernel zImage is less than 8 MB: U-Boot > tftpboot ${loadaddr} ${bootfile} U-Boot > mmc write ${loadaddr} 0x800 0x4000
- RAM의 ${fdt_addr}에 있는 dtb 파일을 eMMC 칩에 프로그램한다.
U-Boot > tftpboot ${fdt_addr} ${fdtfile} U-Boot > mmc write ${fdt_addr} 0x5000 0x800
- 디스플레이로 HannStar LVDS를 사용하는, eMMC의 rootfs를 사용해 시스템을 부팅한다. 커널 MMC 모듈은 이제 USDHC 슬롯에 대해 고정된 mmcblk 인덱스를 사용한다. i.MX 6 SABRE 보드의 eMMC/SD4 슬롯은 mmcblk3이다. i.MX 8QuadMax MEK 보드, i.MX 8QuadXPlus MEK 보드 그리고 i.MX 8M Quad EVK 보드의 eMMC5.0은 mmcblk0이다. i.MX 7Dual SABRE 보드의 eMMC5.0/SD3 슬롯은 mmcblk2이다. eMMC는 i.MX 7Dual SABRE 보드에 장착되어 있지 않다.
U-Boot > setenv mmcboot 'run bootargs_base mmcargs; mmc dev 2; mmc read ${loadaddr} 0x800 0x4000; mmc read ${fdt_addr} 0x5000 0x800; bootz ${loadaddr} - ${fdt_addr} ' U-Boot > setenv bootcmd 'run mmcboot' U-Boot > saveenv
- 디스플레이로 CLAA WVGA 패널을 사용하는, eMMC의 rootfs를 사용해 시스템을 부팅한다:
- i.MX 6 보드의 경우
U-Boot > setenv mmcargs 'setenv bootargs ${bootargs} root=/dev/mmcblk3p2 rootwait rw video=mxcfb0:dev=lcd,CLAAWVGA, if=RGB565 ip=dhcp'
- i.MX 7Dual SABRE 보드의 경우
U-Boot > setenv mmcargs 'setenv bootargs ${bootargs} root=/dev/mmcblk2p2 rootwait rw video=mxcfb0:dev=lcd,CLAAWVGA, if=RGB565 ip=dhcp'
- i.MX 6 보드의 경우
- HDMI를 디스플레이로 사용하는, eMMC의 rootfs를 사용해 시스템을 부팅한다.
- i.MX 6 보드의 경우:
U-Boot > setenv mmcargs 'setenv bootargs ${bootargs} root=/dev/mmcblk3p2 rootwait rw video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24'
- i.MX 7Dual SABRE 보드의 경우:
U-Boot > setenv mmcargs 'setenv bootargs ${bootargs} root=/dev/mmcblk2p2 rootwait rw video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24'
- i.MX 8QuadMax/8QuadXPlus/8M Quad/8M Plus의 경우, 다음 디스플레이 커널 파라미터가 지원된다:
- 시스템 시작 이후 레거시 FB 에뮬레이션을 위한 특정 비디오 모드를 선택한다.
video=HDMI-A-{n}: {video_mode}
n은 1에서 시스템의 최대 HDMI 커넥터 수까지 설정할 수 있다. video_mode는 커넥터에 연결된 모니터가 지원하는 모드여야 한다. 예를 들면, video=HDMI-A-1:1920x1080@60. 커맨드에 파라미터가 없으면, 기본 값으로 시스템은 모니터에서 권장하는 비디오 모드를 사용한다. - 레거시 FB 에물레이션을 활성화나 비활성화한다.
drm_kms_helper.fbdev_emulation=0 or 1
0은 비활성화, 1은 활성화이다. 커맨드에 파라미터가 없으면, 기본 값으로 에물레이션이 활성화된다. - 레거시 FB 에뮬레이션 프레임 버퍼의 bpp(픽셀당 비트) 파라미터를 설정한다.
imxdrm.legacyfb_depth=16 or 24 or 32
커맨드에 파라미터가 없으면, 기본 값으로 bpp는 16이다.
- 시스템 시작 이후 레거시 FB 에뮬레이션을 위한 특정 비디오 모드를 선택한다.
- i.MX 6 보드의 경우:
rootfs를 MMC/SD 로 프로그램하려면, Section 4.4.2 또는 Section 4.3을 참조한다.
4.4.1.4 Flashing U-Boot on SPI-NOR from U-Boot
TFTPBoot를 사용하여 SPI-NOR에 직접 플래싱하는 것은 i.MX 6 SABRE-AI 보드로 제한된다. SPI-NOR에서 U-Boot를 플래시하려면, 다음 단계를 수행해야 한다:
- SD 카드에서 부팅한다.
- Jumper J3를 2-3 위치로 설정한다.
- 내장된 SPI-NOR 지원으로 U-Boot 이미지를 패치한다. 이 예제에서는 uboot.imx를 사용한다.
U-Boot > tftpboot ${loadaddr} u-boot.imx
- SPI-NOR에서 U-Boot 이미지를 플래시한다.
U-Boot > sf probe U-Boot > sf erase 0 0x80000 U-Boot > sf write ${loadaddr} 0x400 0x7FC00
- SABRE-AI의 SPI-NOR에서 부팅하도록 부트 스위치를 설정한다.
- S2-1 1
- S2-2 1
- S2-3 0
- S2-4 0
- S1-[1:10] X
- 대상 보드를 리부팅한다.
4.4.1.4.1 Flashing an Arm Cortex-M4 image on QuadSPI
i.MX 6SoloX SABRE-SD, i.MX 7ULP EVK 그리고 i.MX 7Dual SABRE-SD 보드에는 이미지를 플래시하는 데 사용할 수 있는 Arm Cortex-M4 프로세서와 QuadSPI 메모리가 있다.
참고
i.MX 7ULP의 전체 기능을 활성화하려면, QuadSPI에 Arm Cortex-M4 이미지를 저장(burn)한다. MFGTool 스크립트 uuu LF5.15.71_2.2.0_images_ MX7ULPEVK.zip\uuu_sd_m4.auto를 사용하여 BSP와 Arm Cortex-M4 이미지를 저장(burn)하는 것이 좋다.
- Arm Cortex-M4 이미지를 부트 SD 카드의 첫 번째 VFAT 파티션에 복사한다. 파일 이름을 m4_qspi.bin으로 지정한다.
- SD 카드에서 부팅한다.
- SD 카드의 Arm Cortex-M4 이미지를 i.MX 6SoloX SABRE-SD 보드의 QuadSPI2 PortB CS0 또는 i.MX 7Dual SABRE-SD 보드의 QuadSPI1 PortA CS0 오프셋 1MB의 NOR 플래시로 플래시한다.
U-Boot > run update_m4_from_sd
다른 방법으로, 사용자는 다음 단계를 수행하여 TFTP에서 Arm Cortex-M4 이미지를 플래시할 수 있다.
- SD 카드에서 부팅한다.
- Arm Cortex-M4 이미지를 TFTP 한다.
U-Boot > tftp ${loadaddr} m4_qspi.bin
- i.MX 6SoloX SABRE-SD 보드의 QuadSPI2 PortB CS0에서 NOR 플래시를 선택한다.
U-Boot > sf probe 1:0
i.MX 7Dual SABRE-SD 보드와 i.MX 7ULP EVK 보드의 QuadSPI1 PortA CS0에서 NOR 플래시를 선택한다.
U-Boot > sf probe 0:0
- 선택한 NOR 플래시에 Arm Cortex-M4 이미지를 플래시한다. 삭제 크기는 ${filesize}이며, 대략 64KB이다. 이 예에서는 128KB라고 가정한다.
U-Boot > sf erase 0x0 0x20000 U-Boot > sf write ${loadaddr} 0x0 ${filesize}
i.MX 7Dual SABRE-SD는 Arm Cortex-M4 이미지를 1MB 오프셋으로 프로그램한다. 처음 1MB는 QuadSPI에서 U-Boot 이미지로 사용되기 때문이다.
U-Boot > sf erase 0x100000 0x20000 U-Boot > sf write ${loadaddr} 0x100000 ${filesize}
참고
i.MX 7Dual SABRE-SD에서 QuadSPI의 Arm Cortex-M4이미지는 대상 mx7dsabresd_qspi1_defconfig에 의해 빌드되서 QuadSPI에서 U-Boot로 부팅되는 U-Boot 이미지의 경우에만 지원된다.
i.MX 7Dual SABRESD 보드의 기본 U-Boot는 SD 카드의 Cortex-M4 이미지를 사용하고 OCRAM에서 실행한다.
i.MX 7ULP EVK에서 Arm Cortex-M4 이미지를 프로그램한다. 그렇지 않으면 부팅되지 않는다.
4.4.1.5 Flashing U-Boot on Parallel NOR from U-Boot
TFTPBoot를 사용하여 Parallel NOR로 직접 플래싱하는 것은 i.MX 6 SABRE-AI 보드로 제한된다. Parallel NOR에서 U-Boot를 플래시하려면, 다음 단계를 수행한다:
- Jumper J3 을 확인한다. 핀 2와 3 사이에 있으면 안된다.
- EIM NOR 버전으로 SD U-Boot를 업데이트한다. 커맨드에 대한 자세한 내용은 Section 4.3.4를 참조한다. 그런 다음 SD 카드에서 부팅한다.
- U-Boot 이미지를 TFTP한다.
tftpboot ${loadaddr} u-boot.imx
- U-Boot 이미지를 플래시한다.
cp.b ${loadaddr} 0x08001000 ${filesize}
- 부트 스위치를 변경하고 리부팅한다.
S2 all 0 S1-6 1 others 0
- 기본적으로 rootfs는 NFS에 마운트된다.
4.4.2 Using an i.MX board as the host server to create a rootfs
Linux OS는 스토리지 디바이스에 이미지를 프로그램하는 여러 가지 방법을 제공한다. 이 섹션에서는 Linux 호스트 서버로 i.MX 플랫폼을 사용하여, MMC/SD 카드나 SATA 디바이스에 rootfs를 만드는 방법을 설명한다. 다음은 SD 카드의 예이다. 디바이스 파일 노드 이름은 SATA 디바이스의 경우 변경해야 한다.
- NFS 또는 다른 스토리지에서 부팅한다. SD 카드의 디바이스 ID를 확인한다. mmcblk* 또는 sd*일 수 있다(인덱스는 USDHC 컨트롤러 인덱스로 결정된다). 다음 커맨드로 파티션 정보를 확인한다:
$ cat /proc/partitions
- MMC/SD 카드에 파티션을 생성하려면, Linux 콘솔에서 fdisk 커맨드(root 권한이 필요)를 사용한다:
root@ ~$ sudo fdisk /dev/$SD
위의 $SD를 디바이스 이름으로 변경한다. - 새로운 SD 카드인 경우, 다음 메세지가 표시될 수 있다:
The device contains neither a valid DOS partition table, nor Sun, SGI or OSF disk label Building a new DOS disklabel. Changes will remain in memory only, until you decide to write them. After that the previous content won't be recoverable. The number of cylinders for this disk is set to 124368. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK)
카드를 파티셔닝하기 위한 일반적인 프롬프트와 커맨드는 다음과 같다. 굵은 글씨체의 텍스트(p)는 사용자가 입력하는 내용을 나타낸다.
Command (m for help): p Disk /dev/sdd: 3965 MB, 3965190144 bytes 4 heads, 32 sectors/track, 60504 cylinders, total 7744512 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00080bff Device Boot Start End Blocks Id System
- Section 4.6에서 설명한 것처럼, rootfs 파티션은 커널 이미지 뒤에 위치해야 한다. 처음부터 0x800000 바이트는 MBR, 부트로더 그리고 커널 섹션용으로 예약될 수 있다. 위에 보여지는 로그에서 현재 MMC/SD 카드의 Units은 32768 바이트이다. 첫 번째 파티션의 시작 실린더는 "0x300000/32768 = 96"으로 설정할 수 있다. 마지막 실린더는 rootfs 크기에 따라 설정할 수 있다. 굵게 표시된 문자를 입력하여 새 파티션을 만든다:
Command (m for help): n e extended p primary partition (1-4) Select (default p): p Partition number (1-4): 1 First cylinder (1-124368, default 1): 96 Last cylinder or +size or +sizeM or +sizeK (96-124368, default 124368): Using default value 124368 Command (m for help): w The partition table has been altered! Calling ioctl() to re-read $SD partition table
- 파티션 이름을 확인하려면 partitions(위 참조)을 확인한다. 여기서 $PARTITION은 포맷할 파티션을 나타내는 데 사용된다. MMC/SD 파티션을 ext3나 ext4 유형으로 포맷한다. 예를 들어, ext3를 사용하려면 다음과 같이 사용한다:
root@ ~$ mkfs.ext3 /dev/$PARTITION mke2fs 1.42 (29-Nov-2011) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 248992 inodes, 994184 blocks 49709 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=1019215872 31 block groups 32768 blocks per group, 32768 fragments per group 8032 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736 Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 20 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
- rootfs의 내용을 MMC/SD 카드에 복사한다. 이름은 아래에 사용된 이름과 다를 수 있다. 원하는 rootfs의 디렉토리를 확인한다. (*.ext2를 NFS rootfs에 복사)
mkdir /mnt/tmpmnt mount -t ext3 -o loop /imx-image-multimedia.ext3 /mnt/tmpmnt cd /mnt mkdir mmcblk0p1 mount -t ext3 /dev/$PARTITION /mnt/mmcblk0p1 cp -af /mnt/tmpmnt/* /mnt/mmcblk0p1/ umount /mnt/mmcblk0p1 umount /mnt/tmpmnt
- sync를 입력하여 내용을 MMC/SD에 저장한다.
- poweroff를 입력하여 시스템 전원을 끈다. Section 4.7의 지침에 따라 MMC/SD 카드에서 이미지를 부팅한다.
참고
기본적으로, v2013.04와 이후 버전의 U-Boot는 fatload 커맨드를 사용하여 SD/MMC vfat 파티션에서 커널 이미지와 DTB 파일 로드를 지원한다. 이 기능을 사용하려면, 다음 단계를 수행한다:
- SD/MMC 카드의 첫 번째 파티션(예: 50MB)을 vfat 파일 시스템으로 포맷한다.
- VFAT 파티션을 호스트 컴퓨터에 마운트한 후, zImage와 DTB 파일을 VFAT 파티션에 복사한다.
- zImage와 DTB 파일 이름이 U-Boot 환경 변수(fdtfile과 image)가 가리키는 파일 이름과 동기화되었는지 확인한다. U-Boot에서 print 커맨드를 사용하여 이 두 환경 변수를 표시한다. 예를 들어:
print fdtfile image
- SD/MMC 카드에서 부팅할 때, U-Boot는 VFAT 파티션에서 커널 이미지와 DTB 파일을 자동으로 로드한다.
다음은 첫 번째 파티션을 50MB vfat 파일 시스템으로 포맷하고, 두 번째 파티션을 ext4 파일 시스템으로 포맷하는 예이다.
~$ fdisk /dev/sdb
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-30318591, default 2048): 4096
Last sector, +sectors or +size{K,M,G} (4096-30318591, default 30318591): +50M
Command (m for help): p
Disk /dev/sdb: 15.5 GB, 15523119104 bytes
64 heads, 32 sectors/track, 14804 cylinders, total 30318592 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x3302445d
Device Boot Start End Blocks Id System
/dev/sdb1 4096 106495 51200 83 Linux
Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): p
Partition number (1-4, default 2): 2
First sector (2048-30318591, default 2048): 106496
Last sector, +sectors or +size{K,M,G} (106496-30318591, default 30318591):
Using default value 30318591
Command (m for help): p
Disk /dev/sdb: 15.5 GB, 15523119104 bytes
64 heads, 32 sectors/track, 14804 cylinders, total 30318592 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x3302445d
Device Boot Start End Blocks Id System
/dev/sdb1 4096 106495 51200 83 Linux
/dev/sdb2 106496 30318591 15106048 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
~$ mkfs.vfat /dev/mmcblk0p1
~$ mkfs.ext4 /dev/mmcblk0p2
4.5 How to boot the i.MX boards
부팅을 지원하는 디바이스 중 하나로 U-Boot가 로드(저장)되어 있으면, DIP 스위치를 사용하여 해당 디바이스에서 부팅할 수 있다. i.MX 보드의 부트 모드는 보드의 부트 구성 DIP 스위치로 컨트롤된다. 부트 구성 스위치를 찾는 데 도움이 필요하다면, 위의 References 아래에 나열된 특정 보드에 대한 빠른 시작 가이드를 참조한다.
다음 섹션에는 기본적인 부트 설정 구성이 나와 있다. 아래 테이블은 지정된 보드의 스위치 블럭에 대한 DIP 스위치 설정을 나타낸다. X는 특정 스위치 설정이 해당 작업에 영향을 미치지 않음을 의미한다.
4.5.1 Booting from an SD card in slot SD1
아래 테이블은 i.MX 7Dual SABRE-SD 보드에서 SD1이라고 표시된 SD 카드 슬롯에서 부팅하기 위한 DIP 스위치 설정을 보여준다.
Table 2. Booting from SD1 on i.MX 7Dual SABRE-SD
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
SW2 | OFF | OFF | ON | OFF | OFF | OFF | OFF | OFF |
SW3 | ON | OFF | - | - | - | - | - | - |
아래 테이블은 i.MX 7ULP EVK 보드에서 SD1이라고 표시된 SD 카드 슬롯에서 부팅하기 위한 DIP 스위치 설정을 보여준다.
Table 3. Booting from SD1 on i.MX 7ULP EVK
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
SW1 | ON | OFF | OFF | ON |
아래 테이블은 i.MX 8QuadMax MEK 보드에서 SD1이라고 표시된 SD 카드 슬롯에서 부팅하기 위한 bootcfg 핀 설정을 보여준다.
Table 4. Booting from SD1 on i.MX 8QuadMax MEK
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
SW2 | OFF | OFF | ON | ON | OFF | OFF | - | - |
아래 테이블은 i.MX 8QuadXPlus MEK 보드에서 SD1이라고 표시된 SD 카드 슬롯에서 부팅하기 위한 bootcfg 핀 설정을 보여준다.
참고 : 이는 i.MX 8DualX MEK와 i.MX 8DXL EVK 보드에 대해 동일한 설정이다.
Table 5. Booting from SD1 on i.MX 8QuadXPlus MEK
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
SW2 | ON | ON | OFF | OFF |
4.5.2 Booting from an SD card in slot SD2
SD2라고 표시된 SD 카드 슬롯은 프로세서의 uSDHC 핀 SD2에 연결되어 있다는 것을 나타낸다. 대부분의 보드에서는 이 슬롯을 SD2로 표시한다. 이 문서에서 이 슬롯은 SD2라고 한다.
아래 테이블은 i.MX 6 SABRE-SD 보드의 SD2와 J500이라고 표시된 SD 카드 슬롯에서 부팅하기 위한 DIP 스위치 설정을 보여준다. SD 카드 슬롯은 보드 뒷면의 LVDS1 연결부 옆에 있다.
Table 6. Booting from SD2 (J500) on i.MX 6 SABRE-SD
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
SW6 | ON | OFF | OFF | OFF | OFF | OFF | ON | OFF |
i.MX 6UltraLite EVK 보드나 i.MX 6ULL EVK 보드에는 CPU 보드에 하나의 TF 카드 슬롯이 있다. 이 슬롯은 USDHC2 컨트롤러를 사용한다. 아래 테이블은 TF 슬롯에서 부팅하기 위한 DIP 스위치 설정을 보여준다.
Table 7. Booting from TF on i.MX 6UltraLite EVK and i.MX 6ULL EVK
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
SW601 | OFF | OFF | ON | OFF |
SW602 | ON | OFF | - | - |
i.MX 8M Quad EVK 보드에는 하나의 TF 카드 슬롯이 있다. 이 슬롯은 USDHC2 컨트롤러를 사용한다. 아래 테이블은 TF 슬롯에서 부팅하기 위한 DIP 스위치 설정을 보여준다.
Table 8. Booting from TF on i.MX 8M Quad EVK
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
SW801 | ON | ON | OFF | OFF |
SW802 | ON | OFF | - | - |
i.MX 8M Mini EVK 보드에는 하나의 TF 카드 슬롯이 있다. 이 슬롯은 USDHC2 컨트롤러를 사용한다. 아래 테이블은 TF 슬롯에서 부팅하기 위한 DIP 스위치 설정을 보여준다.
Table 9. Booting from TF on i.MX 8M Mini EVK
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
SW1101 | OFF | ON | OFF | OFF | OFF | ON | ON | OFF |
SW1102 | OFF | OFF | ON | ON | OFF | ON | OFF | OFF |
i.MX 8M Nano EVK 보드에는 하나의 TF 카드 슬롯이 있다. 이 슬롯은 USDHC2 컨트롤러를 사용한다. 아래 테이블은 TF 슬롯에서 부팅하기 위한 DIP 스위치 설정을 보여준다.
Table 10. Booting from TF on i.MX 8M Nano EVK
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
SW1101 | ON | ON | OFF | OFF |
i.MX 8M Plus EVK 보드에는 하나의 TF 카드 슬롯이 있다. 이 슬롯은 USDHC2 컨트롤러를 사용한다. 아래 테이블은 TF 슬롯에서 부팅하기 위한 DIP 스위치 설정을 보여준다.
Table 11. Booting from TF on i.MX 8M Plus EVK
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
SW4 | OFF | OFF | ON | ON |
아래 테이블은 USDHC2 슬롯에서 부팅하기 위한 DIP 스위치 설정을 보여준다.
Table 12. Booting from USDHC2 on i.MX 93 11x11 EVK
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
SW1301 | OFF | ON | OFF | OFF |
4.5.3 Booting from an SD card in slot SD3
SD3이라고 표시된 SD 카드 슬롯은 프로세서의 uSDHC 핀 SD3에 해당 슬롯이 연결되어 있다는 것을 나타낸다. 대부분의 보드는 이 슬롯을 SD3로 표시한다. 이 슬롯은 이 문서에서 SD3이라고 한다.
아래 테이블은 i.MX 6 SABRE-AI 보드의 SD3 슬롯에 있는 SD 카드에서 부팅하기 위한 DIP 스위치 설정을 보여준다.
Table 13. Booting from an SD card in slot SD3 on i.MX 6 SABRE-AI
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 |
---|---|---|---|---|---|---|---|---|---|---|
S1 | X | X | X | OFF | ON | X | X | X | X | X |
S2 | - | OFF | ON | OFF | - | - | - | - | - | - |
S3 | OFF | OFF | ON | OFF | - | - | - | - | - | - |
아래 테이블은 i.MX 6SoloX SABRE-AI 보드의 SD3 슬롯에 있는 SD 카드에서 부팅하기 위한 DIP 스위치 설정을 보여준다.
Table 14. Booting from an MMC card in Slot SD3 on i.MX 6SoloX SABRE-AI
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
S4 | OFF | ON | OFF | X | OFF | OFF | ON | OFF |
S3 | X | OFF | OFF | OFF | ON | ON | OFF | OFF |
S1 | OFF | OFF | ON | OFF | - | - | - | - |
아래 테이블은 SD3(J507로 레이블된)에서 부팅하기 위한 DIP 스위치 설정을 보여준다. SD3 슬롯은 HDMI와 UART 포트 사이에 있다.
Table 15. Booting from an SD card in slot SD3 on i.MX 6 SABRE-SD
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
SW6 | OFF | ON | OFF | OFF | OFF | OFF | ON | OFF |
4.5.4 Booting from an SD card in slot SD4
아래 테이블은 슬롯 SD4에서 SD 카드로 부팅하기 위한 DIP 스위치 설정을 설명한다.
SD4 슬롯은 SoloX 보드 가장자리 중앙에 있다.
Table 16. Booting from an SD card in slot SD4 on i.MX 6SoloX SABRE-SD
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
SW10 | OFF | OFF | OFF | OFF | OFF | OFF | OFF | OFF |
SW11 | OFF | OFF | ON | ON | ON | OFF | OFF | OFF |
SW12 | OFF | ON | OFF | OFF | OFF | OFF | OFF | OFF |
Table 17. Booting from an MMC card in slot SD4 on i.MX 6SoloX SABRE-SD
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
SW10 | OFF | OFF | OFF | OFF | OFF | OFF | OFF | OFF |
SW11 | OFF | OFF | ON | ON | ON | OFF | OFF | OFF |
SW12 | OFF | ON | ON | OFF | OFF | OFF | OFF | OFF |
4.5.5 Booting from eMMC
eMMC 4.4는 i.MX 6 프로세서의 SD4 핀에 연결하여 보드에 영구적으로 장착된 칩이다. 스위치 설정에 대한 자세한 내용은 IC 레퍼런스 매뉴얼의 "MMC/eMMC Boot Fusemap" 테이블을 참조한다.
아래 테이블은 i.MX 6 SABRE-SD 보드의 eMMC4.4(SDIN5C2-8G)에서 부팅하기 위한 부트 스위치 설정을 보여준다.
Table 18. Booting from eMMC on i.MX 6 SABRE-SD
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
SW6 | ON | ON | OFF | ON | OFF | ON | ON | OFF |
i.MX 7Dual은 i.MX 6과 다르다. eMMC는 i.MX 7Dual 프로세서의 SD3 핀에 연결하여 사용한다.
Table 19. Booting from eMMC on i.MX 7Dual SABRE-SD
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
SW2 | OFF | ON | OFF | ON | OFF | OFF | OFF | OFF |
SW3 | ON | OFF | - | - | - | - | - | - |
아래 테이블은 i.MX 7ULP EVK 보드의 eMMC4.4에서 부팅하기 위한 부트 스위치 설정을 보여준다.
Table 20. Booting from eMMC on i.MX 7ULP EVK
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
SW1 | ON | OFF | OFF | OFF |
아래 테이블은 i.MX 8QuadMax MEK 보드의 eMMC5.0에서 부팅하기 위한 부트 스위치 설정을 보여준다.
Table 21. Booting from eMMC on i.MX 8QuadMax MEK
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
SW2 | OFF | OFF | OFF | ON | OFF | OFF | - | - |
아래 테이블은 i.MX 8QuadXPlus MEK 보드의 eMMC5.0에서 부팅하기 위한 부트 스위치 설정을 보여준다.
참고
이는 8DXL EVK가 SW1을 사용한다는 점을 제외하면, i.MX 8DualX MEK와 i.MX 8DXL EVK 보드에 대해 동일한 설정이다.
Table 22. Booting from eMMC on i.MX 8QuadXPlus MEK
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
SW2 | OFF | ON | OFF | OFF |
아래 테이블은 i.MX 8M Quad EVK 보드의 eMMC5.0에서 부팅하기 위한 부트 스위치 설정을 보여준다.
Table 23. Booting from eMMC on i.MX 8M Quad EVK
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
SW801 | OFF | OFF | ON | OFF |
아래 테이블은 i.MX 8M Mini EVK 보드의 eMMC5.1에서 부팅하기 위한 부트 스위치 설정을 보여준다.
Table 24. Booting from eMMC on i.MX 8M Mini EVK
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
SW1101 | OFF | ON | ON | ON | OFF | OFF | ON | OFF |
SW1102 | OFF | OFF | OFF | OFF | ON | OFF | ON | OFF |
아래 테이블은 i.MX 8M Nano EVK 보드의 eMMC5.1에서 부팅하기 위한 부트 스위치 설정을 보여준다.
Table 25. Booting from eMMC on i.MX 8M Nano EVK
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
SW1101 | OFF | ON | OFF | OFF |
아래 테이블은 i.MX 8M Plus EVK 보드의 eMMC5.1에서 부팅하기 위한 부트 스위치 설정을 보여준다.
Table 26. Booting from eMMC on i.MX 8M Plus EVK
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
SW4 | OFF | OFF | OFF | ON |
아래 테이블은 i.MX 8ULP EVK의 eMMC5.1에서 부팅하기 위한 부트 스위치 설정을 보여준다.
Table 27. Singleboot booting from eMMC on i.MX 8ULP EVK
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
SW5 | OFF | OFF | OFF | OFF | OFF | OFF | OFF | ON |
Table 28. Dualboot booting from eMMC for A35 on i.MX 8ULP EVK
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
SW5 | OFF | ON | OFF | OFF | OFF | OFF | OFF | ON |
Table 29. Booting from eMMC for i.MX 93 11x11 EVK
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
SW1301 | OFF | OFF | OFF | OFF |
4.5.6 Booting from SATA
아래 스위치 설정은 SATA에서 부팅을 활성화한다.
SATA 부팅은 i.MX 6Quad/6QuadPlus SABRE 보드에서만 지원된다.
Table 30. Booting from SATA on i.MX 6 SABRE-SD
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
SW6 | OFF | OFF | OFF | OFF | OFF | ON | OFF | OFF |
4.5.7 Booting from NAND
아래 테이블은 i.MX 6 SABRE-AI 보드의 NAND에서 부팅하는 데 필요한 DIP 스위치 설정을 보여준다.
Table 31. Booting from NAND on i.MX 6 SABRE-AI
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 |
---|---|---|---|---|---|---|---|---|---|---|
S1 | OFF | OFF | OFF | ON | OFF | OFF | OFF | OFF | OFF | OFF |
S2 | OFF | OFF | OFF | ON | - | - | - | - | - | - |
S3 | OFF | OFF | ON | OFF | - | - | - | - | - | - |
아래 테이블은 i.MX 7Dual SABRE-SD 보드의 NAND에서 부팅하는 데 필요한 DIP 스위치 설정을 보여준다.
Table 32. Booting from NAND on i.MX 7Dual SABRE-SD
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 |
---|---|---|---|---|---|---|---|---|---|---|
S2 | OFF | ON | ON | X | X | X | X | OFF | - | - |
S3 | ON | OFF | X | X | X | X | X | X | - | - |
아래 테이블은 i.MX 8M Mini DDR4 EVK 보드의 NAND에서 부팅하는 데 필요한 DIP 스위치 설정을 보여준다.
Table 33. Booting from NAND on i.MX 8M Mini DDR4 EVK
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 |
---|---|---|---|---|---|---|---|---|---|---|
S1101 | OFF | ON | OFF | OFF | OFF | OFF | OFF | ON | - | - |
S1102 | OFF | OFF | OFF | ON | ON | ON | ON | OFF | - | - |
4.5.8 Booting from SPI-NOR
핀 2와 3 사이의 J3에 점퍼를 배치하여, i.MX 6 SABRE-AI 보드의 SPI NOR에서 부팅을 활성화한다.
Table 34. Booting from SPI-NOR on i.MX 6 SABRE-AI
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 |
---|---|---|---|---|---|---|---|---|---|---|
S1 | X | X | X | X | X | X | X | X | X | X |
S2 | ON | ON | OFF | OFF | OFF | OFF | OFF | OFF | OFF | OFF |
S3 | OFF | OFF | ON | OFF | - | - | - | - | - | - |
4.5.9 Booting from EIM (Parallel) NOR
아래 테이블은 NOR에서 부팅하기 위한 DIP 스위치 설정을 보여준다.
Table 35. Booting from EIM NOR on i.MX 6 SABRE-AI
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 |
---|---|---|---|---|---|---|---|---|---|---|
S1 | X | X | X | OFF | OFF | ON | X | X | X | X |
S2 | X | OFF | OFF | OFF | - | - | - | - | - | - |
S3 | OFF | OFF | ON | OFF | - | - | - | - | - | - |
참고
SPI와 EIM NOR는 i.MX 6 SABRE-AI 보드에서 핀 충돌이 있다. 둘 다 동일한 구성으로 사용할 수 없다. 기본 U-Boot 구성은 SPI NOR로 설정된다.
4.5.10 Booting from QuadSPI or FlexSPI
아래 테이블에는 QuadSPI에서 부팅하기 위한 DIP 스위치 설정이 나열되어 있다.
Table 36. Booting from QuadSPI on i.MX 6SoloX SABRE-SD
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
SW10 | OFF | OFF | OFF | OFF | OFF | OFF | OFF | OFF |
SW11 | OFF | OFF | OFF | OFF | OFF | OFF | OFF | OFF |
SW12 | OFF | OFF | OFF | ON | ON | OFF | OFF | OFF |
Table 37. Booting from QuadSPI on i.MX 6SoloX SABRE-AI
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
SW4 | OFF | OFF | OFF | OFF | ON | OFF | OFF | OFF |
SW3 | OFF | OFF | OFF | OFF | OFF | OFF | OFF | OFF |
SW1 | OFF | OFF | ON | OFF | - | - | - | - |
Table 38. Booting from QuadSPI on i.MX 7Dual SABRE-SD
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
SW2 | ON | OFF | OFF | OFF | OFF | OFF | OFF | OFF |
SW3 | ON | OFF | - | - | - | - | - | - |
Table 39. Booting from QuadSPI on i.MX 6UltraLite EVK and i.MX 6ULL EVK
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
SW601 | OFF | OFF | OFF | OFF |
SW602 | ON | OFF | - | - |
Table 40. Booting from FlexSPI on i.MX 8QuadMax MEK
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
SW2 | OFF | OFF | OFF | ON | ON | OFF | - | - |
Table 41. Booting from FlexSPI on i.MX 8QuadXPlus MEK
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
SW2 | OFF | ON | ON | OFF |
Table 42. Booting from FlexSPI on i.MX 8M Mini LPDDR4 EVK
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
SW1101 | OFF | ON | OFF | OFF | OFF | OFF | OFF | OFF |
SW1102 | OFF | ON | OFF | OFF | OFF | OFF | OFF | ON |
Table 43. Booting from QuadSPI on i.MX Nano EVK
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
SW601 | OFF | OFF | OFF | OFF |
SW602 | ON | OFF | - | - |
Table 44. Booting from QuadSPI on i.MX 8M Plus EVK
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
SW4 | OFF | ON | ON | OFF |
Table 45. Singleboot booting from FlexSPI NOR on i.MX 8ULP EVK
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
SW5 | OFF | OFF | OFF | OFF | OFF | ON | OFF | ON |
Table 46. Dualboot booting from FlexSPI for A35 on i.MX 8ULP EVK
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
SW5 | OFF | ON | OFF | OFF | OFF | ON | OFF | ON |
4.5.11 Serial download mode for the Manufacturing Tool
i.MX 6 SABRE-SD에서 시리얼 다운로드 모드용으로 예약된 전용 부트 DIP 스위치는 없다. 시리얼 다운로드 모드로 들어가는 방법에는 여러 가지가 있다. 한 가지 방법은 부트 모드를 SD 슬롯 SD3에서 부팅하도록 설정하는 것이다(SW6 DIP 스위치 2와 7을 ON하고 나머지는 OFF한다). SD 카드를 슬롯 SD3에 장착하지 말고 보드의 전원을 켠다. "HID Compliant device" 메세지가 표시된 후, 보드는 시리얼 다운로드 모드로 진입한다. 그런 다음 SD 카드를 SD 슬롯 SD3에 장착한다. 이를 수행하는 또 다른 방법은 SW6의 모든 DIP 스위치를 OFF로 설정하는 것처럼 잘못된 부트 스위치 설정을 구성하는 것이다.
아래 테이블은 Manufacturing Tool의 시리얼 다운로드 모드로 들어가는 데 사용되는 i.MX 6 SABRE-AI 보드의 부트 스위치 설정을 보여준다. 부트 미디어에서 부트 이미지가 확인되지 않으면, 시스템도 시리얼 다운로드 모드로 들어간다.
Table 47. Setup for the Manufacturing Tool on i.MX 6 SABRE-AI
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
S3 | OFF | ON | OFF | OFF |
Table 48. Setup for the Manufacturing Tool on i.MX 7Dual SABRE-SD
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
S3 | OFF | ON | - | - |
Table 49. Setup for Manufacturing Tool on i.MX 6UltraLite EVK and i.MX 6ULL EVK
Switch | D1 | D2 |
---|---|---|
SW602 | OFF | ON |
Table 50. Setup for Manufacturing Tool on i.MX 7ULP EVK
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
SW1 | OFF | ON | - | - |
Table 51. Setup for Manufacturing Tool on i.MX 8M Quad EVK
Switch | D1 | D2 |
---|---|---|
SW802 | OFF | ON |
Table 52. Setup for Manufacturing Tool on i.MX 8M Plus EVK
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
SW4 | OFF | OFF | OFF | ON |
Table 53. Setup for Manufacturing Tool on i.MX 8M Mini EVK
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
SW1101 | ON | OFF | X | X | X | X | X | X |
SW1102 | X | X | X | X | X | X | X | X |
Table 54. Setup for Manufacturing Tool on i.MX 8M Nano EVK
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
SW1101 | ON | OFF | OFF | OFF |
Table 55. Setup for Manufacturing Tool on i.MX 8QuadMax MEK
Switch | D1 | D2 | D3 | D4 | D5 | D6 |
---|---|---|---|---|---|---|
SW2 | OFF | OFF | ON | OFF | OFF | OFF |
참고
아래 설정은 i.MX 8DualX MEK와 i.MX 8DXL EVK 보드(8DXL EVK는 SW1 사용)에 대해 동일하다.
Table 56. Setup for Manufacturing Tool on i.MX 8QuadXPlus MEK
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
SW2 | ON | OFF | OFF | OFF |
Table 57. Setup for Manufacturing Tool on i.MX 8ULP EVK
Switch | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
---|---|---|---|---|---|---|---|---|
SW2 | OFF | OFF | OFF | OFF | OFF | OFF | ON | OFF |
Table 58. Setup for Manufacturing Tool on i.MX 93 11x11 EVK
Switch | D1 | D2 | D3 | D4 |
---|---|---|---|---|
SW1301 | ON | ON | OFF | OFF |
참고
부팅 가능한 이미지가 있는 SD 카드가 SD2(베이스보드)에 장착되어 있으면, ROM이 시리얼 다운로드 모드로 들어가지 않는다.
4.5.12 How to build U-Boot and Kernel in standalone environment
독립 실행형 환경에서 U-Boot와 Kernel을 빌드하려면, 다음 단계를 수행한다.
먼저 툴, 툴체인 그리고 작은 rootfs가 포함된 SDK를 생성하여, 호스트 시스템에 배치하기 위해 컴파일한다.
- 다음 커맨드를 사용하여 Yocto Project 빌드 환경에서 SDK를 생성한다. Yocto Project 빌드 환경을 설정하려면, i.MX Yocto Project User's Guide(IMXLXYOCTOUG)의 단계를 따른다. 다음 커맨드에서 Target-Machine을 빌드하려는 머신으로 설정한다. populate_sdk는 Yocto Project 없이 독립 실행형 환경을 설정하는 스크립트 파일을 생성한다. 현재 릴리스에서 최신 헤더, 툴체인 그리고 툴을 선택하려면 각 릴리스에 대해 이 SDK를 업데이트해야 한다.
DISTRO=fsl-imx-fb MACHINE=Target-Machine bitbake core-imageminimal -c populate_sdk
참고:
빌드 프로세스가 중단되면, conf/local.conf를 수정하여 PACKAGE_CLASSES = "package_deb" 라인을 주석처리한 다음 populate_sdk 커맨드를 다기 실행한다. - bitbake가 실행된 빌드 디렉터리에서 tmp/deploy/sdk의 sh 파일을 빌드할 호스트 머신에 복사하고 스크립트를 실행하여 SDK를 설치한다. 기본 위치는 /opt이지만 호스트 머신의 아무 곳에나 배치할 수 있다.
다음은 호스트 시트템에서 U-Boot와 Kernel을 빌드하는 단계이다.
Toolchain Configuration(툴체인 구성):
- i.MX 6과 i.MX 7을 호스트 머신에서 빌드하는 경우, 빌드하기 전에 다음 커맨드를 사용하여 환경을 설정한다.
source /opt/fsl-imx-fb/5.15-kirkstone/environment-setupcortexa9hf-neon-poky-linux-gnueab
- i.MX 8과 i.MX 9를 호스트 머신에서 빌드하는 경우, 빌드하기 전에 다음 커맨드를 사용하여 환경을 설정한다.
source /opt/fsl-imx-xwayland/5.15-kirkstone/environment-setupaarch64-poky-linux export ARCH=arm64
U-Boot:
클론하여 소스 다운로드:
git clone https://github.com/nxp-imx/uboot-imx -b lf_v2021.04
cd uboot-imx
- 독립 실행형 환경에서 i.MX 6이나 i.MX 7 U-Boot를 빌드하려면, 대상 부트에 대한 구성을 찾는다. 다음 예에서는 i.MX 6ULL이 대상이다.
make clean make mx6ull_14x14_evk_defconfig make
- 독립 실행형 환경에서 i.MX 8 U-Boot를 빌드하려면, 대상 부트에 대한 구성을 찾는다. 다음 예에서는 i.MX 8QuadMax MEK 보드가 대상이며, 기본적으로 Arm Cortex-A53 코어에서 실행된다. SPL 이미지(u-boot-spl.bin)도 기본 defconfig로 생성된다. OP-TEE 이미지로 부팅 시 필요하다.
make distclean make imx8qm_mek_defconfig make
i.MX 8QuadXPlus MEK와 i.MX 8DualX 보드의 경우:
make distclean make imx8qxp_mek_defconfig make
i.MX 8DXL EVK 보드의 경우:
make distclean make imx8qxp_mek_defconfig make
- i.MX 8M Quad EVK의 경우:
make distclean make imx8mq_evk_defconfig make
- i.MX 8M LPDDR4 EVK의 경우:
make distclean make imx8mm_evk_defconfig make
- i.MX 8M DDR4 EVK의 경우:
make distclean make imx8mm_ddr4_evk_defconfig make
- i.MX 8M Plus LPDDR4 EVK 보드의 경우:
make distclean make imx8mp_evk_defconfig make
- i.MX 8ULP EVK 보드의 경우:
make distclean make imx8ulp_evk_defconfig make
- i.MX 93 11x11 EVK 보드의 경우:
make distclean make imx93_11x11_evk_defconfig make
Kernel:
클론하여 소스 다운로드:
git clone https://github.com/nxp-imx/linux-imx -b lf-5.15.y
cd linux-imx
- i.MX 6과 i.MX 7용 독립 실행형 환경에서 커널을 빌드하려면, 다음 커맨드를 실행한다:
make imx_v7_defconfig make
- i.MX 8과 i.MX 9용 독립 실행형 환경에서 커널을 빌드하려면, 다음 커맨드를 실행한다:
make imx_v8_defconfig make
참고:
사용자는 융합된 부분에 대한 구성을 수정해야 한다. 예를 들어, i.MX 6UltraLite에는 G0, G1, G2 그리고 G3의 네 부분이 있다.
융합된 모듈은 다음과 같다:
U-Boot 구성 변경:
- G0: TSC, ADC2, FLEXCAN1, FLEXCAN2, FREQ_MON, TEMP_MON,
VOLT_MONLCDIF, CSI, ENET2, CAAM, USB_OTG2, SAI23, BEE, UART5678,
PWM5678, ECSPI34, I2C34, GPT2, and EPIT2.- G1: TSC, ADC2, FLEXCAN2, FREQ_MON, TEMP_MON, VOLT_MON, LCDIF, CSI,
ENET2, and BEE.- G2: FREQ_MON, TEMP_MON, VOLT_MON, and BEE.
- G3: 융합 모듈 없음.
G0:
/* #define CONFIG_VIDEO */ #define CONFIG_FEC_ENET_DEV 0 /* #define CONFIG_CMD_BEE */ #define CONFIG_USB_MAX_CONTROLLER_COUNT 1
G1:
/* #define CONFIG_VIDEO */ #define CONFIG_FEC_ENET_DEV 0 /* #define CONFIG_CMD_BEE */
G2:
/* #define CONFIG_CMD_BEE */
G3: 변경 없음.
4.5.13 How to build imx-boot image by using imx-mkimage
i.MX 8QuadMax의 경우, imx-mkimage를 사용하여 imx-boot 이미지를 빌드하기 위해 다음 단계를 수행한다:
- u-boot/u-boot.bin에서 imx-mkimage/iMX8QM/으로 u-boot.bin을 복사한다.
- SCFW 포팅 키트에서 imx-mkimage/iMX8QM/으로 scfw_tcm.bin을 복사한다.
- Arm Trusted Firmware(imx-atf)에서 imx-mkimage/iMX8QM/으로 bl31.bin을 복사한다.
- SECO 펌웨어 컨테이너 이미지(mx8qmb0-ahab-container.img)를 imx-mkimage/iMX8QM/에 복사한다.
- make SOC=iMX8QM flash를 실행하여 flash.bin을 생성한다.
- OP-TEE를 사용하는 경우, tee.bin을 imx-mkimage/iMX8QM/에 복사하고 u-boot/spl/u-boot-spl.bin을 imx-mkimage/iMX8QM/에 복사한다. make SOC=iMX8QM flash_spl을 실행하여 flash.bin을 생성한다.
i.MX 8QuadXPlus의 경우, imx-mkimage를 사용하여 imx-boot이미지를 빌드하기 위해 다음 단계를 수행한다:
- u-boot/u-boot.bin에서 imx-mkimage/iMX8QX/으로 u-boot.bin을 복사한다.
- SCFW 포팅 키트에서 imx-mkimage/iMX8QX/으로 scfw_tcm.bin을 복사한다.
- Arm Trusted Firmware(imx-atf)에서 imx-mkimage/iMX8QX/으로 bl31.bin을 복사한다.
- SECO 펨웨어 컨테이너 이미지(mx8qxpb0-ahab-container.img와 mx8qxpc0-ahab-container.img)를 imx-mkimage/iMX8QM/에 복사한다.
- make SOC=iMX8QX flash를 실행하여 i.MX 8QuadXPlus B0용 flash.bin을 생성하고, make SOC=iMX8QX REV=C0 flash를 실행하여 i.MX 8QuadXPlus C0용 flash.bin을 생성한다.
- OP-TEE를 사용하는 경우, tee.bin을 imx-mkimage/iMX8QX/에 복사하고 u-boot/spl/u-boot-spl.bin을 imx-mkimage/iMX8QX/에 복사한다. make SOC=iMX8QX flash_spl을 실행하여 flash.bin을 생성한다.
i.MX 8DXL의 경우, imx-mkimage를 사용하여 imx-boot 이미지를 빌드하기 위해 다음 단계를 수행한다:
- u-boot/u-boot.bin에서 imx-mkimage/iMX8DXL/로 u-boot.bin을 복사한다.
- SCFW 포팅 키트에서 imx-mkimage/iMX8DXL/로 scfw_tcm.bin을 복사한다.
- Arm Trusted Firmware(imx-atf)에서 imx-mkimage/iMX8DXL/로 bl31.bin을 복사한다.
- SECO 펌웨어 컨테이너의 이미지(mx8dxla1-ahab-container.img와 mx8dxlb0-ahab-container.img)를 imx-mkimage/iMX8DXL/에 복사한다.
- make SOC=iMX8DXL flash를 실행하여 i.MX 8DXL A1용 flash.bin을 생성하고 make SOC=iMX8DXL REV=B0 flash를 실행하여 i.MX 8DXL B0용 flash.bin을 생성한다.
- OP-TEE를 사용하는 경우, tee.bin을 imx-mkimage/iMX8DXL/에 복사하고 u-boot/spl/u-boot-spl.bin을 imx-mkimage/ iMX8DXL/에 복사한다. make SOC=iMX8DXL flash_spl을 실행하여 flash.bin을 생성한다.
- V2X 펌웨어 로드를 건너뛰는 경우, V2X=NO를 추가하여 make SOC=iMX8DXL V2X=NO flash와 같은 커맨드를 만든다.
다음은 i.MX 8QuadMax와 i.MX 8QuadXPlus의 대상에 대한 매트릭스 테이블이다.
Table 59. Matrix table for targets of i.MX 8QuadMax, i.MX 8QuadXPlus, and i.MX 8DXL
- | OP-TEE | U-Boot | SPL | Cortex-M4 |
---|---|---|---|---|
flash_spl | Yes | Yes | Yes | No |
flash |
No | Yes | No | No |
flash_linux_m4 | Yes | Yes | Yes | Yes |
flash_ regression_ linux_m4 |
No | Yes | No | Yes |
i.MX 8ULP EVK의 경우, imx-mkimage를 사용하여 imx-boot 이미지를 빌드하기 위해 다음 단계를 수행한다:
- u-boot/u-boot.bin에서 u-boot.bin을 복사하고 u-boot/spl/u-boot-spl.bin을 imx-mkimage/iMX8ULP/로 복사한다.
- Arm Trusted Firmware(imx-atf)에서 imx-mkimage/iMX8ULP/로 bl31.bin을 복사한다.
- Sentinel 펌웨어 컨테이너 mx8ulpa0-ahab-container.img의 이미지를 imx-mkimage/iMX8ULP/에 복사한다.
- uPower 펌웨어 이미지 upower.bin의 이미지를 imx-mkimage/iMX8ULP/에 복사한다.
- Cortex-M33 이미지 m33_image.bin을 imx-mkimage/iMX8ULP/에 복사한다.
- OP-TEE를 사용하는 경우, tee.bin을 imx-mkimage/iMX8ULP/에 복사한다. 2단계에서 복사한 bl31.bin은 OP-TEE SPD를 활성화한 상태에서 빌드해야 한다.
- make SOC=iMX8ULP flash_singleboot_m33을 실행하여 flash.bin을 생성한다.
참고
Sentinel/SECO/uPower/M33/V2X 펌웨어용 바이너리를 다운로드할 수 있는 위치는 i.MX Linux Release Notes IMXLXRN)의 Table "BSP and multimedia standard packages"를 참조한다.
다음 테이블에는 i.MX 8ULP에서 사용되는 imx-mkimage 대상이 나열되어 있다.
Table 60. imx-mkimage targets used on i.MX 8ULP
Boot type | Cortex-A35 | Cortex-M33 | SW5[8:1] |
---|---|---|---|
Single Boot | (Default) Boot Cortex-A35 + Cortex-M33 from eMMC: make SOC=iMX8ULP flash_singleboot_m33 Boot Cortex-A35 only from eMMC: make SOC=iMX8ULP flash_singleboot |
1000_xx00 Single Boote-MMC |
|
Boot Cortex-A35 + Cortex-M33 from FlexSPI NOR: make SOC=iMX8ULP flash_singleboot_m33_flexspi Boot Cortex-A35 only from FlexSPI NOR: make SOC=iMX8ULP flash_singleboot_flexspi |
1010_xx00 Single Boot-NOR |
||
Dual Boot | make SOC=iMX8ULP flash_ dualboot |
For RAM target: make SOC=iMX8ULP flash_dualboot_m33For Flash target: make SOC=iMX8ULP flash_ dualboot_m33_xip |
1000_0010 A35-eMMC/ M33-NOR |
make SOC=iMX8ULP flash_ dualboot_flexspi |
1010_0010 A35-Nor/ M33-NOR |
||
Low Power Boot |
- | 1000_00x1 A35-eMMC/ M33-NOR |
|
- | 1010_00x1 A35-Nor/ M33-NOR |
i.MX 8M EVK의 경우, imx-mkimage를 사용하여 imx-boot 이미지를 빌드가기 위해 다음 단계를 수행한다:
- u-boot/tools/mkimage에서 imx-mkimage/iMX8M/mkimage_uboot로 mkimage를 복사하고 이름을 변경한다.
- u-boot/spl/u-boot-spl.bin에서 imx-mkimage/iMX8M/으로 u-boot-spl.bin을 복사한다.
- u-boot/u-boot-nodtb.bin에서 imx-mkimage/iMX8M/으로 u-boot-nodtb.bin을 복사한다.
- u-boot/arch/arm/dts/에서 imx-mkimage/iMX8M/으로 imx8mq-evk.dtb(i.MX 8M Quad EVK용), imx8mm-evk.dtb(i.MX 8M Mini LPDDR4 EVK용), imx8mm-ddr4-evk.dtb(i.MX 8M Mini DDR4 EVK용), 또는 imx8mp-evk.dtb(i.MX 8M Plus LPDDR4 EVK용)를 복사한다.
- Arm Trusted Firmware(imx-atf)에서 imx-mkimage/iMX8M/으로 bl31.bin을 복사한다.
- firmware-imx 패키지에서 imx-mkimage/iMX8M/으로 firmware/hdmi/cadence/signed_hdmi_imx8m.bin을 복사한다.
- i.MX 8M Quad와 i.MX 8M Mini LPDDR4 EVK의 경우, firmware-imx 패키지의 firmware/ddr/synopsys에서 imx-mkimage/iMX8M/으로 lpddr4_pmu_train_1d_dmem.bin, lpddr4_pmu_train_1d_imem.bin, lpddr4_pmu_train_2d_dmem.bin 그리고 lpddr4_pmu_train_2d_imem.bin을 복사한다.
i.MX 8M Mini DDR4 EVK의 경우, firmware-imx 패키지의 firmware/ddr/synopsys에서 imx-mkimage/iMX8M/으로 ddr4_imem_1d.bin, ddr4_dmem_1d.bin, ddr4_imem_2d.bin 그리고 ddr4_dmem_2d.bin을 복사한다.
i.MX 8M Plus LPDDR4 EVK의 경우, firmware-imx 패키지의 firmware/ddr/synopsys에서 imx-mkimage/iMX8M/으로 lpddr4_pmu_train_1d_dmem_201904.bin, lpddr4_pmu_train_1d_imem_201904.bin, lpddr4_pmu_train_2d_dmem_201904.bin 그리고 lpddr4_pmu_train_2d_imem_201904.bin을 복사한다. - i.MX 8M Quad EVK의 경우, make SOC=iMX8M flash_evk를 실행하여 HDMI FW가 포함된 flash.bin(imx-boot 이미지)을 생성한다.
i.MX 8M Mini LPDDR4 EVK의 경우, make SOC=iMX8MM flash_evk를 실행하여 flash.bin(imx-boot 이미지)을 생성한다.
i.MX 8M Mini DDR4 EVK의 경우, make SOC=iMX8MM flash_ddr4_evk를 실행하여 flash.bin(imx-boot 이미지)을 생성한다.
i.MX 8M Plus LPDDR4 EVK의 경우, make SOC=iMX8MP flash_evk를 실행하여 flash.bin(imx-boot 이미지)을 생성한다.
i.MX 8M Quad EVK와 i.MX 8M Mini LPDDR4 EVK에서 eMMC fastboot로 부팅하려면, flash_evk_emmc_fastboot 대상을 사용한다.
i.MX 93의 경우, imx-mkimage를 사용하여 imx-boot 이미지를 생성하기 위해 다음 단계를 수행한다:
- u-boot/u-boot.bin에서 u-boot.bin과 uboot/spl/u-boot-spl.bin에서 imx-mkimage/iMX9/로 u-boot-spl.bin을 복사한다.
- Arm Trusted Firmware(imx-atf)에서 imx-mkimage/iMX9/로 bl31.bin을 복사한다.
- Sentinel 펌웨어 컨테이너의 이미지 mx93a0-ahab-container.img를 imx-mkimage/iMX9/에 복사한다.
- OP-TEE를 사용하는 경우, tee.bin을 imx-mkimage/iMX9/에 복사한다. 2단계에서 복사한 bl31.bin은 OP-TEE SPD를 활성화한 상태에서 빌드해야 한다.
- make SOC=iMX9 flash_singleboot를 실행하여 flash.bin을 생성한다.
4.6 Flash memory maps
이 섹션에서는 i.MX 보드에서 사용되는 메모리 디바이스의 메모리 내의 소프트웨어 레이아웃에 대해 설명한다.
이 정보는 이미지 다운로드와 이미지가 메모리에 배치되는 방법에 대한 후속 섹션을 이해하는 데 유용하다.
mtdparts 지시문은 메모리 맵핑을 지정하기 위해 Linux 부트 커맨드에서 사용할 수 있다. 다음 예제에서는 메모리 맵을 사용하는 방법을 간략하게 설명한다. 메모리는 나열된 순서대로 할당된다. 대시(-)는 나머지 메모리를 나타낸다.
mtdparts=[memory type designator]:[size]([name of partition]),
[size]([name of partition]),-([name of final partition])
4.6.1 MMC/SD/SATA memory map
MMC/SD/SATA 메모리 체계는 BSP 소프트웨어에서 배치되는 위치가 NAND 및 NOR 플래시와 다르다. MMC/SD/SATA는 rootfs로 MMC/SD를 사용하기 위해 첫 번째 섹터(512바이트)를 Master Boot Record(MBR)로 유지해야 한다.
부팅 시, MBR이 실행되어 파티션 테이블을 조회하고 부팅에 사용할 파티션을 결정한다. 부트로더는 MBR 뒤에 있어야 한다. 커널 이미지와 rootfs는 부트로더 이후의 모든 주소에 저장할 수 있다. 기본적으로 U-Boot의 부트 인수는 커널과 DTB용으로 첫 번째 FAT 파티션을 사용하고, 루트 파일 시스템용으로 다음 ext3 파티션을 사용한다. 또는 사용자는 부트로더 이후의 로우 메모리 영역에 커널과 DTB를 저장할 수 있다. 부트 인수는 변경된 메모리 주소와 일치하도록 업데이트해야 한다.
Linux 호스트 서버에서 MMC/SD 카드에 파티션을 생성할 때, MBR은 fdisk 커맨드를 사용하여 생성할 수 있다.
4.6.2 NAND flash memory map
NAND 플래시 메모리 맵은 Linux 커널 캐맨드 라인에서 구성된다.
예를 들면:
mtdparts=gpmi-nand:64m(boot),16m(kernel),16m(dtb),-(rootfs)
4.6.3 Parallel NOR flash memory map
기본 구성은 하나의 패러럴 NOR 파티션만 포함된다. 패러럴 NOR 디바이스는 일반적으로 4MB이다. 디바이스가 패러럴 NOR에서 부팅할 수 있도록, U-Boot는 패러럴 NOR의 시작 부분에서 로드된다. 기본 구성은 부팅 시 U-Boot가 커널, DTB 그리고 루트 파일 시스템을 SD/MMC 카드에서 DDRAM으로 로드하는 것이다. 최종 사용자는 필요에 따라 기본 설정을 변경할 수 있다. 커널 커맨드 라인을 사용하여 더 많은 파티션을 추가할 수 있다. 아래 커맨드의 메모리 유형 지정자는 NOR 주소와 지정자로 구성된다. 이 정보는 arch/arm/boot/dts의 i.MX .dtsi 디바이스 트리 파일에서 찾을 수 있다. 다음은 Linux 부트 커맨드 라인에 추가할 수 있는 항목의 예이다:
mtdparts=8000000.nor:1m(uboot),-(rootfs)
i.MX 6 SABRE-AI의 경우, 패러럴 NOR의 주소는 0x8000000이다.
4.6.4 SPI-NOR flash memory map
SPI-NOR 플래시 메모리는 Linux 커널 커맨드 라인을 사용하여 구성할 수 있다.
디바이스가 SPI-NOR에서 부팅할 수 있도록, U-Boot는 SPI-NOR 메모리의 1KB 오프셋에서 로드되어야 한다. 기본 구성은 부팅 시 U-Boot가 커널, DTB 그리고 루트 파일 시스템을 SD/MMC 카드에서 DDRAM으로 로드하는 것이다. 최종 사용자는 필요에 따라 기본 설정을 변경할 수 있다. 커널 커맨드 라인을 사용하여 더 많은 파티션을 추가할 수 있다. 다음은 Linux 부트 커맨드 라인에 추가할 수 있는 항목의 예이다:
mtdparts=spi32766.0:768k(uboot),8k(env),128k(dtb),-(kernel)
4.6.5 QuadSPI flash memory map
QuadSPI 플래시 메모리는 Linux 커맨드 라인을 사용하여 구성할 수 있다.
디바이스가 QuadSPI에서 부팅할 수 있도록, U-Boot는 QuadSPI 메모리의 시작 부분에서 로드된다. 기본 구성은 부팅 시 U-Boot가 커널, DTB 그리고 루트 파일 시스템을 SD/MMC 카드에서 DDRAM으로 로드하는 것이다. 최종 사용자는 요구 사항에 따라 기본 설정을 변경할 수 있다. 커널 커맨드 라인을 사용하여 더 많은 파티션을 추가할 수 있다. 다음은 Linux 부트 커맨드 라인에 추가할 수 있는 항목의 예이다:
mtdparts=21e4000.qspi:1m(uboot),8m(kernel),1m(dtb),-(user)
패러럴이 아닌 모드를 위해 U-Boot에는 QuadSPI 플래시에 액세스하는 데 도움이 되는 아래 매핑을 가지고 있다.
Table 61. U-Boot mapping for QuadSPI
Device on hardware | Device in U-Boot | Memory address in U-Boot | Remark |
---|---|---|---|
QuadSPI1 Port A CS0 |
sf probe 0:0 on i.MX 6SoloX SABRE-AI board, i.MX 7Dual SABRE-SD board, i.MX 6Ultra Lite EVK board, i.MX 8QuadMax MEK, i.MX 8QuadXPlus MEK, and i.MX 8DXL EVK |
0x60000000 0x08000000 |
- |
QuadSPI1 Port B CS0 |
sf probe 1:0 on i.MX 6 SoloX SABRE-AI board | 0x68000000 | - |
QuadSPI2 Port A CS0 |
sf probe 0:0 on i.MX 6SoloX SABRE-SD board | 0x70000000 | - |
QuadSPI2 Port B CS0 |
sf probe 1:0 on i.MX 6SoloX SABRE-SD board | 0x78000000 | - |
Table 62. U-Boot mapping for FlexSPI for i.MX 8ULP
Device on hardware | Device in U-Boot | Memory address in U-Boot | Remark |
---|---|---|---|
Flexspi0 PortA CS0 | sf probe 0:0 | 0x04000000 | - |
Flexspi2 PortA CS0 | sf probe 2:0 | 0x60000000 | - |
4.7 Running Linux OS on the target
이 섹션에서는 U-Boot를 사용하여 대상에서 Linux 이미지를 실행하는 방법을 설명한다.
이 지침은 Section 4.4나 Section 4.3의 지침을 사용하여 커널 이미지를 다운로드했다고 가정한다. Serial Terminal을 설정하지 않은 경우, Section 3을 참조한다.
i.MX 보드에서 Linux OS를 실행하기 위한 기본 절차는 다음과 같다. 이 문서에서는 설정을 더 쉽게 설명할 수 있도록 특정 환경 변수 이름 세트를 사용한다. 각 설정 유형은 다음과 같이 해당 섹션에 설명되어 있다.
- 보드의 전원을 켠다.
- U-Boot가 보여질 때, 머신과 구성에 대해 지정된 환경 변수를 설정한다. 일반적인 설정은 아래에 설명되어 있으며, 디바이스에 특정한 설정은 별도의 섹션에 설명되어 있다.
- 환경 설정을 저장한다:
U-Boot > saveenv
- 부트 커맨드를 실행한다:
U-Boot > run bootcmd
env default -f -a와 saveenv 커맨드를 사용하여 기본 환경으로 돌아갈 수 있다.
Specifying the console (콘솔 지정)
디버그와 커맨드 라인 컨트롤용 콘솔은 Linux 부트 커맨드 라인에서 지정할 수 있다. i.MX 6Quad SABRE-AI 보드는 ttymxc2를 사용하므로 모든 보드에서 동일하지는 않다. 일반적으로 다음과 같이 지정되지만, 전송 속도와 포트는 수정할 수 있다. 따라서 NFS의 경우 ttymxc3일 수 있다.
U-Boot > setenv consoleinfo 'console=ttymxc2,115200'
i.MX 7ULP EVK, i.MX 8QuadMax MEK 보드와 i.MX 8QuadXPlus MEK 보드의 경우 "console=ttyLP0,115200"으로 변경한다.
Specifying displays (디스플레이 지정)
디스플레이 정보는 Linux 부트 커맨드 라인에서 지정할 수 있다. Linux 이미지의 소스에 의존하지 않는다. 디스플레이로 아무 것도 지정하지 않으면, 디바이스 트리의 설정이 사용된다. bootargs를 포함하는 환경 매크로에 ${displayinfo}를 추가한다. 특정 파라미터는 i.MX Linux Release Notes(IMXLXRN)에서 찾을 수 있다. 다음은 이러한 파라미터의 몇 가지 예이다.
- HDMI 디스플레이용 U-Boot > setenv displayinfo 'video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24'
- LVDS와 HDMI 듀얼 디스플레이용 U-Boot > setenv displayinfo 'video=mxcfb1:dev=ldb video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24'
- LCD 용 U-Boot > setenv displayinfo 'video=mxcfb0:dev=lcd,if=RGB565'
- EPDC 컨넥터용 U-Boot > setenv displayinfo 'video=mxcepdcfb:E060SCM,bpp=16 max17135:pass=2,vcom=-2030000'
- LCD와 HDMI 듀얼 디스플레이용 U-boot > setenv displayinfo 'video=mxcfb0:mxcfb0:dev=lcd,if=RGB565 video=mxcfb1:dev=hdmi,1920x1080M@60,if=RGB24'
Specifying memory addresses (메모리 주소 지정)
커널과 디바이스 트리가 로드되는 메모리의 주소는 Linux OS를 실행하는 디바이스에 따라 변경되지 않는다. 이 장의 지침에서는 환경 변수 loadaddr와 ftd_addr을 사용하여 이러한 값을 나타낸다. 다음 테이블은 다른 i.MX 보드에서 사용되는 주소를 보여준다.
Table 63. Board-specific default values
Variable | 6Quad, 6QuadPlus, and 6Dual Lite SABRE (AI and SD) |
6SoloX SD | 7Dual SABRE-SD |
6UltraLite, 6ULL and 6ULZ EVK |
7ULP EVK | Description |
---|---|---|---|---|---|---|
loadaddr | 0x12000000 | 0x80800000 | 0x80800000 | 0x80800000 | 0x60800000 | 커널이 로드되는 메모리 주소 |
fdt_addr | 0x18000000 | 0x83000000 | 0x83000000 | 0x83000000 | 0x63000000 | 디바이스 트리 코드가 복사되는 메모리 주소 |
Variable | 8QuadMax, 8Quad XPlus, 8DualX, and 8DXL |
8ULP | 8M Quad/ 8M Mini EVK |
i.MX 93 | Description |
---|---|---|---|---|---|
loadaddr | 0x80200000 | 0x80400000 | 0x40400000 | 0x80400000 | 커널이 로드되는 메모리 주소 |
fdt_addr | 0x83000000 | 0x83000000 | 0x43000000 | 0x83000000 | 디바이스 트리 코드가 복사되는 메모리 주소 |
또한, fdtfile은 디바이스 트리 파일의 이름을 지정하는 데 사용된다. U-Boot 환경 변수를 설정하는 데 사용되는 커맨드는 다음과 같다:
U-Boot > setenv loadaddr 0x80080000
U-Boot > setenv fdtaddr 0x80f00000
U-Boot > setenv fdtfile fsl-imx7ulp-evk.dtb
Specifying the location of the root file system (루트 파일 시스템 위치 지정)
rootfs는 보드나 NFS의 디바이스에 있을 수 있다. 아래 설정은 이를 지정하기 위한 몇 가지 옵션을 보여준다.
- U-Boot > setenv rootfsinfo 'root=/dev/nfs ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp'
- U-Boot > setenv rootfsinfo 'root=/dev/nfs ip=dhcp weim-nor nfsroot=${serverip}:${nfsroot},v3,tcp'
- U-Boot > setenv rootfsinfo 'ubi.mtd=4 root=ubi0:rootfs rootfstype=ubifs rootwait rw mtdparts=gpminand:64m(boot),16m(kernel),16m(dtb),-(rootfs)'
- U-Boot > setenv rootfsinfo 'root=/dev/mmcblk0p2 rootwait rw'
Special settings (특수 설정)
i.MX 6Solo와 6UltraLite는 커맨드 라인에서 uart_from_osc를 지정하여 PLL3 대신 OSC 클럭 사용을 지정할 수 있다. 이렇게 하면 시스템이 저전력 모드로 진입할 수 있다.
U-Boot > setenv special 'uart_from_osc'
Creating the boot command line (부트 커맨드 라인 생성)
설명을 위해 이 문서는 bootargs를 다음과 같이 하나의 매크로로 그룹화한다:
U-Boot > setenv bootargsset 'setenv bootargs ${consoleinfo} ${rootfsinfo} ${displayinfo} ${special}'
그러면 부트 커맨드 실행은 다음과 같다. 인수는 디바이스에 따라 다르다.
U-Boot > setenv bootcmd 'run bootargsset; {settings-fordevice}; bootz ${loadaddr} - ${fdt_addr}'
4.7.1 Running the image from NAND
NAND는 i.MX 6 SABRE-AI 보드에서 찾을 수 있다.
보드의 전원을 켠 다음 제공된 커맨드를 입력한다. 다음 설정을 사용하여 NAND에서 Linux 시스템을 부팅할 수있다.
커널 이미지가 주소 0x1400000바이트(블럭 시작 주소는 0x800)에서 사작한다고 가정한다. 커널 이미지 크기가 0x400000 바이트 미만이다. rootfs는 /dev/mtd2에 있다.
U-Boot > setenv bootcmd 'run bootargsset; nand read
${loadaddr} 0x1000000 0x800000; nand read ${fdt_addr}
0x2000000 0x100000; bootz ${loadaddr} - ${fdt_addr}'
4.7.2 Running Linux OS from Parallel NOR
Parallel NOR은 i.MX 6 SABRE-AI 보드에서 사용할 수 있다. 다음 절차를 사용하여 Parallel NOR에서 시스템을 부팅할 수있다.
- 커널 이미지가 주소 0xc0000바이트에서 시작한다고 가정한다.
- U-Boot 프롬프트에서 다음 변수를 설정한다:
U-Boot > setenv bootcmd 'run bootargsset; cp.b 0x80c0000 ${loadaddr} 0x800000;cp.b 0x80a0000 ${fdt_addr} 0x20000;bootz ${loadaddr} - ${fdt_addr} '
4.7.3 Running the Linux OS image from QuadSPI
QuadSPI는 i.MX 6SoloX SABRE-SD 보드, i.MX 7Dual SABRE-SD 보드, i.MX 6UltraLite EVK 보드, i.MX 6ULL EVK 보드 그리고 i.MX 8QuadMax MEK와 i.MX 8QuadXPlus MEK에서 사용할 수 있다. 다음 절차를 사용하여 QuadSPI NOR에서 Linux 시스템을 부팅할 수 있다.
- 커널 이미지가 주소 0xA00000 바이트에서 시작하고 DTB 파일은 주소 0x800000에서 시작한다고 가정한다.
- U-Boot 프롬프트에서 다음 환경 변수를 설정한다.
U-Boot > setenv bootcmd 'run bootargsset; sf probe; sf read ${loadaddr} 0xA00000 0x2000; sf read ${fdt_addr} 0x800000 0x800; bootz ${loadaddr} - ${fdt_addr} '
4.7.4 Running the Arm Cortex-M4/7/33 image
i.MX 6SoloX 보드에는 U-Boot에서 Arm Cortex-M4 이미지를 부팅하는 두 가지 방법이 있다:
- Arm Cortex-M4 프로세서 Normal Up(i.MX 6SoloX SABRE-AI와 SABRE-SD 보드에서 지원). U-Boot 커맨드를 실행하여 수행한다. 요구 사항:
- Arm Cortex-A9 프로세서가 SD 카드에서 부팅되는 경우, U-Boot 일반 SD 이미지. Arm Cortex-A9 프로세서가 QSPI NOR 플래시에서 부팅되는 경우, U-Boot 일반 QSPI 이미지.
- Kernel DTB: i.MX 6SoloX SABRE-SD 보드용 imx6sx-sdb-m4.dtb. i.MX 6SoloX SABRE-AI 보드용 imx6sx-sabreauto-m4.dtb.
- Arm Cortex-M4 이미지를 저장(burn)한다(i.MX 6SoloX SABRE-SD 보드용 QuadSPI2 PortB CS0의 NOR 플래시. i.MX 6SoloX SABRE-AI 보드용 QuadSPI1 PortB CS0의 NOR 플래시).
- Arm Cortex-M4 프로세서 Fast Up(i.MX 6SoloX SABRE-SD 보드에서만 지원). 50ms 내에 Arm Cortex-M4 프로세서 부팅 요구 사항을 충족하기 위해 이른 초기 부트 단계에서 U-Boot에 의해 시작된다. U-Boot 커맨드가 필요하지 않다. 요구 사항:
- U-Boot Arm Cortex-M4 Fast Up 이미지와 Arm Cortex-A9 프로세서는 QSPI2 NOR 플래시에서 부팅해야 한다.
- Kernel DTB: imx6sx-sdb-m4.dtb.
- Arm Cortex-M4 이미지를 저장(burn)한다(QuadSPI2 PortB CS0의 NOR 플래시).
Arm Cortex-M4 프로세서 Normal Up을 용이하게 하려고, 기본 U-Boot에 스크립트가 추가되었다. 다음 단계는 Cortex-M4 프로세서 Normal Up 스크립트 실행이 필요한 사용자에게 도움이 될 수있다.
- 보드의 전원을 켠다.
- i.MX 6SoloX SABRE-SD 보드에서 Arm Cortex-M4 이미지가 주소 0x78000000(QuadSPI2 PortB CS0의 NOR 플래시)에 있다고 가정한다. i.MX 6SoloX SABRE-AI 보드에서 Arm Cortex-M4 이미지가 주소 0x68000000(QuadSPI1 PortB CS0의 NOR 플래시)에 있다고 가정한다.
U-Boot 프롬프트에서:
U-Boot > run m4boot
또는 사용자는 스크립트에 의존하지 않고 커맨드를 수행할 수 있다:
U-Boot > sf probe 1:0
i.MX 6SoloX SABRE-SD 보드의 경우:
U-Boot > bootaux 0x78000000
i.MX 6SoloX SABRE-AI 보드의 경우:
U-Boot > bootaux 0x68000000
참고:
커널에 MCC 데모를 추가하고 커널에서 사용할 수있는 RAM을 제한하는 방법은 i.MX Linux Reference Manual(IMXLXRM)의 Chapter 53 "i.MX 6 SoloX MultiCore Communication (MCC)"를 참조한다.
기본 i.MX 7Dual SABRE-SD 보드는 QuadSPI에서 Arm Cortex-M4 이미지 실행을 지원할 뿐만 아니라 SD 카드에서 Arm Cortex-M4 이미지를 로드하고 OCRAM에서 실행할 수 있도록 지원한다.
SD 카드의 FAT 파티션에 Arm Cortex-M4 이미지를 준비한다. m4boot 스크립트를 사용할 때 이름을 m4_qspi.bin으로 지정해야 한다.
보드 전원이 켜지면, U-Boot 프롬프트에 다음 정보가 표시된다:
U-Boot > run m4boot
또는 스크립트에 의존하지 않고 커맨드를 수행한다:
u-boot=> fatload mmc 0:0 ${loadaddr} m4_qspi.bin
u-boot=> cp.b ${loadaddr} 0x7e0000 ${filesize}
u-boot=> bootaux 0x7e0000
참고:
데모에 NXP hello_world.bin과 같은 리소스 테이블이 없는 경우, 리소스 테이블 영역을 지운다. 그렇지 않으면, Linux OS에서 쓰레기 값을 표시할 수 있다.
- i.MX 8M Mini/Nano/Quad LPDDR4 EVK의 경우: #mw 0xb80ff000 0 4를 실행하여 가비지 리소스 테이블 영역을 지운다.
- i.MX 8M Plus LPDDR4 EVK의 경우: #mw 0x550ff000 0 4를 실행하여 가비지 리소스 테이블 영역을 지운다.
i.MX 8M 보드에서 다음 커맨드를 수행하여 Arm Cortex-M Core를 부팅한다:
u-boot=> fatload mmc 1:1 ${loadaddr} m4.bin
u-boot=> cp.b ${loadaddr} 0x7e0000 ${filesize}
u-boot=> bootaux 0x7e0000
리모트 코어를 시작하는 방법에는 U-Boot bootaux와 Linux remoteproc의 두 가지가 있다.
리모트 코어를 시작하기 위해 bootaux 또는 remoteproc을 사용할지 여부에 관계없이, 디버그 목적으로만 Cortex-M 코어를 중지하거나 시작하기 위해 remoteproc을 사용한다. 제품 시스템의 Linux OS에서 Cortex-M 코어를 중지하는 것은 권장되지 않는다.
remoteproc을 사용하여 리모트 코어를 직접 시작하도록 선택한 경우, Linux OS를 시작하기 전에 U-Boot에서 run prepare_mcore를 실행한다.
i.MX 8QuadMax와 i.MX 8QuadXPlus 보드에는 Arm Cortex-M4 코어를 부팅하는 두 가지 방법이 있다:
- ROM에서 부팅
사용자는 imx-mkimage를 사용하여 Arm Cortex-M4 이미지를 imx-boot 이미지로 패키징해야 한다. 빌드 커맨드에서 코어 ID와 해당 TCML 주소를 지정해야 한다. 다음은 예이다:
flash_linux_m4: $(MKIMG) mx8qmb0-ahab-container.img
scfw_tcm.bin u-boot-spl.bin m4_image.bin m4_1_image.bin u-boot-atf-container.img
./$(MKIMG) -soc QM -rev B0 -dcd skip -append mx8qmb0-ahab-container.img
-c -flags 0x00200000 -scfw scfw_tcm.bin -ap u-boot-spl.bin a53 0x00100000 -p3 -m4 m4_image.bin 0 0x34FE0000
-p4 -m4 m4_1_image.bin 1 0x38FE0000 -out flash.bin
cp flash.bin boot-spl-container.img
@flashbin_size=`wc -c flash.bin | awk '{print $$1}'`; \
pad_cnt=$$(((flashbin_size + 0x400 - 1) /
0x400)); \
echo "append u-boot-atf-container.img at $
$pad_cnt KB"; \
dd if=u-boot-atf-container.img of=flash.bin
bs=1K seek=$$pad_cnt;
참고:
패키지된 Cortex-M4 이미지(flash_linux_m4)로 부팅할 때, i.MX 8QuadMax MEK용 fsl-imx8qm-mek-rpmsg.dtb 또는 i.MX 8QuadXPlus MEK용 fsl-imx8qxp-mek-rpmsg.dtb와 같이 RPMSG가 활성화된 커널 DTB를 사용한다.
- U-Boot에서 부팅(멀티 파티션 지원 안 함)
U-Boot는 SD 카드의 FAT 파티션에서 기본 이름이 m4_0.bin과 m4_1.bin인 Arm Cortex-M4 이미지 로드를 지원한다. 보드가 U-Boot 콘솔로 부팅된 후, 다음 커맨드를 사용하여 Arm Cortex-M4 코어 0을 부팅한다:
U-Boot > run m4boot_0
Or the command to boot M4 core 1:
U-Boot > run m4boot_1
Or perform the commands for core 0 without depending on the script:
U-Boot > fatload mmc 1:1 0x80280000 m4_0.bin
U-Boot > dcache flush; bootaux 0x80280000 0
i.MX 93 11x11 EVK에서는 bootaux를 사용한다:
=> fatload mmc 1:1 ${loadaddr} imx93_m33_TCM_rpmsg_lite_str_echo_rtos.bin
15948 bytes read in 4 ms (3.8 MiB/s)
=> cp.b ${loadaddr} 0x201e0000 ${filesize}
=> bootaux 0x201e0000 0
## Starting auxiliary core stack = 0x20020000, pc = 0x0FFE05D5...
Arm Cortex-M33을 제외하기 위해 bootaux를 사용할 때, bootargs에 clk_ignore_unused를 전달한다.
i.MX 93의 경우, 사용자는 다음과 같이 remoteproc을 사용하여 Cortex-M33을 직접 시작/중지할 수 있다:
[ 138.693391] remoteproc remoteproc0: stopped remote processor imx-rproc
root@imx93evk:~# echo
imx93_m33_TCM_rpmsg_lite_str_echo_rtos_imxcm33.elf > /sys/
devices/platform/imx93-cm33/remoteproc/remoteproc0/firmware
root@imx93evk:~# echo start > /sys/devices/platform/imx93-cm33/
remoteproc/remoteproc0/state
[ 162.361023] remoteproc remoteproc0: powering up imx-rproc
[ 162.368617] remoteproc remoteproc0: Booting fw image
imx93_m33_TCM_rpmsg_lite_str_echo_rtos_imxcm33.elf, size 175644
[ 162.916805] remoteproc0#vdev0buffer: assigned reserved
memory node vdevbuffer@a4020000
[ 162.926429] virtio_rpmsg_bus virtio0: rpmsg host is online
[ 162.935336] remoteproc0#vdev0buffer: registered virtio0
(type 7)
[ 162.941986] remoteproc0#vdev1buffer: assigned reserved
memory node vdevbuffer@a4020000
[ 162.951071] virtio_rpmsg_bus virtio1: rpmsg host is online
[ 162.956649] virtio_rpmsg_bus virtio1: creating channel
rpmsg-virtual-tty-channel addr 0x1e
[ 162.962559] remoteproc0#vdev1buffer: registered virtio1
(type 7)
[ 162.971179] remoteproc remoteproc0: remote processor imxr-proc is now up
root@imx93evk:~#
root@imx93evk:~# echo stop > /sys/devices/platform/imx93-cm33/
remoteproc/remoteproc0/state
[ 172.114287] remoteproc remoteproc0: stopped remote processor imx-rproc
4.7.5 Linux OS login
i.MX Linux OS의 기본 로그인 사용자 이름은 비밀번호가 없는 root 이다.
4.7.6 Running Linux OS from MMC/SD
이 시나리오는 보드가 U-Boot를 부팅하도록 구성되어 있다고 가정한다. Linux 커널 이미지의 이름은 zImage이며 SD 카드의 MS-DOS FAT 파티션에 저장되어 있고 하나 이상의 디바이스 트리 파일도 이 파티션에 저장되어 있다. rootfs는 SD/MMC 카드의 다른 파티션에 저장될 수 있다.
U-Boot가 부팅되면, 부팅이 되는 슬롯을 감지하여 해당 SD 카드의 rootfs를 사용하도록 mmcdev와 mmcroot를 자동으로 설정한다. 이 시나리오에서는 U-Boot 설정을 변경하지 않고 동일한 SD 카드를 사용하여 i.MX 6/7 보드의 모든 SD 카드 슬롯에서 부팅할 수 있다. U-Boot 커맨드 라인에서 boot를 입력하면 Linux OS를 실행한다.
기본 설정을 원하지 않으면, 다음 지침을 사용할 수 있다.
mmcdev와 mmcroot에서 SD 카드 슬롯의 자동 설정을 끄려면 mmcautodetect를 "no"로 설정한다. U-Boot mmcdev는 납땜된 SD/MMC 연결을 기반으로 하므로 보드에 따라 다르다. U-Boot mmc dev 0은 존재하는 가장 낮은 번호의 SD 슬롯이고 1은 다음 슬롯이다. 그러나 Linux 커널은 존재 여부에 관계없이 모든 uSDHC 컨트롤러를 인덱싱한다. 다음 테이블은 이 매핑을 보여준다.
Table 64. Linux uSDHC relationships
uSDHC | mmcroot |
---|---|
uSDHC 1 | mmcblk0* |
uSDHC 2 | mmcblk1* |
uSDHC 3 | mmcblk2* |
uSDHC 4 | mmcblk3* |
SD 카드의 기본 구성과 여기의 예제에서, U-Boot는 1024바이트 오프셋, i.MX 8QuadXPlus B0과 i.MX 8QuadMax B0에서는 32KB 오프셋 또는 i.MX 8QuadXPlus A0, i.MX 8QuadMax A0, i.MX 8M EVK 보드에서 33KB 오프셋으로 첫 번째 파티션 이전에 있고 파티션 1은 Linux 커널과 디바이스 트리가 있는 파티션이고 파티션 2는 rootfs이다.
Setting up the environment variables (환경 변수 설정)
편의상, 이문서에서는 표준 변수 집합을 사용하여 Linux 커맨드 라인의 정보를 설명한다. 여기에 사용된 값은 머신이나 구성에 따라 다를 수 있다. 기본적으로 U-Boot는 부팅하는 uSDHC 슬롯을 기반으로 자동으로 mmcdev와 mmcroot 설정을 지원한다. 이것은 zImage, 디바이스 트리 파일(DTB) 그리고 rootfs가 동일한 SD/MMC 카드에 있다고 가정한다. 이러한 환경 변수를 수동으로 설정하려면, mmcautodetect를 "no"로 설정하여 기능을 비활성화한다.
다음은 Linux OS를 부팅하는 데 필요한 항목을 설정하는 한 가지 방법이다.
U-Boot > setenv mmcpart 1
U-Boot > setenv loadfdt 'fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdtfile}'
U-Boot > setenv loadkernel 'fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} zImage'
U-Boot > setenv bootcmd 'mmc dev ${mmcdev}; run loadkernel; run mmcargs; run loadfdt; bootz ${loadaddr} - ${fdt_addr};'
위에서 사용된 변수에 대한 설명은 다음과 같다:
- mmcpart - 커널 이미지가 포함된 MMC/SD 카드의 파티션이다.
- mmcroot - rootfs의 부트 커맨드에 대한 지시문으로 MMC/SD 카드에서 루트 파일 시스템의 위치이다.
참고:
미리 빌드된 SD 카드의 U-Boot 환경은 이와 일치하지 않는다. 더 많은 변형을 자동으로 처리할 수 있도록 더 복잡하다. 위의 예는 수동으로 이해하고 사용하기 쉽도록 디자인되었다.
Reading the kernel image from eMMC (eMMC에서 커널 이미지 읽기)
eMMC에는 사용자 영역, 부트 파티션 1 그리고 부트 파티션 2가 있다. eMMC 파티션 사이에서 전환하려면, 사용자가 mmc dev [dev id] [partition id] 커맨드를 사용해야 한다. 예를 들면 아래와 같다.
mmc dev 2 0 ---> user area
mmc dev 2 1 ---> boot partition 1
mmc dev 2 2 ---> boot partition 2
4.7.7 Running the Linux image from NFS
NFS에서 부팅하려면, U-Boot 프롬프트에서 다음 환경 변수를 설정한다:
U-Boot > setenv serverip <your server IP>
U-Boot > setenv image <your kernel zImage name on the TFTP server>
U-Boot > setenv fdtfile <your dtb image name on the TFTP server>
U-Boot > setenv rootfsinfo 'setenv bootargs ${bootargs} root=/dev/nfs
ip=dhcp nfsroot=${serverip}:/data/rootfs_home/rootfs_mx6,v3,tcp'
U-Boot > setenv bootcmd_net 'run rootfsinfo; dhcp ${image};
dhcp ${fdt_addr} ${fdtfile}; booti ${loadaddr} - ${fdt_addr}'
U-Boot > setenv bootcmd 'run bootcmd_net'
참고:
MAC 주소가 퓨즈에 저장(burn)되지 않은 경우, U-Boot에서 네트워크를 사용하도록 MAC 주소를 설정한다.
# eth0:
setenv ethaddr xx:xx:xx:xx:xx:xx
# eth1:
setenv eth1addr xx:xx:xx:xx:xx:xx
4.8 Arm SystemReady-IR
4.8.1 Arm SystemReady-IR ACS compliance test
i.MX 8M Mini EVK 보드에서 SystemReady-IR ACS를 실행하려면, https://github.com/ARM-software/arm-systemready에서 Arm SystemReady-IR ACS를 참조한다.
- ACS Git를 복제(clone)한다.
- 미리 빌드된 릴리스 이미지나 소스 코드에서 빌드된 이미지를 U-Disk, SD나 eMMC에 플래시한다. 대상 저장소가 부트 저장소인 경우, ACS 이미지 다음에 부트 이미지(flash.bin)를 플래시한다. 예를 들어, U-Disk에서 아래와 같이 플래시한다:
sudo dd if=ir_acs_live_image.img of=/dev/sde bs=64M;sync
- 보드를 부팅한다. ACS 테스트가 자동으로 실행된다.
- ACS에서 전원 끄기 테스트를 위한 수동 단계가 있다. 해당 테스트 케이스를 실행할 때 보드의 전원을 다시 켠다.
테스트 결과는 저장소에 저장된다. - SCT_Parser를 사용하여 ACS 결과를 분석한다. SCT_Parser는 https://github.com/vstehle/SCT_Parser에서 얻을 수 있다.
- acs_results\sct_results\Overall\Summary.ekl 파일을 U-Disk의 RESULT 파티션의 SCT_Parser 폴더로 복사한다. 최종 보고서를 얻으려면, python3 parser.py --config EBBR.yaml Summary.ekl EBBR.seq를 실행한다.
4.8.2 Capsule update
다음 커맨드를 사용하여 캡슐 업데이트를 수행한다:
- SD의 경우:
U-Boot > env set dfu_alt_info "mmc 1=1 raw 0x42 0x2000"
- eMMC의 경우:
U-Boot > env set dfu_alt_info "mmc 2=1 raw 0x42 0x2000 mmcpart 1" U-Boot > efidebug boot add 0 Boot0000 mmc 1:1 capsule1.bin;efidebug boot next 0 U-Boot > setenv serverip 10.192.242.218;dhcp $loadaddr capsule1.bin;fatwrite mmc 1:1 ${loadaddr} /EFI/UpdateCapsule/capsule1.bin 0x${filesize} U-Boot > setenv -e -nv -bs -rt -v OsIndications =0x04 U-Boot > efidebug capsule disk-update reset
U-Boot를 중단하지 않는다. 보드가 grub에 진입하도록 한다. grub이 실행되기 전에 부트로더를 자동으로 업데이트하고 capsule1.bin을 제거해야 한다. 그리고 보드를 다시 리부팅한다. 업데이트된 U-Boot로 보드가 부팅된다.
4.8.3 Linux distro installation
Fedora34:
- Fedora34 IOT 버전을 다운로드한다.
- SD 카드에 저장(burn)한다.
- eMMC에서 부팅한다.
- SD 카드에서 eMMC로 배포판을 설치한다.
OpenSUSE:
- OpenSUSE Tumbleweed 버전을 다운로드한다.
- USB 디스크에 ISO를 저장(burn)한다.
- eMMC에서 부팅한다.
- ISO에서 eMMC로 설치한다.
'NXP i.MX SoC Family > i.MX Linux User`s Guide (IMXLUG)' 카테고리의 다른 글
i.MX Linux User's Guide (IMXLUG) - Power Management (0) | 2023.02.24 |
---|---|
i.MX Linux User's Guide (IMXLUG) - Enabling Solo Emulation (0) | 2023.02.24 |
i.MX Linux User's Guide (IMXLUG) - Basic Terminal Setup (0) | 2023.02.02 |
i.MX Linux User's Guide (IMXLUG) - Introduction (0) | 2023.01.31 |
i.MX Linux User's Guide (IMXLUG) - Overview (0) | 2023.01.31 |