Caanoo cofiguration and u boot
Upcoming SlideShare
Loading in...5
×
 

Caanoo cofiguration and u boot

on

  • 1,329 views

 

Statistics

Views

Total Views
1,329
Slideshare-icon Views on SlideShare
1,329
Embed Views
0

Actions

Likes
0
Downloads
9
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Caanoo cofiguration and u boot Caanoo cofiguration and u boot Presentation Transcript

    • CAANOO 시스템 개요 및 U-boot 분석 2010.11.10
    • Table of contents 1. 개 요 2. CAANOO system block 3. 개발 환경 구축 4. CAANOO boot build 및 업데이트 방법 5. CAANOO BOOT GPH
    • 1. 개 요 이 문서는 CAANOO 게임기의 내부 블록 구조와 메인CPU의 몇 가지 중요한 장치를 분석 하여 카누 게임기로 임베디드 리눅스 시스템을 공부하고자 하는 사람들에게 코드분석 및 수정 시 도 움을 주기 위한 문서이며 본 문서에서는 CAANOO 게임기의 부 트 코드(U-BOOT) 구조와 부팅 시퀀스를 기본적으로 다루는 문 서 입니다. GPH
    • 2. CAANOO system block 2.1 내부 블록 전체 구성도 NAND SDRAM 128MB 128MB EAR JACK DAC I2S NAND_C DRAM_C KEY SPEAKER GPIO ANALOG JOYSTICK EEPROM ADC I2C CPU LCD_ PIXEL TOUCH RTC 24BIT TFT LCD CVBS G-SENSOR PWM MOTOR MOTOR DRV SD/MMC CS0 USBD UART BATTERY POWER DC-DC USB HOST 2.0 POWER S/W USB HOST SD SOCKET CON 24PIN CON GPH
    • 2. CAANOO system block 2.2 Clock Manager Block Diagram 2.2.1 POLLUX CPU Clock 기본 구조 CPU Core Clock System BUS 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: ~ 300MHZ Output 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이 다르므로 주의 바람 GPH
    • 2. CAANOO system block 2.2 .2 카누 Clock Core 및 Device clock FCLK PLL0 (533MHZ) CORE CLOCK SOUND CLOCK (I2S) CLKDIV HCLK 1/4 AHB BUS CLOCK BCLK SYSTEM BUS CLOCK (MEMORY / NAND / 3D / DMA) CLKDIV PLL1 (266MHZ) 1/2 DEVICE CLOCK ( UART / TIMER / LCD / SD / ETC) PCLK CLKDIV 1/2 DEVICE CLOCK ( ADC / I2C / ETC) 카누의 Clock 구조는 기본적으로 PLL1(SYSTEM BUS CLOCK 및 기타 디바이스 CLOCK은 고정) 고정 시키고 CORE CLOCK으로 사 용 되는 PLL0는 게임이나 기타 다른 외부 프로그램에서CLOCK을 가변 시킬 수 있으며 (OVER CLOCK을 지원 하기 위함) 이때 디바이스 CLOCK 중 유일하게 사운드 CLOCK은 PLL0에 물려 있다. (사운드의 BIT RATE 설정 시 고정 되어 있는 PLL1 CLOCK값을 가지고는 정확한 BIT RATE 값을 설정 할 수 없기 때문) GPH
    • 2. 카누 system block 2.3 메모리 구조 2.3.1 POLLUX CPU 메모리 기본 구조 RESERVED 0xC000 0000 0x3000 0000 NORMAL I/O NORMAL I/O NAND 0xAC00 0000 0x2C00 0000 0xC000_0000 0xC000_0000 RESERVED MCU-S MCU-A 0xA800 0000 0x2800 0000 (STATIC) (DDR) 0x8000_0000 STATIC9 0x8000_0000 0xA400 0000 0x2400 0000 RESERVED RESERVED ~ STATIC1 0x4000_0000 0x4000_0000 0x8400 0000 0x0400 0000 MCU-A STATIC0 MCU-S (DDR) 0x8000 0000 0x0000 0000 (STATIC) 0x0000_0000 0x0000_0000 SHADOW=1 SHADOW=0 POLLUX CPU 에서 기본 메모리 구조는 위의 그림과 같이 구성 되어 있으며 SHADOW 설정에 따라 0번지가 바뀔 수 있다. 만약 SHADOW 가 1로 설정 되면 DDRAM 번지가 0번지가 되며 SHADOW 0이 되면 STATIC 메모리나 장치 들이 0번지가 된다. 일반적으로 NOR 번지가 0번지로 설정 되므로 NAND 부팅이냐 NOR 부팅이냐를 기준으로 SHADOW를 설정 하면 되며 외부 핀으로도 나와 있다. MCU-A BANK 지원 메모리 : DDR-SDRAM(8bit,16bit) 메모리 최대 지원 사이즈 : ~ 128Mbyte MCU-S BANK Normal static memory (SRAM, ROM and FRAM) NAND Flash Controller * 자세한 MEMORY SETING 관련 내용은 POLLUX DATA BOOK CHAPTER 7의 MEMORY CONTROLLER 참고 GPH
    • 2. CAANOO system block 2.3 .2 카누 PHYSICAL MEMORY MAP 0x0000_0000 0x0000_0000 SYSTEM MEMORY 0x000_40000 BOOT AREA (256KB) 256KB APPLICATION MEMORY 0x0008_0000 BOOT ENV AREA (256KB) 512KB (86MB) 0x0560_0000 86MB 0x003C_0000 KERNEL1 AREA (3.25MB) 3.75MB MTD0 0x0080_0000 KERNEL2 AREA (3.25MB) 8MB VIDEO BUFF (1MB) ROOT FILE1 (48MB) MTD1 0x0570_0000 87MB 0x0380_0000 56MB SOUND BUFF (1MB) ROOT FILE2 (10MB) MTD2 0x0580_0000 88MB 0x0420_0000 66MB YUV BUFF (8MB) RESTORE AREA (57MB) MTD3 0x0600_0000 96MB 0x0570_0000 123MB 3D BUFF (32MB) 0x0080_0000 BAD TABLE (5MB) 128MB 0x0800_0000 128MB 1) DDRAM MEMORY MAP (128MB) 2) NAND FLASH MEMORY MAP (128MB) 카누는 NAND 부팅으로 되어 SHADOW=1로 설정 되어 DRAM 0번지가 시작 주소이다. 물리적으로 128MB 를 사용 하며 앞쪽은 기본 HEAP으로 사용 되고 뒤쪽 영역은 비디오(프레임버퍼),사운드,YUV(동영상),3D 버퍼 식으로 고정 되어 있다. NAND FALSH 메모리 구 조는 그림2) 와 같이 구성(MTD0~MTD3) 되어 항목 4 카누 boot build 및 업데이트 방법에서 좀더 다루어 보기로 하겠다. GPH
    • 2. CAANOO system block 2.4 비디오 구조 2.4.1 POLLUX 비디오 기본 구조 1) MLC 구조 2) DPC 구조 GPH
    • 2. CAANOO system block 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 참고 GPH
    • 2. CAANOO system block 2.3 .2 카누 비디오 구조 Primary Secondary Display Display RGB1 Controller RGB1 Controller (UI,APPS,2D GAME) (LCD (RGB888)) (UI,APPS,2D GAME) (TV(CVBS)) RGB0 RGB0 (only 3D game) VIDEO BUFF (1MB) 0x0570_0000 SOUND BUFF (1MB) VIDEO 0x0580_0000 VIDEO YUV BUFF (8MB) 동영상 플레이, 3D+동영상 0x0600_0000 동영상 플레이 3D BUFF (32MB) Primary Multi layer Controller 0x0800_0000 Secondary Multi layer Controller 카누의 비디오 설계의 기본 구조는 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를 지원 하지 않게 구성 하였다 GPH
    • 2. CAANOO system block 2.3 .3 실제 활용 예 VIDEO RGB1 LAYER LAYER VIDEO RGB0 RGB0 LAYER LAYER LAYER 1) ONLY RGB 1 Layer 2) RGB0 + Video layer 3) RGB0(3DBLOCK 연동)+Video layer UI, ETC …. MOVIE PLAYER 3D GAMES 카누 부팅 후 Menu 진입 시 비디오 상태는 single layer 상태로 Primary RGB1 LAYER로 선택 된 상태 이며 거의 대부분은 이 상태로 유 지 되며 그림2) 와 그림 3) 동영상 및 3D 게임 시 Video layer 와 RGB0 Layer를 사용 하게 된다. TV OUT 선택 시 Primary (MLC+DPC) 는 Disable 되고 Secondary 영역이 enable 되며 layer 사용은 동일 하다. GPH
    • 3. 개발 환경 구축 3.1 기본 개발 환경 3.1.1 개발 환경 구성도 PC 연결 USB POWER CABLE 개발자 보드 PC 연결 시리얼 케이블 카누 게임단말기 24PIN SERIAL CABLE 3.1 .2 개발 환경 구성 품 카누 단말기 개발자 보드 24PIN 연결 케이블 (카누 <=> 개발자 보드) 시리얼 케이블 (개발자 보드 <=> PC) POWER CABLE (개발자 보드 <=> PC) SD CARD 4GB CD GPH
    • 3. 개발 환경 구축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 = HIGH J3 = HIGH NOR BOOT X X (지원 안됨) 개발자 보드 연결 시 switch 가 HIGH 도 LOW도 아닌 상태 => NAND 부팅 모드 이며 단말기의 전원 스위치로 on/off 제어 가능 한 기본 상태 UART BOOT 모드 를 사용 할 경우 => boot 개발 시 boot 이미지 업데이트를 올린 후 제대로 부팅이 되지 않는 경우 가 발생 할 수 있다 이때 시리얼을 통해 강제로 boot를 올릴 수 있는데 이때 사 용 하는 모드 이다. (카누 강제 복구.pdf 문서 참조) GPH
    • 3. 개발 환경 구축 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:$PATH 4) 설치된 Tool chain gcc version 확인 GPH
    • 4. CAANOO boot build 및 업데이트 방법 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 화면에 업데이트 메시지가 사라지면 업데이트 가 완료 되었고 실제 부트가 제대로 업데이트가 이 되었는지를 확인 하려면 단말기 전원을 다시 켜야 한다. GPH
    • 5. CAANOO boot 5.1 CAANOO 부트 디렉토리 구조 U-BOOT-1.1.6 board n35 - CAANOO 단말기의 의존적인 파일 - architecture 독립적인 파일 common - POLLUX CPU 의존적인 파일 cpu ARM926EJS pollux prototype ( BSP 포함 ) disk - Disk drive 파티션 - 외부 장치 DRIVER (NAND) drivers fs fat - File system (FAT) include asm-arm arch-pollux - 헤더파일 & POLLUX 레지스터 설정비트 DEFINE - arm architecture 관련 라이브러리 파일 lib_arm - U-BOOT Image tools 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 GPH
    • 5. CAANOO boot 5.3 CAANOO 부트 설정 파일 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 [① ~⑦] 항목별 역할 ① 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”라는 항목만을 인자로 받아서, mkconfig에 전달하게 됩니다. GPH
    • 5. CAANOO boot “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 인자로 받아 처리하는 mkconfig 스크립트의 루틴입니다. 이 루틴 때문에 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]/” 디렉터리를 컴파일 합니다. GPH
    • 5. CAANOO boot ⑤ 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 시킵니다. GPH
    • 5. CAANOO boot 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 파일 시스템 연동 */ GPH
    • 5. CAANOO boot #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 GPH
    • 5. CAANOO boot 5.4 startup 코드 분석 (TOP_DIR)/cpu/arm926ejs/start.s Linker script file entry point 에서 선언된 _start 에서 프로그램 코드가 실행 되며 실제 b reset 0번지이다. arm의 CPSR 레지스터 7,6번 bit를 clear 하고 (인터럽트 disable) supervisor mode로 변경 한다. (CPSR 0~4번 bit) GPH
    • 5. CAANOO boot Reset 함수로 jump 후 nand u-boot 코드를 메모리에 복사 한다. ( CAANOO는 NAND 부팅으로 초기에 512byte만을 CPU가 NAND 에서 읽어 메모리에 0번지에 올려 놓기 때문에 실제 u-boot 사이즈 256kb 전체를 NAND에서 읽어서 메모리 _start 번지부터( (TOP_DIR)/board/n35/config.mk 정의된 0x07680000 번지 ) 복사를 해야 한다. GPH
    • 5. CAANOO boot 메모리 복사 작업이 완료 되면 위의 코드처럼 cpu_init_crit 함수를 펑션콜을 하여 MMU를 disable 한다. (리눅스 커널이 부팅 하려면 MMU disable 되어야 하고 D-cache 반드시 꺼저 있어야 한다.) 코드 중 bl lowlevel_init 펑션 콜은 실제 (TOP_DIR)/board/n35/lowlevel_init.S 에 구현 되어 있는데 실제 소스에 가보면 아무것도 하지 않고 retrun 한다. 클럭 및 메모리 관련 셋팅 은 board setup 쪽에 C코드로 구현 되어 있다 GPH
    • 5. CAANOO boot relocate 는 statck address 지정 및 C 루틴으로 점프 한다. stack point을 설정 C routine을 실행 하기 위해 ldr pc, _start_armboot 코드는 board.c 파일에 포함 되어 있는 start_armboot 함수로 브 렌치 한다. init_fnc_t *init_sequence[] = { cpu_init, 5.5 CAANOO 단말기 SETUP board_init, interrupt_init, 5.5.1 board.c 구성 env_init, (TOP_DIR)/cpu/lib_arm/board.c init_baudrate, serial_init, void start_armboot (void) console_init_f, { display_banner, ; dram_init, for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { display_dram_config, ; NULL, } }; ; board_late_init (); ; for (;;) { main_loop (); } } 위의 start_armboot 는 다른 많은 역할을 하지만 기본적으로init_sequence 라는 배열에 선언된 함수를 돌려 CPU 및 레지스터 보드에 연동되는 디바이스를 초기화 한 후에 main_loop 함수에서 u-boot command를 기다린다. GPH
    • 5. CAANOO boot 5.5.2 실제 카누 단말기 Initialize 참고) POLLUX 레지스터 bit 설정 관련 (TOP_DIR)/include/asm-arch/system_main.h (TOP_DIR)/board/n35/pollux.c int board_init (void) enum { /* DDRAM */ { ; ; CFG_SYS_BANKA_CASLAT = 3, // CAS latency BOARD_Initialize(); CFG_SYS_BANKA_READLAT = 3, // Read latency retrun 0; 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 (TOP_DIR)/board/n35/board.c CFG_SYS_BANKA_TRAS = 6, // Row Active Time CFG_SYS_BANKA_TWR = 3, // Write Recovery Time void BOARD_Initialize(void) CFG_SYS_BANKA_CLKDLY = 2, // delay of DRAM clock { ; InitializeProtoType(); } InitMemoryInterface(); ClockAndPower(); // usb host (cs0) ( _name_ , bw, tACS tCOS tACC tSACC tOCH tCAH, wm, wb ) InitializeGPIO(); CFG_SYS_STATICBUS_CONFIG( STATIC0, 16, 3, 3, 16, 16, 3, 3, 0, 0, 0 ) InitializeDisplay(); // nand } CFG_SYS_STATICBUS_CONFIG( NAND, 8, 1, 1, 3, 2, 1, 1, 1, 0, 0 ) void InitializeDisplay(void) /* pll0 PMS value */ { #define SYSTEM_FREQUENCY_PLL0_P 20 InitializeDPC(); #define SYSTEM_FREQUENCY_PLL0_M 393 InitializeMLC(); #define SYSTEM_FREQUENCY_PLL0_S 0 InitializeLCD(); /* pll1 PMS value */ LcdTurnOn(); #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 GPH
    • 5. CAANOO boot 참고) 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 GPH
    • 5. CAANOO boot 5.5.3 실제 카누 Initialize 코드 분석 1) DRAM 설정 MEMORY CONFIGURATION REGISTER(MEMCFG) MCU-A:C001_4800hvoid 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() ); ; GPH
    • 5. CAANOO boot 2) NAND FLASH 설정 GPH
    • 5. CAANOO boot 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] GPH
    • 5. CAANOO boot CLOCK MODE REG (CLKMODEREG) C000_F000h 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() );} GPH
    • 5. CAANOO boot 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 ); } GPH
    • 5. CAANOO boot 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 가 발생 할 수 있으니 주의 바람 GPH