1/04/2015

U-BOOT Download 와 기본구조

1. Uboot 란?  

Uboot는 예전의 ppcboot 와 armboot가 합쳐지면서 생겨진 이름으로Univeral Boot Loader의 약자의 이름이다.
내 기억으로는 1.0 이전은 ppcboot로 소스관리가 되다가 ARM7이 나오면서 armboot가 별도나오고 이를 통합하여 생겨난 bootloard이다.
이 bootloard 이외에도 redboot 나 다른 opensource의 boot loarder들이 존재하며, 오래전에는 다 사용을 했지만,
이 bootloader가 Linux에서 많이 사용되어지면서 다른 bootloader들은 지금 찾기가 힘들것 같다.

빌드 방법과 기본구조만 알면 거의 이해가 될 것 같으며, Chip Vendor로 부터 BSP로 받더라도 DDR과 PLL부분은 자신에 맞게 수정을 해야 할 것이며,
본인에게 필요한 Command가 있다면 추가해서 사용하면된다.

U-Boot Site
  http://www.denx.de/wiki/view/U-Boot

1.1 Download on Web

denx 사이트에서 직접 Web browser로 FTP로 연결이 되어 Download가 가능하다.
가장 편하며 좋다.

Download
  ftp://ftp.denx.de/pub/u-boot/

1.2 DownLoad by FTP

$ ftp ftp.denx.de
Connected to phoibe.denx.de.
220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 2 of 50 allowed.
220-Local time is now 09:10. Server port: 21.
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
Name (ftp.denx.de:jhlee): anonymous
ftp>dir
drwxr-sr-x    6 1001       1000             4096 Jun  9  2015 pub
ftp> cd pub
ftp> dir
drwxr-sr-x   17 1001       1000             4096 Jun  9  2015 eldk
drwxr-xr-x    2 1001       1000             4096 Jan 10  2003 ppcboot
drwxr-xr-x    2 1001       1000             4096 Jul  4 08:11 tmp
drwxrwxr-x    2 1001       1000            12288 Dec  6 01:05 u-boot

ftp > get u-boot-latest.tar.bz2
ftp > get u-boot-2015.10.tar.bz2


1.3 Download by GIT

 
$ apt-get install git   // git가 설치 안된 경우 
$ git clone git://git.denx.de/u-boot.git   // GIT를 이용하여 압축이 안된 소스를 Download 


1.4 Chip Vendor U-Boot

해당 SDK를 설치를 하면 U-Boot가 source가 존재 할 것이다.


2. Uboot의 기본구조 및 관련 기본설명 

  • ARCH
CPU의 Architecture를 말하며 현재는거의 ARM을  주로 많이 사용하지만,이전에는 Power PC와 Mips도 많이 사용한 적이 있다.
Board는 현재 각 개별 Board 별 설정을 하는 곳으로 현재 EVM이 많이 생겨나다보니 Kernel의 설정과 거의 유사한 형태로 변화되어 설정되고 있다.

  • Drivers
Uboot도 NOR NAND의 loader에서 발전하여 각각의 interface를 지원하다보니,여러가지 driver를 제공하게 되었으며,
이는 loader로써의 역할뿐만 아니라 간단한 TEST program으로 가능하게되었다.

아래에서 보면 mmc뿐만 아니라, fpga를 사용한다면, fpga loader도 필요할 것이며, bus interfacepci , usb ,
network interface 인 mii 여러가지를 다양하게 지원하며, video를 사용하여 간단한 video도 test도 가능하다.
(예전에 video쪽은 Uboot에서 본인 Chip에 맞게 Driver를 다 구현하였다.)

  • Filesystem 
각각의 BUS interface를 mount 한 후 각각의 Filesystem까지 지원을 하다보니,그 mount된 device의 파일을 load까지 가능하며 접근가능하다.
점점 기능이 추가되므로, 가능하다면 최신버전으로 사용하자

  • NAND BOOT
SPL(Second Program Loader) 약자이며,Uboot는  TPL(Tertiary Program Loader)로 될수가 있다.
이는 본인의 Chip에 따라 달라질수 있으며, 관련내용은 Chip Vender의 Manual을 참조하자
일단 예를 들어 TI인 경우 Davinci를 간단히 보면, RBL(Rom bootloader), UBL, U-BOOT 이런식으로 Boot가 진행된다.
RBL은 CPU가 내장을 하고 있으며, UBL은 NAND의 1st Block에서 찾아 이를 Boot 한 후,
U-BOOT를 Booting 시킨다.
그래서 2번째 Bootloader가 되는 것이며, OMAP인 경우는 이름이 바뀌지만, 개념은 거의 유사하다고 보면된다.
위 개념은 TI 뿐만 아니라, Freescale의 I.MX 다른 CPU에도 존재하기에 반드시 관련문서를보자.

  • Bootscript 지원 및 환경변수 지원 
이 부분은 따로 자세히 설명을 하도록 하겠으며, 일반 OS의 Shell 변수처럼 설정이 가능하며, 외부의 Script을 Load하여 실행도 가능하다.

  • Device Tree 
Uboot 와 Kernel의 설정을 외부에서 손쉽게 설정이 가능하도록 만들어진 기능으로 해당 Board에 대한 MACHINE 정보기반으로
Kernel에게 전달 해주면, Kernel은 Device Tree 정보를 기반으로 Kernel HW 설정을 진행하며, Uboot에게 전달 해주면, Uboot역시 동일하게 동작한다.

$ tree -d -L 2 
.
├── Licenses
├── api
├── arch
│   ├── arc
│   ├── arm
│   ├── avr32
│   ├── blackfin
│   ├── m68k
│   ├── microblaze
│   ├── mips
│   ├── nds32
│   ├── nios2
│   ├── openrisc
│   ├── powerpc
│   ├── sandbox
│   ├── sh
│   ├── sparc
│   └── x86
├── board
│   ├── 8dtech
│   ├── AndesTech
....
│   ├── LaCie
│   ├── Marvell
│   ├── Seagate
....
....
....
│   ├── d-link
│   ├── dave
│   ├── davedenx
│   ├── davinci
│   ├── dbau1x00
│   ├── denx
│   ├── dnp5370
│   ├── efi
....
│   ├── h2200
│   ├── highbank
│   ├── hisilicon
...
│   ├── lge
...
│   ├── nvidia
...
│   ├── raspberrypi
│   ├── renesas
│   ├── ronetix
│   ├── samsung

│   ├── spear
│   ├── st
..
│   ├── ti
...
│   └── xilinx
├── common
│   └── spl
├── configs
├── disk
├── doc
│   ├── DocBook
│   ├── SPI
│   ├── SPL
│   ├── device-tree-bindings
│   ├── driver-model
│   └── uImage.FIT
├── drivers
│   ├── bios_emulator
│   ├── block
│   ├── bootcount
│   ├── clk
│   ├── core
│   ├── cpu
│   ├── crypto
│   ├── ddr
│   ├── demo
│   ├── dfu
│   ├── dma
│   ├── fpga
│   ├── gpio
│   ├── hwmon
│   ├── i2c
│   ├── input
│   ├── led
│   ├── memory
│   ├── misc
│   ├── mmc
│   ├── mtd
│   ├── net
│   ├── pci
│   ├── pcmcia
│   ├── pinctrl
│   ├── power
│   ├── pwm
│   ├── qe
│   ├── ram
│   ├── rtc
│   ├── serial
│   ├── soc
│   ├── sound
│   ├── spi
│   ├── thermal
│   ├── tpm
│   ├── twserial
│   ├── usb
│   ├── video
│   └── watchdog
├── dts
├── examples
│   ├── api
│   └── standalone
├── fs
│   ├── cbfs
│   ├── cramfs
│   ├── ext4
│   ├── fat
│   ├── jffs2
│   ├── reiserfs
│   ├── sandbox
│   ├── ubifs
│   ├── yaffs2
│   └── zfs
├── include
│   ├── andestech
│   ├── asm-generic
│   ├── bedbug
│   ├── configs   // Board Config 
│   ├── cramfs
│   ├── dm
│   ├── dt-bindings  //Device Tree 
│   ├── faraday
│   ├── fsl-mc
│   ├── jffs2
│   ├── linux
│   ├── lzma
│   ├── mtd
│   ├── net
│   ├── pcmcia
│   ├── power
│   ├── samsung
│   ├── synopsys
│   ├── test
│   ├── u-boot
│   ├── usb
│   └── zfs
├── lib
│   ├── bzip2
│   ├── dhry
│   ├── efi
│   ├── libfdt   //Flatted Device Tree 관련부분
│   ├── lzma
│   ├── lzo
│   ├── rsa
│   ├── tizen
│   └── zlib
├── net
├── post
│   ├── board
│   ├── cpu
│   ├── drivers
│   └── lib_powerpc
├── scripts
│   ├── basic
│   └── kconfig
├── test
│   ├── dfu
│   ├── dm
│   ├── env
│   ├── fs
│   ├── image
│   ├── stdint
│   ├── trace
│   ├── ums
│   └── vboot
└── tools
    ├── buildman
    ├── easylogo
    ├── env
    ├── gdb
    ├── kermit
    ├── logos
    ├── omap
    ├── palmtreo680
    ├── patman
    └── scripts