亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? flash16.c

?? coldfire5307的bootloader 將程序寫入flash
?? C
字號:
#include "mcf5307.h" 


#define FLASH_555H 	 0x555
#define FLASH_2AAH  	 0x2AA


#define CHIP_PROTECT     
#define CHIP_UNPROTECT

#define INTEL_FLASH

#define bool unsigned char
#define TRUE   1
#define True   TRUE
#define FALSE  0
#define False  FALSE

#define BlockSize 32768   // for intel TE28F800C3T , it's 32 K words at low address !

void Unlock(void);
void Lock(void);
bool VerifyBlank(long lBaseAddress,long Size);
bool WriteTest(long lBaseAddress);


bool SelChipErase( long lBaseAddress );
bool SelSectorErase( long lBaseAddress, long lSectorAddress );
bool SelSectorUnlock( long lBaseAddress, long lSectorAddress );

bool SelWriteWord( long lBaseAddress, long lAddress, short sData );
bool SelVerifyEnd( volatile short *spAddress, short sVerifyData );
short SelChipManufacturerID( long lBaseAddress );
short SelChipDeviceID( long lBaseAddress );
unsigned short GetFlashStatus( long lBaseAddress );
bool WriteBlockData(int lBaseAddress, int BlockStartAddress, volatile unsigned short * SrcAddress, int HowmanyWords);	
//void Delay(unsigned int de);

unsigned char Sta[100000];


unsigned char BootImg[]={
			0
			};

unsigned char LinuxImg[]={
			0
			};

unsigned char StartAdd[]={0x00,0x30,0x00,0x00,0xff,0x01,0x00,0x00};

/*
void Delay(unsigned int de)
{
	unsigned int i,j;
	for(i = 500; i > 0; i--)
		for(j = de; j > 0; j--);
}
*/
bool SelFlashChip( long lBaseAddress )
{
	short m_ID,d_ID;
	bool FlashOp;
		
	d_ID = SelChipDeviceID( lBaseAddress );
	m_ID = SelChipManufacturerID( lBaseAddress );
	
  return 1;		
	
}


void Flash_Test()
{
  unsigned short m_ID,d_ID;
  unsigned short *ResultP;
  long baseCS0 = 0xFf000000;
  unsigned short *Protect=(unsigned short *)0x22800000;
  

  //(*Protect)=0xffff;


  //while(1)
  //read  ChipDeviceID and ChipManufacturerID
  {
  
  	d_ID = SelChipDeviceID( baseCS0 );
  	if(d_ID!=0x22D7)

  	m_ID = SelChipManufacturerID( baseCS0 );
  	if(m_ID!=0x1)
  	
  }

  m_ID=WriteBlockData(0xff000000, 0x00000/2, (unsigned short *)StartAdd,(4+sizeof(StartAdd)/2));
  
  m_ID=WriteBlockData(0xff000000,0x00010000/2,(unsigned short *)BootImg,(4+sizeof(BootImg)/2));
  
  m_ID=WriteBlockData(0xff000000,0x00020000/2,(unsigned short *)LinuxImg,(4+sizeof(LinuxImg)/2));

  //erase Flash Memory 1
    
  //if ( !SelChipErase( 0xFe000000 ) )
  //   return;

  //read  ChipDeviceID and ChipManufacturerID
  d_ID = SelChipDeviceID( baseCS0 );
  m_ID = SelChipManufacturerID( baseCS0 );
  
  //  if ( !SelSectorErase(baseCS0,0) )
  //     return;    


  while(1)
  {
  	if ( !SelSectorErase(baseCS0,0) )
       return; 
  	SelWriteWord( baseCS0,    0x0000, 0x0000 );  
  	ResultP=(unsigned short *)baseCS0;
  	ResultP+=0x0000;
  	m_ID=*ResultP;
  	if(m_ID!=0x0)
  	{
  		while(1)
  		{
       		m_ID++;
  		}
  	}

  	if ( !SelSectorErase(baseCS0,0x10000) )
       return; 
  	SelWriteWord( baseCS0,    0x10000, 0x1111 ); 
  	ResultP=(unsigned short *)baseCS0;
  	ResultP+=0x10000;
  	m_ID=*ResultP;
  	if(m_ID!=0x1111)
  	{
  		while(1)
  		{
        m_ID++;
  		}
  	}

  	if ( !SelSectorErase(baseCS0,0x20000) )
       return; 
  	SelWriteWord( baseCS0,    0x20000, 0x2222 );  
  	ResultP=(unsigned short *)baseCS0;
  	ResultP+=0x20000;
  	m_ID=*ResultP;
  	if(m_ID!=0x2222)
  	{
  		while(1)
  		{
        m_ID++;
  		}
  	}
  
  	if ( !SelSectorErase(baseCS0,0x30000) )
       return; 
  	SelWriteWord( baseCS0,    0x30000, 0x3333 );  
  	ResultP=(unsigned short *)baseCS0;
  	ResultP+=0x30000;
  	m_ID=*ResultP;
  	if(m_ID!=0x3333)
  	{
  		while(1)
  		{
        m_ID++;
  		}
  	}
  
  	if ( !SelSectorErase(baseCS0,0x40000) )
       return;   
  	SelWriteWord( baseCS0,    0x40000, 0x4444 );  
  	ResultP=(unsigned short *)baseCS0;
  	ResultP+=0x40000;
  	m_ID=*ResultP;
  	if(m_ID!=0x4444)
  		while(1)
  		{
  	   	m_ID++;
  		}

  	if ( !SelSectorErase(baseCS0,0x50000) )
       return; 
  	SelWriteWord( baseCS0,    0x50000, 0x5555 );  
  	ResultP=(unsigned short *)baseCS0;
  	ResultP+=0x50000;
  	m_ID=*ResultP;
  	if(m_ID!=0x5555)
  	{
  		while(1)
  			{
        	m_ID++;
  			}
  	}
  	
  	if ( !SelSectorErase(baseCS0,0x3f8000) )
       return; 
  	SelWriteWord( baseCS0,    0x3f8000, 0xABCD );  
  	ResultP=(unsigned short *)baseCS0;
  	ResultP+=0x3f8000;
  	m_ID=*ResultP;
  	if(m_ID!=0xABCD)
  	{
  		while(1)
  		{
       	m_ID++;
  		}
  	}
  
  }
  
  CHIP_PROTECT;
}


bool SelChipErase( long lBaseAddress )
{
  volatile short *sp;
  bool retval;
  sp = (short*)lBaseAddress;

  *( sp + FLASH_555H ) = 0xAA;
  *( sp + FLASH_2AAH ) = 0x55;
  *( sp + FLASH_555H ) = 0x80;
  *( sp + FLASH_555H ) = 0xAA;
  *( sp + FLASH_2AAH ) = 0x55;
  *( sp + FLASH_555H ) = 0x10;

  retval = SelVerifyEnd( sp, 0x80 );   //if operation is finished, DQ7 = 1
  return retval;
}

/************************************************************************
Name:     SelSectorErase
Function: erase data of a sector
input:    lBaseAddress, the base address of Flash memory to be erased
          lSectorAddress, the base address the sector to be erased
return:   True: erase is successful; False: erase is fail
*************************************************************************/

bool SelSectorErase( long lBaseAddress, long lSectorAddress )
{
  volatile short *sp;
  bool retval;
  unsigned short ID;
  sp = (short*)lBaseAddress;

  #ifndef INTEL_FLASH


	*( sp + FLASH_555H ) = 0xAA;
	*( sp + FLASH_2AAH ) = 0x55;
  *( sp + FLASH_555H ) = 0x80;
  *( sp + FLASH_555H ) = 0xAA;
  *( sp + FLASH_2AAH ) = 0x55;
  *( sp + lSectorAddress ) = 0x30;   //??? lSectorAddress = 0x3000

  retval = sVerifyEnd( sp+lSectorAddress, 0x80 );   //if operation is finished, DQ7 = 1
  return retval;

  #else

	Unlock();
 
 	*sp=0x50;								//clear flag
  *sp=0x60;								//set config
  *( sp + lSectorAddress ) = 0xd0;		//unlock it!
  *sp=0x90;								//read config
  ID=*(sp+lSectorAddress+2);								//is unlock ?
  while(0x00!=(ID&0x01))
 	{
		ID=*(sp+lSectorAddress+2);		
  }

  *sp=0x50;							  //clear flag	
  *( sp + lSectorAddress ) = 0x20;  	//setup erase
  *( sp + lSectorAddress ) = 0xd0;   //confirm it! 

	ID=*sp;								//ready ?
  while(0x00==(ID&0x80))
 	{
  	 ID=*sp;		
 	}

  ID=*(sp);							 //all ok?
  if(0x00==(ID&0x3a))
 	{
   	*sp=0xff;						//set it in read mode
   	return True;
 	}
  else
 	{
   	*sp=0xff;						
   	return False;
 	}

  #endif

}


bool SelSectorUnlock( long lBaseAddress, long lSectorAddress )
{
  volatile short *sp;
  bool retval;
  unsigned short ID;
  int i=0;
  sp = (short*)lBaseAddress;

  #ifndef INTEL_FLASH
	  return 0x01;
  #else
	Unlock();

	*sp=0x50;								//clear flag
  *sp=0x60;								//set config
  *( sp + lSectorAddress ) = 0xd0;		//unlock it!
  *sp=0x90;								//read config
  ID=*(sp+lSectorAddress+2);								//is unlock ?
  i=0;
  while(0x00!=(ID&0x01))
 	{
  	 ID=*(sp+lSectorAddress+2);
   	 i++;
   	 if(i>10000)						//over time ?
 	 	return False;
 	}

  *sp=0x50;							  //clear flag	
 	*sp=0xff;						
 	return True;
   
  #endif
 	
}

/***************************************************************************
Name:    sVerifyEnd
Function: Verify if the operation to Flash mem is finished
input:    spAddress: the address of Flash mem to be verified
	  sVerifyData: Verify Data
return:   True: writing passed;     False: writing is fail	        
***************************************************************************/

bool SelVerifyEnd( volatile short *spAddress, short sVerifyData )
{
  unsigned short sb;
  unsigned  i;
  sb = * spAddress;

  #ifndef INTEL_FLASH

  while( (sb & 0x80 ) != ( sVerifyData & 0x80 ) )
  {
    if( (sb & 0x20 ) == 0x20 )            //if DQ5 == 1, exceed timing limits
    {
      sb = *spAddress;                    //read data again
      if( (sb & 0x80) != (sVerifyData & 0x80) )   //if DQ7!=Data, writing is failure
				return False;
      else
        return True;
    }
    sb = *spAddress;                      //read data again
  }
  	return True;
	#else

  sb=GetFlashStatus((long)spAddress);
  while( (sb & 0x80 ) != 0x80 )       //  1 means ready
  {
    if( 0x00!= ((sb)&sVerifyData) )  // 0 means ok!
			return False;
    else
      return True;		
    sb=GetFlashStatus((long) spAddress); 
 	}

  if( 0x00!= ((sb)&sVerifyData) )  // 0 means ok!
			return False;
  else
      return True;		
       
	#endif

}

/*****************************************************************************
Name:     SelWriteWord
Function: Write a word to Flash memory
input:    lBaseAddress: The first address of Flash memory
	  lAddress: Address of the memory to be written
	  sData: Data to be written
return:   True: writing is successful;  False: writing is failure
*****************************************************************************/

bool SelWriteWord( long lBaseAddress, long lAddress, short sData )
{
  volatile short *sp;
  bool retval;
  unsigned short ID;

  sp = (short*)lBaseAddress;
  #ifndef INTEL_FLASH
  	*( sp + FLASH_555H ) = 0xAA;
    *( sp + FLASH_2AAH ) = 0x55;
    *( sp + FLASH_555H ) = 0xA0;
    sp += lAddress;
    *sp = sData;
    retval = sVerifyEnd( sp, sData );
    return retval;
  #else
 		Unlock();
    *sp=0x50;													 //clear flag
    *sp=0x40;												    //program command 
	  *( sp + lAddress ) = (unsigned short)(sData);		//send data
    while( 0x80!=(0x80&(*sp)) )							//wait ready
		{	;
		}
		
		ID=*(sp);							 //all ok?
  	if(0x00==(ID&0x1a))
    {
    	*sp=0xff;						//set it in read mode
    	return True;
    }
    else
    {
    	*sp=0xff;						
    	return False;
    }
	
	#endif

}


short SelChipManufacturerID( long lBaseAddress )
{

	#ifndef INTEL_FLASH
	  volatile short *sp, M_ID;
  	sp = (short*)lBaseAddress;
		*( sp + FLASH_555H ) = 0xAA;
  	*( sp + FLASH_2AAH ) = 0x55;
  	*( sp + FLASH_555H ) = 0x90;
  	M_ID = * sp ;
  	*sp=0xf0;
  	return M_ID;
	
	#else
		volatile short *sp,M_ID;
  	sp = (short*)lBaseAddress; 
  	*sp=0x90;				// first cycle, 
		M_ID = *(sp+0x0);
  	*sp=0xff;
    return M_ID;  		//intel should be 0x0089
 	#endif
  
}

short SelChipDeviceID( long lBaseAddress )
{
  volatile short *sp,D_ID;
  sp = (short*)lBaseAddress;

	#ifndef INTEL_FLASH
	  *( sp + FLASH_555H ) = 0xAA;
  	*( sp + FLASH_2AAH ) = 0x55;
  	*( sp + FLASH_555H ) = 0x90;
  	D_ID = * ( sp + 0x01 );
  	*sp=0xf0;
  	return D_ID;
	
	#else
	  sp = (short*)lBaseAddress; 
		*sp=0x90;				// first cycle, 
		D_ID = *(sp+0x1);
  	*sp=0xff;
  	return D_ID;  		//
	
	#endif
  
}


unsigned short GetFlashStatus( long lBaseAddress )
{
	#ifdef INTEL_FLASH
		volatile unsigned short * sp;
		unsigned short Status;
		sp = (unsigned short *)lBaseAddress;
		*sp=0x70;
		Status=*sp;
		return (Status);

	#endif
}

void Unlock(void)
{
//	unsigned char * p;
//	p=(unsigned char *)0x33400000;
//	*p=0x20;
 	
}
void Lock(void)
{
//	unsigned char * p;
//	p=(unsigned char *)0x33400000;
//	*p=0x00;
}

bool VerifyBlank(long lBaseAddress,long Size)
{
	unsigned short int Blank;
	volatile unsigned short int *BlankPtr;
 	long Temp;
 
 	Temp=0;
 	BlankPtr=(unsigned short int *)lBaseAddress;
 	while(Temp<Size)
 	{
  	Blank=*BlankPtr;
  	BlankPtr++;
  	Temp++;
  	if(Blank!=0xffff)  return FALSE;
 	}
 	
 	return TRUE;
  	
}

bool WriteTest(long lBaseAddress)
{
 	volatile unsigned  short  int *Ptr;
 
 	if(SelSectorErase(lBaseAddress,0x1f8000)==0x00)           //erase the bottom
  	return 0x00;
 	
 	if(SelWriteWord(lBaseAddress,0x1f8000,0x1234)==0x00)    // write the bottom  
    return 0x00;
    
 	Ptr=(unsigned  short  int *)(lBaseAddress+2*0x1f8000);

 	if( (*Ptr)!=0x1234  )                                  //read th result 
    return 0x00;    
 	else
    return 0x01;
   
 	if(SelSectorErase(lBaseAddress,0x0)==0x00)         //erase the top
    return 0x00;
 
 	if(SelWriteWord(lBaseAddress,0x0,0x1234)==0x00)    // write the top  
    return 0x00;
    
 	Ptr=(unsigned  short  int *)(lBaseAddress+2*0x0);

 	if( (*Ptr)!=0x1234  )                                  //read th result 
    return 0x00;    
 	else
    return 0x01;   
    	
}

//for example 
// 0xfe000000
// 0x00010000
// 0x2000
//macro BlockSize needed!
// return 0x01 if ok
bool WriteBlockData(int lBaseAddress, int BlockStartAddress, volatile unsigned short * SrcAddress, int HowmanyWords)	
{

 	int BlockIndex;
 	int SrcCheckSum;
 	int DestCheckSum;
 	unsigned short Temp;

 	volatile unsigned short * Src;
 	volatile unsigned short * Dest;
 	int i;
	
 	BlockIndex=0;
	
 	Src=(unsigned short *)SrcAddress;
 	Dest=(unsigned short *)(lBaseAddress+2*BlockStartAddress);

 //erase the first sector
 	if( False==SelSectorErase(lBaseAddress,BlockStartAddress+BlockSize*BlockIndex) )
 		return False;
 
	for(i=0;i<HowmanyWords;)
 	{
     Temp=*SrcAddress;
     
     //Temp=(unsigned short)(0xffff&(unsigned short)SrcAddress);
     	
     	if(False==SelWriteWord(lBaseAddress,BlockStartAddress+BlockSize*BlockIndex+(i%BlockSize),Temp) )
    		return False;
   		SrcAddress++;
    	i++;
     
     	if( (0x0==(i%BlockSize)) && (i!=HowmanyWords))
     	{
     		BlockIndex++;
     		if( False==SelSectorErase(lBaseAddress,BlockStartAddress+BlockSize*BlockIndex) )
		 		return False;
     	}
 	
 	}


 //now we will check it!

 
 	for(i=0;i<HowmanyWords;i++)
 	{
		if(*Src!=*Dest)
		return False;
	
    /*
	if( *Dest!=((unsigned short)(0xffff&(unsigned short)Dest)) )
		return False;
    */
	
		Src++;
		Dest++;
 	}

 	return True;	
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本精品一级二级| 一本到不卡免费一区二区| 最新欧美精品一区二区三区| 337p亚洲精品色噜噜噜| 国产·精品毛片| 日韩不卡一区二区| 专区另类欧美日韩| 久久精品一区二区三区不卡| 欧美日韩一区二区在线观看视频 | 精品国产髙清在线看国产毛片| 成人av电影在线网| 激情深爱一区二区| 五月婷婷色综合| 夜夜嗨av一区二区三区网页 | 成人免费在线视频观看| 337p日本欧洲亚洲大胆精品 | 寂寞少妇一区二区三区| 亚洲成人综合在线| 尤物视频一区二区| 一区在线观看视频| 国产精品区一区二区三| 久久免费的精品国产v∧| 91精品国产全国免费观看| 欧美日韩三级视频| 欧美亚洲国产一区在线观看网站| av一区二区三区| 成人av网站在线观看| 成人晚上爱看视频| 国产一区在线观看视频| 久久99精品国产麻豆婷婷洗澡| 秋霞成人午夜伦在线观看| 一卡二卡三卡日韩欧美| 亚洲精品视频免费观看| 亚洲欧美在线高清| 亚洲欧洲国产专区| 国产精品久久毛片av大全日韩| 久久先锋影音av鲁色资源网| 久久一二三国产| 久久久久久久电影| 中文字幕成人在线观看| 欧美激情综合网| 国产精品视频你懂的| 日日夜夜一区二区| 视频一区二区国产| 美美哒免费高清在线观看视频一区二区 | 国产一区二区三区高清播放| 另类中文字幕网| 久久国产福利国产秒拍| 激情文学综合插| 国产成人av电影免费在线观看| 懂色中文一区二区在线播放| 成人网在线免费视频| 色婷婷久久久综合中文字幕 | 9色porny自拍视频一区二区| www.欧美色图| 在线观看亚洲a| 在线免费av一区| 欧美丰满美乳xxx高潮www| 91精品福利在线一区二区三区| 精品欧美乱码久久久久久| 久久久精品免费免费| 国产精品欧美一级免费| 亚洲精品写真福利| 免费成人av在线播放| 国产成人综合亚洲网站| 波多野洁衣一区| 欧美日韩国产一二三| 日韩一区二区三区电影在线观看| 精品国产乱码久久久久久夜甘婷婷 | 91免费观看视频在线| 欧美在线视频你懂得| 91精品国产欧美一区二区18| 久久精品免费在线观看| 亚洲欧洲色图综合| 热久久国产精品| 成人aa视频在线观看| 欧美精品v日韩精品v韩国精品v| 精品不卡在线视频| 亚洲美女一区二区三区| 天天色天天操综合| 国产成人免费视频网站高清观看视频| 日本精品一区二区三区高清| 国产精品久久久久久久久免费丝袜 | 国产综合色产在线精品| 色婷婷综合久久久中文一区二区 | 成人中文字幕电影| 欧美日韩另类一区| 国产精品网站在线观看| 天使萌一区二区三区免费观看| 国产精品资源网| 精品视频资源站| 国产精品卡一卡二卡三| 日韩av不卡在线观看| 97久久超碰精品国产| 日韩欧美第一区| 一区二区三区四区五区视频在线观看| 九色|91porny| 欧美日韩黄视频| 中文字幕亚洲不卡| 久久99精品久久久| 欧美男生操女生| 亚洲天堂精品视频| 国产精一品亚洲二区在线视频| 欧美视频一二三区| 亚洲欧美日韩国产手机在线| 久久99精品国产.久久久久| 欧美性xxxxxxxx| 一色桃子久久精品亚洲| 国产精品一区在线观看你懂的| 欧美精品v国产精品v日韩精品| 亚洲免费在线电影| 成人性生交大片免费看中文 | 亚洲国产精品激情在线观看| 日本va欧美va瓶| 欧美视频在线一区| 亚洲人成7777| 国产精品资源站在线| 日韩一级大片在线观看| 婷婷一区二区三区| 在线视频欧美精品| 中文字幕五月欧美| 国产成人av影院| 久久蜜桃av一区二区天堂| 九色综合狠狠综合久久| 91精品国产入口| 日韩精品国产欧美| 色综合天天综合| 中文字幕一区av| av在线不卡免费看| 国产精品久久久久永久免费观看 | wwwwww.欧美系列| 激情五月婷婷综合| 久久亚洲精品国产精品紫薇| 激情综合色丁香一区二区| 欧美一区二区国产| 毛片一区二区三区| 欧美精品一区二区三区在线| 久久国产精品99久久人人澡| 精品国产免费视频| 国产一区二区三区在线观看精品 | 欧美aⅴ一区二区三区视频| 在线成人av网站| 轻轻草成人在线| 26uuu欧美| 国产成人亚洲综合色影视| 亚洲国产高清在线| 99久久精品一区二区| 亚洲美女视频一区| 欧美日韩中文字幕一区二区| 日本免费新一区视频| 日韩一区二区三区高清免费看看| 蜜臀av性久久久久蜜臀aⅴ| 日韩欧美亚洲一区二区| 国产麻豆9l精品三级站| 《视频一区视频二区| 色狠狠一区二区三区香蕉| 午夜视频久久久久久| 欧美刺激脚交jootjob| 国产精品一二一区| 成人免费在线视频| 欧美久久久久免费| 国产在线日韩欧美| 亚洲欧美在线高清| 7777精品伊人久久久大香线蕉经典版下载| 日本亚洲视频在线| 日本一区二区免费在线观看视频 | 久久久久久久久岛国免费| 丁香天五香天堂综合| 亚洲免费高清视频在线| 91精品国产综合久久久久久久久久 | 亚洲1区2区3区4区| 欧美精品一区二区久久久| av亚洲精华国产精华| 三级久久三级久久久| 久久精品男人天堂av| 欧美性大战久久| 国产精品综合一区二区| 夜夜嗨av一区二区三区网页| 欧美成人精精品一区二区频| www.欧美精品一二区| 美女网站色91| 亚洲免费在线观看视频| 精品美女一区二区三区| 99re热视频这里只精品| 男女性色大片免费观看一区二区 | 久久久99精品免费观看不卡| 日本精品一级二级| 国产精品538一区二区在线| 东方aⅴ免费观看久久av| 亚洲伊人色欲综合网| 久久久天堂av| 欧美性色aⅴ视频一区日韩精品| 国产一区二区在线观看免费| 午夜av电影一区| 亚洲欧洲一区二区三区| 精品不卡在线视频| 91精品国产综合久久久蜜臀图片| 99久久国产综合精品色伊| 国内精品久久久久影院薰衣草| 性久久久久久久久|