요즘나오는 MCU 들은 다양한 부팅디바이스를 지원해야 한다.
MMC(SD)카드, NOR-Flash, NAND-Flash 등등...
이런 이유들로 MCU 내부에 아예 BootRom 이라는 코드가 내장되어 있다.
BootRom 은 플래시이며 이것이 실행될 당연하지만 RAM 영역도 있다.
Zynq 7000 시리즈 (ZC702, ZC706 내가 알고있고 사용한 zynq이다) 에는 내부 ROM 128K, 내부 SRAM 256K 가 있다.
파워리셋시 SRAM 주소는 0 번지이다.
파워리셋시 실행되는 코드를 Zynq에서는 BootRom 이라 명명한다.
BootRom이 시작되면 기본적인 PLL 설정등을 실행하고 부트디바이스를 검색한다.
부트디바이스는 MIO 라고 명명된 GPIO의 상태(H,L)를 보고 결정한다.
아래는 EV 보드 의 부팅스위치 사진이다
만일 MMC 부팅이라면 MMC 디바이스에서 boot.bin 을 검색하여 이 파일을 메모리에 로드하고 이곳으로 점프한다.
NOR-Flash 나 QSPI-Flash 일 경우 0번지 부터 검색하여 특정값(FSBL-Header)이 있다면 데이타를 메모리에 로드한다.
NAND-Flash 의 경우 특정 페이지만큼 로드하겠지..(이건 데이타쉬트 안봄)
언급된 디바이스에서 최초 로드되는 것은 FSBL (FirstBootLoader) 이라고 하는 프로그램이다.
FSBL 은 자이링스가 제공하는 SDK에서 자동으로 생성하여 주는 코드이며 수정이 가능한다.
FSBL 에서는 DRAM 초기화, PLL 설정 등 필요한 하드웨어등을 설정한 후 주 부트로더를 메모리에 로드하고 점프한다.
일반적인 MCU 의 경우 소위 main.c 의 main()함수로 가기위해 start.S 라는 어셈블러코드와 작은 C 코드를
따로 컴파일하고 이를 dd 유틸로 붙이는 작업을 하는데 이것을 제공되는 툴인 SDK 에서 제공하는 것이다.
FSBL을 컴파일 하여 만들어진 fsbl.elf 파일과 부트로더 즉 uboot.elf 파일을 합성하여 최종 boot.bin 이 만들어 진다.
이 합성툴의 이름은 bootgen.exe 이며 SDK 에서는 GUI 로 제공된다.
Zynq의 경우 FPGA 가 붙어있는 MCU 다 보니 따로 FPGA Bit 코드를 다운로드하여 주어야 한다.
FPGA를 구동할 코드는 VHDL, Veilog 등의 언어로 작성하고 ISE 툴을 사용하여 컴파일 한후 최종 .bit 파일 위에서
소개된 bootgen 툴을 사용하여 세개의 파일 FSBL, uboot, fpga-bit 을 합성한다.
bit 파일이 포함되면 FSBL 코드에서 이를 다운로드한다.
bit 파일이 없을경우 다운로드 하지 않는다.
bit 파일은 uboot 에서나 이 후 커널부팅 후 다운로드 할수 있다.
Zynq 메뉴얼 ug585_xxxxx.pdf 를 보면 부팅에 관련된 아주 상세한 내용을 찾을 수 있다.
Zynq 메뉴얼 ug873_xxxxx.pdf 를 보면 SDK 등의 툴 사용법이 잘 기술되어 있다.
개인적으로 Intel, Samsung, TI, FreeScale, ATMEL 등의 MCU 메뉴얼과 비교하면 Zynq 메뉴얼의 서술방식은
잘 써진 메뉴얼이라고 생각한다. (이해하기 쉽다.)
다만 툴 사용법이 익숙치 안으면 좀 고생.. 그렇지만 이클립스 기반의 툴이라 장점이 많다.