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/) 역할 설명
'프로그래밍 > 시스템' 카테고리의 다른 글
U-Boot 포팅 (5. 디바이스 트리(DTS) 및 환경 변수 설정 / 디바이스 트리(Device Tree)란?) (0) | 2025.02.26 |
---|---|
U-Boot 포팅 (4. U-Boot 포팅 개념 및 주요 수정 포인트 / 새로운 보드 추가하기) (0) | 2025.02.26 |
U-Boot 포팅 (4. 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 |