//DRAM_INFO __var DeviceType; __var Page; __var Bank; __var DqWidth; //DRAM_MODE_REG_INFO __var BstLen; __var BstType; __var Mode0Cas; __var Mode0Wr; __var Mode1DllEnN; __var Mode1AllLat; __var Mode2Cwl; //DRAM_TIMING_INFO, additional parameter, to config DRAM_TIMING INFO __var DramTimingTref; __var DramRowNum; __var Tck; //DRAM_TIMING_INFO __var TrfcPs; __var TrefiPs; __var WrMaxTck; __var TrcdPs; __var TrpPs; __var TrasPs; __var TrrdTck; __var TwrPs; __var TwtrTck; __var TmrdTck; __var TrtpTck; __var TccdTck; __var TrcPs; //DRAM_DEVICE_INFO __var DdrPeriodPs; __var DfiRate; __config_dram_param(){ __var CsBstLen; __var CasWr; __var CasRd; __var CasRdT; __var ClrSrt; __var AddLat; __var DramEmr2; __var DramMr0; __var CrTwr; __var DramMaxWr; __var DramWr; __var CrTrtw; __var CrTrtwT; __var DramPeriod; __var DdrType; //__var paDqWidth; //__var paPage; //__var paDfiRate __var tmp; // Register dram common.mac //__registerMacroFile("$PROJ_DIR$\\..\\..\\..\\component\\soc\\realtek\\8195a\\misc\\iar_utility\\common\\dram\\common.mac"); __load_dram_common(); // Load parameter __load_dram_param(); DfiRate = 1<> 1); if (((Mode0Cas) & 0x1) ) { CasRdT = CrlSrt+ 12; }else{ CasRdT = CrlSrt+ 4; } AddLat = 0; if (Mode1AllLat == 1) { // CL-1 AddLat = CasRd -1; } if (Mode1AllLat == 2){ // CL-2 AddLat = CasRd -2; } CasRd = CasRdT + AddLat; CasWr = Mode2Cwl + 5 + AddLat; DramEmr2 = Mode2Cwl << 3; DramWr = (DramWr + 1) / 2; if (DramWr == 16) { DramWr = 0; } if (DramWr <= 9) { // 5< wr <= 9 DramWr = DramWr - 4; } DramMr0 =(DramWr<<(8+1))|(0<<8)|((Mode0Cas>>1)<<4)|(BstType<<3)|((Mode0Cas&0x1)<<2)|DramMr0; CrTrtwT = (CasRdT + 6) - CasWr; } if (DeviceType == 8){ DdrType = 8; if (BstLen == 0) { DramMr0 = 2; // bst_4 CsBstLen = 0; //bst_4 CasRd = 0x2; } else { DramMr0 = 3; // bst_8 CsBstLen = 1; // bst_8 CasRd = 0x3; } CasWr = 0; DramMr0 =(CasRd<<4)|(BstType<<3)|DramMr0; CrTrtwT = 0; // tic: CasRd + rd_rtw + rd_pipe } // countting tRTW if ((CrTrtwT & 0x1)) { CrTrtw = (CrTrtwT+1) /(DfiRate); } else { CrTrtw = CrTrtwT /(DfiRate); } DqWidth = DqWidth; Page = Page +1; // DQ16 -> memory:byte_unit *2 if (DqWidth == 1) { // paralle dq_16 => Page + 1 Page = Page +1; } // REG_SDR_MISC tmp =(Page<<0)|(Bank<<4)|(CsBstLen<<6)|(DqWidth<<8); __writeMemory32(tmp, 0x40005224, "Memory"); __delay(10); // REG_SDR_DCR tmp =(0x2<<8)|(DqWidth<<4)|(DdrType<<0); __writeMemory32(tmp, 0x40005004, "Memory"); __delay(10); // REG_SDR_IOCR tmp =((CasRd-4)/(DfiRate)<<20)|(0<<17)|(((CasWr-3)/(DfiRate))<<12)|(0<<8); __writeMemory32(tmp, 0x40005008, "Memory"); __delay(10); if(DeviceType != 8){ tmp =DramEmr2; __writeMemory32(tmp, 0x40005028, "Memory"); __delay(10); tmp =(1<<2)|(1<<1)|(Mode1DllEnN); __writeMemory32(tmp, 0x40005024, "Memory"); __delay(10); } tmp =DramMr0; __writeMemory32(tmp, 0x40005020, "Memory"); __delay(10); tmp =(0<<28)|(9<<24)|((((TrefiPs)/DramPeriod)+1)<<8)|((((TrfcPs)/DramPeriod)+1)<<0); __writeMemory32(tmp, 0x40005010, "Memory"); __delay(10); tmp =((((TrtpTck)/DfiRate)+1)<<13)|(CrTwr<<9)|((((TrasPs)/DramPeriod)+1)<<4)|((((TrpPs)/DramPeriod)+1)<<0); __writeMemory32(tmp, 0x40005014, "Memory"); __delay(10); tmp =(CrTrtw << 20) | ((((TwtrTck)/DfiRate)+3) << 17) | ((((TccdTck)/DfiRate)+1) << 14) | ((((TrcdPs)/DramPeriod)+1) << 10) | ((((TrcPs)/DramPeriod)+1) << 4 ) | (((TrrdTck/DfiRate)+1) << 0); __writeMemory32(tmp, 0x40005018, "Memory"); __delay(10); tmp =(TmrdTck<<5)|(0<<4)|(2<<0); __writeMemory32(tmp, 0x4000501c, "Memory"); __delay(10); // Set Idle __writeMemory32(0x700, 0x4000500c, "Memory"); __delay(10); // start init __writeMemory32(0x1, 0x40005000, "Memory"); __delay(100); tmp = __readMemory32(0x40005000,"Memory"); __delay(10); // enter memory mode __writeMemory32(0x600, 0x4000500c, "Memory"); __delay(10); } __config_dram_param_fixed(){ __var tmp; // Dram Attribute __writeMemory32(0x1, 0x40005224, "Memory"); __delay(10); __writeMemory32(0x2c8, 0x40005004, "Memory"); __delay(10); __writeMemory32(0xffffd000, 0x40005008, "Memory"); __delay(10); __delay(3); __writeMemory32(0x22, 0x40005020, "Memory"); __delay(10); __delay(3); __writeMemory32(0x09032001, 0x40005010, "Memory"); __delay(10); __delay(3); __writeMemory32(0x2611, 0x40005014, "Memory"); __delay(10); __delay(3); __writeMemory32(0x68413, 0x40005018, "Memory"); __delay(10); __delay(3); __writeMemory32(0x42, 0x4000501c, "Memory"); __delay(10); __delay(3); // Enable __writeMemory32(0x700, 0x4000500c, "Memory"); __delay(10); __delay(20); __writeMemory32(0x1, 0x40005000, "Memory"); __delay(10); __delay(100); tmp = __readMemory32(0x40005000,"Memory"); __delay(10); __writeMemory32(0x600, 0x4000500c, "Memory"); __delay(10); __delay(30); } __mem_test(){ __var i; __var vaddr; __var tmp; i=0; while(i<10){ vaddr = 0x30000000+((i*23)&0x1FFFFC); __writeMemory32(0x55AA55AA, vaddr, "Memory"); tmp = __readMemory32(vaddr,"Memory"); if(tmp!=0x55AA55AA) return 1; i=i+1; } return 0; } __var ok_pipe_id0; __var ok_pipe_id1; __var ok_tpc_min0; __var ok_tpc_max0; __var ok_tpc_min1; __var ok_tpc_max1; __var tpc0_cnt; __var tpc1_cnt; // calibration result __var isCalibrationDone; __dram_calibration(){ __var rdp; __var tpc; __var rdp_reg; __var tpc_reg; __var err_cnt; __var ok_cnt; ok_cnt=0; ok_pipe_id0 = 15; ok_tpc_min0 = 12; ok_tpc_max0 = 0; rdp_reg = __readMemory32(0x40005008,"Memory")&0xFFFF00FF; tpc_reg = __readMemory32(0x40000300,"Memory")&0xFF00FFFF; for(rdp=0;(rdp<=7)&&(err_cnt==0||ok_cnt==0);rdp++){ err_cnt=0; // try pipe __writeMemory32(rdp_reg|rdp<<8,0x40005008, "Memory");__delay(10); for(tpc=0;(tpc<=12)&&(err_cnt<2);tpc++){ // try tpc __writeMemory32(tpc_reg|tpc<<16,0x40000300, "Memory");__delay(10); if(__mem_test()==0){ if(ok_pipe_id0==15) {ok_pipe_id0 = rdp; ok_cnt++;} if(ok_tpc_min0>tpc) ok_tpc_min0 = tpc; if(ok_tpc_max0tpc0_cnt){ __writeMemory32(rdp_reg|ok_pipe_id1<<8,0x40005008, "Memory");__delay(10); __writeMemory32(tpc_reg|(tpc1_cnt/2)<<16,0x40000300, "Memory");__delay(10); }else{ __writeMemory32(rdp_reg|ok_pipe_id0<<8,0x40005008, "Memory");__delay(10); __writeMemory32(tpc_reg|(tpc0_cnt/2)<<16,0x40000300, "Memory");__delay(10); } } __setup_system() { __var tmp; __hwReset(1); __writeMemory32(0x21, 0x40000014, "Memory"); __delay(10); __writeMemory32(0x1FC00002, 0x40000304, "Memory"); __delay(10); __writeMemory32(0x400, 0x40000250, "Memory"); __delay(10); __writeMemory32(0x0, 0x40000340, "Memory"); __delay(10); __writeMemory32(0xdcc4, 0x40000230, "Memory"); __delay(10); __writeMemory32(0x11117, 0x40000210, "Memory"); __delay(10); __writeMemory32(0x11157, 0x40000210, "Memory"); __delay(10); __writeMemory32(0x110011, 0x400002c0, "Memory"); __delay(10); __writeMemory32(0xffffffff, 0x40000320, "Memory"); __delay(10); __config_dram_param(); if(isCalibrationDone){ __var rdp_reg; __var tpc_reg; rdp_reg = __readMemory32(0x40005008,"Memory")&0xFFFF00FF; tpc_reg = __readMemory32(0x40000300,"Memory")&0xFF00FFFF; if(tpc1_cnt>tpc0_cnt){ __writeMemory32(rdp_reg|ok_pipe_id1<<8,0x40005008, "Memory");__delay(10); __writeMemory32(tpc_reg|(tpc1_cnt/2)<<16,0x40000300, "Memory");__delay(10); }else{ __writeMemory32(rdp_reg|ok_pipe_id0<<8,0x40005008, "Memory");__delay(10); __writeMemory32(tpc_reg|(tpc0_cnt/2)<<16,0x40000300, "Memory");__delay(10); } }else{ // Calibration __dram_calibration(); isCalibrationDone = 1; } } execUserPreload() { // Register dram common.mac __registerMacroFile("$PROJ_DIR$\\..\\..\\..\\component\\soc\\realtek\\8195a\\misc\\iar_utility\\common\\dram\\common.mac"); __message "User Preload...."; //isCalibrationDone = 0; __setup_system(); } execUserSetup() { __var tmp; __message "User Setup...."; // if use normal reset, please unmark those 2 lines //execUserPreload(); __setup_system(); //__loadImage("$TARGET_PATH$", 0, 0); // DISABLE DRAM init tmp = __readMemory32(0x40000210, "Memory")|(1<<21); __writeMemory32(tmp, 0x40000210, "Memory"); }