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

📄 tqm8260.c

📁 U BOOT源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	putc ('\n');	return 0;}/* ------------------------------------------------------------------------- *//* Try SDRAM initialization with P/LSDMR=sdmr and ORx=orx * * This routine performs standard 8260 initialization sequence * and calculates the available memory size. It may be called * several times to try different SDRAM configurations on both * 60x and local buses. */static long int try_init (volatile memctl8260_t * memctl, ulong sdmr,						  ulong orx, volatile uchar * base){	volatile uchar c = 0xff;	ulong cnt, val;	volatile ulong *addr;	volatile uint *sdmr_ptr;	volatile uint *orx_ptr;	int i;	ulong save[32];				/* to make test non-destructive */	ulong maxsize, size;	/* We must be able to test a location outsize the maximum legal size	 * to find out THAT we are outside; but this address still has to be	 * mapped by the controller. That means, that the initial mapping has	 * to be (at least) twice as large as the maximum expected size.	 */	maxsize = (1 + (~orx | 0x7fff)) / 2;	/* Since CFG_SDRAM_BASE is always 0 (??), we assume that	 * we are configuring CS1 if base != 0	 */	sdmr_ptr = base ? &memctl->memc_lsdmr : &memctl->memc_psdmr;	orx_ptr = base ? &memctl->memc_or2 : &memctl->memc_or1;	*orx_ptr = orx;	/*	 * Quote from 8260 UM (10.4.2 SDRAM Power-On Initialization, 10-35):	 *	 * "At system reset, initialization software must set up the	 *  programmable parameters in the memory controller banks registers	 *  (ORx, BRx, P/LSDMR). After all memory parameters are configured,	 *  system software should execute the following initialization sequence	 *  for each SDRAM device.	 *	 *  1. Issue a PRECHARGE-ALL-BANKS command	 *  2. Issue eight CBR REFRESH commands	 *  3. Issue a MODE-SET command to initialize the mode register	 *	 *  The initial commands are executed by setting P/LSDMR[OP] and	 *  accessing the SDRAM with a single-byte transaction."	 *	 * The appropriate BRx/ORx registers have already been set when we	 * get here. The SDRAM can be accessed at the address CFG_SDRAM_BASE.	 */	*sdmr_ptr = sdmr | PSDMR_OP_PREA;	*base = c;	*sdmr_ptr = sdmr | PSDMR_OP_CBRR;	for (i = 0; i < 8; i++)		*base = c;	*sdmr_ptr = sdmr | PSDMR_OP_MRW;	*(base + CFG_MRS_OFFS) = c;	/* setting MR on address lines */	*sdmr_ptr = sdmr | PSDMR_OP_NORM | PSDMR_RFEN;	*base = c;	/*	 * Check memory range for valid RAM. A simple memory test determines	 * the actually available RAM size between addresses `base' and	 * `base + maxsize'. Some (not all) hardware errors are detected:	 * - short between address lines	 * - short between data lines	 */	i = 0;	for (cnt = maxsize / sizeof (long); cnt > 0; cnt >>= 1) {		addr = (volatile ulong *) base + cnt;	/* pointer arith! */		save[i++] = *addr;		*addr = ~cnt;	}	addr = (volatile ulong *) base;	save[i] = *addr;	*addr = 0;	if ((val = *addr) != 0) {		/* Restore the original data before leaving the function.		 */		*addr = save[i];		for (cnt = 1; cnt <= maxsize / sizeof(long); cnt <<= 1) {			addr  = (volatile ulong *) base + cnt;			*addr = save[--i];		}		return (0);	}	for (cnt = 1; cnt <= maxsize / sizeof (long); cnt <<= 1) {		addr = (volatile ulong *) base + cnt;	/* pointer arith! */		val = *addr;		*addr = save[--i];		if (val != ~cnt) {			size = cnt * sizeof (long);			/* Restore the original data before leaving the function.			 */ 			for (cnt <<= 1; cnt <= maxsize / sizeof (long); cnt <<= 1) {				addr  = (volatile ulong *) base + cnt;				*addr = save[--i];			}			/* Write the actual size to ORx			 */			*orx_ptr = orx | ~(size - 1);			return (size);		}	}	return (maxsize);}long int initdram (int board_type){	volatile immap_t *immap = (immap_t *) CFG_IMMR;	volatile memctl8260_t *memctl = &immap->im_memctl;#ifndef CFG_RAMBOOT	long size8, size9;#endif	long psize, lsize;	psize = 16 * 1024 * 1024;	lsize = 0;	memctl->memc_psrt = CFG_PSRT;	memctl->memc_mptpr = CFG_MPTPR;#if 0							/* Just for debugging */#define	prt_br_or(brX,orX) do {				\    ulong start =  memctl->memc_ ## brX & 0xFFFF8000;	\    ulong sizem = ~memctl->memc_ ## orX | 0x00007FFF;	\    printf ("\n"					\    	    #brX " 0x%08x  " #orX " 0x%08x "		\	    "==> 0x%08lx ... 0x%08lx = %ld MB\n",	\	memctl->memc_ ## brX, memctl->memc_ ## orX,	\	start, start+sizem, (sizem+1)>>20);		\    } while (0)	prt_br_or (br0, or0);	prt_br_or (br1, or1);	prt_br_or (br2, or2);	prt_br_or (br3, or3);#endif#ifndef CFG_RAMBOOT	/* 60x SDRAM setup:	 */	size8 = try_init (memctl, CFG_PSDMR_8COL, CFG_OR1_8COL,					  (uchar *) CFG_SDRAM_BASE);	size9 = try_init (memctl, CFG_PSDMR_9COL, CFG_OR1_9COL,					  (uchar *) CFG_SDRAM_BASE);	if (size8 < size9) {		psize = size9;		printf ("(60x:9COL - %ld MB, ", psize >> 20);	} else {		psize = try_init (memctl, CFG_PSDMR_8COL, CFG_OR1_8COL,						  (uchar *) CFG_SDRAM_BASE);		printf ("(60x:8COL - %ld MB, ", psize >> 20);	}	/* Local SDRAM setup:	 */#ifdef CFG_INIT_LOCAL_SDRAM	memctl->memc_lsrt = CFG_LSRT;	size8 = try_init (memctl, CFG_LSDMR_8COL, CFG_OR2_8COL,					  (uchar *) SDRAM_BASE2_PRELIM);	size9 = try_init (memctl, CFG_LSDMR_9COL, CFG_OR2_9COL,					  (uchar *) SDRAM_BASE2_PRELIM);	if (size8 < size9) {		lsize = size9;		printf ("Local:9COL - %ld MB) using ", lsize >> 20);	} else {		lsize = try_init (memctl, CFG_LSDMR_8COL, CFG_OR2_8COL,						  (uchar *) SDRAM_BASE2_PRELIM);		printf ("Local:8COL - %ld MB) using ", lsize >> 20);	}#if 0	/* Set up BR2 so that the local SDRAM goes	 * right after the 60x SDRAM	 */	memctl->memc_br2 = (CFG_BR2_PRELIM & ~BRx_BA_MSK) |			(CFG_SDRAM_BASE + psize);#endif#endif /* CFG_INIT_LOCAL_SDRAM */#endif /* CFG_RAMBOOT */	icache_enable ();	return (psize);}/* ------------------------------------------------------------------------- */

⌨️ 快捷键说明

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