U-Boot 포팅 (실습 프로젝트: 새로운 보드에 U-Boot 포팅 / U-Boot 포팅 프로젝트 개요)

2025. 3. 5. 12:55프로그래밍/시스템

U-Boot 포팅 프로젝트 개요

이 프로젝트에서는 특정 보드를 선택하여 U-Boot를 수정, 빌드 및 부팅까지 진행하는 과정을 다룹니다.
예제 보드로 Raspberry Pi, BeagleBone, ODROID 등을 사용할 수 있으며, U-Boot 소스코드를 수정하고 디바이스 트리를 조정하여 부팅 환경을 설정하는 것이 목표입니다.


1. 예제 보드 선택

U-Boot를 포팅하기 위해 지원되는 보드 중 하나를 선택해야 합니다.

보드 CPU  부트 옵션 U-Boot 지원 여부
Raspberry Pi 4 Broadcom BCM2711 (ARM Cortex-A72) SD 카드 지원
BeagleBone Black AM3358 (ARM Cortex-A8) eMMC, SD 카드 지원
ODROID-XU4 Exynos 5422 (ARM Cortex-A15) SD 카드, eMMC 지원

📌 보드 지원 여부 확인 (boards.cfg 확인)

cat boards.cfg | grep raspberrypi
cat boards.cfg | grep beaglebone
cat boards.cfg | grep odroid

사용할 보드 예시: Raspberry Pi 4

export BOARD=rpi_4

2. U-Boot 소스코드 수정 및 빌드

🔹 U-Boot 소스코드 다운로드

📌 U-Boot 소스코드 클론

git clone https://source.denx.de/u-boot/u-boot.git
cd u-boot

📌 사용할 보드 선택 및 설정 적용

make rpi_4_defconfig

defconfig는 기본적으로 보드의 설정을 적용하는 파일로, configs/ 디렉토리에 위치함

📌 U-Boot 빌드

make -j$(nproc)

📌 빌드 완료 후 생성된 파일 확인

ls u-boot*

u-boot.bin, u-boot.img, u-boot.elf 파일이 정상적으로 생성되었는지 확인


3. 디바이스 트리 수정

디바이스 트리(Device Tree, DTS)는 보드의 하드웨어 정보를 U-Boot와 커널이 이해할 수 있도록 정의하는 파일입니다.
📌 기존 DTS 파일을 복사하여 수정 (arch/arm/dts/)

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

📌 예제 DTS 수정 (arch/arm/dts/myboard.dts)

/ {
    model = "My Custom Board";
    compatible = "raspberrypi,4";

    memory {
        device_type = "memory";
        reg = <0x80000000 0x40000000>; /* 1GB RAM */
    };

    chosen {
        bootargs = "console=ttyS0,115200 root=/dev/mmcblk0p2 rw";
    };

    uart0: serial@20201000 {
        compatible = "ns16550";
        reg = <0x20201000 0x1000>;
        clock-frequency = <24000000>;
        status = "okay";
    };
};

📌 DTS 파일 컴파일

make dtbs

생성된 myboard.dtb 파일이 정상적으로 존재하는지 확인

ls arch/arm/dts/*.dtb

4. SD 카드 및 eMMC 부팅 설정

U-Boot를 실행하려면 부트로더를 SD 카드 또는 eMMC에 설치해야 합니다.

🔹 1) SD 카드 포맷 및 준비

📌 SD 카드 디바이스 확인

lsblk

✅ 예제 결과 (/dev/sdb가 SD 카드로 인식됨)

📌 SD 카드 포맷

sudo umount /dev/sdb*
sudo mkfs.vfat /dev/sdb1

🔹 2) SD 카드에 U-Boot 설치 (dd 명령어 사용)

📌 U-Boot를 SD 카드에 기록

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

📌 SD 카드 부팅 테스트

  • SD 카드를 보드에 삽입한 후 전원을 켜면 U-Boot가 실행됨
  • 시리얼 콘솔(UART)을 통해 부팅 로그 확인 가능

5. 부팅 성공 확인 및 디버깅

🔹 1) 시리얼 콘솔을 이용한 부팅 로그 확인

📌 시리얼 콘솔 실행

sudo minicom -D /dev/ttyUSB0 -b 115200

또는

sudo picocom -b 115200 /dev/ttyUSB0

📌 정상 부팅 로그 예제

U-Boot 2024.01 (Mar 04 2025 - 10:30:00)

CPU:   Broadcom BCM2711
DRAM:  1024 MiB
MMC:   mmc@7e300000: 0
In:    serial
Out:   serial
Err:   serial
Net:   No ethernet found.
Hit any key to stop autoboot:  0 

U-Boot가 정상적으로 실행되었음을 확인 가능


🔹 2) 환경 변수 확인 및 수정

📌 현재 환경 변수 확인

printenv

📌 부팅 커맨드 설정

setenv bootcmd 'load mmc 0:1 0x82000000 /boot/zImage; load mmc 0:1 0x83000000 /boot/dtb/myboard.dtb; bootz 0x82000000 - 0x83000000'
saveenv

📌 변경된 설정으로 부팅 테스트

run bootcmd

🔹 3) 문제 발생 시 디버깅

📌 DEBUG 로그 활성화

setenv debug 1
saveenv

📌 RAM 및 저장 장치 점검

bdinfo
mtest 0x80000000 0x800FFFFF
mmc list
fatls mmc 0:1 /boot/

📌 환경 변수 초기화 (env default -a)

env default -a
saveenv
reset

부팅 오류가 발생하면 위 명령어를 사용하여 원인을 분석 후 수정 가능


📌 정리

예제 보드 선택 (Raspberry Pi, BeagleBone, ODROID)
U-Boot 소스코드 다운로드 및 수정 (defconfig, dtbs)
디바이스 트리 수정 (arch/arm/dts/) 및 빌드 (make dtbs)
SD 카드 및 eMMC에 U-Boot 설치 (dd 명령어 사용)
부팅 성공 확인 및 시리얼 콘솔을 통한 디버깅 (printenv, bootcmd, debug 1)