Embedded System/Bootloader & System Startup

임베디드 개발자를 위한 RK3399 U-Boot 부팅 디버깅 및 커스터마이징 가이드

임베디드 친구 2025. 12. 10. 20:12
반응형

임베디드 시스템 개발을 하다 보면 가장 당혹스러운 순간은 전원을 켰는데 UART에 아무런 응답이 없을 때입니다. 특히 Rockchip RK3399와 같은 고성능 SoC는 부팅 단계가 복잡하여 초기 하드웨어 검증과 소프트웨어 디버깅이 쉽지 않습니다. 이번 글에서는 RK3399 보드를 사례로 들어, U-Boot 부팅 과정에서 문제를 추적하는 디버깅 기법과 사용자 경험을 개선하는 커스터마이징 방법을 정리해 보겠습니다.

Generated by Gemini AI.

핵심 요약

  • UART 로그는 부팅 단계별 성공 여부를 판단하는 유일한 지표이므로, 초기 부팅 먹통 현상을 해결하는 것이 최우선입니다.
  • CONFIG_DEBUG_UART와 같은 커널 설정과 printf 디버깅을 적절히 활용하면 부팅 단계별 흐름을 명확히 파악할 수 있습니다.
  • 부트 로고 커스터마이징과 bootdelay 최적화를 통해 제품의 완성도를 높이고 사용자 경험을 개선할 수 있습니다.

1. UART 로그: 디버깅의 시작과 끝

U-Boot는 ROM → SRAM Loader → TPL/SPL → U-Boot Main으로 이어지는 긴 여정을 거칩니다. 이 과정에서 각 단계가 성공적으로 넘어가는지 확인하는 방법은 오직 UART 로그뿐입니다.

단계 특징 확인 사항
ROM SoC 내부 코드 부팅 모드(eMMC/SD) 설정 확인
TPL/SPL SRAM 기반 로더 DRAM 트레이닝 및 UART 초기화 성공 여부
U-Boot Main DRAM 기반 로더 주변 장치 로드 및 커널 실행 단계

2. 초기 부팅 이슈 해결: CONFIG_DEBUG_UART

부팅 초기에 로그가 전혀 나오지 않는다면 표준 드라이버 로드 전 단계에서 문제가 발생했을 가능성이 높습니다. 이때 CONFIG_DEBUG_UART를 활성화하면 시스템 초기 단계부터 강제로 메시지를 출력할 수 있습니다.

설정 방법 (defconfig)

Bash
 
CONFIG_DEBUG_UART=y
CONFIG_DEBUG_UART_BASE=0xFF1A0000  # 회로도에 맞는 UART 주소 입력
CONFIG_DEBUG_UART_CLOCK=24000000
CONFIG_DEBUG_UART_SHIFT=2
CONFIG_DEBUG_UART_BOARD_INIT=y

3. 실시간 로그 제어와 코드 디버깅

시스템 동작 중 로그의 양을 조절하거나, 특정 코드 영역을 확인해야 할 때 다음 기법들을 활용하십시오.

  • 로그 레벨 조절: CONFIG_CMD_LOG=y를 활성화한 후 U-Boot 콘솔에서 log level 7을 입력하면 가장 상세한 디버깅 메시지를 볼 수 있습니다.
  • printf 기법: printf("[DEBUG] %s: Start\n", func);를 코드 중간에 삽입하여 초기화 루틴의 동작 여부를 추적하십시오. func 매크로를 사용하면 함수 이름을 일일이 적지 않아도 되어 작업 효율이 높아집니다.

4. 로고 및 부팅 속도 커스터마이징

제품의 완성도는 사용자가 처음 마주하는 화면에서 결정됩니다.

설정 항목 기능 설명
CONFIG_VIDEO_LOGO 부팅 로고 활성화 시스템 부팅 시 로고 출력
CONFIG_SPLASH_SCREEN 스플래시 화면 이미지 파일을 로드하여 화면 표시
bootdelay 부팅 지연 시간 사용자 대기 시간 조절 (양산 시 0으로 설정)

5. 개발을 위한 팁

  • 키 입력 인터럽트 활용: bootdelay를 0으로 설정하면 콘솔 진입이 어렵습니다. 이때 CONFIG_AUTOBOOT_KEYED를 활성화하십시오. 특정 키를 입력하는 동안에만 부팅을 멈추고 콘솔로 진입하게 설정할 수 있어 양산과 개발의 균형을 잡을 수 있습니다.
  • 핀맵 재확인: 모든 설정이 완벽한데 로그가 안 나온다면 UART 핀이 하드웨어적으로 올바르게 연결되었는지, 보드 레이아웃의 Debug UART 핀 번호와 코드가 일치하는지 다시 확인하십시오.

6. 흔히 하는 실수

  • UART 주소 오기입: CONFIG_DEBUG_UART_BASE에 잘못된 주소를 입력하면 CPU가 아무런 반응을 하지 않거나 시스템 멈춤 현상이 발생합니다. 반드시 보드의 회로도를 보고 물리 주소를 확인하세요.
  • 로그 레벨 오해: 모든 로그가 다 출력될 것이라고 생각하지 마십시오. log level 설정이 낮으면 디버깅 메시지가 필터링되어 보이지 않을 수 있습니다. 문제 발생 시 항상 레벨을 최고치로 설정하세요.

결론

RK3399와 같이 복잡한 시스템에서 디버깅은 시스템이 내뱉는 작은 신호들을 얼마나 잘 읽고 제어하느냐의 싸움입니다. 오늘 정리한 UART 로그 활용법과 CONFIG_DEBUG_UART 설정을 잘 숙지하신다면, 어떤 형태의 부팅 먹통 현상도 논리적으로 해결하실 수 있을 것입니다. 단계적인 디버깅으로 안정적인 임베디드 시스템을 구축하시기 바랍니다.

반응형