본문 바로가기

임베디드

FoxNux SBC(Single Board Computer)의 부팅 과정

i3 CPU 내부에 32KB의 ROM이 내장되어 있다. 부팅을 책임지는 ROM이라 BROM(Boot-ROM)이라고도 부른다.

시스템에 전원이 들어오거나 리셋이 되면 이 ROM에 내장된 프로그램이 실행된다.

아래와 같은 순서로 SPL(Secondary Program Loader)를 여러 종류의 인터페이스에 연결된 부트 미디어(Flash memory 기반의 저장 장치)로 부터 읽어 내려고 시도를 한다.

SD card 인터페이스 #0(4bit SD)를 시도하여 부트사인이 있으면 SPL을 내부 SRAM에 로딩한다.

실패하면 SD card 인터페이스 #2(8bit eMMC)을 찾고 그래도 안되면 SPI 포트에 연결된 NOR Flash와 NAND Flash를 시도한다.

마지막에는 USB OTG를 Device 모드로 전환하고 Host computer에서 SPL(FEL)을 내려보내길 무한정 기다린다.

 

 

 

SPL 소스코드는 별도 패키지로 구성되어 있지 않고, u-boot의 처음 기동되는 부분만 32KB 크기로 잘라서 만든다.

SPL 코드는  CPU 내부의 SRAM에서 실행되며, CPU와 DRAM을 초기화하고 u-boot의 메인 프로그램을 DRAM에 적재하고 실행한다.

 

Allwinner i3의 부팅용 SD 카드에는 아래와 같은 배치로 프로그램 바이너리를 기록한다.

처음 8KB는 파티션 정보를 넣어 OS가 마운트하여 사용할 수 있도록 하고, 그 바로 뒤 공간에 32KB크기의 SPL을 기록하면 BROM이 읽어갈 수 있다. 그 뒷부분에 U-boot 의 메인 바이너리를 기록하며 SPL이 메인 바이너리를 DRAM에 로딩하고 실행시킨다.

 

 

간단히 요약하면 BROM -> SPL -> u-boot 순으로 실행되는 것이다.

BROM에서 u-boot을 바로 로딩하여 실행하면 간단하지만, 부트미디어의 종류와 DRAM의 종류/크기에 초기화 코드가 달라 중간에 SPL이라는 중간 경유지를 만들어 시스템 설계의 유연성을 높이는 것이다.

 

SPL 존재의 이유를 좀 더 구체적으로 정리하면 다음과 같다.

1, 내부 SRAM 용량이 매우 작아(60KB 남짓) 400KB가 넘는 u-boot 바이너리 전체를 로딩할 수 없다.

2. DRAM의 종류 DDR, DDR2, DDR3, DDR4 뿐 아니라 Data bus의 폭과 속도, 전체 용량에 따라 초기화 과정이 다르다.

3. u-boot 바이너리를 읽어오는 저장 장치가 SD, eMMC, Serial NOR Flash, Serial NAND Flash로 다양하고 장치별로 데이터를 읽어내는 방법이 모두 다르다.

 

DRAM에서 동작하는 u-boot 프로그램은 커널 이미지(zImage 등)와 devicetree 파일을 읽어와 리눅스 시스템 구동을 시작하면서 자기 역할을 마치고 감쪽같이 사라진다.

 

다음 글에서는 크로스 툴체인을 설치하고 u-boot 소스코드를 다운로드 받아 빌드하고 Flash memory에 기록하는 방법을 정리해 보겠다.