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 빌드 및 실행 테스트 완료
'프로그래밍 > 시스템' 카테고리의 다른 글
U-Boot 포팅 (5. 디바이스 트리(DTS) 및 환경 변수 설정 / U-Boot 환경 변수 설정) (0) | 2025.02.26 |
---|---|
U-Boot 포팅 (5. 디바이스 트리(DTS) 및 환경 변수 설정 / 디바이스 트리(Device Tree)란?) (0) | 2025.02.26 |
U-Boot 포팅 (4. U-Boot 포팅 개념 및 주요 수정 포인트 / 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 |