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)
'프로그래밍 > 시스템' 카테고리의 다른 글
U-Boot 포팅 (9. 추가 심화 과정) (0) | 2025.03.05 |
---|---|
U-Boot 포팅 (실습 프로젝트: 새로운 보드에 U-Boot 포팅 / 최종 목표: 새로운 보드에서 U-Boot 및 리눅스 커널 부팅 성공) (0) | 2025.03.05 |
U-Boot 포팅 (7. U-Boot 디버깅 및 문제 해결 / 부팅 실패 시 해결 방법) (0) | 2025.03.05 |
U-Boot 포팅 (7. U-Boot 디버깅 및 문제 해결 / JTAG 디버깅) (0) | 2025.03.05 |
U-Boot 포팅 (7. U-Boot 디버깅 및 문제 해결 / U-Boot 디버깅 방법) (0) | 2025.03.05 |