레이블이 Uboot인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Uboot인 게시물을 표시합니다. 모든 게시물 표시

2/10/2015

U-boot MII 와 NAND 기본명령

1. Uboot의 기본정보

  • 메뉴얼 
http://www.denx.de/wiki/DULG/Manual
http://www.denx.de/wiki/U-Boot/Documentation

  • 소스확인 
http://git.denx.de/?p=u-boot.git;a=summary


  • Uboot Command 
  http://skywheel.tistory.com/entry/uboot-%EB%AA%85%EB%A0%B9%EC%96%B4-%EB%B0%8F-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98-%EC%A0%95%EB%A6%AC


1.1 Uboot Config 확인 

  • Uboot 기본설정확인
include/config.h  
include/configs/xxxx   //board name 

#define CONFIG_CMD_xxx         // Command 지원확인
#define CONFIG_ENV_OFFSET      // ENV 저장부분  
#define CONFIG_ENV_ADDR


SoC에따른 Uboot
  http://www.denx.de/wiki/U-Boot/Custodians


1.2 Uboot Env NFS 설정 


  • TI-NFS SETTING EXAMPLE
setenv ethaddr 00:11:22:33:04:55
setenv ipaddr 192.168.1.4
setenv serverip 192.168.1.100
setenv netmask 255.255.255.0
setenv broadcast 192.168.1.255
setenv gateway 192.168.1.1 

setenv bootargs 'console=ttyS1,115200n8 rw mem=48M root=/dev/nfs nfsrootdebug rootdelay=4 nfsroot=192.168.1.100:/home/jhlee/dm368/mt5/Source/ipnc_rdk/target/filesys_dm368,nolock mem=48M cmemk.phys_start="0x83000000" cmemk.phys_end="0x88000000" cmemk.phys_start_1="0x00001000" cmemk.phys_end_1="0x00008000" cmemk.pools_1="1x28672" cmemk.allowOverlap=1 eth=00:0C:0C:A0:04:22 ip=192.168.1.168 nohz=off highres=off clocksource=acpi_pm lpj=1077248 earlyprintk'

안에들어가는 옵션은 Filesystem에 따라 다양하며, 위에서 보는거와 같이 디버깅을 위해서,
earlyprintk , nfsrootdebug 를 추가 가능하다.
또한, mount 시점을 delay를 주는 것도 가능하다.
quiet


2. Uboot의 MII 명령

MII는 Media indepenent interface로 LAN에서 사용하는 표준 Interface이며, 이를 이용하여 일반적으로 사용되어지는 Register 값들을 확인가능하다.

  • Uboot시 아래 mii phy 발견확인 
In:    serial
Out:   serial
Err:   serial
ARM Clock :- 432MHz
DDR Clock :- 340MHz
Ethernet PHY: GENERIC @ 0x01
Hit any key to stop autoboot:  0 

  • MII Device의 갯수 및 주소 파악 
현재 사용되어지는 MII Device 갯수와 주소를 파악가능 (현재 1개만사용)

DM368 IPNC :>mii device
MII devices: 'GENERIC @ 0x01' 
Current device: 'GENERIC @ 0x01'

2.1 Uboot MII 명령어

  • Uboot MII 명령어 
- mii device Lists available devices.  // 사용가능한 MII Device 보여줌
- mii device Set current device.      // MII Device 설정 
- mii read Reads register 'reg' from MII PHY 'addr'.  // MII Device의 Register Read
- mii write Writes 'data' to register 'reg' at MII PHY 'addr'.    // MII Device의 Register Write
- mii dump Displays data of register 'reg' from MII PHY 'addr'.   // MII Device Register Dump 


  • 관련소스
MII에서 MDIO설정하는 부분확인
drivers/net/stmmac/mdio.c

  • Offset Register Name
  1. 00 Basic Mode Configuration
  2. 01 Basic Mode Status
  3. 02 PHY ID #1
  4. 03 PHY ID #2
  5. 04 AutoNegotation Advertisement
  6. 05 Link Partner Ability
  7. 06 AutoNegotation Expansion

  • The bits of the MII status 
  1. 0x8000 Capable of 100baseT4.
  2. 0x7800 Capable of 10/100 HD/FD (most common).
  3. 0x0040 Preamble suppression permitted.
  4. 0x0020 Autonegotiation complete.
  5. 0x0010 Remote fault.
  6. 0x0008 Capable of Autonegotiation.
  7. 0x0004 Link established ("sticky"* on link failure)
  8. 0x0002 Jabber detected ("sticky"* on transmit jabber)
  9. 0x0001 Extended MII register exist.

  https://en.wikipedia.org/wiki/Media-independent_interface

2.2 Uboot MII 사용방법 및 확인


  • Basic Mode Configuration

DM368 IPNC# mii write 1 0 0  // addr reg data
DM368 IPNC# mii read 1 0   // addr reg data 
0000
DM368 IPNC# mii write 1 0 3100     // default setting (Basic Mode Configuration)
DM368 IPNC# mii read 1 0
3100
DM368 IPNC# mii write 1 0 B100    // + Reset 
DM368 IPNC# mii read 1 0
3100


  • 상위 Register 들 점검
DM368 IPNC :>mii read 1 0  // Basic Mode Configuration
3100
DM368 IPNC :>mii read 1 1  // Basic Mode Status 
7849
DM368 IPNC :>mii read 1 2  // PHY ID #1
0181
DM368 IPNC :>mii read 1 3  // PHY ID #2
B8B0
DM368 IPNC :>mii read 1 4  // AutoNegotation Advertisement
01E1
DM368 IPNC :>mii write 1 0 1000
DM368 IPNC :>mii read 1 0


  • MII Dump로 쉽게 분석

# mii dump 1 0  // Basic Mode Configuration
0.     (3100)                 -- PHY control register --
  (8000:0000) 0.15    =     0    reset
  (4000:0000) 0.14    =     0    loopback
  (2040:2000) 0. 6,13 =   b01    speed selection = 100 Mbps
  (1000:1000) 0.12    =     1    A/N enable   // Auto Nego
  (0800:0000) 0.11    =     0    power-down
  (0400:0000) 0.10    =     0    isolate
  (0200:0000) 0. 9    =     0    restart A/N
  (0100:0100) 0. 8    =     1    duplex = full
  (0080:0000) 0. 7    =     0    collision test enable
  (003f:0000) 0. 5- 0 =     0    (reserved)

# mii dump 1 1 // Basic Mode Status 
1.     (786d)                 -- PHY status register --
  (8000:0000) 1.15    =     0    100BASE-T4 able
  (4000:4000) 1.14    =     1    100BASE-X  full duplex able
  (2000:2000) 1.13    =     1    100BASE-X  half duplex able
  (1000:1000) 1.12    =     1    10 Mbps    full duplex able
  (0800:0800) 1.11    =     1    10 Mbps    half duplex able
  (0400:0000) 1.10    =     0    100BASE-T2 full duplex able
  (0200:0000) 1. 9    =     0    100BASE-T2 half duplex able
  (0100:0000) 1. 8    =     0    extended status
  (0080:0000) 1. 7    =     0    (reserved)
  (0040:0040) 1. 6    =     1    MF preamble suppression
  (0020:0020) 1. 5    =     1    A/N complete  //Auto Nego 
  (0010:0000) 1. 4    =     0    remote fault
  (0008:0008) 1. 3    =     1    A/N able
  (0004:0004) 1. 2    =     1    link status
  (0002:0000) 1. 1    =     0    jabber detect
  (0001:0001) 1. 0    =     1    extended capabilities


# mii dump 1 2 // PHY ID #1
2.     (0243)                 -- PHY ID 1 register --
  (ffff:0243) 2.15- 0 =   579    OUI portion


# mii dump 1 3 // PHY ID #2
3.     (0c54)                 -- PHY ID 2 register --
  (fc00:0c00) 3.15-10 =     3    OUI portion
  (03f0:0050) 3. 9- 4 =     5    manufacturer part number
  (000f:0004) 3. 3- 0 =     4    manufacturer rev. number


# mii dump 1 4 // AutoNegotation Advertisement
4.     (01e1)                 -- Autonegotiation advertisement register --
  (8000:0000) 4.15    =     0    next page able
  (4000:0000) 4.14    =     0    reserved
  (2000:0000) 4.13    =     0    remote fault
  (1000:0000) 4.12    =     0    reserved
  (0800:0000) 4.11    =     0    asymmetric pause
  (0400:0000) 4.10    =     0    pause enable
  (0200:0000) 4. 9    =     0    100BASE-T4 able
  (0100:0100) 4. 8    =     1    100BASE-TX full duplex able
  (0080:0080) 4. 7    =     1    100BASE-TX able
  (0040:0040) 4. 6    =     1    10BASE-T   full duplex able
  (0020:0020) 4. 5    =     1    10BASE-T   able
  (001f:0001) 4. 4- 0 =     1    selector = IEEE 802.3

# mii dump 1 5  //Link Partner Ability
5.     (45e1)                 -- Autonegotiation partner abilities register --
  (8000:0000) 5.15    =     0    next page able
  (4000:4000) 5.14    =     1    acknowledge
  (2000:0000) 5.13    =     0    remote fault
  (1000:0000) 5.12    =     0    (reserved)
  (0800:0000) 5.11    =     0    asymmetric pause able
  (0400:0400) 5.10    =     1    pause able
  (0200:0000) 5. 9    =     0    100BASE-T4 able
  (0100:0100) 5. 8    =     1    100BASE-X full duplex able
  (0080:0080) 5. 7    =     1    100BASE-TX able
  (0040:0040) 5. 6    =     1    10BASE-T full duplex able
  (0020:0020) 5. 5    =     1    10BASE-T able
  (001f:0001) 5. 4- 0 =     1    selector = IEEE 802.3

# mii info  // MII PHY 관련정보
PHY 0x01: OUI = 0x90C3, Model = 0x05, Rev = 0x04, 100baseT, FDX

  https://en.wikipedia.org/wiki/Management_Data_Input/Output
  https://en.wikipedia.org/wiki/Autonegotiation
  http://lostintransit.se/tag/autonegotiation/
  http://units.folder101.com/cisco/sem1/Notes/ch6-ethernet/autonegotiation.htm


3. Uboot I2C 와 USB 명령어 

  • Uboot에서 USB 명령어

# usb dev 0
USB device 0:
    Device 0: Vendor: General  Rev: 5.00 Prod:              
            Type: Removable Hard Disk
            Capacity: 3950.0 MB = 3.8 GB (8089600 x 512)
... is now current device

# usb part 0
Partition Map for USB device 0  --   Partition Type: DOS
Partition     Start Sector     Num Sectors     Type
    1            778135908      1141509631      72
    2            168689522      1936028240      65
    3           1869881465      1936028192      79
    4           -1409286144          55499       d

  • Uboot에서 I2C명령어

imd {i2c_chip} {addr}{.0, .1, .2} {len}
imm{.b, .w, .l} {i2c_chip} {addr}{.0, .1, .2}
imw {i2c_chip} {addr}{.0, .1, .2} {data} [{count}]


4. Uboot NAND 명령어

CPU마다 기본적으로 지원되는 Command는 많이 다르며, 특정 CPU에서만 지원되는 CMD도 있다.
본인이 원하면 CMD를 추가하여 설정을 하고 포팅을 해서 사용을 해야 하며 관련내용은 Command Config에서 확인하자.

nand write 관련 command

nand write       : 일반적인 raw data를 기록한다.
nand write.e     : NAND의 ecc block을 사용하여 기록을 한다.
nand write.jffs2 : jffs2 filesystem을 기록한다.


nandecc hw 2
nandecc hw 0   : ecc 변경

  https://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/100/t/210595


nand scrub : bbt까지 다 없애고 초기화
nand erase : nand erase 진행

세부설명은 이곳을 봐도 될 것 같음
  http://wiki.openmoko.org/wiki/U-Boot_commands#Loading_Kernel_from_NAND
  http://wiki.openmoko.org/wiki/NAND_bad_blocks


  http://www.aesop.or.kr/index.php?mid=Board_Community_QandA&page=41&listStyle=webzine&document_srl=77412

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

9/23/2014

IMAGE 수정 및 boot.scr 관리

1. Uboot Script 

Uboot Script 이며, Uboot 에서 사용하는 Command들을 나열하여 사용하는 일종의 Shell Script이라고 생각하면 되겠다.
boot.txt or boot.cmd 로 uboot command를 정의한 후 이를 mkimage를 이용하여 변형을 해주고, Uboot에서 이를 load에서 해서 이 Uboot Script를 사용하면 된다.

  https://www.denx.de/wiki/DULG/UBootScripts


1.1 How to make boot.scr

 mkimage -A arm -T script -C none -n "Boot.scr for odroid" -d ./boot.txt ./boot.scr 
  • boot.txt : string 
  • boot.scr : result

1.2 Uboot 환경변수 설정소스 파악  

기본적으로 Uboot에서 설정되는 환경설정값들을 각각의 EVM or Board마다 다르므로, 본인의 소스 위치를 파악하여 알아보자.

Uboot 에서 BOOTCOMAND는 bootcmd 의 환경설정값 이며, boot.scr 안에서 Kernel를 Load하고 본인이 원하는 기능을 추가하여 넣자.

  • Uboot 의 CONFIG_BOOTCOMMAND (bootcmd ) 
Uboot에서 bootcmd 설정

$ vi /include/configs/smdk4412.h  //EXYNOS의 UBOOT bootcmd 설정 
#if defined(CONFIG_HKDK4412) && defined(CONFIG_EXYNOS_PRIME)
    #define CONFIG_BOOTCOMMAND  \
        " mmc rescan 0:1; mmc rescan 0:2; "     \
        " if run loadbootscript_1; "            \
        "    then run bootscript; "             \
        " else "                                \
        "    if run loadbootscript_2; "         \
        "        then run bootscript; "         \
        "    else "                             \
        "        run default_bootcmd; "         \
        "    fi ;"                              \
        " fi ; "                                
   ...


  • Uboot 기본환경설정 
상위의 CONFIG_BOOTCOMMAND 와 Uboot의 전체 기본 환경설정값

$ vi ./include/env_default.h // UBOOT 환경설정 값 
const unsigned char default_environment[] = {
#endif
#if defined(CONFIG_HKDK4412) && defined(CONFIG_EXYNOS_PRIME)
    "bootscript=source 40008000\0"
    "default_bootcmd=echo >>> Run Default Bootcmd <<<;movi read kernel 0 40008000;movi read rootfs 0 41000000 100000;bootm 40008000 41000000\0"
    "loadbootscript_1=echo >>> Load Boot Script from mmc 0:1 <<<;fatload mmc 0:1 40008000 boot.scr\0"
    "loadbootscript_2=echo >>> Load Boot Script from mmc 0:2 <<<;fatload mmc 0:2 40008000 boot.scr\0"
    "usb_invert_clken=0\0"
#endif
...
#ifdef  CONFIG_BOOTCOMMAND
        "bootcmd="      CONFIG_BOOTCOMMAND              "\0"
#endif


  • Serial에서 Uboot 환경설정확인 

Exynos4412 # pri
baudrate=115200
bootargs=fb_x_res=1280 fb_y_res=720 hdmi_phy_res=720 
bootcmd= mmc rescan 0:1; mmc rescan 0:2;  if run loadbootscript_1;     then run bootscript;  else     if run loadbootscript_2;         then run bootscript;     else         run default_bootcmd;     fi ; fi ; 
bootdelay=5
bootscript=source 40008000
default_bootcmd=echo >>> Run Default Bootcmd <<<;movi read kernel 0 40008000;movi read rootfs 0 41000000 100000;bootm 40008000 41000000
ethact=usb_ether
loadbootscript_1=echo >>> Load Boot Script from mmc 0:1 <<<;fatload mmc 0:1 40008000 boot.scr
loadbootscript_2=echo >>> Load Boot Script from mmc 0:2 <<<;fatload mmc 0:2 40008000 boot.scr
preboot=setenv stdin serial,nc
stderr=serial
stdin=serial
stdout=serial
usb_invert_clken=0
usbethaddr=DE:AD:BE:EF:00:03

관련참고
  http://elinux.org/ECE597_boot.scr   ( OMAP 기준 설명)
  http://forum.odroid.com/viewtopic.php?f=52&t=1104
  https://wiki.linaro.org/Resources/HowTo/boot.scr


2. Android Image 

ODROID에서 제공하는 Android Image들은 크게 아래와 같이 3 종류인 것 같으며, 각 설정에 변경이 되는 것 같다.

Download  Site 
  http://dn.odroid.com/4412/Android/


2.1 ODROID-X2의 Android Image 종류

  1. emmc_self_installer.zip   : Image를 emmc에  굽고, emmc에 모든것이 설치됨.
  2. sd2emmc_installer.zip    :  Image를 SD카드에 굽고, emmc에 모든것이 설치됨.
  3. sd_self_installer.zip        : Image를 SD카드에 굽고  SD카드에 모든것이 설치됨.
위 설정은 boot.scr의 아래 값에 의해 결정

#setenv device   "0"
#setenv ToSDMMC  "0"

2.2 ODROID-X2의 Android Image 구조 


  • Download Image
   sd_self_installer.img


  • sd_self_installer.img의 구성 
  1.  0~100M:  BL1,BL2, UBOOT 있을 거라고 생각 
  2.  FAT:  FAT Partion만 존재.



$ fdisk -l /media/sf_SHARED/images/sd_self_installer.img 

Disk /media/sf_SHARED/images/sd_self_installer.img: 524 MB, 524288000 bytes
189 heads, 61 sectors/track, 88 cylinders, total 1024000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00008403

                                        Device Boot      Start         End      Blocks   Id  System
/media/sf_SHARED/images/sd_self_installer.img1          204800     1023999      409600    b  W95 FAT32 

// 204800 x 512 = 104857600  100M 부터설정,  
// Blocks: 1k단위로 되는 것 같고, Start,End 512 byte 단위로 되는 것 같다 

  • /media/sf_SHARED/images/sd_self_installer.img1
// offset  104857600= 204800 x 512 bytes
$ sudo mount -o loop,offset=104857600 /media/sf_SHARED/images/sd_self_installer.img ./tmp1
or 
$ sudo mount -o loop,offset=$((512 * 204800)) /media/sf_SHARED/images/sd_self_installer.img ./tmp1

$ ls ./tmp1
bl1.bin   cache_aa   system_ac system_af  system_ai  system_al  system_ao  system_ar  tzsw.bin     userdata_ab
bl2.bin   system_aa  system_ad system_ag  system_aj  system_am  system_ap  system_as  u-boot.bin   userdata_ac
boot.scr  system_ab  system_ae system_ah  system_ak  system_an  system_aq  system_at  userdata_aa  zImage

한번 install이 되면, 그 이후에 아래의 구조가 존재하지 않는다.
Fastboot에 의해 Android 를 SD Write를 한다.


2.3 boot.scr (android)  분석 
Uboot의 boot.txt  아래의 command를 나열하고 mkimage로 header를 붙혀주면된다.

 //앞부분, Image 정보부분이라서 깨짐
# BootScript for Odroid (2013/01/28)
#
#
# Boot.scr make script
#
# mkimage -A arm -T script -C none -n "Boot.scr for odroid" -d ./boot.ini ./boot.scr
#

# EMMC Self Update
#setenv device   "0"
#setenv ToSDMMC  "0"

# SD/MMC Self Update
setenv device   "0"
setenv ToSDMMC  "1"

# EMMC Update from SD/EMMC
#setenv device   "1"
#setenv ToSDMMC  "0"

# SD/MMC Update from EMMC
#setenv device   "1"
#setenv ToSDMMC  "1"

setenv check_oldboot "check_value 1"
setenv check_device_sd "check_value ${ToSDMMC}";
setenv check_device "check_value ${device}";
setenv mmc64gb_check "check_64gb ${device}"

if run check_oldboot;then echo >> new-bootloader <<; else echo >> old-bootloader <<; reset; fi;

#------------------------------------------------------------------------------------------------------
# UBOOT ENV Erase
#------------------------------------------------------------------------------------------------------
mmc write 0 40008000 0x4CF 0x20

fatload mmc 0:1 41000000 zImage;movi w k ${device} 41000000;

fatload mmc 0:1 44000000 system_aa;
fatload mmc 0:1 45000000 system_ab;
fatload mmc 0:1 46000000 system_ac;
fatload mmc 0:1 47000000 system_ad;
fatload mmc 0:1 48000000 system_ae;
fatload mmc 0:1 49000000 system_af;
fatload mmc 0:1 4A000000 system_ag;
fatload mmc 0:1 4B000000 system_ah;
fatload mmc 0:1 4C000000 system_ai;
fatload mmc 0:1 4D000000 system_aj;
fatload mmc 0:1 4E000000 system_ak;
fatload mmc 0:1 4F000000 system_al;
fatload mmc 0:1 50000000 system_am;
fatload mmc 0:1 51000000 system_an;
fatload mmc 0:1 52000000 system_ao;
fatload mmc 0:1 53000000 system_ap;
fatload mmc 0:1 54000000 system_aq;
fatload mmc 0:1 55000000 system_ar;
fatload mmc 0:1 56000000 system_as;
fatload mmc 0:1 57000000 system_at;

fatload mmc 0:1 58000000 userdata_aa;
fatload mmc 0:1 59000000 userdata_ab;
fatload mmc 0:1 5A000000 userdata_ac;

fatload mmc 0:1 41000000 cache_aa;

fdisk -c ${device}

fastboot flash system 44000000 0 ${device};

fastboot flash userdata 58000000 0 ${device};

fastboot flash cache 41000000 0 ${device};

fatformat mmc ${device}:1;

if run check_device; then fastboot poweroff; else reset; fi;


3. Ubuntu Image

  https://wiki.odroid.com/old_product/odroid-x_u_q/odroid_u3/u3_partition_table
  • Download Site
  http://dn.odroid.com/Ubuntu_X2/
  http://odroid.in/ubuntu_14.04lts/old_images/
  http://odroid.in/ubuntu_14.04lts/


  • Download Image
   odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img


3.1 Ubuntu Image 구조 


  • Download Image
   odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img

  • Image Partition 구성 
  1. 0~2048K: BL1,BL2,UBOOT 있을 거라고 예상
  2. FAT32:   FAT가 2048K부터 구성,(약 2Mbyte)
  3. Linux :   Linux 기본 Partion


  • Partition으로 구성확인방법 

fdisk -l  xxxx.img //512 Byte 기준표시
parted -s xxxx.img unit B print // Byte 기준표시 


$ fdisk -l  odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img

Disk odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img: 5904 MB, 5904530944 bytes
255 heads, 63 sectors/track, 717 cylinders, total 11532287 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000c4046

                                                       Device Boot      Start         End      Blocks   Id  System
odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img1            4096      266239      131072    b  W95 FAT32
odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img2          266240    11532287     5633024   83  Linux


parted -s xxxxx unit B print  사용가능 (Byte 기준표시)

$ sudo parted -s /media/sf_SHARED/odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img unit B print

  http://odroid.us/mediawiki/index.php?title=Updating_from_Root_File_System_Images


B. FAT32 Partition 정보확인

Booting에 필요한 주요파일로 구성되어 있으며, 간단히 구성을 보면 다음과 같다.
  1. board.dtb  // Device Tree Binary 
  2. boot.scr  // Uboot Script 
  3. boot.ini   // Uboot Env 설정 File 
  4. zImage,uImage   // Kernel Image
  5. uInitrd       // RAM Disk Image


$ mkdir tmp1 tmp2
                     // offset  2097152  = 4096 x 512 bytes
$ sudo mount -o loop,offset=2097152   /media/sf_SHARED/odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img ./tmp1
or
$ sudo mount -o loop,offset=$((512*4096)) /media/sf_SHARED/odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img ./tmp1

$ ls ./tmp1
board.dtb  boot  boot-hdmi1080.scr  boot-hdmi1080.txt  boot-hdmi720.scr  boot-hdmi720.txt  boot.ini  boot.scr  boot.txt  uImage  uInitrd  zImage

C. Linux Partition 정보확인

Mount 되는 Linux Fliesystem 정보로 Host Linux에서 확인을 해보자.

                     // offset  136314880 = 266240 x 512 bytes 
$ sudo mount -o loop,offset=136314880   /media/sf_SHARED/odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img ./tmp2
or
$ sudo mount -o loop,offset=$((512*266240)) /media/sf_SHARED/odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img ./tmp2
$ ls ./tmp2
bin  boot  dev etc  home  initrd.img  lib  lost+found media  mnt  opt  proc  root  run  sbin selinux  srv  sys  tmp usr  var  vmlinuz




4. Uboot script 


4.1 boot.scr  (ubuntu) 

ubuntu boot.scr  설치가 아닌  boot 이며,아래와 같이 기본 설정을 해준다.

setenv initrd_high "0xffffffff"
setenv fdt_high "0xffffffff"
setenv fb_x_res "1280"
setenv fb_y_res "720"
setenv hdmi_phy_res "720"
setenv bootcmd "fatload mmc 0:1 0x40008000 zImage; fatload mmc 0:1 0x42000000 uInitrd; bootm 0x40008000 0x42000000"
setenv bootargs "console=tty1 console=ttySAC1,115200n8 fb_x_res=${fb_x_res} fb_y_res=${fb_y_res} hdmi_phy_res=${hdmi_phy_res} root=UUID=e139ce78-9841-40fe-8823-96a304a09859 rootwait ro mem=2047M"
boot


4.2 boot.scr (dnw 적용) 

setenv initrd_high "0xffffffff"
setenv fdt_high "0xffffffff"
setenv bootcmd "dnw  0xc0008000; fatload mmc 0:1 0x42000000 uInitrd; bootm 0xc0008000 0x42000000"
setenv bootargs "console=tty1 console=ttySAC1,115200n8 root=UUID=e139ce78-9841-40fe-8823-96a304a09859 rootwait ro mem=1023M"
boot


4.3 boot.scr (printenv)
 

baudrate=115200
bootargs=fb_x_res=1280 fb_y_res=720 hdmi_phy_res=720 
bootcmd= mmc rescan 0:1; mmc rescan 0:2;  if run loadbootscript_1;     then run bootscript;  else     if run loadbootscript_2;         then run bootscript;     else         run default_bootcmd;     fi ; fi ; 
bootdelay=1
bootscript=source 40008000
default_bootcmd=echo >>> Run Default Bootcmd <<<;movi read kernel 0 40008000;movi read rootfs 0 41000000 100000;bootm 40008000 41000000
ethaddr=00:40:5c:26:0a:5b
gatewayip=192.168.0.1
ipaddr=192.168.0.20
loadbootscript_1=echo >>> Load Boot Script from mmc 0:1 <<<;fatload mmc 0:1 40008000 boot.scr
loadbootscript_2=echo >>> Load Boot Script from mmc 0:2 <<<;fatload mmc 0:2 40008000 boot.scr
netmask=255.255.255.0
serverip=192.168.0.10


5. mkimage 의 Image header 제거 

mkimage를 사용할 경우 헤더가  64byte 가 사용이 되며, 이는  boot시 사용이 된다. 그리고, 이와 같은 이미지가 필요 없을 경우 아래와 같이 제거 한다.
mkimage를 사용하는 것은 ramdisk, kernel image, boot.scr이 있다.

dd if=image of=recovered file bs=64 skip=1

RAMDISK의 경우 아래와 같이 mkimage를 제거하고, 압축을 풀고 카피한 다음 분석가능

gunzip initrd.gz
mkdir init
cd init
cpio -i < ../initrd


  https://wiki.linaro.org/MichaelHope/Sandbox/DebuggingOnInitrd