⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ctrl_regs.c

📁 uboot200903最新版本的通用uboot
💻 C
📖 第 1 页 / 共 3 页
字号:
		/* Allow setting of ECC only if all DIMMs are ECC. */		ecc_en = popts->ECC_mode;	} else {		ecc_en = 0;	}	rd_en = (common_dimm->all_DIMMs_registered		 && !common_dimm->all_DIMMs_unbuffered);	sdram_type = CONFIG_FSL_SDRAM_TYPE;	dyn_pwr = popts->dynamic_power;	dbw = popts->data_bus_width;	/* DDR3 must use 8-beat bursts when using 32-bit bus mode */	if ((sdram_type == SDRAM_TYPE_DDR3) && (dbw == 0x1))		eight_be = 1;	threeT_en = popts->threeT_en;	twoT_en = popts->twoT_en;	ba_intlv_ctl = popts->ba_intlv_ctl;	hse = popts->half_strength_driver_enable;	ddr->ddr_sdram_cfg = (0			| ((mem_en & 0x1) << 31)			| ((sren & 0x1) << 30)			| ((ecc_en & 0x1) << 29)			| ((rd_en & 0x1) << 28)			| ((sdram_type & 0x7) << 24)			| ((dyn_pwr & 0x1) << 21)			| ((dbw & 0x3) << 19)			| ((eight_be & 0x1) << 18)			| ((ncap & 0x1) << 17)			| ((threeT_en & 0x1) << 16)			| ((twoT_en & 0x1) << 15)			| ((ba_intlv_ctl & 0x7F) << 8)			| ((x32_en & 0x1) << 5)			| ((pchb8 & 0x1) << 4)			| ((hse & 0x1) << 3)			| ((mem_halt & 0x1) << 1)			| ((bi & 0x1) << 0)			);	debug("FSLDDR: ddr_sdram_cfg = 0x%08x\n", ddr->ddr_sdram_cfg);}/* DDR SDRAM control configuration 2 (DDR_SDRAM_CFG_2) */static void set_ddr_sdram_cfg_2(fsl_ddr_cfg_regs_t *ddr,			       const memctl_options_t *popts){	unsigned int frc_sr = 0;	/* Force self refresh */	unsigned int sr_ie = 0;		/* Self-refresh interrupt enable */	unsigned int dll_rst_dis;	/* DLL reset disable */	unsigned int dqs_cfg;		/* DQS configuration */	unsigned int odt_cfg;		/* ODT configuration */	unsigned int num_pr;		/* Number of posted refreshes */	unsigned int obc_cfg;		/* On-The-Fly Burst Chop Cfg */	unsigned int ap_en;		/* Address Parity Enable */	unsigned int d_init;		/* DRAM data initialization */	unsigned int rcw_en = 0;	/* Register Control Word Enable */	unsigned int md_en = 0;		/* Mirrored DIMM Enable */	dll_rst_dis = 1;	/* Make this configurable */	dqs_cfg = popts->DQS_config;	if (popts->cs_local_opts[0].odt_rd_cfg	    || popts->cs_local_opts[0].odt_wr_cfg) {		/* FIXME */		odt_cfg = 2;	} else {		odt_cfg = 0;	}	num_pr = 1;	/* Make this configurable */	/*	 * 8572 manual says	 *     {TIMING_CFG_1[PRETOACT]	 *      + [DDR_SDRAM_CFG_2[NUM_PR]	 *        * ({EXT_REFREC || REFREC} + 8 + 2)]}	 *      << DDR_SDRAM_INTERVAL[REFINT]	 */	obc_cfg = 0;	/* Make this configurable? */	ap_en = 0;	/* Make this configurable? */#if defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER)	/* Use the DDR controller to auto initialize memory. */	d_init = 1;	ddr->ddr_data_init = CONFIG_MEM_INIT_VALUE;	debug("DDR: ddr_data_init = 0x%08x\n", ddr->ddr_data_init);#else	/* Memory will be initialized via DMA, or not at all. */	d_init = 0;#endif	ddr->ddr_sdram_cfg_2 = (0		| ((frc_sr & 0x1) << 31)		| ((sr_ie & 0x1) << 30)		| ((dll_rst_dis & 0x1) << 29)		| ((dqs_cfg & 0x3) << 26)		| ((odt_cfg & 0x3) << 21)		| ((num_pr & 0xf) << 12)		| ((obc_cfg & 0x1) << 6)		| ((ap_en & 0x1) << 5)		| ((d_init & 0x1) << 4)		| ((rcw_en & 0x1) << 2)		| ((md_en & 0x1) << 0)		);	debug("FSLDDR: ddr_sdram_cfg_2 = 0x%08x\n", ddr->ddr_sdram_cfg_2);}/* DDR SDRAM Mode configuration 2 (DDR_SDRAM_MODE_2) */static void set_ddr_sdram_mode_2(fsl_ddr_cfg_regs_t *ddr){	unsigned short esdmode2 = 0;	/* Extended SDRAM mode 2 */	unsigned short esdmode3 = 0;	/* Extended SDRAM mode 3 */	ddr->ddr_sdram_mode_2 = (0				 | ((esdmode2 & 0xFFFF) << 16)				 | ((esdmode3 & 0xFFFF) << 0)				 );	debug("FSLDDR: ddr_sdram_mode_2 = 0x%08x\n", ddr->ddr_sdram_mode_2);}/* DDR SDRAM Interval Configuration (DDR_SDRAM_INTERVAL) */static void set_ddr_sdram_interval(fsl_ddr_cfg_regs_t *ddr,			       const memctl_options_t *popts,			       const common_timing_params_t *common_dimm){	unsigned int refint;	/* Refresh interval */	unsigned int bstopre;	/* Precharge interval */	refint = picos_to_mclk(common_dimm->refresh_rate_ps);	bstopre = popts->bstopre;	/* refint field used 0x3FFF in earlier controllers */	ddr->ddr_sdram_interval = (0				   | ((refint & 0xFFFF) << 16)				   | ((bstopre & 0x3FFF) << 0)				   );	debug("FSLDDR: ddr_sdram_interval = 0x%08x\n", ddr->ddr_sdram_interval);}/* DDR SDRAM Mode configuration set (DDR_SDRAM_MODE) */static void set_ddr_sdram_mode(fsl_ddr_cfg_regs_t *ddr,			       const memctl_options_t *popts,			       const common_timing_params_t *common_dimm,			       unsigned int cas_latency,			       unsigned int additive_latency){	unsigned short esdmode;		/* Extended SDRAM mode */	unsigned short sdmode;		/* SDRAM mode */	/*	 * FIXME: This ought to be pre-calculated in a	 * technology-specific routine,	 * e.g. compute_DDR2_mode_register(), and then the	 * sdmode and esdmode passed in as part of common_dimm.	 */	/* Extended Mode Register */	unsigned int mrs = 0;		/* Mode Register Set */	unsigned int outputs = 0;	/* 0=Enabled, 1=Disabled */	unsigned int rdqs_en = 0;	/* RDQS Enable: 0=no, 1=yes */	unsigned int dqs_en = 0;	/* DQS# Enable: 0=enable, 1=disable */	unsigned int ocd = 0;		/* 0x0=OCD not supported,					   0x7=OCD default state */	unsigned int rtt;	unsigned int al;		/* Posted CAS# additive latency (AL) */	unsigned int ods = 0;		/* Output Drive Strength:						0 = Full strength (18ohm)						1 = Reduced strength (4ohm) */	unsigned int dll_en = 0;	/* DLL Enable  0=Enable (Normal),						       1=Disable (Test/Debug) */	/* Mode Register (MR) */	unsigned int mr;	/* Mode Register Definition */	unsigned int pd;	/* Power-Down Mode */	unsigned int wr;	/* Write Recovery */	unsigned int dll_res;	/* DLL Reset */	unsigned int mode;	/* Normal=0 or Test=1 */	unsigned int caslat = 0;/* CAS# latency */	/* BT: Burst Type (0=Sequential, 1=Interleaved) */	unsigned int bt;	unsigned int bl;	/* BL: Burst Length */#if defined(CONFIG_FSL_DDR2)	const unsigned int mclk_ps = get_memory_clk_period_ps();#endif	rtt = fsl_ddr_get_rtt();	al = additive_latency;	esdmode = (0		| ((mrs & 0x3) << 14)		| ((outputs & 0x1) << 12)		| ((rdqs_en & 0x1) << 11)		| ((dqs_en & 0x1) << 10)		| ((ocd & 0x7) << 7)		| ((rtt & 0x2) << 5)   /* rtt field is split */		| ((al & 0x7) << 3)		| ((rtt & 0x1) << 2)   /* rtt field is split */		| ((ods & 0x1) << 1)		| ((dll_en & 0x1) << 0)		);	mr = 0;		 /* FIXME: CHECKME */	/*	 * 0 = Fast Exit (Normal)	 * 1 = Slow Exit (Low Power)	 */	pd = 0;#if defined(CONFIG_FSL_DDR1)	wr = 0;       /* Historical */#elif defined(CONFIG_FSL_DDR2)	wr = (common_dimm->tWR_ps + mclk_ps - 1) / mclk_ps - 1;#else#error "Write tWR_auto for DDR3"#endif	dll_res = 0;	mode = 0;#if defined(CONFIG_FSL_DDR1)	if (1 <= cas_latency && cas_latency <= 4) {		unsigned char mode_caslat_table[4] = {			0x5,	/* 1.5 clocks */			0x2,	/* 2.0 clocks */			0x6,	/* 2.5 clocks */			0x3	/* 3.0 clocks */		};		caslat = mode_caslat_table[cas_latency - 1];	} else {		printf("Warning: unknown cas_latency %d\n", cas_latency);	}#elif defined(CONFIG_FSL_DDR2)	caslat = cas_latency;#else#error "Fix the mode CAS Latency for DDR3"#endif	bt = 0;	switch (popts->burst_length) {	case 4:		bl = 2;		break;	case 8:		bl = 3;		break;	default:		printf("Error: invalid burst length of %u specified. "			" Defaulting to 4 beats.\n",			popts->burst_length);		bl = 2;		break;	}	sdmode = (0		  | ((mr & 0x3) << 14)		  | ((pd & 0x1) << 12)		  | ((wr & 0x7) << 9)		  | ((dll_res & 0x1) << 8)		  | ((mode & 0x1) << 7)		  | ((caslat & 0x7) << 4)		  | ((bt & 0x1) << 3)		  | ((bl & 0x7) << 0)		  );	ddr->ddr_sdram_mode = (0			       | ((esdmode & 0xFFFF) << 16)			       | ((sdmode & 0xFFFF) << 0)			       );	debug("FSLDDR: ddr_sdram_mode = 0x%08x\n", ddr->ddr_sdram_mode);}/* DDR SDRAM Data Initialization (DDR_DATA_INIT) */static void set_ddr_data_init(fsl_ddr_cfg_regs_t *ddr){	unsigned int init_value;	/* Initialization value */	init_value = 0xDEADBEEF;	ddr->ddr_data_init = init_value;}/* * DDR SDRAM Clock Control (DDR_SDRAM_CLK_CNTL) * The old controller on the 8540/60 doesn't have this register. * Hope it's OK to set it (to 0) anyway. */static void set_ddr_sdram_clk_cntl(fsl_ddr_cfg_regs_t *ddr,					 const memctl_options_t *popts){	unsigned int clk_adjust;	/* Clock adjust */	clk_adjust = popts->clk_adjust;	ddr->ddr_sdram_clk_cntl = (clk_adjust & 0xF) << 23;}/* DDR Initialization Address (DDR_INIT_ADDR) */static void set_ddr_init_addr(fsl_ddr_cfg_regs_t *ddr){	unsigned int init_addr = 0;	/* Initialization address */	ddr->ddr_init_addr = init_addr;}/* DDR Initialization Address (DDR_INIT_EXT_ADDR) */static void set_ddr_init_ext_addr(fsl_ddr_cfg_regs_t *ddr){	unsigned int uia = 0;	/* Use initialization address */	unsigned int init_ext_addr = 0;	/* Initialization address */	ddr->ddr_init_ext_addr = (0				  | ((uia & 0x1) << 31)				  | (init_ext_addr & 0xF)				  );}/* DDR SDRAM Timing Configuration 4 (TIMING_CFG_4) */static void set_timing_cfg_4(fsl_ddr_cfg_regs_t *ddr){	unsigned int rwt = 0; /* Read-to-write turnaround for same CS */	unsigned int wrt = 0; /* Write-to-read turnaround for same CS */	unsigned int rrt = 0; /* Read-to-read turnaround for same CS */	unsigned int wwt = 0; /* Write-to-write turnaround for same CS */	unsigned int dll_lock = 0; /* DDR SDRAM DLL Lock Time */	ddr->timing_cfg_4 = (0			     | ((rwt & 0xf) << 28)			     | ((wrt & 0xf) << 24)			     | ((rrt & 0xf) << 20)			     | ((wwt & 0xf) << 16)			     | (dll_lock & 0x3)			     );	debug("FSLDDR: timing_cfg_4 = 0x%08x\n", ddr->timing_cfg_4);}/* DDR SDRAM Timing Configuration 5 (TIMING_CFG_5) */static void set_timing_cfg_5(fsl_ddr_cfg_regs_t *ddr){	unsigned int rodt_on = 0;	/* Read to ODT on */	unsigned int rodt_off = 0;	/* Read to ODT off */	unsigned int wodt_on = 0;	/* Write to ODT on */	unsigned int wodt_off = 0;	/* Write to ODT off */	ddr->timing_cfg_5 = (0			     | ((rodt_on & 0x1f) << 24)			     | ((rodt_off & 0x7) << 20)			     | ((wodt_on & 0x1f) << 12)			     | ((wodt_off & 0x7) << 8)			     );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -