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

📄 memory.c

📁 本source code 為s3c4510的bootloader
💻 C
📖 第 1 页 / 共 5 页
字号:
       return(-1);       }      else     if(rvl == 0)      {       Print("Fail.");       return(0);      }//      if(hash > 0)      {       break;      }     else      {          PrintRotSlash(j);      }    }  }//  Print("Ok") ; return(1);}////////////////////////////////////////////////////////////////////////////////// Memory Copy Test Top Program ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////static void MemoryCopyTest(void) { U32 MemCopySrc; 				// memory test source address U32 MemCopyDest; 				// memory test destination address U32 MemTestSize; 				// memory test size U32 *src;    					// memory source address U32 *dst;    					// memory destination address int tsize;   					// memory Test size int lsize;   					// memory test loop size Print("\n\nMemory Copy Test");// memory copy test source location //////////////////////////////////////////// Print("\nInput Memory Test Source Location (0x01300000)    : 0x"); MemCopySrc = get_number(16,0); if(MemCopySrc == 0)   {						/* default source */   MemCopySrc = 0x1300000;  }// memory copy test destination location /////////////////////////////////////// Print("\nInput Memory Test Destination Location(0x01400000): 0x"); MemCopyDest = get_number(16,0); if(MemCopyDest == 0)   {						/* default destination */   MemCopyDest=0x1400000;  }// memory copy test size ///////////////////////////////////////////////////////   Print("\nInput Memory Test Size (word) (0x10000)           : 0x"); MemTestSize = get_number(16,0); if(MemTestSize==0)   {   MemTestSize=0x10000;				/* default test size */  }// memory copy test repeat count /////////////////////////////////////////////// Print("\nInput Memory Test repeat number(0x00005)          : 0x"); lsize = get_number(16,0); if(lsize==0)   {				   lsize= 5; 				/* default repeat count */  } src = (U32 *) MemCopySrc; dst = (U32 *) MemCopyDest; tsize = (int) MemTestSize;         Print("\nSource Memory Location      : 0x%08x",src); Print("\nDestination Memory Location : 0x%08x",dst); Print("\nMemory Test Size (words)    : 0x%08x",tsize); Print("\nMemory Test Loop Count      : %d\n"  ,lsize); if(   !MemTest   (    src		,		/* memory source address */    dst		,		/* memory destination address */    tsize	,		/* test size */    lsize	,		/* loop count */    0   )  )   {    Print("\nFail.\n");  } else   {   Print("\nOk.\n");  }}////////////////////////////////////////////////////////////////////////////////// External I/O Bank Test //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////static void ExtIOBankTest(void){ U32 * base0;			// External Bank 0 Base Address U32 * base1;			// External Bank 1 Base Address U32 * base2;			// External Bank 2 Base address U32 * base3;			// External bank 3 base Address U32 testSize; 			// -test size (words) int lsize = 5; 		// -Ext IO test loop count U32 * src;			//  U32 val;			//  U8 it;				// -bank num U8 cfg;			//  int i;				// //  U32 TCOS0;		 	// -Bank 0 Chip selection set-up time on nOE U32 TCOS1;		 	// -Bank 1 Chip selection set-up time on nOE U32 TCOS2;		 	// -Bank 2 Chip selection set-up time on nOE U32 TCOS3;			// -Bank 3 Chip selection set-up time on nOE// Address set-up time before nECS (tACS0, tACS1, tACS2, tACS3)	//////////////// U32 TACS0;			// -Bank 0 Address set-up time before nECS U32 TACS1;			// -Bank 1 Address set-up time before nECS U32 TACS2;			// -Bank 2 Address set-up time before nECS U32 TACS3;			// -Bank 3 Address set-up time before nECS// Chip selection hold time on nOE (tCOH0,tCOH1,tCOH2,tCOH3) /////////////////// U32 TCOH0; 			// -Bank 0 Chip selection hold time on nOE  U32 TCOH1;			// -Bank 1 Chip selection hold time on nOE  U32 TCOH2;			// -Bank 2 Chip selection hold time on nOE  U32 TCOH3;			// -Bank 3 Chip selection hold time on nOE  U32 TACC0;			// -Bank 0 Access cycles (nOE Low time) U32 TACC1; 			// -Bank 1 Access cycles (nOE Low time) U32 TACC2; 			// -Bank 2 Access cycles (nOE Low time) U32 TACC3;			// -Bank 3 Access cycles (nOE Low time)//  Print("\nExternal I/O Bank Test");/* REFEXTCON = DRAM Refresh and External I/O control register *//* [9:0] External I/O Bank 0 Base pointer */// External I/O bank 0 base pointer //////////////////////////////////////////// base0 = (U32 *) ((REFEXTCON & 0x3FF) << 16 ); 	 base1 = base0 + 4096;		// External I/O bank 1 base pointer base2 = base1 + 4096;		// External I/O bank 2 base pointer base3 = base2 + 4096;		// External I/O bank 3 base pointer Print("\n  External I/O Bank #0 Base Addr : 0x%08x", base0); Print("\n  External I/O Bank #1 Base Addr : 0x%08x", base1); Print("\n  External I/O Bank #2 Base Addr : 0x%08x", base2); Print("\n  External I/O Bank #3 Base Addr : 0x%08x", base3);// test source address ///////////////////////////////////////////////////////// src = (U32 *) 0x01300000; Print("\nTest External I/O Bank source address (0x%08x)_0x", src); val = get_number(16,0); if(val != 0)  {   src = (U32 *) val;   }// test size /////////////////////////////////////////////////////////////////// testSize = 0x1000; 			/* size in words (4K words)*/ Print("\nTest External I/O Bank size (words) (0x%08x)  _0x", testSize); val = get_number(16,0); if(val != 0)  {   testSize = val;   }//  Print("\nConfigure External I/O Bank Bus Width      [Y/N]_"); cfg = get_upper(); if(cfg == 'Y')  {////////////////////////////////////////////////////////////////////////////////// configure external banks bus width //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   U32 extbdwth;		// bus width register value    U32 dsx0; 			// Data bus width for external I/O bank 0   U32 dsx1; 			// Data bus width for external I/O bank 1   U32 dsx2; 			// Data bus width for external I/O bank 2   U32 dsx3; 			// Data bus width for external I/O bank 3//    extbdwth = EXTDBWTH;		// bus width register value /*[21:20] Data bus width for external I/O bank 0 (DSX0)	*//*[23:22] Data bus width for external I/O bank 1 (DSX1)	*//*[25:24] Data bus width for external I/O bank 2 (DSX2)	*//*[27:26] Data bus width for external I/O bank 3 (DSX3)	*/  // extract banks bus width /////////////////////////////////////////////////////   dsx0 = (extbdwth>>20) & 0x3; // Data bus width for external I/O bank 0   dsx1 = (extbdwth>>22) & 0x3; // Data bus width for external I/O bank 1   dsx2 = (extbdwth>>24) & 0x3; // Data bus width for external I/O bank 2   dsx3 = (extbdwth>>26) & 0x3; // Data bus width for external I/O bank 3////////////////////////////////////////////////////////////////////////////////// read from console bus width for bank 0 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   switch(dsx0)			 	/* Data bus width for external I/O bank 0 */    {	     case  0 : dsx0 = 'D'; break; 	// disable      case  1 : dsx0 = 'B'; break; 	// byte (8 bit)     case  2 : dsx0 = 'H'; break; 	// half word (16 bit)     case  3 : dsx0 = 'W'; break; 	// word (32 bit)     default : dsx0 = 'D'; break;     }   do    {     Print      (       "\nExternal I/O Bank 0 Bus Width "       "[D]isable/[B]yte/[H]alf word/[W]ord (%c)_",         dsx0      );//      cfg = get_upper();			// read upper character       switch(cfg)			// convert character to numeric value       {       case 'D' : dsx0 = 0; break; 	// Disable bank 0         case 'B' : dsx0 = 1; break; 	// Bank 0 bus width is byte       case 'H' : dsx0 = 2; break; 	// Bank 0 bus width is half word       case 'W' : dsx0 = 3; break; 	// Bank 0 bus width is word       default  : cfg  = 0; break;      }    }    while(cfg == 0);////////////////////////////////////////////////////////////////////////////////// read from console bus width for bank 1 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   switch(dsx1)			 	// conver numeric value to letter    {     case  0 : dsx1 = 'D'; break; 	// Disable bank 1     case  1 : dsx1 = 'B'; break; 	// Bank 1 bus width is byte      case  2 : dsx1 = 'H'; break; 	// Bank 1 bus width is half word     case  3 : dsx1 = 'W'; break; 	// Bank 1 bus width is word     default : dsx1 = 'D'; break; 	// Disable bank 1    }   do    {//      Print      (       "\nExternal I/O Bank 1 Bus Width "       "[D]isable/[B]yte/[H]alf word/[W]ord (%c)_",         dsx1      );     cfg = get_upper();			// read character from console      switch(cfg)			// conver character to numeric value 	      {       case 'D' : dsx1 = 0; break; 	// Disable bank 1        case 'B' : dsx1 = 1; break; 	// Bank 1 bus width is byte       case 'H' : dsx1 = 2; break; 	// Bank 1 bus width is half word       case 'W' : dsx1 = 3; break; 	// Bank 1 bus width is word       default  : cfg  = 0; break;	// 	      }    }    while(cfg == 0);////////////////////////////////////////////////////////////////////////////////// read bank 2 bus width from console ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   switch(dsx2)			 	// convert numerical value to letter    {     case  0 : dsx2 = 'D'; break; 	// Disable Bank 2	     case  1 : dsx2 = 'B'; break; 	// Bank 2 bus width is byte     case  2 : dsx2 = 'H'; break; 	// Bank 2 bus width is half byte     case  3 : dsx2 = 'W'; break; 	// Bank 2 bus width is word     default : dsx2 = 'D'; break; 	// Disable Bank 2	    }   do    {     Print      (       "\nExternal I/O Bank 2 Bus Width "       "[D]isable/[B]yte/[H]alf word/[W]ord (%c)_",         dsx2      );//      cfg = get_upper();			// read character from console      switch(cfg)			// convert character to numeriacal value       {       case 'D' : dsx2 = 0; break; 	// Disable bank        case 'B' : dsx2 = 1; break; 	// Bank 2 bus size is byte       case 'H' : dsx2 = 2; break; 	// Bank 2 bus size is half word        case 'W' : dsx2 = 3; break; 	// Bank 2 bus size is word       default  : cfg  = 0; break;      }    }    while(cfg == 0);////////////////////////////////////////////////////////////////////////////////// read bank 3 bus width from console //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   switch(dsx3)			 	/* Data bus width for external I/O bank 0 */    {     case  0 : dsx3 = 'D'; break; 	// Disable Bank 3     case  1 : dsx3 = 'B'; break; 	// Bank 3 bus size is byte      case  2 : dsx3 = 'H'; break; 	// Bank 3 bus size is half word     case  3 : dsx3 = 'W'; break; 	// Bank 3 bus size is word     default : dsx3 = 'D'; break; 	// Disable bank 3    }   do    {     Print      (       "\nExternal I/O Bank 3 Bus Width "       "[D]isable/[B]yte/[H]alf word/[W]ord (%c)_",         dsx3      );//      cfg = get_upper();     switch(cfg)			/* Data bus width for external I/O bank 0 */      {       case 'D' : dsx3 = 0; break;        case 'B' : dsx3 = 1; break;        case 'H' : dsx3 = 2; break;        case 'W' : dsx3 = 3; break;        default  : cfg = 0; break;      }    }    while(cfg == 0);//    extbdwth &= ~EXTDBWTH_DSX0; 		/* Data bus width for external I/O bank 0 */   extbdwth &= ~EXTDBWTH_DSX1; 		/* Data bus width for external I/O bank 1 */   extbdwth &= ~EXTDBWTH_DSX2; 		/* Data bus width for external I/O bank 2 */   extbdwth &= ~EXTDBWTH_DSX3; 		/* Data bus width for external I/O bank 3 *///   extbdwth      |=    (dsx0 << 20) |    (dsx1 << 22) |    (dsx2 << 24) |    (dsx3 << 26);   Print("\nEXTDBWTH = 0x%08x",extbdwth);   EXTDBWTH = extbdwth; 		/* Data bus width for external I/O bank 0 */  } ////////////////////////////////////////////////////////////////////////////////// read tested bank num from console /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Print("\nSelect Test External I/O Bank  (0, 1, 2, 3, Q)  _"); it = get_upper(); if(it >= '0' && it <= '3')  {   it = it - '0';			// Bank 0   } else if(it == 'Q')  {   return;   } else  {   Print("\n  Invalid External I/O Bank Selected [%c]", it);   return;  } 	////////////////////////////////////////////////////////////////////////////////// configure external I/O bank ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Print("\nConfigure External I/O Bank %c [Y]es/[N]o/[D]efault/[A]ll/[Q]uit]? ", it); cfg = get_upper(); if(cfg == 'Q')  {// Quit ////////////////////////////////////////////////////////////////////////   return;  } if(cfg == 'D')  {// default configuration // [D]efault ///////////////////////////////////////////* Chip selection set-up time on nOE (tCOS0, tCOS1, tCOS2, tCOS3) *//* [0:2]   EXTACON0 tCOS0 *//* [0:2]   EXTACON1 tCOS2 *//* [18:16] EXTACON0 tCOS1 *//* [18:16] EXTACON1 tCOS3 */   TCOS0 = (0x7 << EXTACON0_TCOS0_OFFSET); // Bank 0 Chip selection set-up time on nOE   TCOS1 = (0x7 << EXTACON0_TCOS1_OFFSET); // Bank 1 Chip selection set-up time on nOE   TCOS2 = (0x7 << EXTACON1_TCOS2_OFFSET); // Bank 2 Chip selection set-up time on nOE   TCOS3 = (0x7 << EXTACON1_TCOS3_OFFSET); // Bank 3 Chip selection set-up time on nOE/* Address set-up time before nECS (tACS0, tACS1, tACS2, tACS3)	*/ /* [5:3]   EXTACON0 tACS0 *//* [5:3]   EXTACON1 tACS2 *//* [21:19] EXTACON0 tACS1 *//* [21:19] EXTACON1 tACS3 */   TACS0 = (0x6 << EXTACON0_TACS0_OFFSET); // Bank 0 Address set-up time before nECS   TACS1 = (0x6 << EXTACON0_TACS1_OFFSET); // Bank 1 Address set-up time before nECS   TACS2 = (0x6 << EXTACON1_TACS2_OFFSET); // Bank 2 Address set-up time before nECS   TACS3 = (0x6 << EXTACON1_TACS3_OFFSET); // Bank 3 Address set-up time before nECS// Chip selection hold time on nOE (tCOH0,tCOH1,tCOH2,tCOH3) ////////////////////* [8:6]   EXTACON0 tCOH0 *//* [8:6]   EXTACON1 tCOH2 *//* [24:22] EXTACON0 tCOH1 *//* [24:22] EXTACON1 tCOH3 */   TCOH0 = (0x6 << EXTACON0_TCOH0_OFFSET); // Bank 0 Chip selection hold time on nOE    TCOH1 = (0x6 << EXTACON0_TCOH1_OFFSET); // Bank 1 Chip selection hold time on nOE    TCOH2 = (0x6 << EXTACON1_TCOH2_OFFSET); // Bank 2 Chip selection hold time on nOE    TCOH3 = (0x6 << EXTACON1_TCOH3_OFFSET); // Bank 3 Chip selection hold time on nOE // Access cycles (nOE low time (tACC0,tACC1,tACC2,tACC3)// [11:9]  EXTACON0 tACC0 // [11:9]  EXTACON1 tACC2 // [27:25] EXTACON0 tACC1 // [27:25] EXTACON1 tACC3    TACC0 = (0x7 << EXTACON0_TACC0_OFFSET); // Bank 0 Access cycles (nOE Low time)   TACC1 = (0x7 << EXTACON0_TACC1_OFFSET); // Bank 1 Access cycles (nOE Low time)   TACC2 = (0x7 << EXTACON1_TACC2_OFFSET); // Bank 2 Access cycles (nOE Low time)   TACC3 = (0x7 << EXTACON1_TACC3_OFFSET); // Bank 3 Access cycles (nOE Low time)  } else if(cfg != 'N')  {////////////////////////////////////////////////////////////////////////////////// [Y]es / [A]ll ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Chip selection set-up time on nOE (tCOS0, tCOS1, tCOS2, tCOS3) //////////////   TCOS0 = (EXTACON0 >> EXTACON0_TCOS0_OFFSET) & 0x7; // Bank 0 Chip selection set-up time on nOE   TCOS1 = (EXTACON0 >> EXTACON0_TCOS1_OFFSET) & 0x7; // Bank 1 Chip selection set-up time on nOE   TCOS2 = (EXTACON1 >> EXTACON1_TCOS2_OFFSET) & 0x7; // Bank 2 Chip selection set-up time on nOE   TCOS3 = (EXTACON1 >> EXTACON1_TCOS3_OFFSET) & 0x7; // Bank 3 Chip selection set-up time on nOE// Address set-up time before nECS (tACS0, tACS1, tACS2, tACS3)	////////////////   TACS0 = (EXTACON0 >> EXTACON0_TACS0_OFFSET) & 0x7; // Bank 0 Address set-up time before nECS   TACS1 = (EXTACON0 >> EXTACON0_TACS1_OFFSET) & 0x7; // Bank 1 Address set-up time before nECS   TACS2 = (EXTACON1 >> EXTACON1_TACS2_OFFSET) & 0x7; // Bank 2 Address set-up time before nECS   TACS3 = (EXTACON1 >> EXTACON1_TACS3_OFFSET) & 0x7; // Bank 3 Address set-up time before nECS// Chip selection hold time on nOE (tCOH0,tCOH1,tCOH2,tCOH3

⌨️ 快捷键说明

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