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

📄 system.c

📁 本source code 為s3c4510的bootloader
💻 C
📖 第 1 页 / 共 4 页
字号:
//    brgmin = 0xFFFFFFFF;			// init baudrate difference//      if(un == 0)				// UART0 =>    {					// read UARTBRD0     brgout = UARTBRD0;			// register     }   else    {					// UART1 =>      brgout = UARTBRD1;			// read UARTBRD1    } 					// register//   cnt0 = (brgout >> 4) & 0xFFF;	// init min counter 0 (12 bit)	   cnt1 =  brgout & 0xF;		// init min counter 1 //   for(c0 = 0; c0 < 4096; ++c0)		// c0 loop    {     for(c2 = 0; c2 <= 1; ++c2)		// c1 loop      {       switch(c2)        {         case  0 : c1 =  1; break;	// divide by  1         case  1 : c1 = 16; break; 	// divide by 16         default : break;        }// calculate baud rate /////////////////////////////////////////////////////////       brgout = (CpuClk / 2) / (c0 + 1) / c1 / 16;//       if(brgout >= 38400)        {				//          brgdif = brgout - 38400;	//         }       else        {         brgdif = 38400 - brgout;        }            if(brgdif < brgmin)        {         brgmin = brgdif;		// set min brg difference          cnt0 = c0;			// set min cnt0 counter           cnt1 = c2;			// set min cnt1 counter         }      }    }// UARTBRD0/UARTBRD1 register //////////////////////////////////////////////////    uartbrd = ((cnt0 & 0xFFF) << 4) | cnt1;    if(un == 0)    {					     uartbrd0 = uartbrd;		// UARTBRG0	    }   else    {     uartbrd1 = uartbrd;		// UARTBRG1    }   } // new UART0 baudrate ////////////////////////////////////////////////////////// cnt0 = (uartbrd0 >> 4) & 0xFFF;		//  cnt1 =  uartbrd0 & 0xF;			//  if(cnt1 == 0)  {   cnt1 = 1;  } else  {   cnt1 = 16;  } uartclk0 = (CpuClk / 2) / (cnt0 + 1) / cnt1 / 16;	// new UART1 baudrate ////////////////////////////////////////////////////////// cnt0 = (uartbrd1 >> 4) & 0xFFF;		//  cnt1 =  uartbrd1 & 0xF;			//  if(cnt1 == 0)  {   cnt1 = 1;  } else  {   cnt1 = 16;  }  uartclk1 = (CpuClk / 2) / (cnt0 + 1) / cnt1 / 16;	#endif/* Change DRAM refresh cycle */// Get refresh count value ///////////////////////////////////////////////////// BuffReg   = (REFEXTCON & 0xffe00000) >> 21;   // Get original refresh cycle RefCycle  = (2048 - BuffReg + 1) / fMCLK;     // Calculate refresh cycle BuffReg   =  2048 + 1 - (RefCycle * fMCLK / (divider + 1));//Set refresh cycle ////////////////////////////////////////////////////////////  refextcon = (REFEXTCON & ~0xffe00000) | (BuffReg << 21);   #ifndef EX_UCLK Print("\nUart Board Rate & DRAM refresh cycle"); Print("\nwere changed automaitcally.\n");#else Print("\nDRAM refresh cycle changed automaitcally.\n");#endif#ifndef EX_UCLK Print("\nUARTBRD0=0x%08x <- 0x%08x [%d]", UARTBRD0, uartbrd0, uartclk0); Print("\nUARTBRD1=0x%08x <- 0x%08x [%d]", UARTBRD1, uartbrd1, uartclk1);#endif Print("\nREFEXTCON=0x%08x 0x%08x",refextcon,REFEXTCON);/* Write divider value to clkcon register for change CPU clock  */// Set CPU clock will be fMCLK/(divider+1) CLKCON = (divider & 0xFFFF) | (CLKCON & 0xFFFF0000); {  int i;   for(i = 0; i < Delay4ClkCange; ++i); 	// delay for clock stabilizations }/* Change UART Board Rate */#ifndef EX_UCLK UARTBRD0 = uartbrd0; 			// set UARTBRD0 register  UARTBRD1 = uartbrd1; 			// set UARTBRD1 register #endif/* Change DRAM refresh cycle */ REFEXTCON = refextcon;   }////////////////////////////////////////////////////////////////////////////////  // Search Pattern in cache SET0/1, DRAM bank 0/1/2/3 ///////////////////////////  ////////////////////////////////////////////////////////////////////////////////  static void SearchPattern(void){ unsigned long int  pattern;		// pattern  unsigned long int *Set0Pointer;	// base pointer for cache SET0  unsigned long int *Set1Pointer;	// base pointer for cache SET1 unsigned long int *DramBasePoint;	// DRAM bank base point unsigned long int *DramNextPoint;	// DRAM bank next point unsigned long int i; U8 ch;//  Print("\n\nEntern Search Pattern. 0x");  pattern = get_number(16,0);// search in cache SET 0 ///////////////////////////////////////////////////////  Print("\nSearch in Cache Set0.");  Set0Pointer  = (unsigned long int *)(Set0CacheRAM); for(i = 0; i < 1024; ++i)   {   if(pattern == Set0Pointer[i])     {     Print      (       "\nSet 0 : Address = %08x, Data = %08x\n",	  Set0Pointer + i, 	*(Set0Pointer + i)      );    }  }// search in cache SET 1 ///////////////////////////////////////////////////////  Print("\nSearch in Cache Set1.");  Set1Pointer  = (unsigned long int *)(Set1CacheRAM); for(i = 0; i < 1024; ++i)   {   if(pattern == Set1Pointer[i])     {     Print("Set 1 : Address = %08x, Data = %08x\n",	Set1Pointer + i, Set1Pointer[i]);    }  } if((EXTDBWTH & EXTDBWTH_DSD0) != 0)  {   Print("\nSearch in DRAM Bank 0 [Y/N]");    ch = get_upper();    if(ch == 'Y')    {// DRAM bank 0 enabled => search in DRAM bank 0 ////////////////////////////////     DramBasePoint = (unsigned long int *) (((DRAMCON0 >> 10) & 0x3FF) << 16);     DramNextPoint = (unsigned long int *) (((DRAMCON0 >> 20) & 0x3FF) << 16);     i = 0;     while(DramBasePoint < DramNextPoint)      {       if (pattern == *DramBasePoint)         {         Print          (           "DRAM 0 : Address = %08x, Data = %08x\n",            DramBasePoint 	,            *DramBasePoint          );        }       DramBasePoint += 1;        i++;       if((i % 1024) == 0)        {         PrintRotSlash((i / 1024) & 0x3);        }       }    }  } if((EXTDBWTH & EXTDBWTH_DSD1) != 0)  {// DRAM bank 1 is enabled //////////////////////////////////////////////////////   Print("\nSearch in DRAM Bank 1 [Y/N]");    ch = get_upper();     if(ch == 'Y')    {      DramBasePoint = (unsigned long int *) (((DRAMCON1 >> 10) & 0x3FF) << 16);     DramNextPoint = (unsigned long int *) (((DRAMCON1 >> 20) & 0x3FF) << 16);     i = 0;     while(DramBasePoint < DramNextPoint)      {       if (pattern == *DramBasePoint)         {         Print          (           "\nDRAM 1 : Address = %08x, Data = %08x\n",            DramBasePoint 	,            *DramBasePoint          );        }       DramBasePoint += 1;       i++;       if((i % 1024) == 0)        {         PrintRotSlash((i / 1024) & 0x3);        }       }    }  } if((EXTDBWTH & EXTDBWTH_DSD2) != 0)  {// DRAM base bank 2 is enabled /////////////////////////////////////////////////   Print("\nSearch in DRAM Bank 2 [Y/N]");    ch = get_upper();      if(ch == 'Y')    {     DramBasePoint = (unsigned long int *) (((DRAMCON2 >> 10) & 0x3FF) << 16);     DramNextPoint = (unsigned long int *) (((DRAMCON2 >> 20) & 0x3FF) << 16);     i = 0;     while(DramBasePoint < DramNextPoint)      {       if(pattern == *DramBasePoint)         {         Print          (           "\nDRAM 0 : Address = %08x, Data = %08x\n",              DramBasePoint 	,              *DramBasePoint          );        }       DramBasePoint += 1;       i++;       if((i % 1024) == 0)        {         PrintRotSlash((i / 1024) & 0x3);        }       }    }  } if((EXTDBWTH & EXTDBWTH_DSD3) != 0)  {// DRAM base bank 3 is enabled /////////////////////////////////////////////////   Print("\nSearch in DRAM Bank 3 [Y/N]");    ch = get_upper();   if(ch == 'Y')    {     DramBasePoint = (unsigned long int *) (((DRAMCON3 >> 10) & 0x3FF) << 16);     DramNextPoint = (unsigned long int *) (((DRAMCON3 >> 20) & 0x3FF) << 16);     i = 0;     while(DramBasePoint < DramNextPoint)      {       if (pattern == *DramBasePoint)         {         Print          (           "DRAM 0 : Address = %08x, Data = %08x\n",            DramBasePoint 	,            *DramBasePoint          );        }       DramBasePoint += 1;       i++;       if((i % 1024) == 0)        {         PrintRotSlash((i / 1024) & 0x3);        }       }    }  }}/////////////////////////////////////////////////////////////////////////////////// print CLKCON content //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////static void PrintCLKCON(void){ U32 reg[2]; reg[0] = reg[1] = CLKCON;  PrintMBIT("CLKCON (Clock control register)"); Print("0x%08x", CLKCON);//  PrintMBIT("15:0 Clock Divided Value"); Print("%x", (CLKCON & CLKCON_DIV_MASK));// 16 ROM bank 5 wait enable PrintSBIT(0, "16 ROM bank 5 wait enable",       reg,CLKCON_ROM5_WAIT_EN   ,"1","0");     //  PrintEBIT(0, "17 ROM bank 5 address/data Mux en",reg,CLKCON_ROM5_MUX_EN);      {  ABIT mx_bt[] = {    {"00(1 MCLK)", CLKCON_ROM5_MUX_TAC_1  },    {"01(2 MCLK)", CLKCON_ROM5_MUX_TAC_2  },    {"10(3 MCLK)", CLKCON_ROM5_MUX_TAC_3  },    {"11(unused)", CLKCON_ROM5_MUX_TAC_UN },    { 0, 0}   };   PrintABIT(0, "19:18 Mux bus Address Cycle (tAC)",reg,CLKCON_ROM5_MUX_TAC,mx_bt); }#ifdef _S3C4530_ if(is_s3c4530(syscfg_pd_id)) {   PrintEBIT(0,"20 ROM bank 5 wait 1 cycle delay",reg,CLKCON_ROM5_WAIT_DELAY); //    PrintEBIT(0,"21 ROM bank 4 wait enable",       reg,CLKCON_ROM4_WAIT_EN   );   PrintEBIT(0,"22 ROM bank 4 wait 1 cycle delay",reg,CLKCON_ROM4_WAIT_DELAY);  //    PrintEBIT(0,"23 ROM bank 3 wait enable",       reg,CLKCON_ROM3_WAIT_EN   );     PrintEBIT(0,"24 ROM bank 3 wait 1 cycle delay",reg,CLKCON_ROM3_WAIT_DELAY);//    PrintEBIT(0,"25 ROM bank 2 wait enable",       reg,CLKCON_ROM2_WAIT_EN   );   PrintEBIT(0,"26 ROM bank 2 wait 1 cycle delay",reg,CLKCON_ROM2_WAIT_DELAY);//    PrintEBIT(0,"27 ROM bank 1 wait enable",       reg,CLKCON_ROM1_WAIT_EN   );   PrintEBIT(0,"28 ROM bank 1 wait 1 cycle delay",reg,CLKCON_ROM1_WAIT_DELAY);//    PrintEBIT(0,"29 ROM bank 0 wait enable",       reg,CLKCON_ROM0_WAIT_EN   );   PrintEBIT(0,"30 ROM bank 0 wait 1 cycle delay",reg,CLKCON_ROM0_WAIT_DELAY); }#endif								/* _S3C4530_ */ PrintSBIT(0, "Test bit", reg, CLKCON_TEST_BIT,"1", "0");}static void PrintEXTACON(void){// PrintMBIT("EXTACON 0&1"); Print("0x%08x 0x%08x", EXTACON0, EXTACON1); Print("\nChip selection set-up time on nOE (tCOS0, tCOS1, tCOS2, tCOS3)"); PrintMBIT("0:2   EXTACON0 tCOS0");Print("%d",(EXTACON0>>EXTACON0_TCOS0_OFFSET)&7); PrintMBIT("0:2   EXTACON1 tCOS2");Print("%d",(EXTACON1>>EXTACON1_TCOS2_OFFSET)&7); PrintMBIT("18:16 EXTACON0 tCOS1");Print("%d",(EXTACON0>>EXTACON0_TCOS1_OFFSET)&7); PrintMBIT("18:16 EXTACON1 tCOS3");Print("%d",(EXTACON1>>EXTACON1_TCOS3_OFFSET)&7);// Print("\nAddress set-up time before nECS (tACS0, tACS1, tACS2, tACS3)"); PrintMBIT("5:3   EXTACON0 tACS0");Print("%d",(EXTACON0>>EXTACON0_TACS0_OFFSET)&7); PrintMBIT("5:3   EXTACON1 tACS2");Print("%d",(EXTACON1>>EXTACON1_TACS2_OFFSET)&7); PrintMBIT("21:19 EXTACON0 tACS1");Print("%d",(EXTACON0>>EXTACON0_TACS1_OFFSET)&7); PrintMBIT("21:19 EXTACON1 tACS3");Print("%d",(EXTACON1>>EXTACON1_TACS3_OFFSET)&7);// Print("\nChip selection hold time on nOE (tCOH0,tCOH1,tCOH2,tCOH3)"); PrintMBIT("8:6   EXTACON0 tCOH0");Print("%d",(EXTACON0>>EXTACON0_TCOH0_OFFSET)&7); PrintMBIT("8:6   EXTACON1 tCOH2");Print("%d",(EXTACON1>>EXTACON1_TCOH2_OFFSET)&7); PrintMBIT("24:22 EXTACON0 tCOH1");Print("%d",(EXTACON0>>EXTACON0_TCOH1_OFFSET)&7); PrintMBIT("24:22 EXTACON1 tCOH2");Print("%d",(EXTACON1>>EXTACON1_TCOH3_OFFSET)&7);// Print("\nAccess cycles (nOE low time (tACC0,tACC1,tACC2,tACC3)"); PrintMBIT("11:9  EXTACON0 tACC0");Print("%d",(EXTACON0>>EXTACON0_TACC0_OFFSET)&7); PrintMBIT("11:9  EXTACON1 tACC2");Print("%d",(EXTACON1>>EXTACON1_TACC2_OFFSET)&7); PrintMBIT("27:25 EXTACON0 tACC1");Print("%d",(EXTACON0>>EXTACON0_TACC1_OFFSET)&7); PrintMBIT("27:25 EXTACON1 tACC2");Print("%d",(EXTACON1>>EXTACON1_TACC3_OFFSET)&7);}// print external bus width register content //////////////////////////////////// static void PrintEXTDBWTH(void) { int wn; PrintMBIT("EXTDBWTH Data Bus Width Register"); Print("0x%0x", EXTDBWTH); for(wn  = 0; wn < 14; ++wn) {     U32 reg[2];   static ABIT wd_bt[] = {    {"00(disable)"  , 0},    {"01(byte)"     , 1},    {"10(half word)", 2},    {"11(word)"     , 3},    { 0, 0}   };   static ABIT wd_off[] = {    {"ROM/SRAM/FLASH bank 0", EXTDBWTH_DSR0_OFF},    {"ROM/SRAM/FLASH bank 1", EXTDBWTH_DSR1_OFF},    {"ROM/SRAM/FLASH bank 2", EXTDBWTH_DSR2_OFF},    {"ROM/SRAM/FLASH bank 3", EXTDBWTH_DSR3_OFF},    {"ROM/SRAM/FLASH bank 4", EXTDBWTH_DSR4_OFF},    {"ROM/SRAM/FLASH bank 5", EXTDBWTH_DSR5_OFF },    {"DRAM bank 0"          , EXTDBWTH_DSD0_OFF},    {"DRAM bank 1"          , EXTDBWTH_DSD1_OFF},    {"DRAM bank 2"          , EXTDBWTH_DSD2_OFF},    {"DRAM bank 3"          , EXTDBWTH_DSD3_OFF},    {"External I/O bank 0"  , EXTDBWTH_DSX0_OFF},    {"External I/O bank 1"  , EXTDBWTH_DSX1_OFF},    {"External I/O bank 2"  , EXTDBWTH_DSX2_OFF},    {"External I/O bank 3"  , EXTDBWTH_DSX3_OFF},    { 0, 0}     };   reg[0] = (EXTDBWTH >> wd_off[wn].val) & 0x3;   PrintABIT(0, wd_off[wn].str, reg, 0x03, wd_bt);    }}// print ROMCON content  static void PrintROMCON(int ch){ U32 reg[6]; 				// regs content  int cnt;				// reg count  int cn;				// reg number  reg[0] = ROMCON0; 			// bank 0 config reg  reg[1] = ROMCON1; 			// bank 1 conf reg 	 reg[2] = ROMCON2; 			// bank 2 conf reg reg[3] = ROMCON3; 			// bank 3 conf reg 	 reg[4] = ROMCON4; 			// bank 4 conf reg reg[5] = ROMCON5; 			// bank 5 conf reg if(ch >= 0) {   cnt = ch + 1; } else {   cnt = -ch; }// print ROMCON content ///////////////////////////////////////////////////////// Print("\nROMCON");  if(ch >= 0 && ch < 6) {  Print("%d 0x%08x", ch, reg[ch]); } else {   for(cn = 0; cn < cnt; ++cn) {    Print("%d=%08x", cn, reg[cn]);   }  } { // page mode configuration //////////////////////////////////////////////////////  PrintMBIT("1:0 Page mode configuration (PMC)");  for(cn = 0; cn < cnt; ++cn)    {    if((cn == ch || ch < 0) == 0)      {      continue;     } //    switch(reg[cn] & ROMCON_PMC)      {      case ROMCON_PMC_NORMAL : Print(" 00/N "); break;      case ROMCON_PMC_4WPAGE : Print(" 01/4w"); break;      case ROMCON_PMC_8WPAGE : Print(" 10/8w"); break;      case ROMCON_PMC_16WPAGE: Print(" 11/16"); break;      default :       break;         }   }  Print("\n00=Normal ROM; 01=4-word page; 10=8-word page; 11=16-word page"); } {// [3:2] Page address access time (tPA) /////////////////////////////////////////  PrintMBIT("3:2 Page address access time (tPA)");  for(cn = 0; cn < cnt; ++cn)    {    if((cn == ch || ch < 0) == 0)     {       continue;     }    switch(reg[cn] & ROMCON_TPA)     {      case ROMCON_TPA_5CLK: Print(" 00/5 "); break;      case ROMCON_TPA_2CLK: Print(" 01/2 "); break;      case ROMCON_TPA_3CLK: Print(" 10/3 "); break;      case ROMCON_TPA_4CLK: Print(" 11/4 "); break;      default:       break;     }   }  Print("\n00=5 CLK;01=2 CLK;10=3 CLK; 11=4 CLK"); } {// [6:4]   Programmable access cycle (tACC) /////////////////////////////////////  PrintMBIT("6:4 Programmable access cycle (tACC)");    for(cn = 0; cn < cnt; ++cn)   {    if((cn == ch || ch < 0) == 0)     {      continue;     }    switch(reg[cn] & ROMCON_TACC)     {      case ROMCON_TACC_DISABLE : Print(" 000/D"); break;      case ROMCON_TACC_2CLK    : Print(" 001/2"); break;      case ROMCON_TACC_3CLK    : Print(" 010/3"); break;      case ROMCON_TACC_4CLK    : Print(" 011/4"); break;      case ROMCON_TACC_5CLK    : Print(" 100/5"); break;      case ROMCON_TACC_6CLK    : Print(" 101/6"); break;      case ROMCON_TACC_7CLK    : Print(" 110/7"); break;      case ROMCON_TACC_UNUSED  : Print(" 111/R"); break;      default:       break;     }   }   Print("\n000=Disable  ;001=2 cycles;010=3 cycles;011=4 cycles)");   Print("\n100=5 cycles);101=6 cycles;110=7 cycles;111=Reserved)");  }// PrintMBIT("19:10  base pointer"); for(cn = 0; cn < cnt; ++cn) {

⌨️ 快捷键说明

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