Caanoo cofiguration and u boot
Transcript of Caanoo cofiguration and u boot
![Page 1: Caanoo cofiguration and u boot](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/1.jpg)
CAANOO 시스템 개요 및 U-boot 분석
2010.11.10
![Page 2: Caanoo cofiguration and u boot](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/2.jpg)
Table of contents
1. 개 요
2. CAANOO system block
3. 개발 환경 구축
4. CAANOO boot build 및 업데이트 방법
5. CAANOO BOOT
GPH
![Page 3: Caanoo cofiguration and u boot](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/3.jpg)
1. 개 요
GPH
이 문서는 CAANOO 게임기의 내부 블록 구조와 메인 CPU 의 몇 가지 중요한 장치를 분석 하여 카누 게임기로 임베디드 리눅스 시스템을 공부하고자 하는 사람들에게 코드분석 및 수정 시 도움을 주기 위한 문서이며 본 문서에서는 CAANOO 게임기의 부트 코드 (U-BOOT) 구조와 부팅 시퀀스를 기본적으로 다루는 문서 입니다 .
![Page 4: Caanoo cofiguration and u boot](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/4.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/5.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/6.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/7.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/8.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/9.jpg)
2. CAANOO system block
GPH
2.4 비디오 구조 2.4.1 POLLUX 비디오 기본 구조
1) MLC 구조 2) DPC 구조
![Page 10: Caanoo cofiguration and u boot](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/10.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/11.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/12.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/13.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/14.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/15.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/16.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/17.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/18.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/19.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/20.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/21.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/22.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/23.jpg)
(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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/24.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/25.jpg)
메모리 복사 작업이 완료 되면 위의 코드처럼 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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/26.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/27.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/28.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/29.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/30.jpg)
5. CAANOO boot
GPH
2) NAND FLASH 설정
![Page 31: Caanoo cofiguration and u boot](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/31.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/32.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/33.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061616/55862cdad8b42a32618b4b8a/html5/thumbnails/34.jpg)
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 가 발생 할 수 있으니 주의 바람