전체적인 흐름분석도 벅차서 세부적인 코드분석은 하지 못했다..


Source Tree


 \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




bootloader주요 기능


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


전체적인 초기화 routine






임베디드관련 도서에서 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함수로 이동.



common\main.c


하드웨어 초기화는 모두 완료되었다.

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 







출처 : http://jianna6.tistory.com

+ Recent posts