- EVM Board 구성
- BOARD-NAME: DM8128-IPNC
- BOARD-VER :
- RAM Type : K4B1G1646E
- RAM Size : 2 x (16x 64M, 1Gb) = 2Gb = 256MB
이 오래된 모델을 대학원 교육용으로 팔기위해서 간단히 설정정리한다.
TI의 Sitara 기준으로 간단히 설명
https://ahyuo79.blogspot.com/search/label/RAM-DRAM
2.1 Uboot 설정 및 CCS TEST
아래사이트의 두 항목을 보고 쉽게 수정이 가능하며, CCS TEST 가능하다
- Modifying U-Boot
- Register to U-Boot Macro Definition Mapping Table
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 조절에 관한 내용이 있음
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 설정
$ 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를 사용가능
- 확인사항들
DDR_M: CPU의 Version에 따라 666 or 800 되지만, PG2_1 이기에, 800 사용
2. CLKOUT : [M /(N+1)] * CLKINP * [1/M2]
3. CLKOUT: DDR0_PHY Clock, DDR1_PHYClock, DMM clock and EMIFmclk.
- 관련내용 (SPRUGZ8F.pdf)
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 관련 설정
https://docs.google.com/spreadsheets/d/1ZXFmWqTe1SLkZ-KmxYmUkfUR1GQwOV-Pms0-Fj7J1xA/edit?usp=sharing
- AM43xx용
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를 함.
댓글 없음 :
댓글 쓰기