file : (TOPDIR)/cpu/s5pc11x/start.S

⊙ ARM process의 power on(reset)후 actions

.....



⊙ ENTRY POINT (_start)
Supervisor mode,arm state,pc 값이 0x0이므로 Linker script file의 entry point에서 선언된 ‘_start’부터 프로그램 코드가 실행된다.

.globl _start              @ flash start
_start: b   reset         @ offset jump이므로 dram으로 이동하지 않는다.
    ldr pc, _undefined_instruction
    ldr pc, _software_interrupt
    ldr pc, _prefetch_abort
    ldr pc, _data_abort
    ldr pc, _not_used
    ldr pc, _irq
    ldr pc, _fiq

.global _start
Linker에게 ‘_start’ symbol 처리할 수 있도록 export한다.

_start의 첫번째 instruction은 ‘b reset’이므로 reset 함수로 branch하여
reset으로 제어가 옮겨진다.

나머지는 ARM에서 발생할 수 있는 exception으로 상황에 대한 처리 routine들로 exception이 발생하면 해당하는 핸들러로 branch할 것이다.
 _undefined_instruction
 _software_interrupt
 _prefetch_abort
 _data_abort
 _not_used
 _irq
 _fiq


⊙ reset :
[1] mode setting 및 interrupt disable

/*
 * the actual reset code
 */

reset:
    /*  
     * set the cpu to SVC32 mode and IRQ & FIQ disable
     */  
    @;mrs   r0,cpsr          @ cpsr값을 r0레지스터로 옮긴다.
    @;bic   r0,r0,#0x1f       @ Mode bit을 clear한다.
    @;orr   r0,r0,#0xd3       @ interrupt 을 disable,supervisor mode
    @;msr   cpsr,r0           @ r0값으로 cpsr값을 바꾼다.
    msr cpsr_c, #0xd3       @ I & F disable, Mode: 0x13 - SVC


cpu_init_crit
중요한 registers 및 memory timing 등을 setup한다.

cpu_init_crit:

#ifndef CONFIG_EVT1
#if 0  
    bl  v7_flush_dcache_all
#else
    bl  disable_l2cache

    mov r0, #0x0    @
    mov r1, #0x0    @ i
    mov r3, #0x0
    mov r4, #0x0
lp1:
    mov r2, #0x0    @ j
lp2:
    mov r3, r1, LSL #29     @ r3 = r1(i) <<29
    mov r4, r2, LSL #6      @ r4 = r2(j) <<6
    orr r4, r4, #0x2        @ r3 = (i<<29)|(j<<6)|(1<<1)
    orr r3, r3, r4
    mov r0, r3          @ r0 = r3
    bl  CoInvalidateDCacheIndex
    add r2, #0x1        @ r2(j)++
    cmp r2, #1024       @ r2 < 1024
    bne lp2         @ jump to lp2
    add r1, #0x1        @ r1(i)++
    cmp r1, #8          @ r1(i) < 8
    bne lp1         @ jump to lp1

    bl  set_l2cache_auxctrl

    bl  enable_l2cache
#endif
#endif

    bl  disable_l2cache

    bl  set_l2cache_auxctrl_cycle

    bl  enable_l2cache

       /*
        * Invalidate L1 I/D
        */
        mov r0, #0                  @ set up for MCR
        mcr p15, 0, r0, c8, c7, 0   @ invalidate TLBs
        mcr p15, 0, r0, c7, c5, 0   @ invalidate icache

       /*
        * disable MMU stuff and caches
        */
        mrc p15, 0, r0, c1, c0, 0
        bic r0, r0, #0x00002000     @ clear bits 13 (--V-)
        bic r0, r0, #0x00000007     @ clear bits 2:0 (-CAM)
        orr r0, r0, #0x00000002     @ set bit 1 (--A-) Align
        orr r0, r0, #0x00000800     @ set bit 12 (Z---) BTB
        mcr     p15, 0, r0, c1, c0, 0


        /* Read booting information */
        ldr r0, =PRO_ID_BASE
        ldr r1, [r0,#OMR_OFFSET]

        bic r2, r1, #0xffffffc1

#ifdef CONFIG_VOGUES
    /* PS_HOLD(GPH0_0) set to output high */
    ldr r0, =ELFIN_GPIO_BASE
    ldr r1, =0x00000001
    str r1, [r0, #GPH0CON_OFFSET]

    ldr r1, =0x5500
    str r1, [r0, #GPH0PUD_OFFSET]

    ldr r1, =0x01
    str r1, [r0, #GPH0DAT_OFFSET]
#endif

Posted by eoseontaek

File : (TOPDIR)/board/samsung/mango210/u-boot.lds

LD(loader & Linker)의 input으로 주어져서, object 파일을 생성하는데 규칙을 제공한다.

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);
    .text      :
    {
      cpu/s5pc11x/start.o   (.text)
      cpu/s5pc11x/s5pc110/cpu_init.o    (.text)
      board/samsung/mango210/lowlevel_init.o    (.text)
          cpu/s5pc11x/nand_cp.o (.text)
          cpu/s5pc11x/movi.o (.text)
          common/secure.o (.text)
      common/ace_sha1.o (.text)
      *(.text)
    }

    . = ALIGN(4);
    .rodata : { *(.rodata) }

    . = ALIGN(4);
    .data : { *(.data) }

    . = ALIGN(4);
    .got : { *(.got) }

    __u_boot_cmd_start = .;
    .u_boot_cmd : { *(.u_boot_cmd) }
    __u_boot_cmd_end = .;

    . = ALIGN(4);
    .mmudata : { *(.mmudata) }

    . = ALIGN(4);
    __bss_start = .;
    .bss : { *(.bss) }
    _end = .;
}



⊙ OUTPUT_FORMAT은 ELF32의 little endian으로 코드를 생성

⊙ OUTPUT_ARCH는 binary를 실행 할 수 있는 CPU architecture를 ARM으로 사용

⊙ ENTRY point은 프로그램의 시작을 가리키며, 시작되는 함수의 이름은 "_start"이다.

⊙ SECTIONS를 보면 text, rodata, data, got, mmudata, bss라는 section들이 정의되어 있다.
        .text  :  실행할 프로그램 코드 영역
        .rodata  :  read-only data 영역 (const 등으로 지정된 데이터)
        .data  :  initialized data 영역
        .got  :  global offset table 영역
        .mmudata  :  MMU data 영역
        .bss  :  uninitialized data 영역

⊙ 특수한 링커 변수 dot `.' 는 항상 현재 출력 address point을 담고 있다.
         address point 는 출력 섹션의 크기만큼 증가한다.

⊙ `*'는 어떤 파일명에도 대응한다. `*(.text)'는 모든 입력파일의 모든 입력 섹션 `.text'을 의미한다.

⊙ 프로그램 코드는 0x00000000에서 시작해서 4byte단위로 정렬된 text section에 놓여질 것이다.

⊙ U-boot의 시작은 Entry point에 선언된 _start부터 시작된다.

⊙ _start는 (TOPDIR)/cpu/s5pc11x/start.S에 정의되어 있다.

⊙ TEXT_BASE에의해 Linker수행 시 symbol들은 상대적 주소를 갖는다.

⊙ Power가 on 한 후 0x00번지(즉,flash)에서 시작하여 memory초기화를 거쳐 flash의 내용을 dram에 relocate
    하면 비로써 dram 에서 동작 하게 된다.

⊙ Symbol들은 모두 TEXT_BASE의 상대적 주소 값을 가지고 있으므로, dram에 relocate전에는 offset branch
    명령만 사용 해야 한다.(B,BL,ADR)

Posted by eoseontaek
Bootloader에서 handling하는 hardware list

core에 의존적인 것들
    Processor mode
    Interrupt
    Cache, MMU

SOC에 의존적인 것들
    Interrupt, Watchdog
    Clock
    Memory interface(dram controller)
    Timer
    UART
    RTC

외부장치
    Flash
    Nand Flash
    Ethernet controller
    RTC
    LCD Contoller
    Keyboard controller

'[C-06] S5PV210' 카테고리의 다른 글

[mango210] start.S의 분석  (0) 2011.03.17
[mango210] u-boot.lds 분석  (0) 2011.03.17
[mango210] u-boot 디렉토리 구조  (0) 2011.03.16
[mango210] ARM Architecture Reference Manual  (0) 2011.03.10
[mango210] S5PV210 Booting Sequence  (0) 2011.01.14
Posted by eoseontaek
u-boot 1.3.4 
                   
                   board           .board에 의존적인 파일

                   common      .architecture에 독립적인 파일

                   cpu             .architecture에 독립적인 파일

                   disk            .code for disk drive partition handling

                   doc            .u-boot 관련 문서

                   driver          .외부 장치의 driver파일

                   examples    .u-boot을 위한 test 실행 파일

                   fs                .uboot에서 지원하는 file system관련 파일

                   include        .header file

                   lib_arm        .arm architecture관련 라이브러리 파일

                   net              .network 관련 파일

                   post            .Power On Self Test

                   tools           .Tools to build S-Record or U-Boot images, etc.       
                  


Posted by eoseontaek

ARM and Thumb-2 Instruction Set Quick Reference Card (Korean) v4.0
http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001mk/QRC0001_UAL.pdf

ARM and Thumb-2 Instruction Set Quick Reference Card
http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001m/QRC0001_UAL.pdf

ARM 아키텍처 참조 문서 ARMv7-A 및 ARMv7-R 버전
http://infocenter.arm.com/help/index.jsp

Posted by eoseontaek

6.1 OVERVIEW OF BOOTING SEQUENCE

  S5PV210은 내부 메모리로 64KB ROM96KB SRAM을 가지고 있다. 이 두 영역은 booting을 위해 사용된다.
S5PV210은 secure booting을 enable하기 위해 내부 ROM으로부터 boot한다.  이것은 인증되지 않은 user가 이미지를 변경할 수 없게 한다. secure booting과 normal booting을 선택하기 위해,  S5PV210은 e-fuse 정보를 사용해야한다. 이 정보는 program된 후 변경될 수 없다.

Booting device

• General NAND Flash memory
• OneNAND memory
• SD/ MMC memory (such as MoviNAND and iNAND)
• eMMC memory
• eSSD memory
• UART and USB devices

system reset시, program counter는 내부 ROM 영역에서 iROM code로 부터 시작한다. 그러나 system reset은 booting time이나 또는 low power mode에서 wakeup할 때, assert될수 있다. 따라서 iROM code는 reset status로부터 적절한 process를 execute해야만 한다.

bootloader는 크게 iROM, 1st BL, 2nd BL로 구성된다.

• iROM code : small and simple code로 구성됨. platform-independent, 내부 메모리에 저장됨.
• First boot loader :  small and simple code로 구성됨. platform-independent, 외부 메모리 device에 저장, 
                              secure booting과 관련됨.
• Second boot loader: 복잡한 code로 구성됨, platform-specific, 외부 메모리 device에 저장됨.

secure booting 선택시, iROM code와 1st BL은 loaded image를 verify하기 위해 integrity checking function를 제공한다. secure boot key는 160 e-fuse bit로 되어 있으며 iROM의 integrity check전에 loaded pulict key를 인증하는데 사용된다.



• iROM code는 internal 64KB ROM에 위치한다.
   clock, stack, heap와 같은 기본적인 system function을 초기화한다.
• iROM은 명시한 booting device로부터 1st BL image를 internal 96KB SRAM으로 load한다.
   booting device는 OM(Operation Mode) pins에의해 선택된다. 
   secure boot key values에 따라 iROM code는 1st BL image에서 integrity check 작업을 수행할 수도 있다.
• 1st BL은 2nd BL를 load하고 secure boot key values에 따라 2nd BL의 integrity를 check할 수도 있다.
• 2nd BL은 system clock, UART, DRAM controller를 초기화한다.
   DRAM controller를 초기화한 후에, booting device로부터 OS image를 load한다.
   secure boot key values에 따라 2nd BL은 OS image에서 integrity check를 수행할 있다.
• 부팅이 완료된 후에, 2nd BL은 operationg system으로 jump한다.

iROM code는 booting device를 찾기위해 OM pin을 읽는다. OM 레지스터는 booting에 필요한 OM pin과 다른 정보등을 제공한다.

OM pin은 OneNAND, NAND, MoviNAND, eSSD and iNAND와 같은 booting device를 결정한다. bit width, wait cycles, page sizes, and ECC modes 같은 option들도 결정한다.

BL0 : internal 64KB ROM에  위치한 iROM code
BL1 : first boot loader


6.2 SCENARIO DESCRIPTION

6.2.1 RESET STATUS

hardware reset, watchdog reset, software reset, and wake up from power down modes과 같은 다양한 system reset 시나리오가 있다.


hardware reset and watchdog reset 시에, system은 1st, 2nd boot loader, OS image를 가지고 full boot를 해야 한다. 새로운 reset status는 reset group0로서 분류된다.

DRAM 메모리의 내용이 SLEEP mode에서 보존되었다면 DRAM으로 OS image를 loading할 필요가 없다. SoC internal power가 SLEEP mode돋안 내부 logic에 공급되지 않기때문에 내부 SRAM의 내용은 보존되지 않는다.
그러므로 first boot loader and the second boot loader는 다시 load되야 한다. reset status는 reset group1로서 분류된다.

software reset시에 boot loader의 loading은 실행된다. top block’s power가 DEEP_STOP and DEEP_IDLE modes에서 gate되었다었더라도 내부 SRAM은 reserved될 수 있다.  그래서 boot loader의 reloading은 필요없다. DEEP_STOP and DEEP_IDLE modes에서 SRAM의 non-retention의 경우 1st boot loader는 다시 load되야만 한다. DEEP_STOP and DEEP_IDLE statuses에서 wake up하는 software reset은 reset group2로 분류된다.

system이 모두 power down mode로 들어간다면, 현재 system status은 DRAM과 같은 safe memory region에 저장되어야 한다. 그래서 system은 power down mode로부터 wake up 후에 seamlessly하게 processing을 계속해야 한다.

마지막으로 이전 상태 함수를 복구하는 것은 SLEEP, DEEP_STOP, and DEEP_IDLE modes에서 필요하다.


6.2.2 BOOTING SEQUENCE EXAMPLE

Program code는 iROM에서 시작해서 iRAM으로 이동하고, 마지막으로 DRAM에서 program을 실행한다.


booting sequence in internal ROM

1. Disable the watchdog timer.

2. Initialize the instruction cache controller.

3. Initialize the stack and heap region.

4. Check secure key.

5. Set Clock divider, lock time, PLL (MPS value), and source clock.

6. Check OM pin and load the first boot loader (The size of boot loader depends on S/W) from specific 
    device (block number 0) to iRAM.

7. If secure booting is successful, execute integrity check

8. If integrity check passes, then jump to the first boot loader in iRAM (0xD002_0010)


booting sequence in internal SRAM

1. Load the second boot loader from boot device to iRAM.

2. If secure booting is successful, execute integrity check.

3. If integrity check passes, then jump to the second boot loader in iRAM (The jumping address depends
    on user's software)

4. If integrity check fails, then stop the first boot loader.

5. The second boot loader Initializes the DRAM controller.

6. Load the OS image from specific device (block number 1) to DRAM.

7. Jump to OS code in DRAM (0x2000_0000 or 0x4000_0000)


booting sequence in DRAM

1. If S5PV210 is powered on from SLEEP, DEEP_STOP, or DEEP_IDLE modes, then restore the previous
    state.

2. Jump to OS code.


6.2.3 FIXED PLL AND CLOCK SETTING

1st boot loader의 operation speed를 up하기 위해, 1st boot loader는 수정된 PLL 값으로 초기화 한다. 수정된 PLL 설정은 :

• APLL: M=200, P=6, S=1 FOUT = (MDIV X FIN )/ (PDIV X 2(SDIV-1))) = 800MHz
• MPLL: M=667, P=12, S=1 FOUT = (MDIV X FIN) / (PDIV X 2SDIV) = 667MHz
• EPLL: M=80, P=3, S=3, K=0 FOUT = ((MDIV+KDIV) X FIN) / (PDIV X 2SDIV) = 80MHz



6.2.4 OM PIN CONFIGURATION




6.2.5 SECURE BOOTING

security system의 기본적인 표준은 "‘root of trust’는 하드웨어가 되어야만 하고 'validate'하기 위해 소프트웨어 시스템을 요청할 수 없다"는 것이다.

S5PV210에서, root of trust는 내부 ROM에서 iROM code에 의해 동작된다. 그러므로 인증되 않은 user에 의해 modify될수 없다. 하드웨어 디자인은 iROM code integrity를 증명한다. 다시 말해 first boot
loader, the second boot loader and OS images는 외부 메모리 디바이스에 저장된다. 그러므로 iROM code는 1st boot loader의 integrity를 verify해야만 하고, 1st boot loader에서 integrity check가 pass되면, 1st boot loader는 trust region에 포함된다. 다음에 1st boot loader는 2nd boot loader의 integrity를 check하고, 2nd boot loader는  OS image의 integrity를 verify 한다.

secure booting sequence는 다음과 같다.

iROM code는

1. Checks the integrity of RSA public key using E-fuse RSA key hash value.

2. Loads the first boot loader to iRAM.

3. Checks the integrity of first boot loader using trusted RSA public key.


first boot loader는

1. Loads security software to iRAM.

2. Checks the integrity of software using trusted RSA public key.

3. Loads second boot loader to iRAM.

4. Checks the integrity of second boot loader using trusted RSA public key.


second boot loader는

1. Loads security software to iRAM.

2. Checks the integrity of software using trusted RSA public key.

3. Loads OS kernel and applications to DRAM.

4. Checks the integrity of OS kernel and application using trusted RSA public key











Posted by eoseontaek
/

arch
리눅스가 지원하는 Architecture에 의존적인 코드가 위치한 폴더
mango210의 경우 arch/arm/mach-s5pv210 디렉토리 참조

include
커널의 header file이 위치한 폴더.

init
하드웨어 독립적으로 커널이 초기화되고 실질적으로 커널이 시작되는 부분이다. main.c 파일은 커널 초기화하고 시작하는데 사용되고 version.c 파일은 커널의 버전을 기술하는데 사용된다.

kernel
프로세스 관리를 기본으로 하여 운영체제 커널의 기본적인 핵심코어가 위치한다.

mm
가상메모리 관리 루틴이 위치하는 곳으로 Architecture 독립적으로 구현되어 있다.

ipc
세마포어 그리고 내부 프로세스 통신을 위한 공유메모리, 메시지 전달을 지원하는 루틴이 위치한 폴더

fs
파일시스템 관련 파일이 위치한다. /fs 루트에는 VFS 관련 파일이 있고 각 하위 폴더에는 각각의 파일시스템이 구현되어 있다.

net
네트워킹 관련 모듈이 위치하며 지원하는 프로토콜 중 대표적인 것으로는 TCP/IP(IPv4), IPv6, IPX, Netlink 등이 있다.

drivers
하드웨어 디바이스 드라이버가 위치하는 곳으로 Char, Block 등으로 하드웨어를 분류해 종류별로 각 제품별 디바이스가 위치한다.

lib
커널이 사용하는 라이브러리가 위치한 폴더

script
커널 컴파일 및 인스톨 관련 스크립트가 위치한 폴더

Documentation
커널 관련 문서가 위치한 폴더로 소스 코드의 수정사항에 대한 기술문이 주를 이룬다.




Posted by eoseontaek

1. Download the Kernel source code from the mango site

2. Extract the code from mango210_kernel_src_2010_11_22.tgz tar ball
[host]$ tar -xvzf mango210_kernel_src_2010_11_22.tgz

3. Configure the mango210 board.
[host]$ source setup.sh

4. Run make

'[C-06] S5PV210' 카테고리의 다른 글

[mango210] S5PV210 Booting Sequence  (0) 2011.01.14
[mango210] 커널소스 기본 트리구조  (0) 2011.01.14
[mango210] Compile and configure U-boot  (0) 2010.12.17
[mango210] Board configuration  (0) 2010.12.17
[mango210] mango server  (0) 2010.12.17
Posted by eoseontaek
1. Download the u-boot source from the mango site

2. Extract the code from mango210-uboot-src-2010-11-22.tgz tar ball
[host]# tar -xvzf mango210-uboot-src-2010-11-22.tgz

3. mango210 board configuration
[host]$ source setup.sh

4. Run make to clean up the build environment
[host]$ make distclean

5. Run make to configure the build environment for mango210
[host]$ make mango210_config

6. Build the files u-boot and u-boo.bin
[host]$ make


출력 파일

u-boot : ELF format
u-boot.bin : binary format
u-boot.srec : S.recode format (motorola serial downloading image file)
u-boot.dis : dis-assembler 파일

dis-assembler 파일 생성 : 
[# make u-boot.dis









 
Posted by eoseontaek

mango210  source code build를 위한 board configuration

[host@]$ source setup.sh


setup.sh
#!/bin/sh

echo "mango210 configuration..."

export PATH=~/mango210/toolchain/arm-2009q3/bin:$PATH
export CROSS_COMPILE=arm-none-linux-gnueabi-

export JAVA_HOME=/usr/lib/jvm/jre-1.6.0-openjdk
export ANDROID_JAVA_HOME=$JAVA_HOME



Posted by eoseontaek
Posted by eoseontaek
Posted by eoseontaek

'[C-06] S5PV210' 카테고리의 다른 글

[mango210] mango server  (0) 2010.12.17
[mango210] Download source (2010-11-22 일자 )  (0) 2010.12.17
[mango210] sh: gperf: command not found  (0) 2010.12.16
[ODRIOD] Datasheet Link  (0) 2010.07.09
[ODROID] Modifying U-Boot  (0) 2010.07.05
Posted by eoseontaek

Trouble

froyo build 도중 다음과 같은 error 발생
sh: gperf: command not found
calling gperf failed: 32512 at ./makeprop.pl line 96.
make: *** [out/target/product/mango210/obj/STATIC_LIBRARIES/libwebcore_intermediates/WebCore/css/CSSPropertyNames.h] 오류 25
make: *** 파일 `out/target/product/mango210/obj/STATIC_LIBRARIES/libwebcore_intermediates/WebCore/css/CSSPropertyNames.h'을(를) 지웁니다
make: *** 끝나지 않은 작업을 기다리고 있습니다....
sh: gperf: command not found
calling gperf failed: 32512 at makevalues.pl line 89.
make: *** [out/target/product/mango210/obj/STATIC_LIBRARIES/libwebcore_intermediates/WebCore/css/CSSValueKeywords.h] 오류 25
make: *** 파일 `out/target/product/mango210/obj/STATIC_LIBRARIES/libwebcore_intermediates/WebCore/css/CSSValueKeywords.h'을(를) 지웁니다


Troubleshooting

gperf가 설치되지 않아서 발생하는 문제였다.
gperf를 yum으로 install해주었다.
[root@localhost steo]# rpm -qa | grep gperf
[root@localhost steo]# yum install gperf


Note
- 구차니님의 블로그 -
http://minimonk.tistory.com/category/Programming/android

- Android open source project -
http://source.android.com/source/download.html

Posted by eoseontaek
Posted by eoseontaek

~/ODROID/uboot/include/configs/hkdkc100.h  - Board configuration header file

~/ODROID/uboot/board/samsung/hkdkc100     -  Board-specific files
    config.mk             - Defines base address for U-Boot in memory
    hkdkc100.c           - Board specific initialization
    Makefile               -
    u-boot.lds            - Linker script
    lowlevel_init.S     - Memory/Soc configuratioin table

~/ODROID/uboot/cpu/s5pc1xx - CPU files
    config.mk    - CPU makd flags
    cpu.c    - CPU functions
    interrupts.c    - interrupt routines
    Makefile
    start.S    Main CPU entry point
    
~/ODROID/uboot/cpu/s5pc1xx/s5pc100 - SOC files
    Makefile
    cpu_init.S    - SoC specifi functions

~/ODROID/uboot/lib_arm - Architecture support files
    board.c    - Generic board initialization code
    cache.c
    bootm.c -  Code for booting arm linux kernel

~/ODROID/uboot/include/asm-arm  - Architecture headers






Posted by eoseontaek
이전버튼 1 이전버튼