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

📄 ctrl_regs.c

📁 uboot200903最新版本的通用uboot
💻 C
📖 第 1 页 / 共 3 页
字号:
	debug("FSLDDR: timing_cfg_5 = 0x%08x\n", ddr->timing_cfg_5);}/* DDR ZQ Calibration Control (DDR_ZQ_CNTL) */static void set_ddr_zq_cntl(fsl_ddr_cfg_regs_t *ddr){	unsigned int zq_en = 0;	/* ZQ Calibration Enable */	unsigned int zqinit = 0;/* POR ZQ Calibration Time (tZQinit) */	/* Normal Operation Full Calibration Time (tZQoper) */	unsigned int zqoper = 0;	/* Normal Operation Short Calibration Time (tZQCS) */	unsigned int zqcs = 0;	ddr->ddr_zq_cntl = (0			    | ((zq_en & 0x1) << 31)			    | ((zqinit & 0xF) << 24)			    | ((zqoper & 0xF) << 16)			    | ((zqcs & 0xF) << 8)			    );}/* DDR Write Leveling Control (DDR_WRLVL_CNTL) */static void set_ddr_wrlvl_cntl(fsl_ddr_cfg_regs_t *ddr){	unsigned int wrlvl_en = 0; /* Write Leveling Enable */	/*	 * First DQS pulse rising edge after margining mode	 * is programmed (tWL_MRD)	 */	unsigned int wrlvl_mrd = 0;	/* ODT delay after margining mode is programmed (tWL_ODTEN) */	unsigned int wrlvl_odten = 0;	/* DQS/DQS_ delay after margining mode is programmed (tWL_DQSEN) */	unsigned int wrlvl_dqsen = 0;	/* WRLVL_SMPL: Write leveling sample time */	unsigned int wrlvl_smpl = 0;	/* WRLVL_WLR: Write leveling repeition time */	unsigned int wrlvl_wlr = 0;	/* WRLVL_START: Write leveling start time */	unsigned int wrlvl_start = 0;	ddr->ddr_wrlvl_cntl = (0			       | ((wrlvl_en & 0x1) << 31)			       | ((wrlvl_mrd & 0x7) << 24)			       | ((wrlvl_odten & 0x7) << 20)			       | ((wrlvl_dqsen & 0x7) << 16)			       | ((wrlvl_smpl & 0xf) << 12)			       | ((wrlvl_wlr & 0x7) << 8)			       | ((wrlvl_start & 0x1F) << 0)			       );}/* DDR Self Refresh Counter (DDR_SR_CNTR) */static void set_ddr_sr_cntr(fsl_ddr_cfg_regs_t *ddr, unsigned int sr_it){	/* Self Refresh Idle Threshold */	ddr->ddr_sr_cntr = (sr_it & 0xF) << 16;}/* DDR Pre-Drive Conditioning Control (DDR_PD_CNTL) */static void set_ddr_pd_cntl(fsl_ddr_cfg_regs_t *ddr){	/* Termination value during pre-drive conditioning */	unsigned int tvpd = 0;	unsigned int pd_en = 0;		/* Pre-Drive Conditioning Enable */	unsigned int pdar = 0;		/* Pre-Drive After Read */	unsigned int pdaw = 0;		/* Pre-Drive After Write */	unsigned int pd_on = 0;		/* Pre-Drive Conditioning On */	unsigned int pd_off = 0;	/* Pre-Drive Conditioning Off */	ddr->ddr_pd_cntl = (0			    | ((pd_en & 0x1) << 31)			    | ((tvpd & 0x7) << 28)			    | ((pdar & 0x7F) << 20)			    | ((pdaw & 0x7F) << 12)			    | ((pd_on & 0x1F) << 6)			    | ((pd_off & 0x1F) << 0)			    );}/* DDR SDRAM Register Control Word 1 (DDR_SDRAM_RCW_1) */static void set_ddr_sdram_rcw_1(fsl_ddr_cfg_regs_t *ddr){	unsigned int rcw0 = 0;	/* RCW0: Register Control Word 0 */	unsigned int rcw1 = 0;	/* RCW1: Register Control Word 1 */	unsigned int rcw2 = 0;	/* RCW2: Register Control Word 2 */	unsigned int rcw3 = 0;	/* RCW3: Register Control Word 3 */	unsigned int rcw4 = 0;	/* RCW4: Register Control Word 4 */	unsigned int rcw5 = 0;	/* RCW5: Register Control Word 5 */	unsigned int rcw6 = 0;	/* RCW6: Register Control Word 6 */	unsigned int rcw7 = 0;	/* RCW7: Register Control Word 7 */	ddr->ddr_sdram_rcw_1 = (0				| ((rcw0 & 0xF) << 28)				| ((rcw1 & 0xF) << 24)				| ((rcw2 & 0xF) << 20)				| ((rcw3 & 0xF) << 16)				| ((rcw4 & 0xF) << 12)				| ((rcw5 & 0xF) << 8)				| ((rcw6 & 0xF) << 4)				| ((rcw7 & 0xF) << 0)				);}/* DDR SDRAM Register Control Word 2 (DDR_SDRAM_RCW_2) */static void set_ddr_sdram_rcw_2(fsl_ddr_cfg_regs_t *ddr){	unsigned int rcw8 = 0;	/* RCW0: Register Control Word 8 */	unsigned int rcw9 = 0;	/* RCW1: Register Control Word 9 */	unsigned int rcw10 = 0;	/* RCW2: Register Control Word 10 */	unsigned int rcw11 = 0;	/* RCW3: Register Control Word 11 */	unsigned int rcw12 = 0;	/* RCW4: Register Control Word 12 */	unsigned int rcw13 = 0;	/* RCW5: Register Control Word 13 */	unsigned int rcw14 = 0;	/* RCW6: Register Control Word 14 */	unsigned int rcw15 = 0;	/* RCW7: Register Control Word 15 */	ddr->ddr_sdram_rcw_2 = (0				| ((rcw8 & 0xF) << 28)				| ((rcw9 & 0xF) << 24)				| ((rcw10 & 0xF) << 20)				| ((rcw11 & 0xF) << 16)				| ((rcw12 & 0xF) << 12)				| ((rcw13 & 0xF) << 8)				| ((rcw14 & 0xF) << 4)				| ((rcw15 & 0xF) << 0)				);}unsigned intcheck_fsl_memctl_config_regs(const fsl_ddr_cfg_regs_t *ddr){	unsigned int res = 0;	/*	 * Check that DDR_SDRAM_CFG[RD_EN] and DDR_SDRAM_CFG[2T_EN] are	 * not set at the same time.	 */	if (ddr->ddr_sdram_cfg & 0x10000000	    && ddr->ddr_sdram_cfg & 0x00008000) {		printf("Error: DDR_SDRAM_CFG[RD_EN] and DDR_SDRAM_CFG[2T_EN] "				" should not be set at the same time.\n");		res++;	}	return res;}unsigned intcompute_fsl_memctl_config_regs(const memctl_options_t *popts,			       fsl_ddr_cfg_regs_t *ddr,			       const common_timing_params_t *common_dimm,			       const dimm_params_t *dimm_params,			       unsigned int dbw_cap_adj){	unsigned int i;	unsigned int cas_latency;	unsigned int additive_latency;	unsigned int sr_it;	memset(ddr, 0, sizeof(fsl_ddr_cfg_regs_t));	if (common_dimm == NULL) {		printf("Error: subset DIMM params struct null pointer\n");		return 1;	}	/*	 * Process overrides first.	 *	 * FIXME: somehow add dereated caslat to this	 */	cas_latency = (popts->cas_latency_override)		? popts->cas_latency_override_value		: common_dimm->lowest_common_SPD_caslat;	additive_latency = (popts->additive_latency_override)		? popts->additive_latency_override_value		: common_dimm->additive_latency;	sr_it = (popts->auto_self_refresh_en)		? popts->sr_it		: 0;	/* Chip Select Memory Bounds (CSn_BNDS) */	for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {		phys_size_t sa = 0;		phys_size_t ea = 0;		if (popts->ba_intlv_ctl && (i > 0) &&			((popts->ba_intlv_ctl & 0x60) != FSL_DDR_CS2_CS3 )) {			/* Don't set up boundaries for other CS			 * other than CS0, if bank interleaving			 * is enabled and not CS2+CS3 interleaved.			 */			break;		}		if (dimm_params[i/2].n_ranks == 0) {			debug("Skipping setup of CS%u "				"because n_ranks on DIMM %u is 0\n", i, i/2);			continue;		}		if (popts->memctl_interleaving && popts->ba_intlv_ctl) {			/*			 * This works superbank 2CS			 * There are 2 memory controllers configured			 * identically, memory is interleaved between them,			 * and each controller uses rank interleaving within			 * itself. Therefore the starting and ending address			 * on each controller is twice the amount present on			 * each controller.			 */			unsigned long long rank_density					= dimm_params[0].capacity;			ea = (2 * (rank_density >> dbw_cap_adj)) - 1;		}		else if (!popts->memctl_interleaving && popts->ba_intlv_ctl) {			/*			 * If memory interleaving between controllers is NOT			 * enabled, the starting address for each memory			 * controller is distinct.  However, because rank			 * interleaving is enabled, the starting and ending			 * addresses of the total memory on that memory			 * controller needs to be programmed into its			 * respective CS0_BNDS.			 */			unsigned long long rank_density						= dimm_params[i/2].rank_density;			switch (popts->ba_intlv_ctl & FSL_DDR_CS0_CS1_CS2_CS3) {			case FSL_DDR_CS0_CS1_CS2_CS3:				/* CS0+CS1+CS2+CS3 interleaving, only CS0_CNDS				 * needs to be set.				 */				sa = common_dimm->base_address;				ea = sa + (4 * (rank_density >> dbw_cap_adj))-1;				break;			case FSL_DDR_CS0_CS1_AND_CS2_CS3:				/* CS0+CS1 and CS2+CS3 interleaving, CS0_CNDS				 * and CS2_CNDS need to be set.				 */				if (!(i&1)) {					sa = dimm_params[i/2].base_address;					ea = sa + (i * (rank_density >>						dbw_cap_adj)) - 1;				}				break;			case FSL_DDR_CS0_CS1:				/* CS0+CS1 interleaving, CS0_CNDS needs				 * to be set				 */				sa = common_dimm->base_address;				ea = sa + (2 * (rank_density >> dbw_cap_adj))-1;				break;			case FSL_DDR_CS2_CS3:				/* CS2+CS3 interleaving*/				if (i == 2) {					sa = dimm_params[i/2].base_address;					ea = sa + (2 * (rank_density >>						dbw_cap_adj)) - 1;				}				break;			default:  /* No bank(chip-select) interleaving */				break;			}		}		else if (popts->memctl_interleaving && !popts->ba_intlv_ctl) {			/*			 * Only the rank on CS0 of each memory controller may			 * be used if memory controller interleaving is used			 * without rank interleaving within each memory			 * controller.  However, the ending address programmed			 * into each CS0 must be the sum of the amount of			 * memory in the two CS0 ranks.			 */			if (i == 0) {				unsigned long long rank_density						= dimm_params[0].rank_density;				ea = (2 * (rank_density >> dbw_cap_adj)) - 1;			}		}		else if (!popts->memctl_interleaving && !popts->ba_intlv_ctl) {			/*			 * No rank interleaving and no memory controller			 * interleaving.			 */			unsigned long long rank_density						= dimm_params[i/2].rank_density;			sa = dimm_params[i/2].base_address;			ea = sa + (rank_density >> dbw_cap_adj) - 1;			if (i&1) {				if ((dimm_params[i/2].n_ranks == 1)) {					/* Odd chip select, single-rank dimm */					sa = 0;					ea = 0;				} else {					/* Odd chip select, dual-rank DIMM */					sa += rank_density >> dbw_cap_adj;					ea += rank_density >> dbw_cap_adj;				}			}		}		sa >>= 24;		ea >>= 24;		ddr->cs[i].bnds = (0			| ((sa & 0xFFF) << 16)	/* starting address MSB */			| ((ea & 0xFFF) << 0)	/* ending address MSB */			);		debug("FSLDDR: cs[%d]_bnds = 0x%08x\n", i, ddr->cs[i].bnds);		set_csn_config(i, ddr, popts, dimm_params);		set_csn_config_2(i, ddr);	}#if defined(CONFIG_FSL_DDR2)	set_timing_cfg_0(ddr);#endif	set_timing_cfg_3(ddr, common_dimm);	set_timing_cfg_1(ddr, common_dimm, cas_latency);	set_timing_cfg_2(ddr, popts, common_dimm,				cas_latency, additive_latency);	set_ddr_sdram_cfg(ddr, popts, common_dimm);	set_ddr_sdram_cfg_2(ddr, popts);	set_ddr_sdram_mode(ddr, popts, common_dimm,				cas_latency, additive_latency);	set_ddr_sdram_mode_2(ddr);	set_ddr_sdram_interval(ddr, popts, common_dimm);	set_ddr_data_init(ddr);	set_ddr_sdram_clk_cntl(ddr, popts);	set_ddr_init_addr(ddr);	set_ddr_init_ext_addr(ddr);	set_timing_cfg_4(ddr);	set_timing_cfg_5(ddr);	set_ddr_zq_cntl(ddr);	set_ddr_wrlvl_cntl(ddr);	set_ddr_pd_cntl(ddr);	set_ddr_sr_cntr(ddr, sr_it);	set_ddr_sdram_rcw_1(ddr);	set_ddr_sdram_rcw_2(ddr);	return check_fsl_memctl_config_regs(ddr);}

⌨️ 快捷键说明

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