Module 7: Bootloader ESP30076 임베디드시스템프로그래밍 (Embedded System Programming) 조윤석 전산전자공학부
주차별목표 부트로더의기능이해하기 부트로더의주요소스이해하기 uboot 명령어알아보기 타겟보드에컴파일된부트로더이미지설치하기 부트로더에신규명령어추가하기 부트로더컴파일하기 2
Bootloader 임베디드시스템에서의부트로더 (Bootloader) 시스템을켰을때가장먼저실행되는프로그램 CPU 가리셋되었을때접근하는메모리주소 ( 일반적으로주소는 0 번이나메모리의마지막번지가됨 ) 부터시작 부트로더의가장기본적인기능들 하드웨어를초기화 커널을로드 몇몇커널파라미터들을커널에넘겨주는역할을함 호스트컴퓨터의리눅스에서는 GRUB 이라는부트로더를많이사용 임베디드시스템에서는 armboot, blob, ppcboot, redboot, uboot 등이있음 Achro-210T 에서는 uboot 를사용 3
Bootloader 부트로더의기능 부트로더는 CPU 클럭이나메모리타이밍, 인터럽트벡터, UART 등의시스템을구성하고있는기본적인하드웨어초기화와레지스터설정등을통하여시스템을활성화시켜운영체제가시작될수있는기본환경을만들어줌 운영체제의핵심프로그램인커널을메모리에올리고실행권한을커널로넘겨주는역할을함 임베디드시스템에서사용하는부트로더는이러한기본기능외에도시스템의개발을도와주는부가적인기능도제공 4
Bootloader 부트로더의기능 대부분의임베디드시스템 ( 또는타겟보드 ) 은개발환경을갖추고있지않으므로개발은호스트컴퓨터에서하게됨 부트로더는개발한프로그램을타겟보드로전송할수있는다양한통신채널을지원 직렬장치를통해데이터를전송할수있도록 xmodem, zmodem, uuencode 등의기능제공 이더넷을통해데이터를전송할수있도록 tftp 나 bootp 기능들도제공 비휘발성메모리를퓨징하는기능 직렬통신프로그램인미니컴이나 putty 프로그램을사용하여타겟보드의상태를알아보거나명령어를입력할수도있음 5
부트로더의실행흐름 부트로더의실행흐름도 6
부트로더의실행흐름 보드가리셋상태에서깨어난후, start.s 의 reset() 루틴이 internal SRAM(Stepping Stone) 에서바로실행 해당함수가실행된다음 cpu_init_crit() 함수가호출되고, lowlevel_init.s 의 lowlevel_init() 함수를호출해서각보드의초기화를수행하고난후, 캐쉬를초기화 이때 SRAM 에저장된실행코드를 SDRAM 의 TEXT_BASE 번지로복사하는 relocation 을수행 Relocation 을하는이유는부트로더가 microsd 에서이용되는경우, 부트로더를업데이트하는데문제가발생하기때문임 그래서 RAM 에 relocation 을수행하게되고, 이후 relocation 된곳으로점프해서 SDRAM 에서실행됨. 그이후에 0 으로초기화해야할영역인 BSS 영역을초기화 BSS 까지초기화가되었다면 start_armboot() 를이용하여이전에 relocation 된 SDRAM 으로점프 해당메모리로점프를하게되면서부트로더코드가실행 7
Main Sources of Bootloader -Makefile Makefile 수정 Makefile 에서 arm 에대한 CROSS_COMPILE 정보를추가 ifeq ($(ARCH),arm) CROSS_COMPILE = / 자신의 toolchain compile 경로 /arm-none-linux-gnueabiendif 새로운 210T 개발보드에맞는설정 achropv210_config : unconfig @$(MKCONFIG) $(@:_config=) arm s5pc11x achropv210 samsung s5pc110 @echo "TEXT_BASE = 0x2fd00000" > $(obj)board/samsung/achropv210/config.mk 8
Main Sources of Bootloader -Complie make 명령어를이용하여컴파일하기 u-boot.bin 파일이생성됨 # make distclean ( 생략 ) # make achropv210_config Configuring for achropv210 board... # make ( 생략 ) # ls -l u-boot.bin -rwxr-xr-x 1 root root 154568 9 월 22 11:10 u-boot.bin make distclean 을이용하여기존에컴파일했었던오브젝트나설정 (*.bak, *.o, *.a 등 ) 을모두삭제 make achro210_config 를이용해서앞서설명한 210T 에서참조하는헤더파일등의정보를 mkconfig 스크립트를호출하여해당내용이적용된 include/config.h, include/config.mk 파일을생성 9
Main Sources of Bootloader -Compile make 명령어를이용하여컴파일하기 include/config.h /* Automatically generated - do not edit */ #include <configs/achropv210.h> include/config.mk ARCH = arm CPU = s5pc11x BOARD = achropv210 VENDOR = samsung SOC = s5pc110 ARCH = arm 아키텍처가무엇인지를나타낸다. 어떤크로스컴파일러를사용할것인지결정된다. (arm-linux-) 어떤라이브러리를사용할것인지결정된다. (lib_arm/*) CPU = s5pc11x CPU 가무엇인지를나타낸다.(s5pv210 은 s5pc110 에서파생되었다.) 어떤라이브러리를사용할것인지결정된다. (cpu/s5pc11x/*) BOARD = achropv210 Achro210 개발보드가무엇인지를나타낸다. VENDOR = samsung 어떤라이브러리를사용할것인지결정된다. (board/samsung/achropv210/*) SOC = s5pc110 SOC 가무엇인지를나타낸다. 어떤라이브러리를사용할것인지결정된다. (cpu/s5pc11x/s5pc110/*) 10
Main Sources of Bootloader board/samsung/achropv210/config.mk board/samsung/achropv210 디렉토리에는 Achro-210T 개발보드에관련된소스들과컴파일과정에필요한설정파일들이들어있음 TEXT_BASE = 0x2fd00000 TEXT_BASE 는부트로더가실행되는베이스번지를나타냄 board/samsung/achropv210/u-boot.lds 이파일은 make 과정의마지막인링크과정에서사용되는링크스크립트 11
Main Sources of Bootloader board/samsung/achropv210/u-boot.lds OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") /*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32- arm")*/ OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS {. = 0x00000000; // 메모리의시작주소. = ALIGN(4); // 위치카운터를 4 의배수로정렬.text : // 텍스트섹션 { cpu/s5pc11x/start.o (.text) cpu/s5pc11x/s5pc110/cpu_init.o (.text) board/samsung/achropv210/lowlevel_init.o (.text) cpu/s5pc11x/nand_cp.o (.text) cpu/s5pc11x/movi.o (.text) common/secure.o (.text) common/ace_sha1.o (.text) cpu/s5pc11x/pmic.o (.text) *(.text) }. = ALIGN(4);.rodata : { *(.rodata) } // 읽기전용데이터섹션. = ALIGN(4);.data : { *(.data) }. = ALIGN(4);.got : { *(.got) } // Global Offset Table Section u_boot_cmd_start =.;.u_boot_cmd : { *(.u_boot_cmd) } u_boot_cmd_end =.;. = ALIGN(4);.mmudata : { *(.mmudata) } // MMU Section. = ALIGN(4); bss_start =.;.bss : { *(.bss) } // 비초기화변수들을저장하는데이터세그먼트 _end =.; } 12
Main Sources of Bootloader board/samsung/achropv210/u-boot.lds 코드에서 OUTPUT_FORMAT 은 elf32 의 little endian 형식으로코드를생성하겠다는의미 매개변수가 3 개인것은링크할때옵션으로 EB 를준경우, -EL 을준경우, 아무것도지정하지않은경우에어떤형식으로코드를생성할것인가를알려주기위함 이경우에는모든경우에 elf32 의 little endian 형식으로코드를생성 참고로리눅스에서는오브젝트코드와실행파일형식으로 ELF(Executable and Linkable Format) 를사용 OUTPUT_ARCH(arm) 은생성될바이너리파일은 arm 용으로하겠다는의미 ENTRY(_start) 는 uboot 의진입점이며최초실행함수를 _start 로지정한경우 _start 는 start.s 에글로벌레이블로선언되어있으며실제 uboot 의시작위치가됨 13
Main Sources of Bootloader board/samsung/achropv210/u-boot.lds SECTIONS{} 에서는코드를목적에맞게각섹션에분배 ELF 형식에서는소스의명령어부분, 데이터부분을각섹션별로묶어서관리. = 0x00000000; 은위치카운터로, 코드가오브젝트코드내에서위치할곳의주소. = ALIGN(4); 는위치카운터를 4 바이트단위로정렬함을의미.text : { *(.text) } 에의해지정된 text 섹션에는소스코드의명령어부분이저장됨.rodata : { *(.rodata) } 에의해지정된 rodata 섹션에는읽기전용데이터들이저장됨.data : { *(.data) } 에의해지정된 data 섹션에는초기화된전역변수들이저장됨.got : { *(.got) } 에의해지정된 got 섹션에는위치와무관한코드 (position independent code) 를위해절대주소를동적으로매핑시켜주기위한정보들이저장됨.bss : { *(.bss) } 에의해지정된 bss(block started by symbol) 섹션에는초기화되지않은전역변수들이저장됨 14
Main Sources of Bootloader board/samsung/achropv210/achropv210.c 이파일에는해당 Achro-210T 개발보드를위한초기화루틴들이정의되어있음 int board_init (void) lib_arm/board.c 소스에서정의된 void start_armboot() 함수에서호출 Start_armboot() 함수는초기어셈블리루틴 (cpu/s5pc11x/start.s) 의마지막에서호출되는것으로, 어셈블리루틴에의해호출되는함수중처음으로 C 언어로작성된함수 start_armboot() 초기화하기위한시퀀스정보를가지고있는 init_fnc_t *init_sequence[] 에등록된함수들을차례로호출하는데, 제일처음으로 cpu_init() 함수가호출되고난후에 board_init() 함수가호출됨 즉, CPU 관련초기화가진행된후에바로보드관련초기화가실행 gd->bd->bi_arch_number 변수는리눅스를부팅할때넘겨주는 Machine Number 값 gd->bd->bi_boot_params 변수는리눅스를부팅할때넘겨주는커널파라미터문자열에관련된정보가저장된번지를나타냄 커널파라미터문자열은환경변수 bootargs 에저장됨 15
Main Sources of Bootloader board/samsung/achropv210/achropv210.c int board_late_init (void) Lib_arm/board.c 소스에서정의된 void start_armboot() 함수에서호출 start_armboot() 함수의마지막부분에서 main_loop() 함수를호출하기전에 board_late_init() 함수를호출 해당함수가호출되려면보드설정헤더 (include/configs/achropv210.h) 파일에 BOARD_LATE_INIT 를정의해야함 int dram_init (void) Lib_arm/board.c 소스에서정의된 void start_armboot() 함수에서호출 start_armboot() 함수에서는 init_fnc_t *init_sequence[] 에등록된함수들을차례로호출하는데, 리스트에 dram_init() 함수가등록되어있음 보드정보를저장하고있는 gd->bd 구조체의 DRAM 관련된항목을설정 16
Main Sources of Bootloader board/samsung/achropv210/lowlevel_init.s 보드가리셋상태에서깨어난직후하드웨어적으로초기화되어져야하는부분들에대한초기화를진행하게됨 lowlevel_init() 함수에서초기화하는내용 전원유지를위한 PMIC 를초기화 (PMIC_init) 클럭에관련된레지스터를설정 (system_clock_init) SDRAM 메모리가동작하도록관련된레지스터를설정 ( mem_ctrl_asm_init) 부트로더모니터링을위한 UART 를초기화 (uart_asm_init) 17
Main Sources of Bootloader include/configs/achropv210.h 210T 보드의설정에관련된헤더파일 보드와관련된모든사항들을정의해야하며, S5PV210(S5PC110 에서파생됨 ) CPU 와관련된루틴들이포함되도록함 그러면컴파일과정에서해당 CPU 에만적용되어야할루틴들이컴파일됨 #define CONFIG_S5PC110 1 #define CONFIG_S5PC11X 1 보드의초기화과정중에인터럽트가발생되지않도록설정 #undef CONFIG_USE_IRQ 18
Main Sources of Bootloader include/configs/achropv210.h 그다음은 SDRAM 메모리와관련된값들 #define MEMORY_BASE_ADDRESS 0x20000000 #define MEMORY_BASE_ADDRESS2 0x40000000 #define CONFIG_NR_DRAM_BANKS 2 /* we have 2 bank of DRAM */ #define SDRAM_BANK_SIZE 0x10000000 /* 256 MB */ #define PHYS_SDRAM_1 MEMORY_BASE_ADDRESS /* SDRAM Bank #1 */ #define PHYS_SDRAM_1_SIZE SDRAM_BANK_SIZE #define PHYS_SDRAM_2 MEMORY_BASE_ADDRESS2 /* SDRAM Bank #2 */ #define PHYS_SDRAM_2_SIZE SDRAM_BANK_SIZE malloc() 함수에서사용할버퍼의크기를설정 #define CFG_MALLOC_LEN (CFG_ENV_SIZE + 1024*1024) #define CFG_MEMTEST_END MEMORY_BASE_ADDRESS + 0xFD00000 #define CFG_UBOOT_BASE CFG_MEMTEST_END #define CFG_UBOOT_SIZE (3*1024*1024) #define CFG_STACK_SIZE 512*1024 19
Main Sources of Bootloader include/configs/achropv210.h include/asm-arm/global_data.h 헤더파일에정의된 gd_t 타입의변수를저장할공간의크기를설정 #define CFG_GBL_DATA_SIZE 128 스택의크기를설정하는부분 #define CONFIG_STACKSIZE 0x40000 #ifdef CONFIG_USE_IRQ #define CONFIG_STACKSIZE_IRQ (4*1024) #define CONFIG_STACKSIZE_FIQ (4*1024) #endif 직렬통신관련설정하는부분 #define CONFIG_SERIAL1 1 #define CONFIG_BAUDRATE 115200 20
Main Sources of Bootloader include/configs/achropv210.h Achro-210T 와별도로제공되는개발보드에실장되어있는 21 SMSC LAN91C111 칩을액세스하기위한설정사항 #define CONFIG_DRIVER_SMC911X 1 #define CONFIG_DRIVER_SMC911X_16_BIT #define CONFIG_DRIVER_SMC911X_BASE 0x98000000 환경변수는 SD 메모리에저장되도록설정되어있음 #define CFG_ENV_IS_IN_AUTO #define CFG_ENV_OFFSET 0x0007C000 #define CFG_ENV_SIZE 0x0004000 기본적으로환경변수에포함될내용들을정의 #define CONFIG_EXTRA_ENV_SETTINGS BOARD_LATE_INIT 설정은 board/samsung/achropv210/achropv210.c 소스에정의된 board_late_init() 함수가 lib_arm/board.c 소스에정의된 start_armboot() 함수에서호출되도록설정 #define BOARD_LATE_INIT
uboot Command uboot 명령어 부트로더명령을실행하기위해서는부트로더상태로진입후다음을진행 help PV210 # help? - alias for 'help' autoscr - run script from memory base - print or set address offset bdinfo - print Board Info structure boot - boot default, i.e., run 'bootcmd ( 생략 ) tftpboot- boot image via network using TFTP protocol version - print monitor version PV210 # 22
uboot Command Information Command bdinfo Achro-210T 개발보드정보를출력하는명령 PV210 # bdinfo arch_number = 0x00000998 env_t = 0x00000000 boot_params = 0x20000100 DRAM bank = 0x00000000 -> start = 0x20000000 -> size = 0x10000000 DRAM bank = 0x00000001 -> start = 0x40000000 -> size = 0x10000000 ethaddr = 00:40:5C:26:0A:5B ip_addr = 192.168.1.121 baudrate = 115200 bps 23
uboot Command Information Command help 도움말을출력해주는명령 help 명령어뒤에사용할명령어를인자로주면해당명령어의기능과형식에대한도움말을출력 PV210 # help base 수행하고있는메모리명령어의메모리위치를출력하거나설정하는명령 PV210 # help base base - print address offset for memory commands base off - set address offset for memory commands to 'off' PV210 # base Base Address: 0x00000000 24
uboot Command Memory Control 부트로더에서 SDRAM 이나 SD 메모리에접근하기위한명령어들 cp 부트로더상태에서메모리를복사하는명령 PV210 # help cp cp [.b,.w,.l] source target count - copy memory PV210 # cp 21000000 22000000 100 25
uboot Command Memory Control md 부트로더상태에서지정한메모리영역의값을출력해주는명령 PV210 # help md md [.b,.w,.l] address [# of objects] - memory display PV210 # md 21008000 21008000: 00002000 00000000 00000000 00000000.... 21008010: ea000013 e59ff014 e59ff014 e59ff014... 21008020: e59ff014 e59ff014 e59ff014 e59ff014... 21008030: 2fe001e0 2fe00240 2fe002a0 2fe00300.../@../.../.../ 21008040: 2fe00360 2fe003c0 2fe00420 12345678 `../.../../xv4. ( 이하생략 ) 26
uboot Command Memory Control mm 메모리의값을변경하는명령 본명령은리눅스부팅전에특정한레지스터를설정해서리눅스퓨징이전에어느정도하드웨어가정상동작을하는지를확인하는용도로종종쓰임 PV210 # help mm mm [.b,.w,.l] address - memory modify, auto increment address PV210 # mm 21008000 21008000: 00002000? 11112222 21008004: 00000000? 33334444 21008008: 00000000? q (mm 명령을종료할때는 16 진수가아닌값을됨 ) 27
uboot Command Memory Control mw 어떤값으로메모리를초기화 ( 의미상기록 ) 하는방법 카운트인자없이사용될때, 이값들은특정주소에만쓰여짐 PV210 # help mw mw [.b,.w,.l] address value [count] - write memory PV210 # mw 21008000 00002000 PV210 # md 21008000 4 21008000: 00002000 33334444 00000000 00000000...DD33... 28
uboot Command Memory Control nm 메모리를수정하는명령어 nm 명령어는데이터를기록할때해당어드레스가자동증가하지않고해당데이터를반복해서기록할수있음 디버깅할때특정레지스터에값을바꾸면서테스트하는경우유용하게사용할수있음 PV210 # help nm nm [.b,.w,.l] address - memory modify, read and keep address PV210 # nm 21008000 21008000: 00002000? 1 21008000: 00000001? 2 21008000: 00000002? 3 21008000: 00000003? q 29
uboot Command Memory Control dnw tftp USB 를통해서데이터를수신할경우사용되는명령어 PV210 # help dnw dnw [download address] PV210 # dnw 0x21008000 Insert a OTG cable into the connector! TFTP 프로토콜을이용하여호스트의 tftp 데몬에서서비스하는디렉토리에서부트로더나커널을지정한메모리로다운로드받는명령어 30 PV210 # help tftp tftpboot [loadaddress] [[hostipaddr:]bootfilename] PV210 # tftp 0x21008000 u-boot.bin smc911x: initializing smc911x: detected LAN9115 controller smc911x: phy initialized smc911x: MAC 00:40:5c:26:0a:5b TFTP from server 192.168.1.100; our IP address is 192.168.1.121 Filename 'u-boot.bin'. Load address: 0x21008000 Loading: ####################################
uboot Command SD 관련 Command 210T 는내부에 NOR 혹은 NAND 와같은메모리를이용하지않고, microsd 메모리를이용하여시스템을구동하도록구성되어있음 부트로더와커널, 파일시스템등모든데이터는 2GB 의시스템메모리에기록 부트로더모드에서는 USB 혹은이더넷을통하여다운로드받은부트로더와커널이미지등을메모리로받았다가, 메모리에서 microsd 로기록 31
uboot Command SD 관련 Command PV210 # help movi movi init - Initialize movinand and show card info movi read {u-boot kernel} {addr} - Read data from sd/mmc movi write {fwbl1 u-boot kernel} {addr} - Write data to sd/mmc movi read rootfs {addr} [bytes(hex)] - Read rootfs data from sd/mmc by size movi write rootfs {addr} [bytes(hex)] - Write rootfs data to sd/mmc by size movi read {sector#} {bytes(hex)} {addr} - instead of this, you can use "mmc read" movi write {sector#} {bytes(hex)} {addr} - instead of this, you can use "mmc write" 32
uboot Command SD 관련 Command movi init 초기화명령어로서장착된 microsd를인식하고메모리카드의정보와 MBR의정보를읽어와출력해줌 PV210 # movi init Device: S3C_HSMMC0 Manufacturer ID: 1b RCA: 2 OEM: 534d Name: 00000 Tran Speed: 50000000 Rd Block Len: 512 SD version 2.0 High Capacity: No Size: 1910MB (block: 3911680) Bus Width: 4-bit 33
uboot Command SD 관련 Command movi read 읽기명령어로서 microsd 로부터특정데이터를읽는명령어 PV210 # movi read u-boot 0x21008000 reading bootloader.. 49, 1024 MMC read: dev # 0, block # 49, count 1024...1024 blocks read: OK completed PV210 # movi read kernel 0x21008000 reading kernel.. 1073, 8192 MMC read: dev # 0, block # 1073, count 8192...8192 blocks read: OK completed 34
uboot Command SD 관련 Command movi read rootfs microsd 에서사용하는읽기명령어 PV210 # movi read rootfs 0x21008000 0x100000 reading RFS.. 9265, 2048 MMC read: dev # 0, block # 9265, count 2048...2048 blocks read: OK completed 35
uboot Command SD 관련 Command movi write 메모리에있는부트로더및커널을 microsd에기록하기위한명령어 PV210 # movi write uboot 0x21008000 Writing BL1 to sector 1 (16 sectors).. checksum : 0xeaa33 writing bootloader.. 49, 1024 MMC write: dev # 0, block # 49, count 1024... 1024 blocks written: OK completed PV210 # movi write kernel 0x21008000 writing kernel.. 1073, 8192 MMC write: dev # 0, block # 1073, count 8192... 8192 blocks written: OK completed 36
uboot Command SD 관련 Command movi write rootfs SDRAM 21008000 에있는 rootfs 를지정한크기만만큼가져와서 microsd 의 rootfs 영역에기록하는명령이 PV210 # movi write rootfs 0x21008000 0x100000 writing RFS.. 9265, 2048 MMC write: dev # 0, block # 9265, count 2048... 2048 blocks written: OK completed 37
Bootloader Compile 부트로더컴파일하기 Achro-210T 의부트로더소스는제공되는 DVD 의 bootloader 디렉토리에위치하고있음 컴파일하기위해해당미디어로부터파일을복사한다음, 압축을해제하고컴파일설정을기본환경으로한다음 make 를입력하여컴파일함 컴파일이완료되면부트로더소스디렉토리에 u-boot.bin 파일이생성됨 38
Bootloader Compile 부트로더소스준비 부트로더컴파일작업은압축된부트로더소스파일을 /root/work 에푸는것으로시작 root@esp:~# cd /root/achro-210t/bootloader/ root@esp:~/achro-210t/bootloader# ls 합계 11474 11474 uboot-111007.tar.gz root@esp:~/achro-210t/bootloader# tar xvfz uboot-111007.tar.gz -C /root/work ( 생략 ) uboot-111007/lib_sparc/time.c uboot-111007/makeall uboot-111007/avr32_config.mk uboot-111007/copying root@esp:~/achro-210t/bootloader# cd ~/work/uboot-111007/ 39
Bootloader Compile 부트로더소스준비 압축이해제되면 /root/work/uboot-111007 이라는디렉토리가생성됨 해당디렉토리로이동한다음 Makefile 을수정 root@esp:~/work/uboot-111007# vi Makefile CROSS_COMPILE?= /opt/toolchains/arm-2009q3/bin/arm-none-linux-gnueabi- 40
Bootloader Compile 부트로더컴파일 부트로더를컴파일하는순서 make distclean 명령을통해서기존설정해놓은환경과관련된내용을모두지우기 210T 개발보드의기본적인설정 (CPU, 플랫폼등 ) 을해주기위해서 make achropv210_config 명령을수행 make 를사용하여컴파일을시작 root@esp:~/work/uboot-111007# make distclean root@esp:~/work/uboot-111007# make achropv210_config Configuring for achropv210 board... root@esp:~/work/uboot-111007# make 41
Bootloader Compile 부트로더컴파일 생성된부트로더바이너리파일확인 42
To Update the Bootloader 부트로더업데이트 부트로더를업데이트하기위해서호스트리눅스에서미니컴을실행 개발보드의전원을켠후, uboot 명령모드로진입 개발보드의전원을켜면, 화면에 Hit any key to stop autoboot : 3 이라고카운트다운이시작 카운트가 0 이되기전아무키값이나입력하면 ubot 명령모드로진입할수있음 210T 의 USB OTG 와호스트가 USB 케이블로연결 dnw 0x21008000 명령어를통해호스트로부터파일수신대기상태진입 43
To Update the Bootloader 부트로더업데이트 VirtualBox 관리자메뉴표시줄에서 [ 장치 ] - [USB 장치 ] 를클릭하여 System MCU SEC S3C6400X Test B/D[0100] 을선택 호스트 PC 에서 smdk-usbdl 명령어를통해컴파일된부트로더바이너리를 210T 개발보드로전송 movi write 명령어를통해다운로드받은바이너리를 microsd 의부트로더영역 (BL2) 에기록 reset 명령을통해장치를리부팅 새로적용된 uboot 이미지를이용해부팅 44
To Update the Bootloader 부트로더업데이트 부트로더 (uboot) 시작화면 45
To Update the Bootloader 부트로더업데이트 미니컴을통해보드의부트로더에서 DNW 명령실행 46
To Update the Bootloader 부트로더업데이트 smdk-usbdl 사용을위한 USB 장치선택 47
To Update the Bootloader 부트로더업데이트 호스트리눅스에서 smdk-usbdl 을이용데이터전송 48
To Update the Bootloader 부트로더업데이트 OTG 를이용한다운로드완료 49
To Update the Bootloader 부트로더업데이트 microsd 에부트로더기록 50
부트로더에명령어추가하기 부트로더명령추가 부트로더는네트워크를이용한 tftp, usb 를이용한 OTG 등여러가지전송방식을지원 이런명령들은 uboot 를제작하는프로젝트에서개발하기보다하드웨어개발업체에서해당프로그래밍을해서동작하도록하고있음 부트로더에서는물리적인어드레스에접근이가능 부트로더명령어추가를위해서는 2 개의파일을작성혹은수정해야함 부트로더에서명령으로실행할소스코드예제에서는 cmd_hello.c ([ 부트로더소스 ]/common) 파일 컴파일시참조되는 Makefile ([ 부트로더소스 ]/common) 파일 51
부트로더에새로운명령어추가 부트로더명령추가 52 부트로더소스디렉토리의서브디렉토리인 common 디렉토리로이동 다음의소스코드작성 root@esp:~# cd ~/work/uboot-111007/common root@esp:~/work/uboot-111007/common# vi cmd_hello.c /* Bootloader Test Example - Helloworld */ #include <common.h> #include <command.h> #include <net.h> int do_hello (void) { printf("hello World!\n"); return 0; } U_BOOT_CMD ( hello, 1, 1, do_hello, "hello - Bootloader Command Test\n", "using hello.\n" );
부트로더에새로운명령어추가 부트로더명령추가 소스의가장아래의 U_BOOT_CMD() 는부트로더에명령어로등록하기위한매크로임 uboot 에서사용하는명령어들은 U_BOOT_CMD() 매크로를사용하여등록 이매크로는명령어에대한도움말뿐만아니라부트로더에서명령어 (hello) 입력시실행할함수 (do_hello) 를지정하는데사용 #define Struct_Section attribute ((unused,section (".u_boot_cmd"))) #define U_BOOT_CMD (name,maxargs,rep,cmd,usage,help) \ cmd_tbl_t u_boot_cmd_##name Struct_Section = \ { #name, maxargs, rep, cmd, usage, help } 53
부트로더에새로운명령어추가 부트로더명령추가 Makefile(bootloader_src/common) 을수정 기존의 Makefile 의다음의내용을추가 COBJS-y += cmd_pcmcia.o COBJS-$(CONFIG_CMD_PORTIO) += cmd_portio.o ( 생략 ) COBJS-$(CONFIG_S3C_USBD) += cmd_usbd.o COBJS-$(CONFIG_CMD_XIMG) += cmd_ximg.o COBJS-y += cmd_vfd.o COBJS-y += cmd_hello.o hello 명령이추가되도록컴파일항목을추가 54
새로추가된부트로더명령어확인 부트로더명령추가 타겟보드를새로작성된부트로더로업데이트한후추가된명령어확인하기 PV210 # help hello hello using hello. PV210 # hello Hello World! PV210 # 55