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 설정 수정
'프로그래밍 > 시스템' 카테고리의 다른 글
U-Boot 포팅 (실습 프로젝트: 새로운 보드에 U-Boot 포팅 / 최종 목표: 새로운 보드에서 U-Boot 및 리눅스 커널 부팅 성공) (0) | 2025.03.05 |
---|---|
U-Boot 포팅 (실습 프로젝트: 새로운 보드에 U-Boot 포팅 / 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 |
U-Boot 포팅 (6. U-Boot 기능 확장 및 디바이스 드라이버 추가 / 새로운 디바이스 추가하기 (UART, I2C, SPI, GPIO 설정)) (0) | 2025.02.26 |