전체적인 흐름분석도 벅차서 세부적인 코드분석은 하지 못했다..
\arch\arm\cpu | 각종 vendor별 CPU dependent Initialization code를 가진다. |
\arch\arm\cpu\arm7 | entry point인 start.S 파일을 가진다. |
\arch\arm\cpu\arm7 \exynos | |
\arch\arm\include | cpu관련 c파일 |
\board | 각종 vendor별 board dependent Initialization code를 가진다. |
\board\samsung\wmdk5250 | clock init, DMC init,.. |
\common | 각종 명령어, user interface main routine, CLI archtecture나 target board에 무관한 소프트웨어로 command구현되어 있다. |
\drivers | 각종 디바이스 드라이버를 가지고 있다. block , DMA, GPIO, I2C, input, MMC, MTD, net, PCI, RTC(real time clock dirver), serial,SPI, USB 등... |
\include | u-boot header정보 |
\include\config.mk | 컴파일 후 생성되는 파일로 보인다. ARCH, CPU, BOARD, VENDOR, SOC정보를 가짐. |
\include\configs\arndale5250.h | 보드에 대한 설정파일. |
\lib | |
\net | |
SPL은 u-boot 의 기능 중 초기부분을 떼어서 만든거라고 봐도된다. 초기작업을 수행한 후 u-boot을 로딩한다. mcu에 따라 쓰는 것도 있고 안쓰기도 한다.
u-boot은 하드웨어 초기화를 수행한다음 최종적으로 kernel을 로딩한다.

출처 : http://processors.wiki.ti.com/index.php/The_Boot_Process
1. 하드웨어 초기화 : CPU clock ,Memory Timing, Interrupt, UART, GPIO등 초기화
코드상에서는 (lowlevel_init, board_init_f,board_init_r) 3가지 routine으로 분류하였다.
초기화라는 말이 상당히 추상적으로 들릴수도 있다. 짧은 지식으로 간단하게 말해보자면, cpu든 gpio든 ethernet이든 모두 구조체로 이루어져 있고, 이 구조체를 세팅해주는 작업이라고 하면 되려나?...
2. Image loading : flash memory에 있는 zImage, file system을 SDRAM으로 복사한다.
3. jump to kernel

임베디드관련 도서에서 u-boot의 흐름.
1. watch dog중지하고 interrupt disable을 수행
2. clock설정 : PPL
3.메모리 시스템 초기화
4. stack셋업 : c program을 위해서는 스택이 설정되어 있어야 한다.
5. IRQ, 예외처리 핸들러 설정, IRQ enable
6. C에서 사용되는 변수 초기화
arch\arm\cpu\armv7\start.S
reference : http://blog.naver.com/PostView.nhn?blogId=pjsin865&logNo=120108264029
위의 블로그를 가면 상세한 start.s를 볼 수 있다.
lds파일에 따르면, u-boot의 entry point는 _start 이다.
_start는 0x0번지에 위치하며, 가장 먼저 vector table를 세팅한다.
cpu_init_cp15를 호출한다. : * Setup CP15 registers (cache, MMU, TLBs). The I-cache is turned on unless
* CONFIG_SYS_ICACHE_OFF is defined.
disable MMU stuff and caches
board\samsung\smdk5250\lowlevel_init.S
start.S의 CPU_init_cirt는 lowlevel_init.S에 있는 lowlevel_init procdure를 호출한다.
(lowlevel_init은 2군데 있음. 진작 makefile 봤으면 쉽게 알았을탠데..)
ifneq ($(CONFIG_AM33XX)$(CONFIG_OMAP44XX) $(CONFIG_OMAP54XX)$(CONFIG_TEGRA20),)
arch\arm\cpu\armv7\lowlevel_init.S
board\samsung\smdk5250\lowlevel_init.S
-arch_timer_init[board\samsung\smdk5250\ ]
-tzpc_init[board\samsung\smdk5250\ ]
TZPC[TrustZone Protection Controller] 을 설정한다.
-monitor_init[board\samsung\smdk5250\ ]
-system_clock_init[board\samsung\smdk5250\ ]
system clock 을 초기화한다.
-mem_ctrl_init[board\samsung\smdk5250\ ]
memory를 초기화한다.
arch\arm\cpu\armv7\start.S
ram상에 stack pointer를 설정.
board_init_f를 호출한다.
start.S 수행 종료됨.
arch\arm\lib\board.c 의 board_init_f 함수
board_init_f 역시 2군데 있음
arch\arm\lib\board.c
board\samsung\smdk5250\Mmc_boot.c (ifdef CONFIG_SPL_BUILD) : u-boot호출하는 함수.
위 그림의 init_sequence에 있는 init함수를 수행한다.
DRAM bank사이즈 초기화,
dram config 설정 등을 수행.
start.S의 relocate_code함수 호출.
arch\arm\cpu\armv7\start.S 의 relocate_code procedure
u-boot을 ram으로 옮긴다.
마지막에 arch\arm\lib\board.c의 board_init_r 을 호출한다.
arch\arm\lib\board.c 의 board_init_r함수
enable_caches,
board_init : boot mode를 확인한다.
gd->bd->bi_boot_params = (PHYS_SDRAM_1 + 0x100UL);
serial_initialize : s5p_serial_initialize in drivers\serial\serial_s5p.c
logbuff_init_ptrs
post_output_backlog
mem_malloc_init : 특정 영역의 메모리를 memset해준다. 근데 그 특정 영역이 DRAM에서 monitor copy??
arch_early_init_r
flash_init
nand_init
onenand_init
mmc_initialize: exynos_dwmci_init [drivers\mmc\exynos_dw_mmc.c] 함수를 호출한다.
AT91F_DataflashInit
env_relocate
arm_pci_init
stdio_init : 다시 다양한 init을 수행한다.
jumptable_init
api_init,
console_init_r.....등 다양한 위치에 있는 각종 init함수들을 호출한다.
arch_misc_init
misc_init_r
interrupt_init
enable_interrupts
board_late_init : mac주소를 ethaddr, usbethaddr에 등록한다.
bb_miiphy_init
eth_initialize : eth_device초기화
post_run
main_loop : 최종적으로 common\main.c의 main_loop함수로 이동.
하드웨어 초기화는 모두 완료되었다.
main loop는 사용자의 입력을 parsing하고, 해당 명령어를 수행한다.
최종적으로 kernel을 로딩한다.
http://www.crashcourse.ca/wiki/index.php/U-Boot_command/file_reference
위의 wiki에서 u-boot의 command확인가능하다.
dhcp는 boot image via network using DHCP/TFTP protocol
nfs는 boot image via network using NFS protocol
dcache는 enable or disable data cache