TI에서 제공해주는 Uboot말고 opensource site(Denx)에 있는 걸로 직접사용을 해보자.
open source u-boot는 아래의 사이트에서 기본으로 제공을 해주고 있다.
아래사이트에서 download를 하여 소스를 받아 간단히 비교 분석해보자.
http://www.denx.de/wiki/U-Boot/WebHome
Tool Chain 설치
https://ahyuo79.blogspot.com/2015/11/arm-tool-chain.html
1.1 board config 설정 및 Build
- Board config 확인
$ ls configs/am43* am43xx_evm_defconfig am43xx_evm_ethboot_defconfig am43xx_evm_qspiboot_defconfig am43xx_evm_usbhost_boot_defconfig
- Board config 설정
$ make am43xx_evm_defconfig //.config 가 configs/am43xx_evm_defconfig 기반으로 자동생성 // Makefile을 보면 CONFIG_xxx 검색설정은 .config 기반 $ make menuconfig CROSS_COMPILE=xxx //Kconfig 기반으로 Menu가 구성되고 최종으로 .config 저장
이제 config가 생성이 되었으니, 아래의 File들을 점검
include/config.h // include/configs/am43xx_evm.h 설정확인 include/configs/am43xx_evm.h // 자신의 Board CONFIG 설정확인 board/ti/am43xx/board.c // board_init 분석 및 수정
- Uboot Build
$ make CROSS_COMPILE=xxx //u-boot Image 생성
1.2 General Uboot 기본확인사항
다음과 같이 요약할 수 있다.
1. board config에서 설정확인 (필요하다면 추가 CONFIG , make menuconfig)
2. board init 에서 DRAM TIMING 수정. (DRAM이 변경되었다면)
3. 함수들을 u-boot.map 이나 다른 map로 확인
RAM TIMING만 맞추고 CONFIG만 설정하면 된다.
1.3 일반적인 Uboot 메뉴얼 및 소스
- 일반적인 Uboot 메뉴얼
http://www.denx.de/wiki/U-Boot/Documentation
- Uboot download 및 소스확인
$ git clone git://git.denx.de/u-boot.git
2. TI Uboot와 일반 Uboot 설정 및 빌드비교
TI-Uboot는 기존 Uboot와 거의 기능이 유사하며, mkconfig(shell script)을 사용하여 config 설정하며 이외에도 Uboot에서 제공되지 않는 기능이
CONFIG가 몇개 추가 되었다. 기존에 Open Source에서 사용하던 config 설정에서 약간 변경이 되었다.
2.1 TI Uboot
- Makefile
- mkconfig
- boards.cfg
- Board 설정 및 빌드
$ make am43xx_evm_config // mkconfig 수행 ( 설정시 boards.cfg 참조) ./arch/arm/include/asm/arch ./include/config.h // GCC CONFIG , include/configs/am43xx_evm.h 설정 ./include/config.mk // Makefile CONFIG , ( 둘다 기존과 동일하지만 생성시점이 다르다)
$ make CROSS_COMPILE=xx ./include/spl-autoconf.mk ./include/autoconf.mk
*다른설정을 원할 경우, boards.cfg 에서 참조
http://processors.wiki.ti.com/index.php/Linux_Core_U-Boot_User's_Guide
2.2 Open Uboot
- board 설정 및 빌드
$ make am43xx_evm_defconfig
.config //Makefile Config (TI-UBOOT 다른것으로 mkconfig 대체 )
$ make CROSS_COMPILE=xx include/config.h // GCC CONFIG (기존과 동일) include/autoconf.mk // Makefile CONFIG (기존과 동일) ./include/config/auto.conf // TI-UBOOT 없음 , Makefile CONFIG 설정 ./include/autoconf.mk // Makefile CONFIG 설정 ./include/config.h // configs/am43xx_evm.h
이외 부분은 아직 비슷한 FDT 나 SPL기능을 둘다 지원이 가능한 것 같으며,자세한 부분은 소스를 다 분석을 해야 할 것 같다.
http://www.denx.de/wiki/view/DULG/UBootCmdFDT
- SPL과 TPL 설정 관련 설명 및 앞으로 변화
아래의 문서는 반드시 한번 읽어봐야한다.
http://www.denx.de/wiki/pub/U-Boot/MiniSummitELCE2014/uboot2014_kconfig.pdf
3. TI Uboot Guide
아래는 TI에서 제공해주는 Guide 이며, 반드시 개발하기 전에 읽어야 한다.
- TI에서 제공하는 Sitara U-BOOT를 의 종합 기능설명
Sitara를 사용한다면, 반드시 한번 읽어봐야한다.
http://processors.wiki.ti.com/index.php/Linux_Core_U-Boot_User's_Guide
- AM335x용 UBOOT User Guide
http://processors.wiki.ti.com/index.php/AM335x_U-Boot_User's_Guide
- ETHERNET 관련설정
- NAND Boot 할 경우 및 NAND 사용할 경우 Guide
http://processors.wiki.ti.com/index.php/Linux_Core_NAND_User%27s_Guide#Board_specific_configurations
4. SPL(Secondary Program Loader)의 개념 및 비교
Uboot에서 MLO , SPL 모르는 용어가 나와서 간단히 다시 Uboot를 대충 다시 분석하기로 했다.
Uboot-SPL은 MLO와 동일한 존재이며, Uboot안에 제공해주는 작은부트로더이다.
기존에 TI에서 제공된 UBL(User Boot Loader) 혹 X-Loader의 기능과 동일하며, 다른점은 Uboot 내에 소스가 포함이 되어 만들어지는 방법이 만들어진다.
이는 오래전에 제공되어진 솔루션(UBL 과 X-Loader)과는 다른점이며, AM437x는 기본적으로 OMAP 플랫폼을 동작되고 있다.
결론적으로 1st Boot Loader 이며,기능은 Uboot의 기능을 제한적사용가능
- Boot 순서
- SOC(Rom Boot Loader) : SoC에 내장되어있으며, NAND의 1 Block을 읽어온다.
- SPL : 1 Block Size의 작은 Boot Loader이며, Uboot 호출
- Uboot : Size 문제로 SPL를 사용하여 Uboot를 3번째로 호출된다.
- Open Uboot
* TPL( Tertiary Program Loader) : 보통 Uboot
http://www.denx.de/wiki/pub/U-Boot/MiniSummitELCE2013/tpl-presentation.pdf
- For Davinci series (UBL)
* 부가기능- UART BOOT로 Window에서 Flashing 과 loading 기능제공
1. DM644x Dvflasher (RBL -> UBL-> UBOOT) for Davinci series.
http://processors.wiki.ti.com/index.php/RBL_UBL_and_host_program
2. 기존 Davinci Series 와 OMAP-Lx Series 지원 (기능 동일)
http://processors.wiki.ti.com/index.php/Serial_Boot_and_Flash_Loading_Utility
- For OMAP series (X-Loader ->SPL)
*기본개념은 상동
http://omappedia.org/wiki/Bootloader_Project
http://processors.wiki.ti.com/index.php/Boot_Sequence
- 참고사항
http://www.wiki.xilinx.com/U-Boot+Secondary+Program+Loader
4.1 SPL 기본구조
기본 Makfile과 Makefile Config를 분석
$ vi Makefile ... ALL-$(CONFIG_SPL) += spl/u-boot-spl.bin ALL-$(CONFIG_SPL_FRAMEWORK) += u-boot.img ...... spl/u-boot-spl.bin: spl/u-boot-spl @: spl/u-boot-spl: tools prepare $(Q)$(MAKE) obj=spl -f $(srctree)/scripts/Makefile.spl all ... tpl/u-boot-tpl.bin: tools prepare $(Q)$(MAKE) obj=tpl -f $(srctree)/scripts/Makefile.spl all CONFIG_TPL_BUILD=y
board config에서 SPL 설정하고 빌드를 진행하면, SPL dir이 새로 생성하게 되며,이 안에 작은 boot loader와 각각의 필요한 *.o, *.su, *.cmd 이 생성이 된다.
.su 파일 과 .cmd 파일기록으로 분석해보면, 기존의 소스로 컴파일 or link해서 사용하는것 같다.
$ cat spl/arch/arm/cpu/armv7/.cpu.o.cmd source_spl/arch/arm/cpu/armv7/cpu.o := arch/arm/cpu/armv7/cpu.c xxxxx $ cat spl/arch/arm/cpu/armv7/cpu.su cpu.c:25:13:cpu_cache_initialization 0 static cpu.c:27:5:cleanup_before_linux 8 static
- SPL 설정 (DM8127-IPNC예제)
SPL은 각각의 내부 COMMAND와 별도의 설정가능하며,SPL의 역할은 DDR 설정 및 초기화 기능
$ vi ./include/configs/ti8148_ipnc.h #ifdef CONFIG_TI814X_MIN_CONFIG ... # define CONFIG_CMD_LOADB /* loadb */ # define CONFIG_CMD_LOADY /* loady */ # define CONFIG_TI814X_CONFIG_DDR # define CONFIG_TI814X_EVM_DDR3 # define CONFIG_SYS_PROMPT "TI-MIN#" .... #else # include# define CONFIG_SKIP_LOWLEVEL_INIT /* 1st stage would have done the basic init */ # define CONFIG_ENV_SIZE 0x2000 # define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + (32 * 1024)) # define CONFIG_ENV_OVERWRITE # define CONFIG_SYS_PROMPT "TI8148_IPNC#" # define CONFIG_MMC 1 # define CONFIG_NAND 1 #endif
- U-BOOT 내의 Image 구성
$ cd board-support/u-boot-2014.07-g7e537bf $ ls MLO : u-boot-spl.bin 의 최종 이미지 확인방법 cat .MLO.cmd (동일한 존재) spl : SPL 관련링크 및 Image 파일 u-boot.img : U-BOOT bin 최종 파일 확인방법: cat .u-boot.img.cmd xxx (중략)
- su file 관련내용
su file 관련내용
https://gcc.gnu.org/onlinedocs/gnat_ugn/Static-Stack-Usage-Analysis.html
su file 생성 관련수정 (Makefile 연계)
http://lists.denx.de/pipermail/u-boot/2014-February/172622.html
- SPL 관련 문서
./doc/README.SPL
4.2 SPL 사용방법
TI-UBOOT는 Makefile CONFIG를 두개로 따로 관리(자동생성)를 하여, 관리하지만, 만약, SPL 관련 수정을 한다면, boards.cfg를 봐야할 것 같다.
Makefile은 (mkconfig 실행 와 boards.cfg 참조) Board Config들을 보려면 아래사항을 확인 해야할 것 같다.
- Board Configuration
./include/configs/am43xx_evm.h ./include/configs/ti_armv7_common.h //SPL 관련 설정 // 위 Config 파일을 보면 각각 설정이 가능함. //USB BOOT Mode일 경우 변경 #define CONFIG_SPL_TEXT_BASE 0x402F4000 // SRAM 위치 , Link Sript 참조. #define CONFIG_SPL_MAX_SIZE (220 << 10) /* 220KB */ #define CONFIG_SYS_SPL_ARGS_ADDR (CONFIG_SYS_SDRAM_BASE + \ (128 << 20)) #define CONFIG_SPL_BOARD_INIT #define CONFIG_SPL_POWER_SUPPORT #define CONFIG_SPL_YMODEM_SUPPORT
- Makefile의 CONFIG 파일 구성
./include/autoconf.mk // CONFIG_SPL=y 선언 ./include/spl-autoconf.mk // CONFIG_SPL_BUILD=y 선언
- SPL 빌드과정
- U-BOOT의 CONFIG .config에 CONFIG_SPL=y 설정 할 경우
- Makefile 안의 spl/u-boot-spl 에서 Makefile.spl이 spl-autoconf.mk 생성
- SPL은 이 부분을 참조하여 빌드를 한다.
*CONFIG_SPL_BUILD=y //SPL 관련 Makefile CONFIG 이부분은 SPL문서 참조.
4.3 SPL 관련파일
SPL 관련자료는 board config에서 *CONFIG_SPL_BUILD=y 사용하겠다고 명시를 하면, 아래와 같이 기본기능과 각 BOOT MODE 맞게 생성이 되는 것 같다.
BSP 혹은 uboot version에 따라 조금씩 다른것 같다.
- SPL의 기본소스
common/spl/
$ vi common/spl/Makefile 11 ifdef CONFIG_SPL_BUILD 12 obj-$(CONFIG_SPL_FRAMEWORK) += spl.o 13 obj-$(CONFIG_SPL_NOR_SUPPORT) += spl_nor.o 14 obj-$(CONFIG_SPL_YMODEM_SUPPORT) += spl_ymodem.o 15 obj-$(CONFIG_SPL_NAND_SUPPORT) += spl_nand.o 16 obj-$(CONFIG_SPL_ONENAND_SUPPORT) += spl_onenand.o 17 obj-$(CONFIG_SPL_NET_SUPPORT) += spl_net.o 18 obj-$(CONFIG_SPL_MMC_SUPPORT) += spl_mmc.o 19 obj-$(CONFIG_SPL_USB_SUPPORT) += spl_usb.o 20 obj-$(CONFIG_SPL_FAT_SUPPORT) += spl_fat.o 21 obj-$(CONFIG_SPL_EXT_SUPPORT) += spl_ext.o 22 obj-$(CONFIG_SPL_SATA_SUPPORT) += spl_sata.o 23 endif
빌드 후에는 uboot/spl 에 모든 파일이 생성.
- U-BOOT 설정
$ vi .config // U-BOOT EVM CONFIG 설정 $ vi ./u-boot.cfg // U-BOOT Build 된 후 아래 CONFIG와 관련 CONFIG 전부 $ vi ./spl/include/autoconf.mk // U-BOOT-SPL, MLO의 설정 확인 $ vi ./spl/u-boot-spl.cfg // Build 된 후 CONFIG 포함
- U-BOOT SPL 설정
$ vi ./spl/include/autoconf.mk // U-BOOT-SPL, MLO의 설정 확인 $ vi ./spl/u-boot-spl.cfg // Build 된 후 CONFIG 포함
4.4 TI-SPL을 적용한 BOOT MODE
- 자주사용할 Boot Mode
- MMC BOOT (SD Card)
- NAND BOOT
- 기본 부팅순서
- ROM Bootloader, (IPL, Initial Program Loader or (PPL, the Primary Program Loader)
- The binary for the (SPL, Secondary Program Loader) or the MLO.
- The binary for U-Boot (TBL, Tertiary Program Loader)
NAND일 경우, PPL이 NAND 1st ~ 4th block 몇개를 SPL 찾기위해 검색을 Bad Block 생각해서, 그리고, SPL 진행하고 초기화
MMC와 USB일 경우, PPL이 FAT를 Mount하는 기능이 추가되어, SPL 파일을 찾아,SPL(MLO)를 진행하고 초기화
부팅관련용어 및 내용
http://elinux.org/Boot_U-Boot_from_UBI_volume
5. Boot Mode 기본분석 및 Memory Map
- NAND BOOT 구조
아래는 AM33xx 인 경우 NAND 구조이며, SPL과 U-Boot.img Kernel 위치를 알수 있다.
+------------+-->0x00000000-> SPL start (SPL copy on 1st block) | | | |-->0x0001FFFF-> SPL end | |-->0x00020000-> SPL.backup1 start (SPL copy on 2nd block) | | | |-->0x0003FFFF-> SPL.backup1 end | |-->0x00040000-> SPL.backup2 start (SPL copy on 3rd block) | | | |-->0x0005FFFF-> SPL.backup2 end | |-->0x00060000-> SPL.backup3 start (SPL copy on 4th block) | | | |-->0x0007FFFF-> SPL.backup3 end | |-->0x00080000-> U-Boot start | | | |-->0x002BFFFF-> U-Boot end | |-->0x00260000-> ENV start | | | | | |-->0x0027FFFF-> ENV end | |-->0x00280000-> Linux Kernel start | | | | | | | | | |-->0x0077FFFF-> Linux Kernel end | |-->0x00780000-> File system start | | | | | | | | | | | | | | | | | | | | | | | | +------------+-->0x10000000-> NAND end (Free end)
http://processors.wiki.ti.com/index.php/AM335x_U-Boot_User's_Guide
- MMC와 eMMC 와 USB BOOT MODE일 경우 구조
Partition-2: EXT3: Linux File system
(* fdisk로 각 파티션을 만들고, 분할)
- Linker Script 확인
- 기본 확인방법 (Board Config)
$ vi include/configs/am43xx_evm.h
...
#define CONFIG_SPL_LDSCRIPT "$(CPUDIR)/omap-common/u-boot-spl.lds"
...
$ cat arch/arm/cpu/armv7/omap-common/u-boot-spl.lds //linker script 확인
https://sourceware.org/binutils/docs-2.25/ld/index.html
http://www.math.utah.edu/docs/info/ld_3.html
5.1 AM335x 관련정보
- AM335x AM335x EVM-SK Info
http://processors.wiki.ti.com/index.php/AM335x_Starter_Kit#Hardware_Documentation
- AM335x EVM-SK 진단용
http://processors.wiki.ti.com/index.php/AM335x_Starter_Kit_Diagnostics
- AM335x Battery Pack
- AM335x EVM-SK JTAG (XDS-100 V2) 설정
http://processors.wiki.ti.com/index.php/Starter_kit_jtag
- AM335x SD Boot 일 경우 참고사항
현재 SD Boot할 경우, Sandisk 16GB Class10 인 경우 제대로 동작이 안되지만, 기본적으로 ICS 4.0.3 포함한 SD Disk는 잘동작한다.
원인은 MLO에서 MMC를 정확히 인식을 못하는 것 같다.
http://processors.wiki.ti.com/index.php/TI-Android-ICS-4.0.3-DevKit-3.0.1_UserGuide#SD_Card_Recommendations
U-Boot SPL 2016.05 (Feb 20 2017 - 16:27:15) Trying to boot from MMC1 ** First descriptor is NOT a primary desc on 0:1 ** ** Partition 1 not valid on device 0 ** spl_register_fat_device: fat register err - -1 ** Partition 1 not valid on device 0 ** spl_register_fat_device: fat register err - -1 spl_load_image_fat: error reading image u-boot.img, err - -1 spl: no partition table found spl: no partition table found SPL: failed to boot from all boot devices ### ERROR ### Please RESET the board ###
https://en.wikipedia.org/wiki/Secure_Digital#Micro
댓글 없음 :
댓글 쓰기