34
CAANOO 시시시 시시 시 U-boot 시시 2010.11.10

Caanoo cofiguration and u boot

  • Upload
    jumiss

  • View
    1.289

  • Download
    10

Embed Size (px)

Citation preview

Page 1: Caanoo cofiguration and u boot

CAANOO 시스템 개요 및 U-boot 분석

2010.11.10

Page 2: Caanoo cofiguration and u boot

Table of contents

1. 개 요

2. CAANOO system block

3. 개발 환경 구축

4. CAANOO boot build 및 업데이트 방법

5. CAANOO BOOT

GPH

Page 3: Caanoo cofiguration and u boot

1. 개 요

GPH

이 문서는 CAANOO 게임기의 내부 블록 구조와 메인 CPU 의 몇 가지 중요한 장치를 분석 하여 카누 게임기로 임베디드 리눅스 시스템을 공부하고자 하는 사람들에게 코드분석 및 수정 시 도움을 주기 위한 문서이며 본 문서에서는 CAANOO 게임기의 부트 코드 (U-BOOT) 구조와 부팅 시퀀스를 기본적으로 다루는 문서 입니다 .

Page 4: Caanoo cofiguration and u boot

2. CAANOO system block

GPH

2.1 내부 블록 전체 구성도

TOUCH 24BIT TFT LCD

I2S NAND_C DRAM_C GPIO ADC I2C CPU LCD_ PIXEL CVBSPWM

SD/MMC CS0 USBD UART

DAC EAR JACK

SPEAKER

EEPROM

G-SENSOR

RTC

SD SOCKET 24PIN CON

USB HOST 2.0

USB HOST CON

ANALOGJOYSTICK

KEY

NAND128MB

SDRAM128MB

POWER DC-DC

BATTERY

POWERS/W

MOTOR DRV MOTOR

Page 5: Caanoo cofiguration and u boot

2. CAANOO system block

GPH

2.2 Clock Manager Block Diagram

2.2.1 POLLUX CPU Clock 기본 구조

System BUS Clock CPU Core Clock

POLLUX CPU 의 CLOCK Manager 블록은 기본적으로 2 개의 소스 Clock (PLL0,PLL1) 을 제공 하며 각각 CORE (FCLK), AHB BUS (HCLK), SYSTEM BUS CLOCK(BCLK) 의 소스 CLOCK 으로 사용 되며 위의 PCLK 은 SYSTEM BUS CLOCK 을 2 분주 한 값으로 CPU 가 디바이스의 레지스터를 access 하는데 필요한 PERIPHERAL BUS CLOCK 이다 .

Output Frequency Range PLL0: ~ 533MHZ PLL1: ~ 300MHZOutput MAX Frequency FCLK : 533 MHZ HCLK : 133MHZ BCLK : 133MHZ PCLK : 66.5MHZ* 자세한 CLOCK 레지스터 SETING 관련 내용은 POLLUX DATA BOOK CHAPTER 4 의 CLOCK AND POWER MANGEMENT 참고* PLL0, PLL1, PCLK 의 CLOCK 을 디바이스 CLOCK 사용 시 디바이스 마다 지원 되는 소스 CLOCK 이 다르므로 주의 바람

Page 6: Caanoo cofiguration and u boot

2. CAANOO system block

GPH

PLL0 (533MHZ)

PLL1 (266MHZ) CLKDIV 1/2

CORE CLOCK

CLKDIV 1/4

CLKDIV 1/2

2.2 .2 카누 Clock Core 및 Device clock

SOUND CLOCK (I2S)

SYSTEM BUS CLOCK (MEMORY / NAND / 3D / DMA)

AHB BUS CLOCK

DEVICE CLOCK ( UART / TIMER / LCD / SD / ETC)

DEVICE CLOCK ( ADC / I2C / ETC)

FCLK

BCLK

HCLK

PCLK

카누의 Clock 구조는 기본적으로 PLL1(SYSTEM BUS CLOCK 및 기타 디바이스 CLOCK 은 고정 ) 고정 시키고 CORE CLOCK으로 사용 되는 PLL0 는 게임이나 기타 다른 외부 프로그램에서 CLOCK 을 가변 시킬 수 있으며 (OVER CLOCK 을 지원 하기 위함 ) 이때 디바이스 CLOCK 중 유일하게 사운드 CLOCK 은 PLL0 에 물려 있다 . ( 사운드의 BIT RATE 설정 시 고정 되어 있는 PLL1 CLOCK값을 가지고는 정확한 BIT RATE 값을 설정 할 수 없기 때문 )

Page 7: Caanoo cofiguration and u boot

2. 카누 system block

GPH

2.3 메모리 구조 2.3.1 POLLUX CPU 메모리 기본 구조

NORMAL I/O

0xC000_0000

MCU-S(STATIC)

0x8000_0000

RESERVED

0x4000_0000

MCU-A(DDR)

0x0000_0000

SHADOW=1

NORMAL I/O

0xC000_0000

MCU-S(STATIC)

0x0000_0000

RESERVED

0x4000_0000

MCU-A(DDR)

0x8000_0000

SHADOW=0

RESERVED0xC000 0000 0x3000 0000 NAND0xAC00 0000 0x2C00 0000

STATIC90xA400 0000 0x2400 0000 ~ STATIC10x8400 0000 0x0400 0000 STATIC00x8000 0000 0x0000 0000

RESERVED0xA800 0000 0x2800 0000

POLLUX CPU 에서 기본 메모리 구조는 위의 그림과 같이 구성 되어 있으며 SHADOW 설정에 따라 0 번지가 바뀔 수 있다 . 만약 SHADOW 가 1 로 설정 되면 DDRAM 번지가 0 번지가 되며 SHADOW 0 이 되면 STATIC 메모리나 장치 들이 0 번지가 된다 . 일반적으로 NOR 번지가 0 번지로 설정 되므로 NAND 부팅이냐 NOR 부팅이냐를 기준으로 SHADOW 를 설정 하면 되며 외부 핀으로도 나와 있다 .

MCU-A BANK 지원 메모리 : DDR-SDRAM(8bit,16bit) 메모리 최대 지원 사이즈 : ~ 128MbyteMCU-S BANK Normal static memory (SRAM, ROM and FRAM) NAND Flash Controller

* 자세한 MEMORY SETING 관련 내용은 POLLUX DATA BOOK CHAPTER 7 의 MEMORY CONTROLLER 참고

Page 8: Caanoo cofiguration and u boot

2. CAANOO system block

GPH

2.3 .2 카누 PHYSICAL MEMORY MAP

3D BUFF (32MB)0x0800_0000 128MB

1) DDRAM MEMORY MAP (128MB)

YUV BUFF (8MB)0x0600_0000 96MB

SOUND BUFF (1MB)0x0580_0000 88MB

VIDEO BUFF (1MB)0x0570_0000 87MB

0x0000_0000SYSTEM MEMORY

APPLICATION MEMORY(86MB)

0x0560_0000 86MB

2) NAND FLASH MEMORY MAP (128MB)

0x0000_0000 0x000_40000 BOOT AREA (256KB) 256KB

0x0008_0000 BOOT ENV AREA (256KB) 512KB0x003C_0000 KERNEL1 AREA (3.25MB) 3.75MB0x0080_0000 KERNEL2 AREA (3.25MB) 8MB

MTD0

ROOT FILE1 (48MB)0x0380_0000 56MB

ROOT FILE2 (10MB)0x0420_0000 66MB

MTD1

RESTORE AREA (57MB)0x0570_0000 123MB

MTD2

MTD3

0x0080_0000 BAD TABLE (5MB) 128MB

카누는 NAND 부팅으로 되어 SHADOW=1 로 설정 되어 DRAM 0 번지가 시작 주소이다 . 물리적으로 128MB 를 사용 하며 앞쪽은 기본 HEAP 으로 사용 되고 뒤쪽 영역은 비디오 ( 프레임버퍼 ), 사운드 ,YUV( 동영상 ),3D 버퍼 식으로 고정 되어 있다 . NAND FALSH 메모리 구조는 그림 2) 와 같이 구성 (MTD0~MTD3) 되어 항목 4 카누 boot build 및 업데이트 방법에서 좀더 다루어 보기로 하겠다 .

Page 9: Caanoo cofiguration and u boot

2. CAANOO system block

GPH

2.4 비디오 구조 2.4.1 POLLUX 비디오 기본 구조

1) MLC 구조 2) DPC 구조

Page 10: Caanoo cofiguration and u boot

2. CAANOO system block

GPH

POLLUX CPU 에서 기본 비디오 출력 관련 구조는 위의 그림과 같이 크게 MLC 와 DPC 로 구성 되어 있다 . MLC 위의 그림 1 처럼 2 개의 Layer (Primary, Second Layer) 가 있으며 각각의 LAYER 는 2 개의 RGB Layer 1 개의 VIDEO LAYER 로 구성 되어 있다 . DPC 는 MLC 와 동일 하게 2 개의 SYNC Generator 구성 되어 있으며 그림 2 의 구성을 보듯이 Primary MLC Layer 와 Primary Sync Generator 는 연결 되어있으며 (Secondary Layer 동일 ) TV 출력은 Secondary Sync Generator 만 출력 할 수 있으며 이러한 구성은 LCD, TV 출력을 MCL 및 DPC 가 고정 될 수 밖에 없는 형태를 뛰게 된다 .

MLC Various pixel formats RGB layer : RGB/BGR 332, 444, 555, 565, 888 Video layer : 2D YUV 4:2:0 RGB layer can be user as 3D layers (RGB layer 0) Scale-up/down (Video layer only) Color control ( Video layer only) DPC Supports RGB, MRGB, ITU-R BT601 and ITU-R BT 656 Supports dual display Supports NTSC/ PAL TV (only Secondary Display) Supports Scale (Only Secondary Display) Supports RGB dithering

• MLC 블록의 RGB LAYER 는 SCALE 가 없으므로 비디오 전체 설계 시 주의 요망• 3D 블록과 MLC 연동 시 3D 연산 결과는 RGB0 Layer 만으로 놓여짐 설계 시 주의 요망• 자세한 VIDEO SETING 관련 내용은 POLLUX DATA BOOK CHAPTER 20 의 MULTI LAYERCONTROLLER 와 CHAPTER 21

DISPLAY CONTROLLER 참고

Page 11: Caanoo cofiguration and u boot

2. CAANOO system block

GPH

2.3 .2 카누 비디오 구조

RGB1(UI,APPS,2D GAME)

RGB0(only 3D game)

VIDEO

Primary Multi layer Controller

Primary DisplayController (LCD (RGB888))

동영상 플레이 , 3D+동영상

RGB1(UI,APPS,2D GAME)

RGB0

VIDEO

Secondary Multi layer Controller

Secondary DisplayController (TV(CVBS))

동영상 플레이3D BUFF (32MB)0x0800_0000

YUV BUFF (8MB)0x0600_0000

SOUND BUFF (1MB)0x0580_0000

VIDEO BUFF (1MB)0x0570_0000

카누의 비디오 설계의 기본 구조는 Primary (MLC+DPC) 는 LCD 로 설정 Secondary (MLC+DPC) TV OUT 모드로 설정 되어 있다 . Primary MLC (RGB0,1,VIDEO) 와 Secondary MLC (RGB0,1,VIDEO) 는 동일 한 메모리 어드레스가 MAPING 되어 있어 LCD, TV 동시 출력이 가능 하나 카누 TV OUT ENABLE 설정 시 LCD 를 OFF 한다 . 또한 3D 블록 연동 출력 시 3D 는 Primary SYNC 기준으로 출력 되어 TV 출력 시 (Secondary) 문제가 되어 3D 는 TV OUT 를 지원 하지 않게 구성 하였다

Page 12: Caanoo cofiguration and u boot

2. CAANOO system block

GPH

2.3 .3 실제 활용 예

1) ONLY RGB 1 Layer UI, ETC ….

2) RGB0 + Video layer MOVIE PLAYER

RGB0 LAYER

VIDEOLAYER

3) RGB0(3DBLOCK 연동 )+Video layer 3D GAMES

RGB0 LAYER

VIDEOLAYER RGB1 LAYER

카누 부팅 후 Menu 진입 시 비디오 상태는 single layer 상태로 Primary RGB1 LAYER 로 선택 된 상태 이며 거의 대부분은 이 상태로 유지 되며 그림 2) 와 그림 3) 동영상 및 3D 게임 시 Video layer 와 RGB0 Layer 를 사용 하게 된다 . TV OUT 선택 시 Primary (MLC+DPC) 는 Disable 되고 Secondary 영역이 enable 되며 layer 사용은 동일 하다 .

Page 13: Caanoo cofiguration and u boot

3. 개발 환경 구축

GPH

3.1 기본 개발 환경 3.1.1 개발 환경 구성도

개발자 보드

카누 게임단말기

24PIN SERIAL CABLE

PC 연결 시리얼 케이블

PC 연결 USB POWER CABLE

3.1 .2 개발 환경 구성 품 카누 단말기 개발자 보드 24PIN 연결 케이블 ( 카누 <=> 개발자 보드 ) 시리얼 케이블 ( 개발자 보드 <=> PC) POWER CABLE ( 개발자 보드 <=> PC) SD CARD 4GB CD

Page 14: Caanoo cofiguration and u boot

3. 개발 환경 구축

GPH

3.1.3 기본 부팅 모드 상태 3.1.3 개발자 SWITCH MODE

기능 SWITCH SWITCH 상태

POWER OFF J4 = 0 LOW

POWER ON J4 = 1 HIGH

UART BOOT J1 = 0 / J2 =0 / J3=1 J1 = LOW J2 = LOW J3 = HIGH

NAND BOOT J1 = 0 / J2 =1 / J3=1 J1 = LOW J2 = HIGHJ3 = HIGH

NOR BOOT( 지원 안됨 )

X X

개발자 보드 연결 시 switch 가 HIGH 도 LOW 도 아닌 상태 => NAND 부팅 모드 이며 단말기의 전원 스위치로 on/off 제어 가능 한 기본 상태 UART BOOT 모드 를 사용 할 경우 => boot 개발 시 boot 이미지 업데이트를 올린 후 제대로 부팅이 되지 않는 경우 가 발생 할 수 있다 이때 시리얼을 통해 강제로 boot 를 올릴 수 있는데 이때 사 용 하는 모드 이다 . ( 카누 강제 복구 .pdf 문서 참조 )

Page 15: Caanoo cofiguration and u boot

3. 개발 환경 구축

GPH

3.2 개발 소프트웨어 설치 3.2.1 Tool chain 설치

1) 제공 되는 CD 를 사용자 Linux Host PC 에 삽입 한다 .2)CD 를 MOUNT 후 압축 된 Tool chain 을 아래와 동일 하게 푼다 . $ mount /mnt/cdrom $ cd /mnt/cdrom/tools $ mkdir –p /opt/arm/ $ cp cross-eabi.tar.gz /opt/arm $ cd /opt/arm $ tar zxvf cross-eabi.tar.gz

3) ./bash_profile 아래 경로 추가 export PATH=/opt/arm/cross-eabi/bin:$PATH4) 설치된 Tool chain gcc version 확인

Page 16: Caanoo cofiguration and u boot

4. CAANOO boot build 및 업데이트 방법

GPH

4.1 boot build 방법

1) 제공 되는 CD 에서 부트 파일을 작업 경로에 복사 후 압축을 푼다 . $ cd /mnt/cdrom/src $ cp caanoo-u-boot.tar.gz <<user_directory>> $ cd <<user_directory>> $ tar zxvf caanoo-u-boot.tar.gz

2) 압축 푼 경로로 이동 후 build 한다 . $ cd caanoo-u-boot $ make clobber $ make n35_fast_config $ make clean && make dep && make

3) 현재 경로에 polluxb_n35 파일이 있으면 제대로 build 가 된 것이다 .

4.2 NAND Flash Memory 에 U-BOOT 업데이트 하기카누 부트 코드에는 SD 루트 영역 에서 boot 바이너리 파일을 (polluxb_n35) NAND Flash 부트 영역에 자동으로 업데이트

하는기능이 들어 있다 .

1) Flash boot 업데이트 영역 : 0x0000_0000 ~ 0x0004_0000 (max size : 256KB)2) 업데이트 방법 2-1) build 한 boot file polluxb_n35 파일을 SD CARD 루트에 복사 한다 . 2-2) SD CARD 를 카누에 삽입한다 . 2-3) 카누 단말기 상단에 R 버튼을 누른 후 단말기 전원을 켜면 LCD 에 업데이트 이미지가 나오고 자동으로 polluxb_n35 부트 파일을 FLASH 에 업데이트가 된다 . 2-4) LCD 화면에 업데이트 메시지가 사라지면 업데이트 가 완료 되었고 실제 부트가 제대로 업데이트가 이 되었는지를 확인 하려면 단말기 전원을 다시 켜야 한다 .

Page 17: Caanoo cofiguration and u boot

5. CAANOO boot

GPH

5.1 CAANOO 부트 디렉토리 구조

U-BOOT-1.1.6 board

ARM926EJS

common

cpu pollux prototype

disk

drivers

fs fat

n35

include asm-arm arch-pollux

lib_arm

tools

- CAANOO 단말기의 의존적인 파일

- POLLUX CPU 의존적인 파일 ( BSP 포함 )

- Disk drive 파티션

- 외부 장치 DRIVER (NAND)

- File system (FAT)

- architecture 독립적인 파일

- 헤더파일 & POLLUX 레지스터 설정비트 DE-FINE- arm architecture 관련 라이브러리 파일

- U-BOOT Image tools

5.2 CAANOO 부트에서 handling 하는 하드웨어 리스트 1) CORE 관련 : Processor mode, Cache, MMU 2) SOC 관련 : clock, memory , gpio 초기화 , TIMER, UART, VIDEO, PWM 3) 외부 장치 관련 : DDRAM, NAND FLASH, LCD ,SD

Page 18: Caanoo cofiguration and u boot

5.3.1 Makefile

(TOP_DIR)/Makefile 을 열면 다음과 같은 부분이 있다 . ; $(obj)u-boot.bin: $(obj)u-boot $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@ cp $@ polluxb-n35 ① ; n35_config unconfig @$(MKCONFIG) $(@:_config=) arm arm926ejs n35 NULL pollux ② ③ ④ ⑤ ⑥ ⑦

polluxb-n35 => u-boot build 바이너리 최종 이미지 파일 이름 n35_config => (TOP_DIR)/include/configs/n35.h (u-boot 기본설정 ) arm => 설정 CPU arm926ejs => (TOP_DIR)/cpu/arm926ejs n35 => (TOP_DIR)/board/n35/ pollux => (TOP_DIR)/cpu/arm926ejs/pollux

5. CAANOO boot

GPH

5.3 CAANOO 부트 설정 파일

[① ~⑦] 항목별 역할

① U-Boot 를 build 할 Configuration 의 이름 U-Boot 의 특정 보드를 위하여 , build 할 수 있도록 해주는 구분 자 입니다 . 실제로 U-Boot 컴파일 시 “ make n35_config”

라고 입력하면 , U-Boot 는 CAANOO 단말기 용으로 컴파일 될 수 있도록 설정됩니다 .

② “make n35_config” 를 입력하면 , 위의 Makefile 에서는 mkconfig 라는 유틸리티를 호출하여 mkconfig 에 ③ ~⑦ 번 항목을

인자로 입력합니다 . mkconfig 스크립트는 이 인자를 입력 받아서 컴파일 환경 설정을 진행하게 됩니다 . $(@:_config=) 항목의 경우 위의 “ n35_config” 라는 항목이며 , 여기서 “ n35” 라는 항목만을 인자로 받아서 , mkcon-fig 에

전달하게 됩니다 .

Page 19: Caanoo cofiguration and u boot

5. CAANOO boot

GPH

“n35” 라는 항목은 mkconfig 에서 BOARD_NAME 을 설정하는데 사용되며 , 다음은 mkconfig 에서 이 인자를 전달 받아서 Board Name 을 설정하는 항목입니다 .

while [ $# -gt 0 ] ; do

case "$1" in --) shift ; break ;; -a) shift ; APPEND=yes ;; -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;; *) break ;; esac done [ "${BOARD_NAME}" ] || BOARD_NAME="$1" [ $# -lt 4 ] && exit 1 [ $# -gt 6 ] && exit 1 echo "Configuring for ${BOARD_NAME} board..."

위의 BOARD_NAME 이라는 항목에는 “ n35_config” 에서 “ _config” 를 제외한 “ n35” 을 $1 인자로 받아 처리하는 mk-config

스크립트의 루틴입니다 . 이 루틴 때문에 U-Boot 컴파일 시 “ make n35_config” 을 입력하면 , "Configuring for n35 board..."

라는 메시지가 화면에 출력되게 됩니다 .

③ CPU 의 아키텍처를 입력하는 부분으로 ARM, MIPS등 CPU 아키텍처들 별로 상이하게 사용되는 어셈블러 랭귀지를 구분하기

위해 만들어진 항목입니다 . mkconfig 에 두 번째 인자로 전달되며 [ARCH] 라는 항목으로 인식됩니다 . 이 항목은 다음과 같

은 디렉터리를 컴파일 하도록 설정합니다 . - U-Boot 의 “ include/” 디렉터리 내의 헤더 파일들에 대한 컴파일 항목 ㆍ“ include/asm-[ARCH]/” 를 “ include/asm/” 이라는 이름으로 심볼릭 링크를 생성하고 이 항목들을 이 항목들을 소스

컴 파일 시 include 시킵니다 .. ㆍ“ include/asm-[ARCH]/proc-armv/” 를 “ proc-armv/” 라는 이름으로 심볼릭 링크를 생성하고 이 항목들을 소스 컴파일

시에 include 시킵니다 . - U-Boot 소스의 루트 디렉터리에 대한 컴파일 항상ㆍ“ lib_[ARCH]/” 디렉터리를 컴파일 합니다 .

④ CPU 의 종류를 입력하는 부분으로 ARM 계열 CPU 의 각 계열들을 구분하기 위해서 만들어진 항목입니다 . 각 CPU 계열별로

특화된 항목에 대한 부분이 담겨있습니다 . mkconfig 에 세 번째 인자로 전달되며 [CPU] 라는 항목으로 인식됩니다 . 이 항목

은 다음과 같은 이름의 디렉터리를 컴파일 하도록 명령합니다 . - U-Boot 소스의 “ cpu/” 디렉터리에 대한 컴파일 항목 “ cpu/[CPU]/” 디렉터리를 컴파일 합니다 .

Page 20: Caanoo cofiguration and u boot

5. CAANOO boot

GPH

⑤ Board 의 이름을 입력하는 항목으로 Board 의 종류에 따라 특화된 항목에 대한 부분이 담겨있습니다 . mkconfig 에 네 번째 인 자로 전달되며 , [BOARD] 라는 항목으로 인식됩니다 . 이 항목은 다음과 같은 이름의 디렉터리를 컴파일 하도록 명령합니다 .

- U-Boot 소스의 “ /board” 디렉터리에 대한 컴파일 항목 “ board/[BOARD]/” 디렉터리를 컴파일 합니다 .

⑥ Board 를 제조한 Vendor 에 대한 이름을 입력하는 항목으로 한 벤더에서 여러 가지의 Board 를 출시했을 경우 , 편리하게 분류 하기 위하여 만든 항목 입니다 . 특정한 벤더가 없을 경우 “ NULL” 로 처리하면 자동으로 ⑤번 에서 설명한 항목만을 가지고 컴파일 합니다 . - U-Boot 소스의 “ board/” 디렉터리에 대한 컴파일 항목 “ board/[VENDOR]/[BOARD]/” 디렉터리를 컴파일 합니다 .

⑦ SoC( 이하 System On Chip) 의 모델명을 입력하는 항목으로 , 각 CPU 아키텍처와 계열을 탑재한 각 CPU 벤더의 SoC에 담겨

있는 특화된 기능을 지원하기 위해 만들어진 항목입니다 . mkconfig 에 여섯 번째 인자로 전달되며 , [SoC] 라는 항목으로 인식

됩니다 . 이 항목은 다음과 같은 이름의 디렉터리를 컴파일 하도록 명령합니다 . - U-Boot 소스의 “ cpu/” 디렉터리에 대한 컴파일 항목 “ cpu/[CPU]/[SoC]/” 디렉터리를 컴파일 합니다 .

- U-Boot 의 “ include/” 디렉터리 내의 헤더 파일들에 대한 컴파일 항목 “ include/asm-[ARCH]/[SoC]/” 를 “ asm/arch/” 라는 이름으로 심볼릭 링크를 생성하고 이 항목들을 이 항목들을 소스 컴파

일 시에 include 시킵니다 .

Page 21: Caanoo cofiguration and u boot

5. CAANOO boot

GPH

5.3.2 n35.h

(TOP_DIR)/include/configs/n35.h /* High Level Configuration Options */ #define CONFIG_ARM926EJS 1 /* This is an arm926ejs CPU core */ #define CONFIG_POLLUX 1 /* in a MagicEyes POLLUX SoC */ #define CONFIG_GPH_N35 1 /* CAANOO 단말기 설정 */ #define CONFIG_NAND_BOOT_MODE 1 /* CAANOO 단말기는 nand 부팅 모드임 nor 부팅은 지원 안됨 */

/* shadow =1 이므로 dram 번지는 0 번지가 됨 ( 항목 2.3 참조 ) */ #define CONFIG_POLLUX_SHADOW_ONE

/* input clock of PLL */ #define CONFIG_SYS_CLK_FREQ 27000000 /* pollux CPU 는 27MHZ 오실레이터 사용 */ #undef CONFIG_USE_IRQ

/ * Size of malloc() pool */ #define CFG_MALLOC_LEN (CFG_ENV_SIZE + 64*1024) #define CFG_GBL_DATA_SIZE 128

/ * Hardware drivers */ #define CONFIG_TIMER_ENABLE 1 #define CFG_HZ (261000000 / 50) /* pll1 을 timer 소스 CLOCK 사용 (10ms time tick 발생 ) */

/* select serial console configuration */ #define CONFIG_DRIVER_POLLUX_SERIAL 1 #define CONFIG_SERIAL1 1 #define CONFIG_CONS_INDEX 1 #define CONFIG_BAUDRATE 115200 #define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 } #define CONFIG_MMC 1 /* SD 지원 only read 만 가능 */ #define CONFIG_DOS_PARTITION 1 #define CONFIG_SUPPORT_VFAT 1 /* SD 에 fat 파일 시스템 연동 */

Page 22: Caanoo cofiguration and u boot

5. CAANOO boot

GPH

#define CONFIG_BOOTDELAY 0 /* 커널에 전달 되는 부트 아큐 먼트임 */ /* memory size 전달 및 mtd position 관련 은 2.3 .2 카누 PHYSICAL MEMORY MAP 참조 */ #define CONFIG_BOOTARGS "mem=86M root=/dev/mtdblock1 rw rootfstype=yaffs2 console=ttySAC0,115200n81" /* 업그레이드 용으로 사용 하는 ramdisk 지원 커널 사용 아큐 먼트입 (uImageUP) */ #define CONFIG_RAMDISKARGS "mem=86M root=/dev/ram0 rw initrd=0x800000,16M console=ttySAC0,115200n81“ #define CONFIG_LOADADDR 0x01000000 /* u-boot 소스 내에서 nand 커널 영역을 미리 0x02000000 읽어 놓는다 . */ #define CONFIG_BOOTCOMMAND "bootm 0x02000000“ #define CONFIG_RAMBOOTCOMMAND "bootm 0x02000000“ #define CFG_PROMPT "gpollux# " /* Monitor Command Prompt */

#define CONFIG_STACKSIZE (128*1024) /* regular stack */ /* Physical Memory Map */ #define CONFIG_NR_DRAM_BANKS 1 #define PHYS_SDRAM_1 0x00000000 /* SDRAM Bank #1 */ #define PHYS_SDRAM_1_SIZE 0x08000000

#define BOARD_LATE_INIT

5.3.3 config.mk (TOP_DIR)/board/n35/config.mk # # MagicEyes POLLUX(ARM926EJS) cpu # # u-boot 메모리 로드 주소 TEXT_BASE = 0x07680000

Page 23: Caanoo cofiguration and u boot

(TOP_DIR)/cpu/arm926ejs/start.s

5. CAANOO boot

GPH

5.4 startup 코드 분석

Linker script file entry point 에서 선언된 _start 에서 프로그램 코드가 실행 되며 실제 b reset 0 번지이다 .

arm 의 CPSR 레지스터 7,6 번 bit 를 clear 하고 ( 인터럽트 disable) supervisor mode 로 변경 한다 . (CPSR 0~4 번 bit)

Page 24: Caanoo cofiguration and u boot

5. CAANOO boot

GPH

Reset 함수로 jump 후 nand u-boot 코드를 메모리에 복사 한다 . ( CAANOO 는 NAND 부팅으로 초기에 512byte 만을 CPU 가 NAND 에서 읽어 메모리에 0 번지에 올려 놓기 때문에 실제 u-boot 사이즈 256kb 전체를 NAND 에서 읽어서 메모리 _start 번지부터 ( (TOP_DIR)/board/n35/config.mk 정의된 0x07680000 번지 ) 복사를 해야 한다 .

Page 25: Caanoo cofiguration and u boot

메모리 복사 작업이 완료 되면 위의 코드처럼 cpu_init_crit 함수를 펑션콜을 하여 MMU 를 disable 한다 . ( 리눅스 커널이 부팅 하려면 MMU disable 되어야 하고 D-cache 반드시 꺼저 있어야 한다 .) 코드 중 bl lowlevel_init 펑션 콜은 실제 (TOP_DIR)/board/n35/lowlevel_init.S 에 구현 되어 있는데 실제 소스에 가보면 아무것도 하지 않고 retrun 한다 . 클럭 및 메모리 관련 셋팅 은 board setup 쪽에 C 코드로 구현 되어 있다

5. CAANOO boot

GPH

Page 26: Caanoo cofiguration and u boot

relocate 는 statck address 지정 및 C 루틴으로 점프 한다 . stack point 을 설정 C routine 을 실행 하기 위해 ldr pc, _start_armboot 코드는 board.c 파일에 포함 되어 있는 start_armboot 함수로 브렌치 한다 .

5. CAANOO boot

GPH

5.5 CAANOO 단말기 SETUP

(TOP_DIR)/cpu/lib_arm/board.c

5.5.1 board.c 구성

void start_armboot (void){ ; for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { ; } ; board_late_init (); ; for (;;) { main_loop (); } }

init_fnc_t *init_sequence[] = {cpu_init,board_init,interrupt_init,env_init,init_baudrate,serial_init,console_init_f,display_banner,dram_init,display_dram_config,NULL,};

위의 start_armboot 는 다른 많은 역할을 하지만 기본적으로 init_sequence 라는 배열에 선언된 함수를 돌려 CPU 및 레지스터 보드에 연동되는 디바이스를 초기화 한 후에 main_loop 함수에서 u-boot command 를 기다린다 .

Page 27: Caanoo cofiguration and u boot

5. CAANOO boot

GPH

5.5.2 실제 카누 단말기 Initialize (TOP_DIR)/board/n35/pollux.c

int board_init (void) { ; BOARD_Initialize(); retrun 0; }

(TOP_DIR)/board/n35/board.c

void BOARD_Initialize(void){ InitializeProtoType(); InitMemoryInterface(); ClockAndPower(); InitializeGPIO(); InitializeDisplay();}

void InitializeDisplay(void){ InitializeDPC(); InitializeMLC(); InitializeLCD(); LcdTurnOn();}

참고 ) POLLUX 레지스터 bit 설정 관련 (TOP_DIR)/include/asm-arch/system_main.h

enum { /* DDRAM */ ; CFG_SYS_BANKA_CASLAT = 3, // CAS latency CFG_SYS_BANKA_READLAT = 3, // Read latency CFG_SYS_BANKA_TMRD = 3, // Mode Register Set Cycle CFG_SYS_BANKA_TRP = 3, // Row Prechage Time CFG_SYS_BANKA_TRCD = 3, // RAS to CAS delay CFG_SYS_BANKA_TRC = 10, // Row Cycle Time CFG_SYS_BANKA_TRAS = 6, // Row Active Time CFG_SYS_BANKA_TWR = 3, // Write Recovery Time CFG_SYS_BANKA_CLKDLY = 2, // delay of DRAM clock; }

// usb host (cs0) ( _name_ , bw, tACS tCOS tACC tSACC tOCH tCAH, wm, wb )CFG_SYS_STATICBUS_CONFIG( STATIC0, 16, 3, 3, 16, 16, 3, 3, 0, 0, 0 )// nand CFG_SYS_STATICBUS_CONFIG( NAND, 8, 1, 1, 3, 2, 1, 1, 1, 0, 0 )

/* pll0 PMS value */#define SYSTEM_FREQUENCY_PLL0_P 20#define SYSTEM_FREQUENCY_PLL0_M 393#define SYSTEM_FREQUENCY_PLL0_S 0/* pll1 PMS value */#define SYSTEM_FREQUENCY_PLL1_P 9#define SYSTEM_FREQUENCY_PLL1_M 174#define SYSTEM_FREQUENCY_PLL1_S 1

#define SYSTEM_CLOCK_CPU_SELPLL SEL_PLL0#define SYSTEM_CLOCK_CPU_DIV 1#define SYSTEM_CLOCK_CPU_AHBDIV 4

Page 28: Caanoo cofiguration and u boot

5. CAANOO boot

GPH

참고 ) POLLUX 레지스터 bit 설정 관련 계속 (TOP_DIR)/include/asm-arch/system_main.h

/* //// CLOCK //// */#define SYSTEM_CLOCK_BCLK_SELPLL SEL_PLL0#define SYSTEM_CLOCK_BCLK_DIV 4

#define SYSTEM_CLOCK_TIMER_SELPLL SEL_PLL1#define SYSTEM_CLOCK_TIMER_DIV 50

#define SYSTEM_CLOCK_PWM_SELPLL SEL_PLL1#define SYSTEM_CLOCK_PWM_DIV 64

#define SYSTEM_CLOCK_UART_SELPLL SEL_PLL0#define SYSTEM_CLOCK_UART_DIV 46

/* video */#define DISPLAY_MLC_RGB_FORMAT MLC_RGBFMT_R8G8B8#define DISPLAY_MLC_BYTE_PER_PIXEL 3

#define DISPLAY_PRI_MAX_X_RESOLUTION 320 #define DISPLAY_PRI_MAX_Y_RESOLUTION 240#define DISPLAY_DPC_PRI_VCLK_SOURCE DPC_VCLK_SOURCE_PLL1#define DISPLAY_DPC_PRI_VCLK_DIV_TCL 23#define DISPLAY_DPC_PRI_OUTPUT_FORMAT DPC_FORMAT_RGB888

#define DISPLAY_SEC_SCALE_UP_ENABLE CTRUE #define DISPLAY_SEC_MAX_X_RESOLUTION 720#define DISPLAY_SEC_MAX_Y_RESOLUTION 480#define DISPLAY_DPC_SEC_ENCODER_ON CTRUE#define DISPLAY_DPC_SEC_ENCODER_FORMAT DPC_VBS_NTSC_M

/*************** PWM LIST ***************/#define PWM_DISPLAY_LCD_PRI_BRIGHTNESS 0

Page 29: Caanoo cofiguration and u boot

5. CAANOO boot

GPH

5.5.3 실제 카누 Initialize 코드 분석

1) DRAM 설정

void InitMemoryInterface(void){ MES_MCUD_SetCASLatency(CFG_SYS_BANKA_CASLAT ); MES_MCUD_SetReadLatency(CFG_SYS_BANKA_READLAT ); ; /* (TOP_DIR)/include/asm-arch/system_main.h 설정된 DRAM 타이밍 셋팅 코드 */ ; MES_MCUD_ApplyModeSetting(); do{

volatile U32 x;for( x=0 ; x<0x01FF ; x++ );

} while( MES_MCUD_IsBusyModeSetting() ); ;

MEMORY CONFIGURATION REGISTER(MEMCFG) MCU-A:C001_4800h

Page 30: Caanoo cofiguration and u boot

5. CAANOO boot

GPH

2) NAND FLASH 설정

Page 31: Caanoo cofiguration and u boot

5. CAANOO boot

GPH

void InitMemoryInterface(void){ ;

; // NAND Bus config MES_MCUS_SetStaticBUSConfig { MES_MCUS_SBUSID_NAND, // bus type : NAND 0, // bit width : Not used CFG_SYS_NAND_TACS, // tACS ( 0 ~ 3 ) CFG_SYS_NAND_TCAH, // tCAH ( 0 ~ 3 ) CFG_SYS_NAND_TCOS, // tCOS ( 0 ~ 3 ) CFG_SYS_NAND_TCOH, // tCOH ( 0 ~ 3 ) CFG_SYS_NAND_TACC, // tACC ( 1 ~ 16 ) 0, // tSACC ( 1 ~ 16 ) : Not used (MES_MCUS_WAITMODE)0, //Wait mode : Not used // Read burst mode : Not used (MES_MCUS_BURSTMODE)0, // Write burst mode : Not used (MES_MCUS_BURSTMODE)0 };}

아래 NAND FLASH DELAY SETTING 관련 레지스터 주소와 비트 를 정리 하였습니다 . 자세한 사항은 POLLUX DATA BOOK CHAPTER 7 의 MEMORY CONTROLLER 를 참조 하십시요 MEMORY TIMING FOR TACS REG(MEMTIMEACS) C001_5804h TCOH11[23:22bit]MEMORY TIMING FOR TCOS LOW REG(MEMTIMECOS) C001_5808h TCOH11[23:22bit]MEMORY TIMING FOR TACC REG(MEMTIMEACCH) C001_5810h TCOH11[15:12bit]MEMORY TIMING FOR TCOH LOW REG(MEMTIMECOH) C001_5824h TCOH11[23:22bit] MEMORY TIMING FOR TCAH HIGH REG(MEMTIMECAH) C001_5828h TCOH11[23:22bit]

Page 32: Caanoo cofiguration and u boot

5. CAANOO boot

GPH

2) CLOCK 설정

void ClockAndPower(void){ MES_CLKPWR_SetClockCPU( CPUSELPLL,CPUDIV,CPUAHBDIV); // initialize system(Bus/Peri clock) clock source and divider MES_CLKPWR_SetClockBCLK( BCLKSELPLL, BCLKDIV); // initialize PLL0 MES_CLKPWR_SetPLLPMS( 0, SYSTEM_FREQUENCY_PLL0_P, SYSTEM_FREQUENCY_PLL0_M, SYSTEM_FREQUENCY_PLL0_S); // initialize PLL1 MES_CLKPWR_SetPLLPowerOn( CTRUE ); MES_CLKPWR_SetPLLPMS( 1, SYSTEM_FREQUENCY_PLL1_P,

SYSTEM_FREQUENCY_PLL1_M, SYSTEM_FREQUENCY_PLL1_S); MES_CLKPWR_DoPLLChange(); // Change PLL while( CFALSE == MES_CLKPWR_IsPLLStable() ); }

CLOCK MODE REG (CLKMODEREG) C000_F000h

Page 33: Caanoo cofiguration and u boot

5. CAANOO boot

GPH

3) VIDEO MLC 설정

void InitializeMLC(void){ /* 부팅 초기 에는 LCD 만 출력 하고 TV 출력은 하지 않으므로 Primary MLC&DPC 는 설정 enable 하지 않는다 . 부트 에서는 Primary MLC 영역 중 RGB1 layer 만 사용 한다 . */

U32 X_STRIDE = DISPLAY_MLC_BYTE_PER_PIXEL * DISPLAY_PRI_MAX_X_RESOLUTION; U32 PRI_MLC_FRAME_BASE; // 프레임 버퍼 주소는 커널 에서 사용 하는 메모리와 동일 한 영역에 설정 하였다 (0x05600000) PRI_MLC_FRAME_BASE = OEM_MEM_PHY_FRAMEBUFFER_START; ; MES_MLC_SetScreenSize( DISPLAY_PRI_MAX_X_RESOLUTION, DISPLAY_PRI_MAX_Y_RESOLUTION ); ; MES_MLC_SetTopDirtyFlag();

// PRIMARY RGB Layer SCREEN Field // LAYER_DISPLAY_SCREEN_RGB == RGB LAYER 1 임 ) MES_MLC_SetLayerPowerMode ( LAYER_DISPLAY_SCREEN_RGB, CTRUE ); MES_MLC_SetLayerSleepMode ( LAYER_DISPLAY_SCREEN_RGB, CFALSE ); // CAANOO 는 기본 3byte 메모리 처리를 하므로 RGB888 임 DISPLAY_MLC_RGB_FORMAT == RGB888) MES_MLC_SetFormat ( LAYER_DISPLAY_SCREEN_RGB,

(MES_MLC_RGBFMT)DISPLAY_MLC_RGB_FORMAT ); MES_MLC_SetPosition ( LAYER_DISPLAY_SCREEN_RGB, 0, 0, DISPLAY_PRI_MAX_X_RESOLUTION-1, DISPLAY_PRI_MAX_Y_RESOLUTION-1 ); MES_MLC_SetRGBLayerStride ( LAYER_DISPLAY_SCREEN_RGB, DISPLAY_MLC_BYTE_PER_PIXEL, X_STRIDE ); // 프레임 버퍼의 주소를 레지스터에 셋팅 MES_MLC_SetRGBLayerAddress( LAYER_DISPLAY_SCREEN_RGB, PRI_MLC_FRAME_BASE ); //RGB1 LAYEER 를 enable 한다 . MES_MLC_SetLayerEnable( LAYER_DISPLAY_SCREEN_RGB, CTRUE ); // RGB LAYER 설정 시 실제 위에 적용 된 값이 실제 반영 되려면 아래처럼 Dirty bit 를 SET 했을 경우 // MLC RGB 블록이 변경 된다 . (MLCCONTROL0 4 번 bit C000-4024h, C000_4424h) MES_MLC_SetDirtyFlag( LAYER_DISPLAY_SCREEN_RGB );}

Page 34: Caanoo cofiguration and u boot

5. CAANOO boot

GPH

4) VIDEO DPC 설정

void InitializeDPC(void){ /* 부팅 초기 에는 TV 를 출력 하지 않으므로 MLC 와 동일 마찬 가지로 Primary DPC 만 Enable 한다 . // DPC 가 셋팅 전에는 DPC 인에이블 bit 를 Disable 한다 . MES_DPC_SetDPCEnable( CFALSE ); // CAANOO 에서는 320x240 을 LCD 로 그대로 출력 하기 때문에 업스케일러을 enable 할 필요 없다 . MES_DPC_SetHorizontalUpScaler( CFALSE, 2, 2 ); //lcd 블록도 소스 clock 은 PLL1 에서 받고 해당 클럭을 디바이드 한다 . MES_DPC_SetClockSource (0, DISPLAY_DPC_PRI_VCLK_SOURCE); MES_DPC_SetClockDivisor (0, DISPLAY_DPC_PRI_VCLK_DIV); MES_DPC_SetClockOutEnb( 0, CTRUE ); // CAANOO lcd 출력이 24bit 이므로 역시 RGB888 로 모드로 설정 한다 . MES_DPC_SetMode( (MES_DPC_FORMAT)DISPLAY_DPC_PRI_OUTPUT_FORMAT) // MLC 888 이고 DPC 888 이므로 디더링 할 필요 없으므로 패스 한다 . MES_DPC_SetDither(MES_DPC_DITHER_BYPASS, MES_DPC_DITHER_BYPASS, MES_DPC_DITHER_BYPASS // Secondary 영역은 사용 하지 않으므로 Disable 한다 . MES_DPC_SetSecondaryDPCSync( CFALSE ); //셋팅이 완료 되었으므로 DPC 를 enable 한다 . MES_DPC_SetDPCEnable( CTRUE );

}

lcd Initialize 부분과 lcd 백라이트를 on 시키는 부분은 소스가 어렵지 않으므로 소스를 참고 하기 바람 lcd init 펑션 => InitializeLCD() (LCD 데이타쉬트 참고 ) lcd 백라이트 => LcdTurnOn() - PWM 채널 0 번 사용 - PWM MAIN CLOCK 4MHZ 를 사용 실제 펄스 주기는 40KHZ 이며 부트 로더 에서는 주기의 50% 만 enable 하여 LCD 밝기를 조정한 상태 입니다 . 펄스 주기를 바꾸면 보드에서 NOISE 가 발생 할 수 있으니 주의 바람