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

📄 fads.c

📁 AT91RM9200的完整启动代码:包括loader, boot及U-boot三部分均已编译通过!欢迎下载使用!
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * (C) Copyright 2000 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. * * See file CREDITS for list of people who contributed to this * project. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA */#include <common.h>#include <config.h>#include <mpc8xx.h>#include "fads.h"/* ------------------------------------------------------------------------- */#define	_NOT_USED_	0xFFFFFFFF#if defined(CONFIG_DRAM_50MHZ)/* 50MHz tables */const uint dram_60ns[] ={ 0x8fffec24, 0x0fffec04, 0x0cffec04, 0x00ffec04,  0x00ffec00, 0x37ffec47, 0xffffffff, 0xffffffff,  0x8fffec24, 0x0fffec04, 0x08ffec04, 0x00ffec0c,  0x03ffec00, 0x00ffec44, 0x00ffcc08, 0x0cffcc44,  0x00ffec0c, 0x03ffec00, 0x00ffec44, 0x00ffcc00,  0x3fffc847, 0xffffffff, 0xffffffff, 0xffffffff,  0x8fafcc24, 0x0fafcc04, 0x0cafcc00, 0x11bfcc47,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x8fafcc24, 0x0fafcc04, 0x0cafcc00, 0x03afcc4c,  0x0cafcc00, 0x03afcc4c, 0x0cafcc00, 0x03afcc4c,  0x0cafcc00, 0x33bfcc4f, 0xffffffff, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0xc0ffcc84, 0x00ffcc04, 0x07ffcc04, 0x3fffcc06,  0xffffcc85, 0xffffcc05, 0xffffffff, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x33ffcc07, 0xffffffff, 0xffffffff, 0xffffffff };const uint dram_70ns[] ={ 0x8fffcc24, 0x0fffcc04, 0x0cffcc04, 0x00ffcc04,  0x00ffcc00, 0x37ffcc47, 0xffffffff, 0xffffffff,  0x8fffcc24, 0x0fffcc04, 0x0cffcc04, 0x00ffcc04,  0x00ffcc08, 0x0cffcc44, 0x00ffec0c, 0x03ffec00,  0x00ffec44, 0x00ffcc08, 0x0cffcc44, 0x00ffec04,  0x00ffec00, 0x3fffec47, 0xffffffff, 0xffffffff,  0x8fafcc24, 0x0fafcc04, 0x0cafcc00, 0x11bfcc47,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x8fafcc24, 0x0fafcc04, 0x0cafcc00, 0x03afcc4c,  0x0cafcc00, 0x03afcc4c, 0x0cafcc00, 0x03afcc4c,  0x0cafcc00, 0x33bfcc4f, 0xffffffff, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0xe0ffcc84, 0x00ffcc04, 0x00ffcc04, 0x0fffcc04,  0x7fffcc06, 0xffffcc85, 0xffffcc05, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x33ffcc07, 0xffffffff, 0xffffffff, 0xffffffff };const uint edo_60ns[] ={ 0x8ffbec24, 0x0ff3ec04, 0x0cf3ec04, 0x00f3ec04,  0x00f3ec00, 0x37f7ec47, 0xffffffff, 0xffffffff,  0x8fffec24, 0x0ffbec04, 0x0cf3ec04, 0x00f3ec0c,  0x0cf3ec00, 0x00f3ec4c, 0x0cf3ec00, 0x00f3ec4c,  0x0cf3ec00, 0x00f3ec44, 0x03f3ec00, 0x3ff7ec47,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x8fffcc24, 0x0fefcc04, 0x0cafcc00, 0x11bfcc47,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x8fffcc24, 0x0fefcc04, 0x0cafcc00, 0x03afcc4c,  0x0cafcc00, 0x03afcc4c, 0x0cafcc00, 0x03afcc4c,  0x0cafcc00, 0x33bfcc4f, 0xffffffff, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0xc0ffcc84, 0x00ffcc04, 0x07ffcc04, 0x3fffcc06,  0xffffcc85, 0xffffcc05, 0xffffffff, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x33ffcc07, 0xffffffff, 0xffffffff, 0xffffffff };const uint edo_70ns[] ={ 0x8ffbcc24, 0x0ff3cc04, 0x0cf3cc04, 0x00f3cc04,  0x00f3cc00, 0x37f7cc47, 0xffffffff, 0xffffffff,  0x8fffcc24, 0x0ffbcc04, 0x0cf3cc04, 0x00f3cc0c,  0x03f3cc00, 0x00f3cc44, 0x00f3ec0c, 0x0cf3ec00,  0x00f3ec4c, 0x03f3ec00, 0x00f3ec44, 0x00f3cc00,  0x33f7cc47, 0xffffffff, 0xffffffff, 0xffffffff,  0x8fffcc24, 0x0fefcc04, 0x0cafcc00, 0x11bfcc47,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x8fffcc24, 0x0fefcc04, 0x0cafcc00, 0x03afcc4c,  0x0cafcc00, 0x03afcc4c, 0x0cafcc00, 0x03afcc4c,  0x0cafcc00, 0x33bfcc47, 0xffffffff, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0xe0ffcc84, 0x00ffcc04, 0x00ffcc04, 0x0fffcc04,  0x7fffcc04, 0xffffcc86, 0xffffcc05, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x33ffcc07, 0xffffffff, 0xffffffff, 0xffffffff };#elif defined(CONFIG_DRAM_25MHZ)/* 25MHz tables */const uint dram_60ns[] ={ 0x0fffcc04, 0x08ffcc00, 0x33ffcc47, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x0fffcc24, 0x0fffcc04, 0x08ffcc00, 0x03ffcc4c,  0x08ffcc00, 0x03ffcc4c, 0x08ffcc00, 0x03ffcc4c,  0x08ffcc00, 0x33ffcc47, 0xffffffff, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x0fafcc04, 0x08afcc00, 0x3fbfcc47, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x0fafcc04, 0x0cafcc00, 0x01afcc4c, 0x0cafcc00,  0x01afcc4c, 0x0cafcc00, 0x01afcc4c, 0x0cafcc00,  0x31bfcc43, 0xffffffff, 0xffffffff, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x80ffcc84, 0x13ffcc04, 0xffffcc87, 0xffffcc05,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x33ffcc07, 0xffffffff, 0xffffffff, 0xffffffff };const uint dram_70ns[] ={ 0x0fffec04, 0x08ffec04, 0x00ffec00, 0x3fffcc47,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x0fffcc24, 0x0fffcc04, 0x08ffcc00, 0x03ffcc4c,  0x08ffcc00, 0x03ffcc4c, 0x08ffcc00, 0x03ffcc4c,  0x08ffcc00, 0x33ffcc47, 0xffffffff, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x0fafcc04, 0x08afcc00, 0x3fbfcc47, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x0fafcc04, 0x0cafcc00, 0x01afcc4c, 0x0cafcc00,  0x01afcc4c, 0x0cafcc00, 0x01afcc4c, 0x0cafcc00,  0x31bfcc43, 0xffffffff, 0xffffffff, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0xc0ffcc84, 0x01ffcc04, 0x7fffcc86, 0xffffcc05,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x33ffcc07, 0xffffffff, 0xffffffff, 0xffffffff };const uint edo_60ns[] ={ 0x0ffbcc04, 0x0cf3cc04, 0x00f3cc00, 0x33f7cc47,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x0ffbcc04, 0x09f3cc0c, 0x09f3cc0c, 0x09f3cc0c,  0x08f3cc00, 0x3ff7cc47, 0xffffffff, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x0fefcc04, 0x08afcc04, 0x00afcc00, 0x3fbfcc47,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x0fefcc04, 0x08afcc00, 0x07afcc48, 0x08afcc48,  0x08afcc48, 0x39bfcc47, 0xffffffff, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x80ffcc84, 0x13ffcc04, 0xffffcc87, 0xffffcc05,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x33ffcc07, 0xffffffff, 0xffffffff, 0xffffffff };const uint edo_70ns[] ={ 0x0ffbcc04, 0x0cf3cc04, 0x00f3cc00, 0x33f7cc47,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x0ffbec04, 0x08f3ec04, 0x03f3ec48, 0x08f3cc00,  0x0ff3cc4c, 0x08f3cc00, 0x0ff3cc4c, 0x08f3cc00,  0x3ff7cc47, 0xffffffff, 0xffffffff, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x0fefcc04, 0x08afcc04, 0x00afcc00, 0x3fbfcc47,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x0fefcc04, 0x08afcc00, 0x07afcc4c, 0x08afcc00,  0x07afcc4c, 0x08afcc00, 0x07afcc4c, 0x08afcc00,  0x37bfcc47, 0xffffffff, 0xffffffff, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0xc0ffcc84, 0x01ffcc04, 0x7fffcc86, 0xffffcc05,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,  0x33ffcc07, 0xffffffff, 0xffffffff, 0xffffffff };#else#error dram not correct defined - use CONFIG_DRAM_25MHZ or CONFIG_DRAM_50MHZ#endif/* ------------------------------------------------------------------------- *//* * Check Board Identity: */int checkboard (void){	uint k;	puts ("Board: ");#ifdef CONFIG_FADS	k = (*((uint *)BCSR3) >> 24) & 0x3f;	switch(k) {	case 0x03 :	case 0x20 :	case 0x21 :	case 0x22 :	case 0x23 :	case 0x24 :	case 0x2a :	case 0x3f :		puts ("FADS");		break;	default :		printf("unknown board (0x%02x)\n", k);		return -1;	}	printf(" with db ");	switch(k) {	case 0x03 :		puts ("MPC823");		break;	case 0x20 :		puts ("MPC801");		break;	case 0x21 :		puts ("MPC850");		break;	case 0x22 :		puts ("MPC821, MPC860 / MPC860SAR / MPC860T");		break;	case 0x23 :		puts ("MPC860SAR");		break;	case 0x24 :		puts ("MPC860T");		break;	case 0x3f :		puts ("MPC850SAR");		break;	}	printf(" rev ");	k = (((*((uint *)BCSR3) >> 23) & 1) << 3)	  | (((*((uint *)BCSR3) >> 19) & 1) << 2)	  | (((*((uint *)BCSR3) >> 16) & 3));	switch(k) {	case 0x01 :		puts ("ENG or PILOT\n");		break;	default:		printf("unknown (0x%x)\n", k);		return -1;	}	return 0;#endif	/* CONFIG_FADS */#ifdef CONFIG_ADS  printf("ADS rev ");  k = (((*((uint *)BCSR3) >> 23) & 1) << 3)    | (((*((uint *)BCSR3) >> 19) & 1) << 2)    | (((*((uint *)BCSR3) >> 16) & 3));  switch(k) {  case 0x00 : puts ("ENG - this board sucks, check the errata, not supported\n");              return -1;  case 0x01 : puts ("PILOT - warning, read errata \n"); break;  case 0x02 : puts ("A - warning, read errata \n"); break;  case 0x03 : puts ("B \n"); break;  default   : printf ("unknown revision (0x%x)\n", k); return -1;  }  return 0;#endif	/* CONFIG_ADS */}/* ------------------------------------------------------------------------- */int _draminit(uint base, uint noMbytes, uint edo, uint delay){	volatile immap_t     *immap = (immap_t *)CFG_IMMR;	volatile memctl8xx_t *memctl = &immap->im_memctl;	/* init upm */	switch(delay)	{		case 70:		{			if(edo)			{				upmconfig(UPMA, (uint *) edo_70ns, sizeof(edo_70ns)/sizeof(uint));			}			else			{				upmconfig(UPMA, (uint *) dram_70ns, sizeof(dram_70ns)/sizeof(uint));			}			break;		}		case 60:		{			if(edo)			{				upmconfig(UPMA, (uint *) edo_60ns, sizeof(edo_60ns)/sizeof(uint));			}			else			{				upmconfig(UPMA, (uint *) dram_60ns, sizeof(dram_60ns)/sizeof(uint));			}			break;		}		default :			return -1;	}	memctl->memc_mptpr = 0x0400; /* divide by 16 */	switch(noMbytes)	{		case 8:  /* 8 Mbyte uses both CS3 and CS2 */		{			memctl->memc_mamr = 0x13a01114;			memctl->memc_or3 = 0xffc00800;			memctl->memc_br3 = 0x00400081 + base;			memctl->memc_or2 = 0xffc00800;			break;		}		case 4: /* 4 Mbyte uses only CS2 */		{			memctl->memc_mamr = 0x13a01114;			memctl->memc_or2 = 0xffc00800;			break;		}		case 32: /* 32 Mbyte uses both CS3 and CS2 */		{			memctl->memc_mamr = 0x13b01114;			memctl->memc_or3 = 0xff000800;			memctl->memc_br3 = 0x01000081 + base;			memctl->memc_or2 = 0xff000800;			break;		}		case 16: /* 16 Mbyte uses only CS2 */		{#ifdef CONFIG_ADS			memctl->memc_mamr = 0x60b21114;#else			memctl->memc_mamr = 0x13b01114;#endif			memctl->memc_or2 = 0xff000800;			break;		}		default:		    return -1;	}	memctl->memc_br2 = 0x81 + base;     /* use upma */	return 0;}/* ------------------------------------------------------------------------- */void _dramdisable(void){	volatile immap_t     *immap = (immap_t *)CFG_IMMR;	volatile memctl8xx_t *memctl = &immap->im_memctl;	memctl->memc_br2 = 0x00000000;	memctl->memc_br3 = 0x00000000;	/* maybe we should turn off upma here or something */}#if defined(CONFIG_SDRAM_100MHZ)/* ------------------------------------------------------------------------- *//* sdram table by Dan Malek                                                  *//* This has the stretched early timing so the 50 MHz * processor can make the 100 MHz timing.  This will * work at all processor speeds. */#define SDRAM_MPTPRVALUE 0x0400#define SDRAM_MBMRVALUE0 0xc3802114  /* (16-14) 50 MHz */#define SDRAM_MBMRVALUE1 SDRAM_MBMRVALUE0#define SDRAM_OR4VALUE   0xffc00a00#define SDRAM_BR4VALUE   0x000000c1   /* base address will be or:ed on */#define SDRAM_MARVALUE   0x88#define SDRAM_MCRVALUE0  0x80808111   /* run pattern 0x11 */#define SDRAM_MCRVALUE1  SDRAM_MCRVALUE0const uint sdram_table[] ={	/* single read. (offset 0 in upm RAM) */	0xefebfc24, 0x1f07fc24, 0xeeaefc04, 0x11adfc04,	0xefbbbc00, 0x1ff77c45, 0xffffffff, 0xffffffff,	/* burst read. (offset 8 in upm RAM) */	0xefebfc24, 0x1f07fc24, 0xeeaefc04, 0x10adfc04,	0xf0affc00, 0xf0affc00, 0xf1affc00, 0xefbbbc00,	0x1ff77c45, 0xeffbbc04, 0x1ff77c34, 0xefeabc34,	0x1fb57c35, 0xffffffff, 0xffffffff, 0xffffffff,	/* single write. (offset 18 in upm RAM) */	0xefebfc24, 0x1f07fc24, 0xeeaebc00, 0x01b93c04,	0x1ff77c45, 0xffffffff, 0xffffffff, 0xffffffff,	/* burst write. (offset 20 in upm RAM) */	0xefebfc24, 0x1f07fc24, 0xeeaebc00, 0x10ad7c00,	0xf0affc00, 0xf0affc00, 0xe1bbbc04, 0x1ff77c45,	0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,	0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,	/* refresh. (offset 30 in upm RAM) */	0xeffafc84, 0x1ff5fc04, 0xfffffc04, 0xfffffc04,	0xfffffc84, 0xfffffc07, 0xffffffff, 0xffffffff,

⌨️ 快捷键说明

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