SlideShare uma empresa Scribd logo
1 de 34
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_4800h


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() );
                       ;




                                                                                                            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

Mais conteúdo relacionado

Destaque

Zilog manual eng(1)
Zilog manual eng(1)Zilog manual eng(1)
Zilog manual eng(1)jumiss
 
Blue cornv1.2 manual
Blue cornv1.2 manualBlue cornv1.2 manual
Blue cornv1.2 manualBeeconJS.com
 
Nfc manual
Nfc manualNfc manual
Nfc manualjumiss
 
Open vSwitch와 Mininet을 이용한 가상 네트워크 생성과 OpenDaylight를 사용한 네트워크 제어실험
Open vSwitch와 Mininet을 이용한 가상 네트워크 생성과 OpenDaylight를 사용한 네트워크 제어실험Open vSwitch와 Mininet을 이용한 가상 네트워크 생성과 OpenDaylight를 사용한 네트워크 제어실험
Open vSwitch와 Mininet을 이용한 가상 네트워크 생성과 OpenDaylight를 사용한 네트워크 제어실험Seung-Hoon Baek
 
Tableau TD3 Korean Manual
Tableau TD3 Korean ManualTableau TD3 Korean Manual
Tableau TD3 Korean Manual수빈 홍
 
QGIS 공식 Training Manual 한국어판
QGIS 공식 Training Manual 한국어판 QGIS 공식 Training Manual 한국어판
QGIS 공식 Training Manual 한국어판 SANGHEE SHIN
 

Destaque (6)

Zilog manual eng(1)
Zilog manual eng(1)Zilog manual eng(1)
Zilog manual eng(1)
 
Blue cornv1.2 manual
Blue cornv1.2 manualBlue cornv1.2 manual
Blue cornv1.2 manual
 
Nfc manual
Nfc manualNfc manual
Nfc manual
 
Open vSwitch와 Mininet을 이용한 가상 네트워크 생성과 OpenDaylight를 사용한 네트워크 제어실험
Open vSwitch와 Mininet을 이용한 가상 네트워크 생성과 OpenDaylight를 사용한 네트워크 제어실험Open vSwitch와 Mininet을 이용한 가상 네트워크 생성과 OpenDaylight를 사용한 네트워크 제어실험
Open vSwitch와 Mininet을 이용한 가상 네트워크 생성과 OpenDaylight를 사용한 네트워크 제어실험
 
Tableau TD3 Korean Manual
Tableau TD3 Korean ManualTableau TD3 Korean Manual
Tableau TD3 Korean Manual
 
QGIS 공식 Training Manual 한국어판
QGIS 공식 Training Manual 한국어판 QGIS 공식 Training Manual 한국어판
QGIS 공식 Training Manual 한국어판
 

Semelhante a Caanoo cofiguration and u boot

TestBCD2014-2(Answer)
TestBCD2014-2(Answer)TestBCD2014-2(Answer)
TestBCD2014-2(Answer)Yong Heui Cho
 
2013 mcu( 마이크로컨트롤러 ) 수업자료 3
2013 mcu( 마이크로컨트롤러 ) 수업자료 32013 mcu( 마이크로컨트롤러 ) 수업자료 3
2013 mcu( 마이크로컨트롤러 ) 수업자료 3진우 김
 
Cubietruck 리눅스 이미지 설치
Cubietruck 리눅스 이미지 설치Cubietruck 리눅스 이미지 설치
Cubietruck 리눅스 이미지 설치ymtech
 
IoT with Raspberry Pi + Node JS - Chapter 2
IoT with Raspberry Pi + Node JS - Chapter 2IoT with Raspberry Pi + Node JS - Chapter 2
IoT with Raspberry Pi + Node JS - Chapter 2Park Jonggun
 
콩테크 비콘 외 하드웨어 카탈로그(kongtech hardware catalog)
콩테크 비콘 외 하드웨어 카탈로그(kongtech hardware catalog)콩테크 비콘 외 하드웨어 카탈로그(kongtech hardware catalog)
콩테크 비콘 외 하드웨어 카탈로그(kongtech hardware catalog)콩테크(kongtech)
 
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoLinux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoMario Cho
 
광운대[바람] 1.vhdl intro
광운대[바람] 1.vhdl intro광운대[바람] 1.vhdl intro
광운대[바람] 1.vhdl introNAVER D2
 
TestBCD2013-1(answer)
TestBCD2013-1(answer)TestBCD2013-1(answer)
TestBCD2013-1(answer)Yong Heui Cho
 
백업을 위한 USB운영체제 완료세미나
백업을 위한 USB운영체제 완료세미나백업을 위한 USB운영체제 완료세미나
백업을 위한 USB운영체제 완료세미나Daniel Shin
 
NodeMcu로 시작하는 사물인터넷 DIY
NodeMcu로 시작하는 사물인터넷 DIYNodeMcu로 시작하는 사물인터넷 DIY
NodeMcu로 시작하는 사물인터넷 DIYHakyong Kim
 
Quick start guide-mango-am335x
Quick start guide-mango-am335xQuick start guide-mango-am335x
Quick start guide-mango-am335x종인 전
 
02. led switch
02. led switch02. led switch
02. led switch성호 정
 
Smartwatch block
Smartwatch blockSmartwatch block
Smartwatch block남억 김
 
2013 mcu( 마이크로컨트롤러 ) 수업자료 2
2013 mcu( 마이크로컨트롤러 ) 수업자료 22013 mcu( 마이크로컨트롤러 ) 수업자료 2
2013 mcu( 마이크로컨트롤러 ) 수업자료 2진우 김
 
Arduino 소개, RC카 만들기
Arduino 소개, RC카 만들기Arduino 소개, RC카 만들기
Arduino 소개, RC카 만들기Ji Hun Kim
 
TestBCD2017-1(answer)
TestBCD2017-1(answer)TestBCD2017-1(answer)
TestBCD2017-1(answer)Yong Heui Cho
 
Mikrotic CCR1036 라우팅 설정
Mikrotic CCR1036 라우팅 설정Mikrotic CCR1036 라우팅 설정
Mikrotic CCR1036 라우팅 설정ymtech
 
TestBCD2013-2(answer)
TestBCD2013-2(answer)TestBCD2013-2(answer)
TestBCD2013-2(answer)Yong Heui Cho
 
TestBCD2018-1(answer)
TestBCD2018-1(answer)TestBCD2018-1(answer)
TestBCD2018-1(answer)Yong Heui Cho
 
iWorks 아이웍스의 비즈니스, IBM Power Chip(CPU)에 대하여
iWorks 아이웍스의 비즈니스, IBM Power Chip(CPU)에 대하여iWorks 아이웍스의 비즈니스, IBM Power Chip(CPU)에 대하여
iWorks 아이웍스의 비즈니스, IBM Power Chip(CPU)에 대하여아이웍스 | iWorks Inc.
 

Semelhante a Caanoo cofiguration and u boot (20)

TestBCD2014-2(Answer)
TestBCD2014-2(Answer)TestBCD2014-2(Answer)
TestBCD2014-2(Answer)
 
2013 mcu( 마이크로컨트롤러 ) 수업자료 3
2013 mcu( 마이크로컨트롤러 ) 수업자료 32013 mcu( 마이크로컨트롤러 ) 수업자료 3
2013 mcu( 마이크로컨트롤러 ) 수업자료 3
 
Cubietruck 리눅스 이미지 설치
Cubietruck 리눅스 이미지 설치Cubietruck 리눅스 이미지 설치
Cubietruck 리눅스 이미지 설치
 
IoT with Raspberry Pi + Node JS - Chapter 2
IoT with Raspberry Pi + Node JS - Chapter 2IoT with Raspberry Pi + Node JS - Chapter 2
IoT with Raspberry Pi + Node JS - Chapter 2
 
콩테크 비콘 외 하드웨어 카탈로그(kongtech hardware catalog)
콩테크 비콘 외 하드웨어 카탈로그(kongtech hardware catalog)콩테크 비콘 외 하드웨어 카탈로그(kongtech hardware catalog)
콩테크 비콘 외 하드웨어 카탈로그(kongtech hardware catalog)
 
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoLinux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
 
광운대[바람] 1.vhdl intro
광운대[바람] 1.vhdl intro광운대[바람] 1.vhdl intro
광운대[바람] 1.vhdl intro
 
TestBCD2013-1(answer)
TestBCD2013-1(answer)TestBCD2013-1(answer)
TestBCD2013-1(answer)
 
백업을 위한 USB운영체제 완료세미나
백업을 위한 USB운영체제 완료세미나백업을 위한 USB운영체제 완료세미나
백업을 위한 USB운영체제 완료세미나
 
NodeMcu로 시작하는 사물인터넷 DIY
NodeMcu로 시작하는 사물인터넷 DIYNodeMcu로 시작하는 사물인터넷 DIY
NodeMcu로 시작하는 사물인터넷 DIY
 
Quick start guide-mango-am335x
Quick start guide-mango-am335xQuick start guide-mango-am335x
Quick start guide-mango-am335x
 
02. led switch
02. led switch02. led switch
02. led switch
 
Smartwatch block
Smartwatch blockSmartwatch block
Smartwatch block
 
2013 mcu( 마이크로컨트롤러 ) 수업자료 2
2013 mcu( 마이크로컨트롤러 ) 수업자료 22013 mcu( 마이크로컨트롤러 ) 수업자료 2
2013 mcu( 마이크로컨트롤러 ) 수업자료 2
 
Arduino 소개, RC카 만들기
Arduino 소개, RC카 만들기Arduino 소개, RC카 만들기
Arduino 소개, RC카 만들기
 
TestBCD2017-1(answer)
TestBCD2017-1(answer)TestBCD2017-1(answer)
TestBCD2017-1(answer)
 
Mikrotic CCR1036 라우팅 설정
Mikrotic CCR1036 라우팅 설정Mikrotic CCR1036 라우팅 설정
Mikrotic CCR1036 라우팅 설정
 
TestBCD2013-2(answer)
TestBCD2013-2(answer)TestBCD2013-2(answer)
TestBCD2013-2(answer)
 
TestBCD2018-1(answer)
TestBCD2018-1(answer)TestBCD2018-1(answer)
TestBCD2018-1(answer)
 
iWorks 아이웍스의 비즈니스, IBM Power Chip(CPU)에 대하여
iWorks 아이웍스의 비즈니스, IBM Power Chip(CPU)에 대하여iWorks 아이웍스의 비즈니스, IBM Power Chip(CPU)에 대하여
iWorks 아이웍스의 비즈니스, IBM Power Chip(CPU)에 대하여
 

Mais de jumiss

Zi log quickguide_eng
Zi log quickguide_engZi log quickguide_eng
Zi log quickguide_engjumiss
 
Pb 100 영문
Pb 100 영문Pb 100 영문
Pb 100 영문jumiss
 
Brochure 32 page-english
Brochure 32 page-englishBrochure 32 page-english
Brochure 32 page-englishjumiss
 
Rex karaⅱ eng
Rex karaⅱ engRex karaⅱ eng
Rex karaⅱ engjumiss
 
Rex karaⅱ eng
Rex karaⅱ engRex karaⅱ eng
Rex karaⅱ engjumiss
 
Proposal kropsson nfc
Proposal kropsson nfcProposal kropsson nfc
Proposal kropsson nfcjumiss
 
rex-kara II Brochure 32 page-english
rex-kara II Brochure 32 page-englishrex-kara II Brochure 32 page-english
rex-kara II Brochure 32 page-englishjumiss
 
Wiz manual(chn)
Wiz manual(chn)Wiz manual(chn)
Wiz manual(chn)jumiss
 
Wiz manual(kor)
Wiz manual(kor)Wiz manual(kor)
Wiz manual(kor)jumiss
 
Wiz manual(usa)
Wiz manual(usa)Wiz manual(usa)
Wiz manual(usa)jumiss
 
Hud mx2 en
Hud mx2 enHud mx2 en
Hud mx2 enjumiss
 
2013 new kropsson waterproof splash
2013 new kropsson waterproof splash2013 new kropsson waterproof splash
2013 new kropsson waterproof splashjumiss
 
Kropsson cd 850
Kropsson cd 850Kropsson cd 850
Kropsson cd 850jumiss
 
Kropsson cd 750max
Kropsson cd 750maxKropsson cd 750max
Kropsson cd 750maxjumiss
 
Kropsson cd aero
Kropsson cd aeroKropsson cd aero
Kropsson cd aerojumiss
 
Kropsson install guide2013
Kropsson install guide2013Kropsson install guide2013
Kropsson install guide2013jumiss
 
Fv726 user manual (eng)
Fv726 user manual (eng)Fv726 user manual (eng)
Fv726 user manual (eng)jumiss
 
Fv726 user manual (eng)
Fv726 user manual (eng)Fv726 user manual (eng)
Fv726 user manual (eng)jumiss
 
Km s200 manual-20110922
Km s200 manual-20110922Km s200 manual-20110922
Km s200 manual-20110922jumiss
 
Nexusone userguide
Nexusone userguideNexusone userguide
Nexusone userguidejumiss
 

Mais de jumiss (20)

Zi log quickguide_eng
Zi log quickguide_engZi log quickguide_eng
Zi log quickguide_eng
 
Pb 100 영문
Pb 100 영문Pb 100 영문
Pb 100 영문
 
Brochure 32 page-english
Brochure 32 page-englishBrochure 32 page-english
Brochure 32 page-english
 
Rex karaⅱ eng
Rex karaⅱ engRex karaⅱ eng
Rex karaⅱ eng
 
Rex karaⅱ eng
Rex karaⅱ engRex karaⅱ eng
Rex karaⅱ eng
 
Proposal kropsson nfc
Proposal kropsson nfcProposal kropsson nfc
Proposal kropsson nfc
 
rex-kara II Brochure 32 page-english
rex-kara II Brochure 32 page-englishrex-kara II Brochure 32 page-english
rex-kara II Brochure 32 page-english
 
Wiz manual(chn)
Wiz manual(chn)Wiz manual(chn)
Wiz manual(chn)
 
Wiz manual(kor)
Wiz manual(kor)Wiz manual(kor)
Wiz manual(kor)
 
Wiz manual(usa)
Wiz manual(usa)Wiz manual(usa)
Wiz manual(usa)
 
Hud mx2 en
Hud mx2 enHud mx2 en
Hud mx2 en
 
2013 new kropsson waterproof splash
2013 new kropsson waterproof splash2013 new kropsson waterproof splash
2013 new kropsson waterproof splash
 
Kropsson cd 850
Kropsson cd 850Kropsson cd 850
Kropsson cd 850
 
Kropsson cd 750max
Kropsson cd 750maxKropsson cd 750max
Kropsson cd 750max
 
Kropsson cd aero
Kropsson cd aeroKropsson cd aero
Kropsson cd aero
 
Kropsson install guide2013
Kropsson install guide2013Kropsson install guide2013
Kropsson install guide2013
 
Fv726 user manual (eng)
Fv726 user manual (eng)Fv726 user manual (eng)
Fv726 user manual (eng)
 
Fv726 user manual (eng)
Fv726 user manual (eng)Fv726 user manual (eng)
Fv726 user manual (eng)
 
Km s200 manual-20110922
Km s200 manual-20110922Km s200 manual-20110922
Km s200 manual-20110922
 
Nexusone userguide
Nexusone userguideNexusone userguide
Nexusone userguide
 

Caanoo cofiguration and u boot

  • 1. CAANOO 시스템 개요 및 U-boot 분석 2010.11.10
  • 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
  • 27. 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
  • 28. 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
  • 29. 5. CAANOO boot 5.5.3 실제 카누 Initialize 코드 분석 1) DRAM 설정 MEMORY CONFIGURATION REGISTER(MEMCFG) MCU-A:C001_4800h 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() ); ; GPH
  • 30. 5. CAANOO boot 2) NAND FLASH 설정 GPH
  • 31. 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
  • 32. 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
  • 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