8/05/2015

AM437x Uboot DRAM 설정 및 확인사항

1. AM437x EVM의 구성

  • BOARD-NAME: AM43__GP 
  • BOARD-VER   : 1.4   
  • RAM TYPE : MT41K512M8RH-125 (CS0 PIN ONLY)   
  • RAM SIZE :  4 x (64 Meg x 8 x 8 banks, 4Gb) = 16Gb = 2 GB   
  http://processors.wiki.ti.com/index.php/AM437X_EVM_Boards


DRAM-1 Module RAM의 구성과 Type 및 각 용어 설명

DRAM-2 Memory의 성능향상 방법 Bank Interleaving 과 Burst Mode 및 DLL

DRAM-3 AC-Timing AM437x 적용 (TI-TOOL사용)
  https://ahyuo79.blogspot.com/2015/07/ram.html



2. AM437x DDR3 CONFIG TI-GUIDE 

  http://processors.wiki.ti.com/index.php/AM437x_DDR_Configuration_and_Programming_Guide

상위 사이트에서 다 주위깊게 봐야겠지만, U-BOOT에서 기본적으로 자동으로 설정을
하기에, 아래 부분을 주의깊게 봐야겠다.

  • EMIF General Configuration Registers
  • DDR PHY Control Register   ---> 
  • AC Timing Registers (TI에서 Excel을 제공) 
  • Setting Refresh rate 

Power Consumption (옵션)
  • Internal DDR Clocks ( DLL Clock을 사용한다면, 현재 미사용)

3. Uboot DDR CLOCK 설정

DDR 설정은 현재 400MHz 나오며, 이는 외부 오실레이터에 의해 결정된다. (24MHz)
CLOCK부분과 POWER쪽에 전체적인 완벽한 이해는 추후 다시한번해야함.

  • SoC PLL 설정 전체구조

  • PLL의 DDR PLL 구조 


PLL의 INPUT CLOCK은 우선 PRCM.CM_CLKSEL_DPLL_DDR.DPLL_BYP_CLKSEL의 의해  CLKINP or CLKINPULOW 결정되고 (CLKINPULOW는 PM사용시 사용),
            ALT_CLK0,1 TEST 목적으로 사용
            Master OSC : 19.2/24/25/26 MHz  ( 회로도 확인: OSC0 24MHz )

  • EMIF-CLOCK (EMIF Maximum Frequency)

위와 같이 400MHz 동작하지만, Micron DDR3는 이보다 더 지원이 가능함.


3.1 Uboot DDR Clock  


* board/ti/am43xx/board.c
       gp_evm_dpll_ddr
* arch/arm/cpu/armv7/am33xx/clock.c
       setup_dplls->get_dpll_ddr_params()

struct dpll_params {
        u32 m;  //PRCM_CM_CLKSEL_DPLL_DDR->DPLL_MULT 
        u32 n;  //PRCM_CM_CLKSEL_DPLL_DDR->DPLL_DIV  
        s8 m2;  
        s8 m3;  
        s8 m4;    
        s8 m5;  
        s8 m6;
};  

Power Management에 의해 아래와 같이 4가지 모드로 설정이 가능하지만,
GP EVM은 한가지모드로 설정로 설정하여 사용.

const struct dpll_params epos_evm_dpll_ddr[NUM_CRYSTAL_FREQ] = {
                {665, 47, 1, -1, 4, -1, -1}, /*19.2*/
                {133, 11, 1, -1, 4, -1, -1}, /* 24 MHz */
                {266, 24, 1, -1, 4, -1, -1}, /* 25 MHz */
                {133, 12, 1, -1, 4, -1, -1}  /* 26 MHz */
};
// 회로도에서 Input 24MHz 확인 
const struct dpll_params gp_evm_dpll_ddr = {
                50, 2, 1, -1, 2, -1, -1};      // 상위 dpll_params 참조 


3.2 DDR PLL의 계산방법
    TI의 Reference Manual 와 상위 소스 기반으로 설정을 하면된다.

    1. CLKOUT       :  [M / (N+1)] * CLKINP * [1/M2]  = 266MHz
    2. CLKDCOLDO :  2 * [M / (N+1)] * CLKINP         = 532MHz

    GP_BOARD의 경우 다음과 같이 설정
      상위 gp_evm_dpll_ddr기반으로 계산
                  50 / (2+1) * 24 /(1) = 400MHz (OSC: 회로도 확인 24MHz)


    • TI Manual 참고
    1. 6.6.3.1 Clock Functions
    2. 6.6.11 DDR PLL Description ( 666MHz 로 되나, M2 1이면 반으로 됨)
    3. PRCM_CM_CLKSEL_DPLL_DDR

          m2= DFI_CLK (차분CLK),
          m4= DLL CLK 지원


    4. DDR Timing 및 Config 설정

    • DDR3 EMIF PINMAP 
    현재 8bit로 4개로 DDR3 4개가 연결이 되어있으며, 최대 16 bank를 interleaving 가능하므로, 4개는 의미가 없다. (2개가 최적,  2x16bit 가 최적)

    위와 보다시피 , Embeded는 ODT는 사용하지 않는다.

    4.1 Uboot DDR Timing source 
    • Main 관련설정 source 
                   board/ti/am43xx/board.c
                   sdram_init() ->  config_ddr -> set_sdram_timings() // DDR Timing

    • 기타 관련설정 source       
                  arch/arm/include/asm/arch-am33xx/ddr_defs.h
                  arch/arm/cpu/armv7/am33xx/ddr.c
                  arch/arm/cpu/armv7/am33xx/emif4.c


    4.2 Uboot EMIF Config 및 Timing 
    쉽게 설정이 변경이 가능하며, 아래의 Register로 쉽게 Timing 과 Config를 변경하자.

    GP_EVM은 3가지 Version이 존재함 (현재 1.4용)
     
    const struct emif_regs ddr3_emif_regs_400Mhz_production = {
     .sdram_config   = 0x638413B2,
     .ref_ctrl   = 0x00000C30,
     .sdram_tim1   = 0xEAAAD4DB,
     .sdram_tim2   = 0x266B7FDA,
     .sdram_tim3   = 0x107F8678,
     .read_idle_ctrl   = 0x00050000,
     .zq_config   = 0x50074BE4,
     .temp_alert_config  = 0x0,
     .emif_ddr_phy_ctlr_1  = 0x0E004008,
     .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
     .emif_ddr_ext_phy_ctrl_2 = 0x00000066,//
     .emif_ddr_ext_phy_ctrl_3 = 0x00000091,//
     .emif_ddr_ext_phy_ctrl_4 = 0x000000B9,//
     .emif_ddr_ext_phy_ctrl_5 = 0x000000E6,//
     .emif_rd_wr_exec_thresh  = 0x80000405,//
     .emif_prio_class_serv_map = 0x80000001,
     .emif_connect_id_serv_1_map = 0x80000094,
     .emif_connect_id_serv_2_map = 0x00000000,
     .emif_cos_config  = 0x000FFFFF
    };
    


    각 설정을 MT41K512M8RH-125 데이타 시트와 비교하고,DDR3 SDRAM Initialization을 확인하자

    • EMIF의 관련 설정 
    EMIF의 Config 및 Timing, Refresh Register 기반으로 DDR register를 설정을 하기에 설정을 확인을하자.


     
    EMIF4D_SDRAM_CONFIG 0x638413B2  
            SDRAM_TYPE      3 (DDR3)                          SDRAM Type selection.
            IBANK_POS       0 (Decimal)                       Internal bank position. 
            DDR_TERM        3 (RZQ/6)                         DDR3 termination resistor value.  
            LPDDR2_DDQS     1 (differential DQS)              LPDDR2 differential DQS enable.
            DYN_ODT         0 (Turn off DYN_ODT)              DDR3 Dynamic ODT. 
            DDR_DISABLE_DLL 0 (Disable DLL)                   Disable DLL select. 
            SDRAM_DRIVE     1 (Decimal)                       SDRAM drive strength.  0 for RZQ/6 , 1 for RZQ/7   
            CWL             0 (Decimal)                       DDR3 CAS Write latency.  
            NARROW_MODE     0 (32bit)                         SDRAM data bus width. 
            CL              4 (Decimal)                       CAS Latency. 
            ROWSIZE         7 (Decimal)                       Row Size. 
            IBANK           3 (Decimal)                       Internal Bank setup. 
            EBANK           0 (use pad_cs_o_n[0] only)        External chip select setup. 
            PAGESIZE        2 ((9 colum bits))                Page Size. 
    

    관련설정은 AC-TIMING 참고하여 설정하자

    AM437x에는 DDR에 많은기능이 추가되었지만, 사용하지 않으면 필요없다.
    * HW-LEVELING, DLL, 기타 등등