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

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

?? bl_nfi.c

?? mtk 平臺 bootloader
?? C
?? 第 1 頁 / 共 2 頁
字號:
	      *NFI_ADDRM = addr2;
	   *NFI_ADDNOB = addr_no;	           // number of bytes for address	   
	   while (*NFI_PSTA & STATUS_ADDR);	   
	}
	else
	{
	   *NFI_CMD = RD_1ST_CMD;	           // Issue data input command
	   while (*NFI_PSTA & STATUS_CMD);	   
	   *NFI_ADDRL = addr1;
	   if ( addr_no>4 )
	      *NFI_ADDRM = addr2;
	   *NFI_ADDNOB = addr_no;	           // no. of bytes for address	
	   while (*NFI_PSTA & STATUS_ADDR);	   
	   *NFI_CMD = RD_2ND_CYCLE_CMD;
	   while (*NFI_PSTA & STATUS_CMD);	   
	}

   *NFI_OPCON = BURST_RD | NOB_DWORD;    // set burst read
   
   while( *NFI_PSTA & STATUS_DATAR );
   
   NFI_Wait_Ready(timeout);
   
   if ( timeout==0 )
      return KAL_FALSE;

   // Activating DMA transfer
   if ( ECC )
      *NFI_CON = (DMA_RD_EN | AUTOECC_DEC_EN);
   else
      *NFI_CON = DMA_RD_EN;
   
   *(volatile kal_uint32 *)(0x80030118) = 0x0000;
   *(volatile kal_uint32 *)(0x80030100) = (kal_uint32)NFI_DATAR;
   *(volatile kal_uint32 *)(0x80030104) = (kal_uint32)destination;
   *(volatile kal_uint32 *)(0x80030110) = length>>2;
   *(volatile kal_uint32 *)(0x80030114) = 0x00f4001a;
   *(volatile kal_uint32 *)(0x80030128) = 0;
   *(volatile kal_uint32 *)(0x80030118) = 0x8000;
   
   timeout = 0xfff;
   
   while ( ((*(volatile kal_uint32 *)(0x80030000)&0x03)==0x01) && (timeout--) ); 
   
   if ( timeout==0 )
	   return DMA_TRANSFER_DATA_TIMEOUT;
         
//   while (!(*NFI_FIFOCON & RD_EMPTY_MASK) || (*NFI_PSTA & STATUS_DATAR));
   while (*NFI_PSTA & STATUS_BUSY);   

   if ( ECC )
   {
		if ( parity==NULL )
			return NFI_ZERO_POINTER;
		 
		if ( pageSize<1024 )
		{
			parity_ptr[0] = *NFI_PAR6;
			parity_ptr[0] |= (*NFI_PAR7) << 16;         
		}
		else
		{
			parity_ptr[0] = *NFI_PAR0;
			parity_ptr[0] |= (*NFI_PAR1) << 16;
			parity_ptr[1] = *NFI_PAR2;
			parity_ptr[1] |= (*NFI_PAR3) << 16;
			parity_ptr[2] = *NFI_PAR4;
			parity_ptr[2] |= (*NFI_PAR5) << 16;
			parity_ptr[3] = *NFI_PAR6;
			parity_ptr[3] |= (*NFI_PAR7) << 16;
		}         
   }
   
   // Caution: This line must not omitted!
   *NFI_OPCON = 0x0;
   
   if ( timeout )
	   return NFI_SUCCESS;
	else 
	   return NFI_READ_DATA_TIMEOUT;
}

/**********************************************************
Description : NFI_SpareRead
Input       : .......
Output      : _RET_CODE
Remark      : Must be spare area aligned
***********************************************************/
_RET_CODE NFI_SpareRead(kal_uint32 *spare, kal_uint16 addr_no, kal_uint32 addr1, \
                        kal_uint16 addr2, kal_uint16 pageSize, kal_uint16 IO)
{
	kal_int16 timeout=0xfff, size, i;
	  
	*NFI_OPCON = 0x00;
	*NFI_CON = 0x00;        
	*NFI_FIFOCON = 0x30;                  // Flushing FIFO

	if ( pageSize<1024 )
	{
		size = 16;
		*NFI_CON = SW_PROGSPARE_EN;        // program/read spare area enable
		*NFI_CMD = RD_SPARE_CMD;			  // reading spare command	   
		while (*NFI_PSTA & STATUS_CMD);	  
		*NFI_ADDRL = (addr1&0xffffff00);	 
		*NFI_ADDRM = 0;
		*NFI_ADDNOB = addr_no;             // number of bytes for address
		while (*NFI_PSTA & STATUS_ADDR);	 
	}
	else
	{
		size = 64;
		*NFI_CON = SW_PROGSPARE_EN;        // program spare area enable
		*NFI_CMD = RD_1ST_CMD;             // read spare command
		while (*NFI_PSTA & STATUS_CMD);	  
		if ( IO==IO_16BITS )
		{
			// addr1 >>= 1;	   
			addr1 = addr1 + (2048/2);
		}
		else 
		{
			addr1 = addr1 + 2048;
		}
		*NFI_ADDRL = addr1;
		if ( addr_no>4 )
			*NFI_ADDRM = addr2;
		*NFI_ADDNOB = addr_no;             // number of bytes for address
		while (*NFI_PSTA & STATUS_ADDR);	   
		*NFI_CMD = RD_2ND_CYCLE_CMD;            
		while (*NFI_PSTA & STATUS_CMD);	   
	}	   

	//	*NFI_OPCON = BURST_RD | NOB_WORD;     // set burst read	
	*NFI_OPCON = BURST_RD | NOB_DWORD;     // set burst read	

	while( *NFI_PSTA & STATUS_DATAR );

	NFI_Wait_Ready(timeout);

	if ( timeout==0 )
	  return NFI_READ_SPARE_TIMEOUT;


	/*   *NFI_CON |= DMA_RD_EN;
	*(volatile kal_uint32 *)(0x80030118) = 0x0000;
	*(volatile kal_uint32 *)(0x80030100) = (kal_uint32)NFI_DATAR;
	*(volatile kal_uint32 *)(0x80030104) = (kal_uint32)spare;
	*(volatile kal_uint32 *)(0x80030110) = size>>2;
	*(volatile kal_uint32 *)(0x80030114) = 0x00f4001a;
	*(volatile kal_uint32 *)(0x80030128) = 0;
	*(volatile kal_uint32 *)(0x80030118) = 0x8000;

	timeout = 0xfff;

	while ( ((*(volatile kal_uint32 *)(0x80030000)&0x03)==0x01) && (timeout--) ); */


	for (i=0; i<(size/4); i++)
	{
		while ((*NFI_FIFOCON & RD_EMPTY_MASK));
		spare[i] = *NFI_DATAR;
	}   

/*	dbg_print("Spare area = ");
	for(i=0; i<(size/4); i++) {
	     dbg_print("%x ", spare[i]);
	}
	dbg_print("\n\r");*/


	//   while (*NFI_PSTA & STATUS_DATAR);
	// Caution: This line must not omitted!
	*NFI_OPCON = 0x0;
	while (*NFI_PSTA & STATUS_BUSY);   

	if ( timeout )
	   return NFI_SUCCESS;
	else 
	   return DMA_TRANSFER_SPARE_TIMEOUT;
}

/**********************************************************
Description : NFI_ParityCheck
Input       : .......
Output      : _RET_CODE
Remark      : Must be page alignment.
***********************************************************/
_RET_CODE NFI_ParityCheck(kal_uint32 *destination, kal_uint32 *parity, kal_uint16 addr_no, \
                          kal_uint32 addr1, kal_uint16 addr2, kal_uint16 pageSize, kal_uint16 IO, \
                          kal_uint32 blockSize)
{
   _RET_CODE  status;
   kal_uint32 spare[64>>2];
   
   status = NFI_SpareRead(&spare[0], addr_no, addr1, addr2, pageSize, IO);
   
   if ( status!=NFI_SUCCESS )
      return status;
  
   if ( pageSize<1024 )
      status = NUTL_ECC_Correction(destination, parity, &spare[0], 512, blockSize);
   else
      status = NUTL_ECC_Correction(destination, parity, &spare[0], 2048, blockSize);
   
   return status;
}
                  
/**********************************************************
Description : NFI_CheckGoodBlock
Input       : NFI_MENU, baseaddr must be page alignment
Output      : U32 return data
              512B/page, 8-bits interface, 0x????FF??
              otherwise, 0x????FFFF or 0x??????FF
              for good page
              2: Read error
***********************************************************/ 
static kal_uint32 NFI_CheckGoodBlock(NFI_MENU *input, kal_uint32 addr1, kal_uint16 addr2)
{
   kal_uint32 rb_data[4];
   kal_int16  timeout=0xfff, size;
   
   rb_data[0]= 0;
   rb_data[1]= 0;
   rb_data[2]= 0;
   rb_data[3]= 0;
   
   *NFI_OPCON = 0x00;
   *NFI_CON = 0x00;        
   *NFI_FIFOCON = 0x30;                  // Flushing FIFO
   
   if ( input->pageSize<1024 )
   {
      *NFI_CON = SW_PROGSPARE_EN;        // program/read spare area enable
	   *NFI_CMD = RD_SPARE_CMD;			  // reading spare command	   
	   while (*NFI_PSTA & STATUS_CMD);	  
	   *NFI_ADDRL = (addr1&0xffffff00);	 
	   *NFI_ADDRM = 0;
	   *NFI_ADDNOB = input->addressCycle; // number of bytes for address
	   while (*NFI_PSTA & STATUS_ADDR);	 
	}
	else
	{
	   *NFI_CON = SW_PROGSPARE_EN;        // program spare area enable
	   *NFI_CMD = RD_1ST_CMD;             // read spare command
	   while (*NFI_PSTA & STATUS_CMD);	  
	   if ( input->IOInterface == IO_8BITS )
	      *NFI_ADDRL = addr1 + 2048;
	   else
	      *NFI_ADDRL = addr1 + 1024;
	   if ( input->addressCycle>4 )
	      *NFI_ADDRM = addr2;
	   *NFI_ADDNOB = input->addressCycle; // number of bytes for address
	   while (*NFI_PSTA & STATUS_ADDR);	   
      *NFI_CMD = RD_2ND_CYCLE_CMD;            
      while (*NFI_PSTA & STATUS_CMD);	   
	}	   

	*NFI_OPCON = BURST_RD | NOB_WORD;  // set burst read	
	
	while( *NFI_PSTA & STATUS_DATAR );
	
   NFI_Wait_Ready(timeout);
   
   if ( timeout==0 )
      return 2;
   
   size = 0;
   timeout=0xfff;
   
   while ( (size<4) && timeout>0 )
 	{
	   if ( !(*NFI_FIFOCON&RD_EMPTY_MASK) )
	   {
         rb_data[size] = *NFI_DATAR;
         size ++;
      }
      else 
         timeout--;
   }
   
   if ( timeout<=0 )
      return 2;
      
   // Caution: This line must not omitted!
   *NFI_OPCON = 0x0;
      
   if ( input->pageSize<1024 )
   {
      if ( input->IOInterface == IO_8BITS )
         return ( (kal_uint32)((rb_data[1]&0xff00)>>8) );
      else
         return ( ((kal_uint32)(rb_data[0]&0xff) | (rb_data[1]&0xff00)) );
   }
   else
   {
      if ( input->IOInterface == IO_8BITS )
         return ( (kal_uint32)(rb_data[0]&0xff) );
      else
         return ( (kal_uint32)(rb_data[0]&0xffff) );
   }
}


/**********************************************************
Description : NFIReconfigure
Input       : NO
Output      : NO
***********************************************************/
void NFIReconfigure(void)
{
	*NFI_FIFOCON = 0x30;                  // Flushing FIFO
	*NFI_OPCON = 0x00;
	*NFI_CON = 0x00;     
	// Force 512Bytes ECC block size for both 2KB and 512B NAND-flash
	*NFI_PAGEFMT |= 0x20;
	*NFI_ACCCON = 0x7FF;
}


/**********************************************************
Description : GoodBlockChecking
Input       : NFI_MENU, NFIReadPtr must be page alignment
Output      : TRUE, good block, FALSE, bad block
***********************************************************/
kal_bool GoodBlockChecking(NFI_MENU *input, kal_uint32 addr1, kal_uint16 addr2)
{
   kal_uint32 marking, i;
      
   for (i=0; i<2; i++)
   {
      // Read the bad block marking from the first page
      marking = NFI_CheckGoodBlock(input, addr1, addr2);
      if ( (marking!=0xff) && (marking!=0xffff) )
         return KAL_FALSE;
      addr1 = addr1 + (1<<input->pageShift);
   }
         
   return KAL_TRUE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人av免费| 欧美成人在线直播| 日韩一区二区在线看片| 亚洲国产精品t66y| 日韩影视精彩在线| 91丨porny丨蝌蚪视频| 精品久久一区二区三区| 亚洲一区二区四区蜜桃| 99精品视频中文字幕| 久久久美女毛片| 免费观看成人鲁鲁鲁鲁鲁视频| 91欧美激情一区二区三区成人| 欧美大片一区二区| 亚洲国产精品人人做人人爽| av高清久久久| 中文字幕免费在线观看视频一区| 美女网站一区二区| 91精品国产综合久久国产大片| 亚洲精品免费在线观看| 成人动漫视频在线| 国产午夜精品久久| 国产美女娇喘av呻吟久久| 欧美一级高清片| 水野朝阳av一区二区三区| 欧美亚洲国产一区在线观看网站 | 狠狠色综合播放一区二区| 欧美日韩aaaaa| 一区二区三区四区亚洲| 99在线精品一区二区三区| 国产精品久久久久久久久免费樱桃 | 久久欧美中文字幕| 韩国毛片一区二区三区| 欧美大胆人体bbbb| 国产一区二区在线视频| 久久女同性恋中文字幕| 国产91在线观看丝袜| 国产日本欧美一区二区| 成人福利视频在线| 中文字幕日韩av资源站| 91影视在线播放| 一区二区三区四区在线播放 | 亚洲人成网站精品片在线观看| 99久久精品久久久久久清纯| 最新日韩av在线| 色婷婷综合久久久久中文| 亚洲一区二区三区视频在线| 欧美精品99久久久**| 日韩中文字幕区一区有砖一区 | 久久精品日产第一区二区三区高清版| 狠狠久久亚洲欧美| 亚洲国产经典视频| 色8久久人人97超碰香蕉987| 亚洲主播在线播放| 精品免费国产一区二区三区四区| 国产在线国偷精品免费看| 国产精品国产三级国产a| 一本色道久久综合亚洲精品按摩| 亚洲成人第一页| 精品少妇一区二区三区在线播放| 国产一区二区美女诱惑| 亚洲欧美另类久久久精品| 欧美日韩精品一区二区| 国产一区二区三区免费观看| 亚洲乱码国产乱码精品精98午夜| 337p亚洲精品色噜噜狠狠| 国产乱妇无码大片在线观看| 亚洲女与黑人做爰| 日韩欧美不卡一区| 99re成人在线| 麻豆国产精品777777在线| 欧美激情一区二区三区四区| 91黄色免费网站| 国产麻豆精品久久一二三| 亚洲综合视频网| 久久久综合视频| 欧美少妇bbb| 成人97人人超碰人人99| 免费在线观看视频一区| 亚洲另类在线制服丝袜| 国产三级一区二区三区| 欧美日韩久久不卡| 99精品久久只有精品| 老司机午夜精品99久久| 一区二区久久久| 欧美国产日产图区| 日韩欧美国产系列| 欧美日韩一区二区三区四区五区| 国产91精品欧美| 激情综合亚洲精品| 日韩电影网1区2区| 一区二区成人在线| 中文字幕亚洲欧美在线不卡| 日韩免费一区二区三区在线播放| 日本高清免费不卡视频| 成人免费高清视频| 国产一级精品在线| 美女一区二区三区| 日韩黄色免费网站| 亚洲综合成人在线| 亚洲欧美日韩小说| 亚洲色大成网站www久久九九| 久久久三级国产网站| 欧美电视剧在线看免费| 日韩欧美色综合| 欧美一区二区三区四区视频| 欧美美女一区二区在线观看| 欧美亚洲免费在线一区| 91久久精品网| 在线视频你懂得一区| 色综合视频在线观看| 成人激情文学综合网| 成人18视频日本| 成人av免费观看| aaa国产一区| 91蝌蚪porny| 91亚洲国产成人精品一区二区三| 成人综合日日夜夜| thepron国产精品| 91麻豆自制传媒国产之光| 91国偷自产一区二区开放时间 | 国产成人在线网站| 国产一区欧美日韩| 国产成人无遮挡在线视频| 国产精品77777竹菊影视小说| 国产成人av在线影院| 粉嫩蜜臀av国产精品网站| 大尺度一区二区| 色老头久久综合| 7777精品伊人久久久大香线蕉 | 欧美又粗又大又爽| 欧美日韩免费电影| 日韩精品最新网址| 国产欧美视频一区二区| 国产精品热久久久久夜色精品三区| 国产精品每日更新| 亚洲一区日韩精品中文字幕| 午夜精品久久久久久久久| 久久99最新地址| 成人一区二区三区视频在线观看| 91久久精品网| 日韩视频一区二区三区在线播放| 久久久久久久一区| 亚洲乱码精品一二三四区日韩在线| 午夜激情综合网| 国产一区二区影院| 色综合一区二区| 欧美一区二区私人影院日本| 国产日韩精品一区二区三区| 亚洲资源在线观看| 激情五月激情综合网| 99re在线精品| 日韩欧美一区二区在线视频| 国产精品久久久久影院亚瑟| 亚洲国产成人tv| 国产精品一区二区你懂的| 在线视频一区二区三区| 久久久久久久久久久久久久久99| 亚洲精品写真福利| 国产一区二区三区观看| 欧美亚洲高清一区二区三区不卡| 欧美成人综合网站| 亚洲精品精品亚洲| 国产真实乱偷精品视频免| 色老汉av一区二区三区| 国产亚洲综合在线| 日韩制服丝袜av| 在线看一区二区| 欧美韩国日本不卡| 蜜桃av噜噜一区| 欧美视频一区二| 综合电影一区二区三区 | 欧美在线小视频| 国产亚洲一区二区在线观看| 日韩精品一区第一页| 91在线porny国产在线看| 国产亚洲美州欧州综合国| 日韩中文字幕区一区有砖一区| 白白色亚洲国产精品| 久久亚洲春色中文字幕久久久| 午夜精品久久久久| 日本高清免费不卡视频| 中文字幕日本不卡| 国产成人av电影在线| 欧美va亚洲va香蕉在线| 日韩精彩视频在线观看| 欧美军同video69gay| 日韩理论电影院| 不卡一卡二卡三乱码免费网站| 久久九九全国免费| 国产一区 二区 三区一级| 欧美xxxxxxxx| 激情文学综合网| 精品99一区二区三区| 久久国产尿小便嘘嘘| 日韩精品自拍偷拍| 精品一区二区三区的国产在线播放| 欧美一区二区三区视频免费播放| 午夜成人免费电影| 欧美日韩国产另类不卡| 午夜精品久久久久久久蜜桃app |