레이블이 SoC-DM81xx인 게시물을 표시합니다. 모든 게시물 표시
레이블이 SoC-DM81xx인 게시물을 표시합니다. 모든 게시물 표시

7/26/2015

Sitara(AM437x/AM335x) Uboot와 SPL 분석

1. Open Uboot (Denx)

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 설정
Kernel 과 동일하게 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/DULG/Manual
       http://www.denx.de/wiki/U-Boot/Documentation

  • Uboot download 및 소스확인
       http://git.denx.de/?p=u-boot.git;a=summary
   
$ 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   
boards.cfg를 참조하며, mkconfig를 실행을 실행하여 설정하고, 빌드시 script와 새로 생성된 만들어진 Makefile Config 파일로 설정하여 빌드한다.
  • mkconfig  
config를 만드는 shell script (TI에서 추가)
  • boards.cfg 
board의 설정 및 정보


  • 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 설정 관련 설명 및 앞으로 변화 
Chip Vendor와 상관 없이 Uboot의 설정이 점점 변경이 되고 있으며,TI도 이 흐름에 따라가고 있을 뿐인것 같다.
아래의 문서는 반드시 한번 읽어봐야한다.
  http://www.denx.de/wiki/pub/U-Boot/MiniSummitELCE2014/uboot2014_kconfig.pdf


3. TI Uboot Guide 

아래는 TI에서 제공해주는 Guide 이며, 반드시 개발하기 전에 읽어야 한다.

  • TI에서 제공하는 Sitara U-BOOT를 의 종합 기능설명 
  Sitara U-BOOT Build 및 BOOT모드 설정 및 환경구성 설명이며,
  Sitara를 사용한다면, 반드시 한번 읽어봐야한다.
  http://processors.wiki.ti.com/index.php/Linux_Core_U-Boot_User's_Guide

  • AM335x용 UBOOT User Guide
  AM335x용 UserGuide로 각 BOOT 모드를 설명 및  Flashing 방법을 설명. (참고용)
  http://processors.wiki.ti.com/index.php/AM335x_U-Boot_User's_Guide

  • ETHERNET 관련설정 
  http://processors.wiki.ti.com/index.php/Linux_Core_CPSW_User's_Guide

  • NAND Boot 할 경우 및 NAND 사용할 경우 Guide 
  http://processors.wiki.ti.com/index.php/Linux_Core_NAND_User's_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 순서
  1. SOC(Rom Boot Loader)  :  SoC에 내장되어있으며, NAND의 1 Block을 읽어온다.
  2. SPL                            : 1 Block Size의 작은 Boot Loader이며, Uboot 호출
  3. Uboot                        : Size 문제로 SPL를 사용하여 Uboot를 3번째로 호출된다.

  • Open Uboot
     * SPL( Secondary Program Loader) : 작은 Uboot
     * TPL( Tertiary Program Loader)  : 보통 Uboot

  http://www.denx.de/wiki/pub/U-Boot/MiniSummitELCE2013/tpl-presentation.pdf

  • For Davinci series (UBL)
     * UBL 제공 및 사용 (RBL->UBL->UBOOT) BOOT
     * 부가기능- 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)
     *초반에 X-Loader를 사용했으나, 이를 SPL 개념으로 변경
     *기본개념은 상동
  http://omappedia.org/wiki/Bootloader_Project
  http://processors.wiki.ti.com/index.php/Boot_Sequence
   
  • 참고사항 
    * 다른 CPU UBOOT SPL
  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예제)
dm8127-ipnc의 config 설정 각각의 설정에 따라, PROMPT를 SPL과 Uboot를 각각 변경하고 MINI Uboot인 SPL이 되어진다.
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은 static stack의 사용량 분석하는 파일이니, 참고만 하면 되겠으며, 이 file로 최대 stack 사이즈를 알려고 하는 것 같다.

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 관련 문서 
Uboot안에 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 빌드과정
  1. U-BOOT의 CONFIG .config에 CONFIG_SPL=y 설정 할 경우  
  2. Makefile 안의  spl/u-boot-spl 에서 Makefile.spl이 spl-autoconf.mk 생성
  3. 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의 기본소스 
SPL의 기본소스는 존재하지만, U-BOOT와 공통되느는 부분은 동일하게 외부에서 가져다 쓰기에 이곳에 존재하지 않는다.

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 설정
기본적으로, make board_config를 한 후에 가능

$ 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 
AM437X는 다양한 BOOT MODE를 제공하지만, 일단 기본적인 BOOT인 MMC와 NAND 보겠다.

  • 자주사용할 Boot Mode 
  1. MMC BOOT   (SD Card)
  2. NAND BOOT

  • 기본 부팅순서 
  1. ROM Bootloader, (IPL, Initial Program Loader or (PPL, the Primary Program Loader) 
  2. The binary for the (SPL, Secondary Program Loader) or the MLO.
  3. 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 구조 
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-1:  FAT32:   MLO(SPL) 와 u-boot.img
    Partition-2:  EXT3:  Linux File system
    (* fdisk로 각 파티션을 만들고, 분할)

  • Linker Script 확인
SPL때문에 Link Script을 다시 확인하게 되었지만, 기본 Link Script가 에서 다시 설정이 되어, spl directory에 최종결과물이 생성이 된다.

  • 기본 확인방법 (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
  http://processors.wiki.ti.com/index.php/AM335x_Starter_Kit#Hardware_Documentation

  • AM335x EVM-SK 진단용
  추후 QC Program응용가능
  http://processors.wiki.ti.com/index.php/AM335x_Starter_Kit_Diagnostics

  • AM335x Battery Pack
  http://processors.wiki.ti.com/index.php/AM335x_Starter_Kit_Battery_Pack

  • AM335x EVM-SK JTAG (XDS-100 V2) 설정 
현재 이 EVM JTAG Header가 없다고해서 사용못한다고 한다. 설정방법
  http://processors.wiki.ti.com/index.php/Starter_kit_jtag

  • AM335x SD Boot 일 경우 참고사항
  http://processors.wiki.ti.com/index.php/Linux_Core_U-Boot_User's_Guide#Partitioning_eMMC_from_U-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