2. Table of contents
1. 개 요
2. CAANOO system block
3. 개발 환경 구축
4. CAANOO boot build 및 업데이트 방법
5. CAANOO BOOT
GPH
3. 1. 개 요
이 문서는 CAANOO 게임기의 내부 블록 구조와 메인CPU의 몇
가지 중요한 장치를 분석 하여 카누 게임기로 임베디드 리눅스
시스템을 공부하고자 하는 사람들에게 코드분석 및 수정 시 도
움을 주기 위한 문서이며 본 문서에서는 CAANOO 게임기의 부
트 코드(U-BOOT) 구조와 부팅 시퀀스를 기본적으로 다루는 문
서 입니다.
GPH
4. 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
5. 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
6. 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
7. 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
8. 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
9. 2. CAANOO system block
2.4 비디오 구조
2.4.1 POLLUX 비디오 기본 구조
1) MLC 구조 2) DPC 구조
GPH
10. 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
11. 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
12. 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
13. 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
14. 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
15. 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
16. 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
17. 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
18. 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
19. 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
20. 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
21. 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
22. 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
23. 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
24. 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
25. 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
26. 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
33. 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
34. 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