8/17/2015

Uboot DRAM 설정 (DM812x)

1. DM8128 의 EVM의 구성 

  • EVM Board 구성
  1. BOARD-NAME: DM8128-IPNC
  2. BOARD-VER   :
  3. RAM Type     : K4B1G1646E
  4. RAM Size      :  2 x (16x 64M, 1Gb) = 2Gb = 256MB 

이 오래된 모델을 대학원 교육용으로 팔기위해서 간단히 설정정리한다.

2. RAM의 기본이해 및 다른 SOC Setting 

TI의 Sitara 기준으로 간단히 설명
  https://ahyuo79.blogspot.com/search/label/RAM-DRAM

2.1 Uboot 설정 및 CCS TEST

아래사이트의 두 항목을 보고 쉽게 수정이 가능하며, CCS TEST 가능하다

  1. Modifying U-Boot
  2. Register to U-Boot Macro Definition Mapping Table
  http://processors.wiki.ti.com/index.php/TI814x-DDR3-Init-U-Boot

2.2 DRAM의 SW Leveling 

만약, DDR의 선로의 길이 확장으로 인해 SW-Leveling 사용해야한다면, 아래부분 참조
Leveling은 대해 좀더 알고 싶다면 상위 RAM부분을 읽어보고 파악하자

  http://processors.wiki.ti.com/index.php/TI814x-DDR3-Init-U-Boot_Wordwise_SWleveling

2.3 DDR Power Optimization

  Docs/Application_Notes/IPNC_RDK_Power_Optimization.pdf

  • DM8127 전체 Power 조절에 관한 내용이 있음
       1. Interleaving 문제로 16bit로 두개연결이 성능이 가장 뛰어남.
       2. DeepSleep과 IO Power optimization 부분 및 VTP 조절

 
3. DDR 관련 설정 


$ cd ~/dm8127/work/Source/ti_tools/ipnc_psp_04_04_00_01/u-boot 
  • DM8127 CONFIG 

$ vi include/config.h
$ vi include/configs/ti8148_ipnc.h

  • DDR관련소스 

$ vi ./board/ti/ti8148_ipnc/evm.c


3.1 Uboot의 DRAM SOURCE


  • DDR 설정 관련소스
$ vi board/ti/ti8148_ipnc/evm.c
                dram_init                  // 확장시 확인 필요
                is_ddr3()                  // ddr3 동작 , return 1
                config_ti814x_ddr()        // 이 부분 설정
                ddr_pll_config()           // CLOCK 변경 ,DDR_PLL_533

  • 설정부분 
arch/arm/include/asm/arch-ti81xx/ddr_defs_ti814x.h      // 설정값 변경
arch/arm/include/asm/arch-ti81xx/clocks_ti814x.h        // DDR_M


3.2 Uboot DDR Timing 설정 및 Clock 설정

  • DDR TIMING 및 CONFIG 부분

$ vi arch/arm/include/asm/arch-ti81xx/ddr_defs_ti814x.h 
....
#else //CONFIG_DM385_DDR3_533

/* TI814X DDR3 EMIF CFG Registers values 400MHz */
#define DDR3_EMIF_READ_LATENCY          0x00170208   //RD_ODT=0x2, IDLE_ODT=0x0, Dynamic power_down enabled
#define DDR3_EMIF_TIM1                  0x0AAAD4DB
#define DDR3_EMIF_TIM2                  0x682F7FDA
#define DDR3_EMIF_TIM3                  0x501F82BF
#define DDR3_EMIF_REF_CTRL              0x00000C30
#define DDR3_EMIF_SDRAM_CONFIG          0x61C011B2
#define DDR3_EMIF_SDRAM_ZQCR            0x50074BE1

#endif

        아래는 U-BOOT Name과 Reg-Name 및 OFFSet을 간단히 Mapping 하였습니다.

#define EMIF4_0_CFG_BASE                0x4C000000
#define EMIF4_1_CFG_BASE                0x4D000000
          U-BOOT Name                   Reg-Name     OFFSET
#define DDR3_EMIF_READ_LATENCY          DDRPHYCR      (E4h)
#define DDR3_EMIF_TIM1                  SDRTIM1       (18h)
#define DDR3_EMIF_TIM2                  SDRTIM2       (20h)
#define DDR3_EMIF_TIM3                  SDRTIM3       (28h) 
#define DDR3_EMIF_REF_CTRL              SDRRCR        (10h)
#define DDR3_EMIF_SDRAM_CONFIG          SDRCR         (08h) 
#define DDR3_EMIF_SDRAM_ZQCR            ZQCR          (C8h)

  • DDR CLOCK 설정 
현재 DDR_PLL_533 정의되어있으나, 400MHz 동작됨 


$ vi arch/arm/include/asm/arch-ti81xx/clocks_ti814x.h

#define DDR_PLL_533     /* Values supported 400,533 */
.....
#define DDR_N           19
#ifdef CONFIG_DM385
/* DDR PLL */
/* For 400 MHz */
#if defined(DDR_PLL_400)
#define DDR_M           (opp_val_dm385(800, 800))
#endif

/* For 533 MHz */
#if defined(DDR_PLL_533)
#define DDR_M       (opp_val_dm385(1066, 1066))
#endif
#else
#define DDR_M           (pg_val_ti814x(666, 800))
#endif
#define DDR_M2          2
#define DDR_CLKCTRL     0x801
$ vi ./board/ti/ti8148_ipnc/evm.c

static void ddr_pll_config()
{
        pll_config(DDR_PLL_BASE,
                        DDR_N, DDR_M,
                        DDR_M2, DDR_CLKCTRL);
}


 AM437x 와 유사하며, maxium frequecies를 확인을 반드시 확인하자.
 일반적은 Maximum Clock 400MHz이며, overclock해서 533MHz를 사용가능

  • 확인사항들 
         위 부분은 TI DM814x의 SPRUGZ8F와 회로도를 참고하여, 위 설정값을 변경하자.
         DDR_M: CPU의 Version에 따라 666 or 800 되지만, PG2_1 이기에,  800 사용
         1. DEVOSC_MX0 : APPRO 회로도에서 20MHz 확인 (DEVOSC_MX0=CLKINP)
         2. CLKOUT    : [M /(N+1)] * CLKINP * [1/M2]
                            **    800/20 * 20*1/2 = 400 MHz   최종 CLOCK
         3. CLKOUT: DDR0_PHY Clock, DDR1_PHYClock, DMM clock and EMIFmclk.

  • 관련내용 (SPRUGZ8F.pdf)

             2.3.5 DDR PLL Clock
             2.5.3 DPLLS Clock Function 참조
             8.4.10 Module Clock (Maximum Clock 확인)
             8.2.2.1 DVFS ( Maximum Clock 확인)
           

3.3 DDR3 Datasheet Timing 


  • K4B1G1646E 의 TIMING 

  • DDR3로 16bit로 연결시 




TI에서는 손쉽게 Timing 설정이 가능하도록 Tool을 제공을 한다.

  • DM8127 관련 설정 
AM43xx 용을 고쳐서 DM8127용으로 내가 새로 만들었다.
  https://docs.google.com/spreadsheets/d/1ZXFmWqTe1SLkZ-KmxYmUkfUR1GQwOV-Pms0-Fj7J1xA/edit?usp=sharing


  • AM43xx용 
  https://drive.google.com/open?id=0B_ehveuLi8MVV1lXaW0zLTZ1ZVE


4. DDR설정 및 확인

DM8127는 EMIF에 현재 16bit 모드로 연결되어 있기때문에 아래와 같이 EMIF를 개별로 각각 설정을 해줘야 한다. (EMIF0, EMIF1)

$ vi arch/arm/include/asm/arch-ti81xx/cpu.h

#define EMIF4_0_CFG_BASE                0x4C000000
#define EMIF4_1_CFG_BASE                0x4D000000

.....

#define EMIF4_0_SDRAM_ZQCR              (EMIF4_0_CFG_BASE + 0xC8)
#define EMIF4_0_SDRAM_CONFIG            (EMIF4_0_CFG_BASE + 0x08)
#define EMIF4_0_SDRAM_CONFIG2           (EMIF4_0_CFG_BASE + 0x0C)
#define EMIF4_0_SDRAM_REF_CTRL          (EMIF4_0_CFG_BASE + 0x10)
#define EMIF4_0_SDRAM_REF_CTRL_SHADOW   (EMIF4_0_CFG_BASE + 0x14)
#define EMIF4_0_SDRAM_TIM_1             (EMIF4_0_CFG_BASE + 0x18)
#define EMIF4_0_SDRAM_TIM_1_SHADOW      (EMIF4_0_CFG_BASE + 0x1C)
#define EMIF4_0_SDRAM_TIM_2             (EMIF4_0_CFG_BASE + 0x20)
#define EMIF4_0_SDRAM_TIM_2_SHADOW      (EMIF4_0_CFG_BASE + 0x24)
#define EMIF4_0_SDRAM_TIM_3             (EMIF4_0_CFG_BASE + 0x28)
#define EMIF4_0_SDRAM_TIM_3_SHADOW      (EMIF4_0_CFG_BASE + 0x2C)
#define EMIF4_0_DDR_PHY_CTRL_1          (EMIF4_0_CFG_BASE + 0xE4)
#define EMIF4_0_DDR_PHY_CTRL_1_SHADOW   (EMIF4_0_CFG_BASE + 0xE8)
#define EMIF4_0_IODFT_TLGC              (EMIF4_0_CFG_BASE + 0x60)

#ifndef CONFIG_DM385
#define EMIF4_1_SDRAM_ZQCR              (EMIF4_1_CFG_BASE + 0xC8)
#define EMIF4_1_SDRAM_CONFIG            (EMIF4_1_CFG_BASE + 0x08)
#define EMIF4_1_SDRAM_CONFIG2           (EMIF4_1_CFG_BASE + 0x0C)
#define EMIF4_1_SDRAM_REF_CTRL          (EMIF4_1_CFG_BASE + 0x10)
#define EMIF4_1_SDRAM_REF_CTRL_SHADOW   (EMIF4_1_CFG_BASE + 0x14)
#define EMIF4_1_SDRAM_TIM_1             (EMIF4_1_CFG_BASE + 0x18)
#define EMIF4_1_SDRAM_TIM_1_SHADOW      (EMIF4_1_CFG_BASE + 0x1C)
#define EMIF4_1_SDRAM_TIM_2             (EMIF4_1_CFG_BASE + 0x20)
#define EMIF4_1_SDRAM_TIM_2_SHADOW      (EMIF4_1_CFG_BASE + 0x24)
#define EMIF4_1_SDRAM_TIM_3             (EMIF4_1_CFG_BASE + 0x28)
#define EMIF4_1_SDRAM_TIM_3_SHADOW      (EMIF4_1_CFG_BASE + 0x2C)
#define EMIF4_1_DDR_PHY_CTRL_1          (EMIF4_1_CFG_BASE + 0xE4)
#define EMIF4_1_DDR_PHY_CTRL_1_SHADOW   (EMIF4_1_CFG_BASE + 0xE8)
#define EMIF4_1_IODFT_TLGC              (EMIF4_1_CFG_BASE + 0x60)
#endif
$ vi board/ti/ti8148_ipnc/evm.c

static void config_ti814x_ddr(void)
{
....

 /*Program EMIF0 CFG Registers*/
                __raw_writel(DDR3_EMIF_READ_LATENCY, EMIF4_0_DDR_PHY_CTRL_1);
                __raw_writel(DDR3_EMIF_READ_LATENCY, EMIF4_0_DDR_PHY_CTRL_1_SHADOW);
                __raw_writel(DDR3_EMIF_TIM1, EMIF4_0_SDRAM_TIM_1);
                __raw_writel(DDR3_EMIF_TIM1, EMIF4_0_SDRAM_TIM_1_SHADOW);
                __raw_writel(DDR3_EMIF_TIM2, EMIF4_0_SDRAM_TIM_2);
                __raw_writel(DDR3_EMIF_TIM2, EMIF4_0_SDRAM_TIM_2_SHADOW);
                __raw_writel(DDR3_EMIF_TIM3, EMIF4_0_SDRAM_TIM_3);
                __raw_writel(DDR3_EMIF_TIM3, EMIF4_0_SDRAM_TIM_3_SHADOW);
                __raw_writel(DDR3_EMIF_SDRAM_CONFIG, EMIF4_0_SDRAM_CONFIG);

....

/*Program EMIF1 CFG Registers*/
                __raw_writel(DDR3_EMIF_READ_LATENCY, EMIF4_1_DDR_PHY_CTRL_1);
                __raw_writel(DDR3_EMIF_READ_LATENCY, EMIF4_1_DDR_PHY_CTRL_1_SHADOW);
                __raw_writel(DDR3_EMIF_TIM1, EMIF4_1_SDRAM_TIM_1);
                __raw_writel(DDR3_EMIF_TIM1, EMIF4_1_SDRAM_TIM_1_SHADOW);
                __raw_writel(DDR3_EMIF_TIM2, EMIF4_1_SDRAM_TIM_2);
                __raw_writel(DDR3_EMIF_TIM2, EMIF4_1_SDRAM_TIM_2_SHADOW);
                __raw_writel(DDR3_EMIF_TIM3, EMIF4_1_SDRAM_TIM_3);
                __raw_writel(DDR3_EMIF_TIM3, EMIF4_1_SDRAM_TIM_3_SHADOW);
                __raw_writel(DDR3_EMIF_SDRAM_CONFIG, EMIF4_1_SDRAM_CONFIG);

....

}

위와 같이 변경후, DDR 설정은 SPL에서 진행이 되므로, SPL 변경 후, TEST를 진행하자.

SPL 파일:  u-boot.min.sd을 MLO 변경후 SDIMAGE 생성후 TEST   각 REGISTER 확인은 아래와 같이, md 명령으로 확인 (boot가 될 경우)

* SPL도 기본 U-BOOT 명령은 동작한다.
TI-MIN# md 0x4C000018
TI8148_IPNC# md 0x4C000018 


AM437x DDR 의 AC Timing 설정 TOOL을 DM8127에 맞게 수정하고 SDBOOT로 변경하고 이값으로 기본적으로 TEST를 함.

댓글 없음 :