U-Boot 포팅 (4. U-Boot 포팅 개념 및 주요 수정 포인트 / 새로운 보드 추가하기)

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

새로운 보드 추가하기 (U-Boot 포팅 과정)

새로운 보드를 지원하기 위해서는 보드의 하드웨어를 정의하고, U-Boot가 해당 보드를 인식할 수 있도록 설정하는 과정이 필요합니다.

이 문서에서는 새로운 보드를 추가하는 단계별 방법을 설명합니다.


1. 새로운 보드 추가를 위한 필수 작업

보드 설정 파일 (defconfig) 추가
보드 디렉토리 생성 및 초기화 코드 작성
Makefile 및 Kconfig 수정하여 보드를 U-Boot 빌드 시스템에 등록
디바이스 트리(DTS) 작성 및 하드웨어 설정 적용


2. configs/ 디렉토리에 새로운 defconfig 생성

각 보드는 고유한 defconfig 파일을 가지고 있으며, configs/ 디렉토리에 저장됩니다.
defconfig 파일에는 RAM 크기, 환경 변수 저장 방식, UART 설정, 네트워크 옵션 등이 포함됩니다.

📌 새로운 보드용 defconfig 파일 생성 (예: myboard_defconfig)

cp configs/existing_board_defconfig configs/myboard_defconfig

📌 파일 수정 (configs/myboard_defconfig)

vim configs/myboard_defconfig

📌 설정 예제 (configs/myboard_defconfig)

CONFIG_ARM=y
CONFIG_ARCH_MYBOARD=y
CONFIG_SYS_TEXT_BASE=0x40200000
CONFIG_NR_DRAM_BANKS=1
CONFIG_ENV_SIZE=0x2000
CONFIG_ENV_IS_IN_MMC=y
CONFIG_SYS_MALLOC_LEN=0x200000

이제 U-Boot에서 새로운 보드의 기본 설정을 로드할 수 있습니다.
📌 설정 적용 후 빌드 가능

make myboard_defconfig

3. board/ 디렉토리에 새로운 보드 디렉토리 추가

각 보드는 board/<보드명>/ 디렉토리에 위치하며, 하드웨어 초기화 및 설정 코드가 포함됩니다.

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

mkdir board/myboard

📌 기존 보드를 참고하여 파일 복사

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

📌 보드 초기화 코드 작성 (board/myboard/myboard.c)

#include <common.h>
#include <dm.h>
#include <init.h>
#include <asm/io.h>

int board_init(void)
{
    printf("Initializing MyBoard...\n");
    return 0;
}

int board_late_init(void)
{
    env_set("bootcmd", "bootm 0x82000000");
    return 0;
}

보드 초기화 과정에서 board_init() 및 board_late_init()을 구현해야 합니다.

📌 헤더 파일 작성 (board/myboard/myboard.h)

#ifndef __MYBOARD_H__
#define __MYBOARD_H__

#define CONFIG_SYS_TEXT_BASE 0x40200000
#define CONFIG_NR_DRAM_BANKS 1
#define CONFIG_ENV_SIZE 0x2000

#endif /* __MYBOARD_H__ */

4. Makefile 및 Kconfig 수정하여 보드 인식시키기

U-Boot 빌드 시스템이 새로운 보드를 인식하려면 Makefile 및 Kconfig 파일을 수정해야 합니다.

📌 board/myboard/Makefile 생성 및 수정

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

📌 U-Boot Makefile에 새로운 보드 추가

vim Makefile
BOARD_DIRS += myboard

📌 보드를 선택할 수 있도록 arch/arm/Kconfig 수정

vim arch/arm/Kconfig
config ARCH_MYBOARD
    bool "Support for MyBoard"
    select CPU_ARM_CORTEXA7
    help
      Enable support for MyBoard with ARM Cortex-A7.

이제 make myboard_defconfig를 실행하면 새로운 보드를 선택할 수 있습니다.


5. arch/arm/dts/ 디렉토리에 새로운 DTS 파일 작성

디바이스 트리(DTS)는 보드의 CPU, RAM, 저장장치, 네트워크, GPIO 등을 정의하는 파일입니다.
📌 새로운 보드용 DTS 파일 생성 (arch/arm/dts/myboard.dts)

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

📌 DTS 파일 수정 (arch/arm/dts/myboard.dts)

vim arch/arm/dts/myboard.dts
/dts-v1/;
#include "arm/boot/dts/soc.dtsi"

/ {
    model = "My Custom Board";
    compatible = "myboard,my-soc";

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

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

📌 DTS 컴파일 (dtb 파일 생성)

make dtbs

새로운 DTS 파일을 빌드 시스템에 반영하기 위해 arch/arm/dts/Makefile도 수정해야 합니다.

📌 새로운 DTS 파일을 Makefile에 추가

vim arch/arm/dts/Makefile
dtb-$(CONFIG_ARCH_MYBOARD) += myboard.dtb

DTS 빌드 후, myboard.dtb 파일이 생성되었는지 확인

ls arch/arm/dts/*.dtb

6. 새로운 보드 빌드 및 실행

📌 새로운 보드의 defconfig 적용

make myboard_defconfig

📌 U-Boot 빌드 실행

make -j$(nproc)

📌 빌드된 실행 파일 확인

ls u-boot*

✅ u-boot.bin, u-boot.img, u-boot.dtb가 정상적으로 생성되었는지 확인

📌 QEMU에서 테스트

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

📌 SD 카드에 U-Boot 설치

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

📌 정리

새로운 보드용 defconfig 파일 생성 (configs/)
보드 초기화 코드 추가 (board/myboard/)
Makefile 및 Kconfig 수정하여 빌드 시스템에 보드 등록
디바이스 트리(DTS) 파일 작성 및 컴파일 (arch/arm/dts/)
U-Boot 빌드 및 실행 테스트 완료