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 빌드 및 실행 테스트 방법 포함
'프로그래밍 > 시스템' 카테고리의 다른 글
U-Boot 포팅 (4. U-Boot 포팅 개념 및 주요 수정 포인트 / 새로운 보드 추가하기) (0) | 2025.02.26 |
---|---|
U-Boot 포팅 (4. U-Boot 포팅 개념 및 주요 수정 포인트 / U-Boot 디렉토리 구조 및 주요 파일) (0) | 2025.02.26 |
U-Boot 포팅 (3. U-Boot 빌드 및 실행 / 실제 보드에서 U-Boot 실행하기) (0) | 2025.02.26 |
U-Boot 포팅 (3. U-Boot 빌드 및 실행 / QEMU를 활용한 U-Boot 실행) (0) | 2025.02.26 |
U-Boot 포팅 (3. U-Boot 빌드 및 실행 / 빌드 결과물 분석) (0) | 2025.02.26 |