U-Boot 포팅 (4. U-Boot 포팅 개념 및 주요 수정 포인트 / U-Boot 디렉토리 구조 및 주요 파일)

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

U-Boot 디렉토리 구조 및 주요 파일

U-Boot 소스 코드는 CPU 아키텍처, 보드 설정, 디바이스 드라이버, 공통 코드 등으로 구성되어 있습니다.
새로운 보드를 추가하거나 U-Boot를 수정할 때는 해당 디렉토리와 주요 파일의 역할을 이해하는 것이 중요합니다.

이 문서에서는 U-Boot의 디렉토리 구조와 각 주요 파일의 역할을 설명합니다.


1. U-Boot 디렉토리 구조 개요

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

u-boot/
├── arch/            # CPU 및 아키텍처별 코드
│   ├── arm/
│   ├── x86/
│   ├── riscv/
│   ├── mips/
├── board/           # 특정 보드별 코드
│   ├── raspberrypi/
│   ├── beaglebone/
│   ├── myboard/
├── configs/         # 보드별 기본 설정 파일 (defconfig)
├── drivers/         # 디바이스 드라이버 (I2C, SPI, USB 등)
├── include/         # 공통 헤더 파일 및 환경 변수 설정
│   ├── configs/
├── common/          # 공통 기능 코드 (명령어, 환경 변수, 메모리 관리 등)
├── net/             # 네트워크 관련 코드 (TFTP, DHCP, PXE 부팅 지원)
├── fs/              # 파일 시스템 코드 (FAT, ext4, UBIFS 등)
├── tools/           # U-Boot 관련 유틸리티 프로그램
├── doc/             # 공식 문서 및 가이드
├── scripts/         # 빌드 및 설정 관련 스크립트
└── Makefile         # 전체 빌드 시스템을 관리하는 Makefile

각 디렉토리는 특정 기능을 담당하며, 새로운 보드를 추가하거나 수정할 때 주로 arch/, board/, configs/, drivers/, common/ 디렉토리를 수정하게 됩니다.


2. U-Boot 주요 디렉토리 및 파일 설명

🔹 1) arch/ : CPU 및 아키텍처 관련 코드

CPU 및 SoC(System-on-Chip)별 초기화 코드가 포함된 디렉토리입니다.
RAM, 클럭, 인터럽트 컨트롤러 등의 하드웨어 초기화 코드가 여기에 위치합니다.

📌 디렉토리 구조

arch/
├── arm/             # ARM 아키텍처 코드 (Cortex-A, Cortex-M, Cortex-R)
│   ├── cpu/         # CPU별 초기화 코드 (i.MX, Rockchip, Allwinner 등)
│   ├── mach-omap2/  # TI OMAP2 SoC 관련 코드
│   ├── mach-imx/    # NXP i.MX 시리즈 관련 코드
│   ├── dts/         # ARM 디바이스 트리(DTS) 파일
├── riscv/           # RISC-V 관련 코드
├── mips/            # MIPS 아키텍처 관련 코드
├── x86/             # x86 PC 관련 코드

📌 RAM 초기화 예제 (i.MX SoC)

void dram_init(void)
{
    gd->ram_size = get_ram_size();
}

새로운 SoC를 추가할 때 arch/<ARCH>/mach-<SoC>/ 디렉토리를 수정해야 합니다.


🔹 2) board/ : 특정 보드 관련 코드

각 보드별 초기화 코드 및 설정이 포함된 디렉토리입니다.
✅ 새로운 보드를 추가하려면 board/<보드명>/ 디렉토리를 만들어야 합니다.

📌 디렉토리 구조

board/
├── raspberrypi/
│   ├── Makefile
│   ├── rpi.c
│   ├── rpi.h
├── beaglebone/
│   ├── Makefile
│   ├── beaglebone.c
│   ├── beaglebone.h
├── myboard/        # 새로운 보드를 추가할 때 사용
│   ├── myboard.c
│   ├── myboard.h

📌 보드 초기화 예제 (BeagleBone)

int board_init(void)
{
    /* GPIO, UART, 클럭 초기화 */
    return 0;
}

보드별 GPIO, 전원 관리, 부팅 장치 설정을 여기에 추가합니다.


🔹 3) configs/ : 디폴트 설정 파일 (defconfig)

✅ **각 보드의 기본 설정 파일(defconfig)**이 저장된 디렉토리입니다.
✅ make <board>_defconfig 명령어를 실행하면, 이 파일이 .config로 적용됩니다.

📌 디렉토리 구조

configs/
├── rpi_4_defconfig          # Raspberry Pi 4 설정 파일
├── beaglebone_defconfig     # BeagleBone 설정 파일
├── imx8mm_evk_defconfig     # i.MX8 EVK 설정 파일
├── myboard_defconfig        # 새로운 보드 추가

📌 설정 파일 예제 (configs/myboard_defconfig)

CONFIG_SYS_TEXT_BASE=0x40200000
CONFIG_NR_DRAM_BANKS=1
CONFIG_ENV_SIZE=0x2000
CONFIG_SYS_MALLOC_LEN=0x200000

새로운 보드를 추가할 때 configs/ 디렉토리에 <보드명>_defconfig 파일을 만들어야 합니다.


🔹 4) drivers/ : 디바이스 드라이버 코드

UART, I2C, SPI, USB, 네트워크 등의 하드웨어 드라이버가 포함된 디렉토리입니다.
✅ 새로운 하드웨어(센서, 저장장치, 통신 모듈 등)를 추가하려면 이 디렉토리를 수정해야 합니다.

📌 디렉토리 구조

drivers/
├── uart/             # UART 드라이버
├── i2c/              # I2C 드라이버
├── spi/              # SPI 드라이버
├── usb/              # USB 드라이버
├── mmc/              # SD/eMMC 드라이버
├── net/              # 네트워크 드라이버

📌 UART 드라이버 예제

void uart_init(void)
{
    /* UART 초기화 코드 */
}

새로운 디바이스 드라이버를 추가하려면 drivers/ 디렉토리를 수정해야 합니다.


🔹 5) include/configs/ : 환경 설정 파일

환경 변수 및 보드별 기본 설정을 포함하는 헤더 파일이 위치하는 디렉토리입니다.
✅ CONFIG_ 접두어가 붙은 U-Boot 설정 값들이 저장됩니다.

📌 디렉토리 구조

include/configs/
├── raspberrypi.h
├── beaglebone.h
├── myboard.h

📌 환경 변수 설정 예제 (include/configs/myboard.h)

#define CONFIG_BOOTCOMMAND "bootm 0x80000000"
#define CONFIG_ENV_SIZE 0x2000
#define CONFIG_SYS_MALLOC_LEN (16 * 1024 * 1024)

환경 변수 및 부팅 명령을 변경하려면 include/configs/ 디렉토리를 수정해야 합니다.


🔹 6) common/ : 공통 코드

U-Boot 명령어, 메모리 관리, 환경 변수 처리 등의 공통 기능을 포함하는 디렉토리입니다.

📌 디렉토리 구조

common/
├── bootm.c         # 커널 부팅 명령어 처리
├── console.c       # 콘솔 관련 코드
├── command.c       # U-Boot 명령어 처리
├── env_common.c    # 환경 변수 관리

📌 부팅 명령 예제 (common/bootm.c)

void do_bootm(void)
{
    printf("Loading kernel...\n");
    /* 커널 실행 코드 */
}

부팅 과정 또는 U-Boot 명령어를 변경하려면 common/ 디렉토리를 수정해야 합니다.


📌 정리

U-Boot 소스 코드 구조 이해
CPU/보드 설정(arch/, board/, configs/)
디바이스 드라이버(drivers/), 환경 변수(include/configs/), 공통 코드(common/) 역할 설명