U-Boot 포팅 (7. U-Boot 디버깅 및 문제 해결 / 부팅 실패 시 해결 방법)

2025. 3. 5. 12:53프로그래밍/시스템

부팅 실패 시 해결 방법

임베디드 시스템에서 U-Boot가 정상적으로 부팅되지 않는 경우 다양한 원인이 있을 수 있습니다.
이를 해결하려면 로그 분석, 보드 설정 확인, 환경 변수 초기화 등을 수행해야 합니다.

이 문서에서는 부팅 실패 시 문제 해결 방법, DEBUG 로그를 활용한 분석, 보드 설정 수정, 환경 변수 리셋 방법을 설명합니다.


1. U-Boot가 멈추는 지점 분석 (DEBUG 로그 활용)

🔹 부팅 로그 분석 방법

U-Boot가 부팅 과정에서 멈춘다면, 시리얼 콘솔(UART) 출력을 확인하여 어디서 멈췄는지 분석해야 합니다.

📌 시리얼 콘솔에서 부팅 로그 확인

sudo minicom -D /dev/ttyUSB0 -b 115200

또는

sudo picocom -b 115200 /dev/ttyUSB0

📌 부팅 로그 예제 (정상 동작)

U-Boot 2024.01 (Mar 04 2025 - 10:30:00)

CPU:   Allwinner H3
DRAM:  1024 MiB
MMC:   mmc@1c0f000: 0, mmc@1c11000: 1
In:    serial
Out:   serial
Err:   serial
Net:   No ethernet found.
Hit any key to stop autoboot:  0 

위와 같은 로그가 출력되면, U-Boot가 정상적으로 실행됨


🔹 부팅이 멈춘 경우 (오류 분석)

📌 예제 1: U-Boot 실행 중 멈춤

U-Boot 2024.01 (Mar 04 2025 - 10:30:00)

CPU:   Allwinner H3
DRAM:  

RAM 크기 출력 후 멈춘 경우, RAM 초기화 문제일 가능성이 높음

📌 예제 2: 저장 장치 인식 실패

MMC:   no card present

SD 카드 또는 eMMC가 정상적으로 연결되지 않았을 가능성이 있음


🔹 DEBUG 로그 활성화

U-Boot 내부에서 더 많은 디버깅 정보를 출력하려면 CONFIG_DEBUG 옵션을 활성화해야 합니다.

📌 U-Boot 빌드 설정 수정 (configs/myboard_defconfig)

CONFIG_DEBUG=y
CONFIG_LOGLEVEL=7

로그 레벨을 7로 설정하여 모든 디버깅 정보 출력

📌 U-Boot 재빌드 및 실행

make myboard_defconfig
make -j$(nproc)

이제 printenv debug를 실행하면 활성화된 로그를 확인 가능

📌 부팅 후 DEBUG 로그 활성화

setenv debug 1
saveenv

부팅 과정에서 더 자세한 로그 출력 가능


2. 보드 설정이 잘못된 경우 수정할 부분 확인

🔹 보드 설정 오류 유형과 해결 방법

오류 유형 해결 방법
RAM 초기화 오류 arch/arm/mach-<SoC>/ 디렉토리에서 DRAM 설정 확인
저장 장치 인식 실패 mmc dev 0 실행 후 printenv bootcmd 확인
부트 커맨드 실행 오류 printenv bootcmd 및 bootargs 확인
디바이스 트리 오류 dtc -I dtb -O dts -o myboard_decoded.dts myboard.dtb 로 디바이스 트리 확인

🔹 RAM 초기화 문제 해결

📌 현재 RAM 크기 확인

bdinfo | grep ram

📌 출력 예제

DRAM bank 0: start = 0x80000000, size = 0x40000000

이 값이 예상과 다르면, arch/arm/mach-<SoC>/ 내의 RAM 설정을 확인해야 함

📌 RAM 테스트 (mtest 활용)

mtest 0x80000000 0x800FFFFF

RAM이 정상적으로 읽기/쓰기가 가능한지 확인 가능


🔹 SD 카드 또는 eMMC 부팅 문제 해결

📌 저장 장치 목록 확인

mmc list

📌 출력 예제

mmc@1c0f000: 0 (SD)
mmc@1c11000: 1 (eMMC)

부트 장치가 인식되지 않으면 하드웨어 연결 또는 DTS 설정을 확인해야 함

📌 SD 카드에서 부팅 파일 확인

fatls mmc 0:1 /boot/

📌 출력 예제

zImage
myboard.dtb

부트로더가 올바르게 SD 카드에서 커널을 찾을 수 있도록 확인 필요


3. 환경 변수를 리셋하는 방법 (env default -a)

U-Boot에서 환경 변수가 잘못 설정된 경우, 부팅 실패의 원인이 될 수 있습니다.
📌 현재 환경 변수 확인

printenv

📌 환경 변수 초기화 (공장 기본값으로 복원)

env default -a
saveenv

환경 변수를 초기화한 후 재부팅

reset

📌 환경 변수 변경 후 저장

setenv bootdelay 3
setenv bootcmd 'run my_custom_boot'
saveenv

환경 변수를 올바르게 설정하여 자동 부팅 문제 해결 가능


4. 부팅 문제 해결 프로세스 요약

📌 1️⃣ U-Boot 시리얼 콘솔 로그 확인

printenv debug

디버깅 로그 레벨이 낮다면 setenv debug 1로 설정 후 saveenv 실행

📌 2️⃣ 메모리 및 저장 장치 점검

bdinfo
mtest 0x80000000 0x800FFFFF
mmc list
fatls mmc 0:1 /boot/

RAM 및 부팅 장치가 정상적으로 인식되는지 확인

📌 3️⃣ 부팅 커맨드 점검 및 수정

printenv bootcmd
setenv bootcmd 'load mmc 0:1 0x82000000 /boot/zImage; load mmc 0:1 0x83000000 /boot/myboard.dtb; bootz 0x82000000 - 0x83000000'
saveenv
reset

부팅 과정에서 bootcmd 실행 여부 확인

📌 4️⃣ 환경 변수 초기화 (env default -a)

env default -a
saveenv
reset

환경 변수를 초기화하여 문제 해결 가능


📌 정리

U-Boot 부팅 중 멈추는 원인 분석 (printenv debug, bdinfo, mtest)
DEBUG 로그 활성화 및 시리얼 콘솔을 통해 오류 지점 확인 (CONFIG_DEBUG=y)
보드 설정 오류(RAM, SD 카드, eMMC, DTS) 분석 및 수정
환경 변수 초기화 (env default -a) 및 bootcmd 설정 수정