-
u-boot 분석embedded system 2015. 1. 19. 11:21
전체적인 흐름분석도 벅차서 세부적인 코드분석은 하지 못했다..
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설정 : PPL3.메모리 시스템 초기화4. stack셋업 : c program을 위해서는 스택이 설정되어 있어야 한다.5. IRQ, 예외처리 핸들러 설정, IRQ enable6. 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 cachesboard\samsung\smdk5250\lowlevel_init.Sstart.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.Sboard\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.cboard\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.clogbuff_init_ptrspost_output_backlogmem_malloc_init : 특정 영역의 메모리를 memset해준다. 근데 그 특정 영역이 DRAM에서 monitor copy??arch_early_init_rflash_initnand_initonenand_initmmc_initialize: exynos_dwmci_init [drivers\mmc\exynos_dw_mmc.c] 함수를 호출한다.AT91F_DataflashInitenv_relocatearm_pci_initstdio_init : 다시 다양한 init을 수행한다.jumptable_initapi_init,console_init_r.....등 다양한 위치에 있는 각종 init함수들을 호출한다.arch_misc_initmisc_init_rinterrupt_initenable_interruptsboard_late_init : mac주소를 ethaddr, usbethaddr에 등록한다.bb_miiphy_initeth_initialize : eth_device초기화post_runmain_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
'embedded system' 카테고리의 다른 글
network protocol supported by u-boot (0) 2015.02.02 Cross compile (0) 2015.01.30 u-boot 컴파일,부팅 (1) 2015.01.16 ADB, Fastboot (0) 2015.01.15 RAM, Flash memory (0) 2015.01.15