U-Boot 포팅 (4. U-Boot 포팅 개념 및 주요 수정 포인트 / 포팅 개요)

2025. 2. 26. 12:26프로그래밍/시스템

포팅 개요

U-Boot는 다양한 임베디드 보드에서 동작할 수 있도록 설계된 오픈소스 부트로더입니다.
하지만, 새롭게 개발된 보드나 기존에 지원되지 않는 하드웨어에서는 U-Boot를 직접 포팅해야 합니다.

이 문서에서는 새 보드를 위한 U-Boot 포팅이 필요한 이유와 기존 보드 설정을 참고하여 포팅하는 방법을 설명합니다.


1. 새 보드를 위한 U-Boot 포팅이 필요한 이유

🔹 왜 U-Boot 포팅이 필요할까?

U-Boot는 다양한 임베디드 하드웨어를 지원하지만, 모든 보드를 기본적으로 지원하는 것은 아닙니다.
새로운 보드에서 U-Boot를 실행하려면, 보드의 하드웨어 특성에 맞게 U-Boot를 수정하고 설정을 추가해야 합니다.

🔹 U-Boot 포팅이 필요한 주요 이유

이유  설명
새로운 SoC 사용 기존에 지원되지 않는 CPU/SoC를 사용하는 경우
새로운 보드 설계 새로운 PCB 설계로 인해 하드웨어 설정이 달라지는 경우
부팅 환경이 다름 기본 저장장치(eMMC, NAND, SD 카드)가 기존 보드와 다른 경우
I/O 및 주변장치 차이 UART, SPI, I2C, GPIO 등의 하드웨어 구성이 다를 경우
메모리 초기화 필요 RAM 크기, 클럭 설정 등이 기존 보드와 다른 경우
네트워크 부팅 환경 변경 TFTP, NFS 등의 네트워크 설정이 기존 보드와 다를 경우

결론: 새 보드를 지원하려면 CPU 및 메모리 초기화, 부팅 저장장치 설정, 디바이스 트리 수정 등의 작업이 필요합니다.


2. 기존 보드 설정을 참고하여 포팅하는 방법

🔹 U-Boot 소스 코드 구조 분석

U-Boot 소스 코드는 보드, CPU 아키텍처, 디바이스 드라이버별로 정리되어 있습니다.
새로운 보드를 추가할 때, 유사한 보드의 설정을 참고하여 수정하는 것이 가장 효율적인 방법입니다.

📌 U-Boot 소스코드 디렉토리 구조

u-boot/
├── arch/                # CPU 아키텍처별 코드 (ARM, x86, RISC-V 등)
│   ├── arm/
│   │   ├── dts/         # ARM 디바이스 트리(DTS) 파일
│   │   ├── cpu/         # CPU 관련 코드
│   │   ├── mach-xxx/    # 특정 SoC 관련 코드 (i.MX, Rockchip 등)
│   ├── riscv/
│   ├── x86/
├── board/               # 보드별 코드
│   ├── raspberrypi/     # Raspberry Pi 관련 코드
│   ├── beaglebone/      # BeagleBone 관련 코드
│   ├── myboard/         # 새로운 보드 추가할 디렉토리
├── configs/             # 보드별 기본 설정(defconfig)
├── drivers/             # 디바이스 드라이버 (I2C, SPI, USB 등)
├── include/             # 공통 헤더 파일
├── common/              # 공통 기능 코드
└── Makefile             # 빌드 시스템

📌 포팅 시 수정이 필요한 주요 파일

디렉토리  역할
arch/arm/dts/ 보드의 디바이스 트리(DTS) 파일
arch/arm/mach-<soc>/ SoC별 초기화 코드 (클럭, RAM 등)
board/<보드명>/ 보드별 설정 및 초기화 코드
configs/<보드명>_defconfig 보드의 기본 빌드 설정
drivers/ 특정 하드웨어 드라이버 (I2C, SPI, USB 등)

🔹 1) 기존 보드 설정을 찾아 참고하기

비슷한 하드웨어 구조를 가진 보드를 찾아 기존 설정을 참고하는 것이 중요합니다.

📌 지원되는 보드 목록 확인 (boards.cfg)

cat boards.cfg | less

📌 특정 키워드로 검색 (예: i.MX8)

grep "imx8" boards.cfg

📌 출력 예제

imx8mm_evk   aarch64  armv8      nxp   imx8mm_evk_defconfig

비슷한 SoC(i.MX8M Mini)가 있는 보드를 찾고, 해당 보드의 설정을 참고할 수 있습니다.


🔹 2) 새로운 보드 디렉토리 생성 및 설정 추가

📌 새로운 보드용 디렉토리 생성

mkdir board/myboard
cp -r board/existing_board/* board/myboard

📌 Makefile에 새 보드 추가

vim board/myboard/Makefile
obj-y += myboard.o

🔹 3) 보드 설정(defconfig) 파일 추가

configs/ 디렉토리에 새로운 보드의 기본 설정 파일을 생성합니다.

cp configs/existing_board_defconfig configs/myboard_defconfig

📌 설정 파일 편집

vim configs/myboard_defconfig
CONFIG_SYS_TEXT_BASE=0x40200000
CONFIG_NR_DRAM_BANKS=1
CONFIG_ENV_SIZE=0x2000
CONFIG_SYS_MALLOC_LEN=0x200000

해당 설정을 기반으로 U-Boot를 빌드할 수 있습니다.

make myboard_defconfig
make -j$(nproc)

🔹 4) 디바이스 트리(DTS) 수정

📌 새로운 보드의 DTS 파일 추가

cp arch/arm/dts/existing_board.dts arch/arm/dts/myboard.dts
vim arch/arm/dts/myboard.dts

📌 예제 (RAM, UART 설정)

/ {
    memory {
        device_type = "memory";
        reg = <0x80000000 0x40000000>; /* 1GB RAM */
    };
    
    chosen {
        bootargs = "console=ttyS0,115200 root=/dev/mmcblk0p2 rw";
    };
};

디바이스 트리를 반영하여 빌드

make dtbs

🔹 5) 새 보드 빌드 및 실행 테스트

📌 새 보드용 U-Boot 빌드

make myboard_defconfig
make -j$(nproc)

📌 QEMU에서 테스트

qemu-system-aarch64 -M virt -nographic -bios u-boot.bin

📌 실제 보드에서 테스트

sudo dd if=u-boot.bin of=/dev/sdX bs=1024 seek=8

📌 정리

새 보드를 위한 U-Boot 포팅이 필요한 이유 정리
기존 보드 설정을 참고하여 새로운 보드를 추가하는 방법 학습
보드별 디렉토리, defconfig, DTS 설정 방법 설명
U-Boot 빌드 및 실행 테스트 방법 포함