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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? ex_nandflash.c

?? LPC23xx_24xx系列ARM的源碼實(shí)例
?? C
字號(hào):
/*****************************************************************************
 *   ex_nandflash.c:  External NAND FLASH memory module file for NXP 
 *   LPC23xx Family Microprocessors
 *
 *   Copyright(C) 2006, NXP Semiconductor
 *   All rights reserved.
 *
 *   History
 *   2007.01.13  ver 1.00    Prelimnary version, first Release
 *
******************************************************************************/
#include "LPC23xx.h"				/* LPC23xx/24xx definitions */
#include "type.h"
#include "irq.h"
#include "target.h"
#include "ex_nandflash.h"

BYTE InvalidBlockTable[NANDFLASH_BLOCKNUM];

/*****************************************************************************
** Function name:		delayMs
**
** Descriptions:		Start the timer delay in milo seconds
**						until elapsed
**
** parameters:			Delay value in milo second			 
** 						
** Returned value:		None
** 
*****************************************************************************/
void delayMs(DWORD delayInMs)
{
  /*
  * setup timer #1 for delay
  */
  T1TCR = 0x02;		/* reset timer */
  T1PR  = 0x00;		/* set prescaler to zero */
  T1MR0 = delayInMs * (Fpclk / 1000);
  T1IR  = 0xff;		/* reset all interrrupts */
  T1MCR = 0x04;		/* stop timer on match */
  T1TCR = 0x01;		/* start timer */
  
  /* wait until delay time has elapsed */
  while (T1TCR & 0x01);
  return;
}

/*****************************************************************************
** Function name:		NANDFLASHRBCheck
**
** Descriptions:		Ready/Busy check, no timeout, basically, R/B bit
**						should toggle once to bail out from this routine.
**
** parameters:			None			 
** 						
** Returned value:		None
** 
*****************************************************************************/
void NANDFLASHRBCheck( void )
{
  while( FIO2PIN & (1 << 12) );		/* from high to low once */
  __asm
  {
	nop
	nop
  }
  while( !(FIO2PIN & (1 << 12)) );	/* from low to high once */
  return; 
}

/*****************************************************************************
** Function name:		NANDFLASHInit
**
** Descriptions:		initialize external NAND FLASH memory
**
** parameters:			None			 
** 						
** Returned value:		None
** 
*****************************************************************************/
void NANDFLASHInit( void )
{
  DWORD i;

  /**************************************************************************
   * Initialize EMC for NAND FLASH
   **************************************************************************/
  EMC_CTRL = 0x00000001;
  PCONP  |= 0x00000800;		/* Turn On EMC PCLK */

  FIO2DIR &= ~(1 << 12);	/* make P2.12 pin as input */
  FIO2MASK &= ~(1 << 12); 

  PINSEL4 = 0x50000000;
  PINSEL5 = 0x05050555;
  PINSEL6 = 0x55555555;
  PINSEL8 = 0x55555555;
  PINSEL9 = 0x50555555;

  /* for NAND FLASH */
  EMC_STA_CFG1      = 0x00000080;
  EMC_STA_WAITWEN1  = 0x2;
  EMC_STA_WAITOEN1  = 0x2;
  EMC_STA_WAITRD1   = 0x1F;
  EMC_STA_WAITPAGE1 = 0x1F;
  EMC_STA_WAITWR1   = 0x1F;
  EMC_STA_WAITTURN1 = 0xF;
  delayMs(2);

  /* assume all blocks are valid to begin with */
  for ( i = 0; i < NANDFLASH_BLOCKNUM; i++ )
  {
  	InvalidBlockTable[i] = 0;
  }
  return;
}

/*****************************************************************************
** Function name:		NANDFLASHReset
**
** Descriptions:		Issue Reset command to NAND FLASH memory
**
** parameters:			None			 
** 						
** Returned value:		None
** 
*****************************************************************************/
void NANDFLASHReset( void )
{
  volatile BYTE *pCLE;
  
   /* Reset NAND FLASH  through NAND FLASH command */
	pCLE = K9F1G_CLE;
	*pCLE = K9FXX_RESET;
	delayMs( 2 );
	return;
		
}

/*****************************************************************************
** Function name:		NANDFLASHReadStatus
**
** Descriptions:		Read status from NAND FLASH memory
**
** parameters:			None			 
** 						
** Returned value:		Status
** 
*****************************************************************************/
DWORD NANDFLASHReadStatus( DWORD Cmd )
{
  volatile BYTE *pCLE;
  volatile BYTE *pDATA;
  BYTE StatusData;
  
  pCLE  = K9F1G_CLE;
  pDATA = K9F1G_DATA;
    
  *pCLE = K9FXX_READ_STATUS;
  /* Wait until bit 5 and 6 are 1, READY, bit 7 should be 1 too, not protected */
  /* if ready bit not set, it gets stuck here */
  while ( (*pDATA & 0xE0) != 0xE0 );
  StatusData = *pDATA;
  switch ( Cmd )
  {
  	case K9FXX_BLOCK_PROGRAM_1:
	case K9FXX_BLOCK_ERASE_1:
		if ( StatusData & 0x01 )	/* Erase/Program failure(1) or pass(0) */
			return( FALSE );
		else
			return( TRUE );
	case K9FXX_READ_1:				/* bit 5 and 6, Read busy(0) or ready(1) */
			return( TRUE );			
	default:
		break;
  }  
  return( FALSE );
}

/*****************************************************************************
** Function name:		NANDFLASHReadID
**
** Descriptions:		Read ID from external NAND FLASH memory
**
** parameters:			None			 
** 						
** Returned value:		Device ID info.
** 
*****************************************************************************/
DWORD NANDFLASHReadID( void )
{
  BYTE a, b, c, d;
  volatile BYTE *pCLE;
  volatile BYTE *pALE;
  volatile BYTE *pDATA;
  
  pCLE  = K9F1G_CLE;
  pALE  = K9F1G_ALE;
  pDATA = K9F1G_DATA;
    
  *pCLE = K9FXX_READ_ID;
  *pALE = 0;
    
  a = *pDATA;
  b = *pDATA;
  d = *pDATA;
  c = *pDATA;
  return ((a << 24) | (b << 16) | (c << 8) | d);
}

/*****************************************************************************
** Function name:		NANDFLASHEraseBlock
**
** Descriptions:		Erase the whole NAND FLASH memory block based on the
**						block number
**
** parameters:			block number			 
** 						
** Returned value:		Erase status: succeed or fail
** 
*****************************************************************************/
DWORD NANDFLASHEraseBlock( DWORD blockNum )
{
  volatile BYTE *pCLE;
  volatile BYTE *pALE;
  DWORD rowAddr;
  
  pCLE  = K9F1G_CLE;
  pALE  = K9F1G_ALE;

  rowAddr = (NANDFLASH_BASE_ADDR 
  		+ blockNum * NANDFLASH_PAGE_PER_BLOCK * NANDFLASH_RW_PAGE_SIZE) >> 16;    
  *pCLE = K9FXX_BLOCK_ERASE_1;
  *pALE = (BYTE)(rowAddr & 0x00FF);			/* column address low */
  *pALE = (BYTE)((rowAddr & 0xFF00) >> 8);	/* column address high */
  *pCLE = K9FXX_BLOCK_ERASE_2;

  NANDFLASHRBCheck();
  return( NANDFLASHReadStatus( K9FXX_BLOCK_ERASE_1 ) );
}

/*****************************************************************************
** Function name:		NANDFLASHCheckValidBlock
**
** Descriptions:		This routine is used to check if the block is valid or 
**						not.
**
** parameters:			None			 
** 						
** Returned value:		FALSE is invalid block is found, an initial invalid
**						table will be created. TRUE if all blocks are valid.   
** 
*****************************************************************************/
DWORD NANDFLASHCheckValidBlock( void )
{
  volatile BYTE *pCLE;
  volatile BYTE *pALE;
  volatile BYTE *pDATA;
  DWORD block, page, retValue = TRUE;
  DWORD curAddr;

  pCLE  = K9F1G_CLE;
  pALE  = K9F1G_ALE;
  pDATA = K9F1G_DATA;

  for ( block = 0; block < NANDFLASH_BLOCKNUM; block++ )
  {  
	curAddr = NANDFLASH_BASE_ADDR 
		+ block * NANDFLASH_PAGE_PER_BLOCK * NANDFLASH_RW_PAGE_SIZE;
	for ( page = 0; page < 2; page++ )
	{
		/* Check column address 2048 at first page and second page */
		curAddr += page * NANDFLASH_RW_PAGE_SIZE;       
		*pCLE = K9FXX_READ_1;
		*pALE =  (BYTE)(curAddr & 0x00000000);			/* column address low */
		*pALE = (BYTE)((curAddr | 0x00000800) >> 8);	/* column address high */
		*pALE = (BYTE)((curAddr & 0x00FF0000) >> 16);	/* row address low */
		*pALE = (BYTE)((curAddr & 0xFF000000) >> 24);	/* row address high */
		*pCLE = K9FXX_READ_2;

		NANDFLASHRBCheck();
		if ( *pDATA != 0xFF )
		{
			/* found invalid block number, mark block number in the invalid 
			block table. */
			InvalidBlockTable[block] = 1;
			retValue = FALSE;		/* At least one block is invalid. */
		}
	}
  }  			
  return( retValue );
}

/*****************************************************************************
** Function name:		NANDFLASHPageProgram
**
** Descriptions:		Write a full page of program into NAND flash based on the
**						page number, write up to 2112 bytes of data at a time.  
**
** parameters:			page number, block number, and pointer to the buffer			 
** 						
** Returned value:		Erase status: succeed or fail
** 
*****************************************************************************/
DWORD NANDFLASHPageProgram( DWORD pageNum, DWORD blockNum, BYTE *bufPtr )
{
  volatile BYTE *pCLE;
  volatile BYTE *pALE;
  volatile BYTE *pDATA;
  DWORD i, curAddr;
  
  pCLE  = K9F1G_CLE;
  pALE  = K9F1G_ALE;
  pDATA = K9F1G_DATA;
  
  curAddr = NANDFLASH_BASE_ADDR + blockNum * NANDFLASH_BLOCKNUM
  							+ pageNum * NANDFLASH_RW_PAGE_SIZE;  
  *pCLE = K9FXX_BLOCK_PROGRAM_1;
  *pALE =  (BYTE)(curAddr & 0x000000FF);		/* column address low */
  *pALE = (BYTE)((curAddr & 0x00000F00) >> 8);	/* column address high */
  *pALE = (BYTE)((curAddr & 0x00FF0000) >> 16);	/* row address low */
  *pALE = (BYTE)((curAddr & 0xFF000000) >> 24);	/* row address high */
  __asm
  {
	nop
	nop
  }
  for ( i = 0; i < NANDFLASH_RW_PAGE_SIZE; i++ )
  {
	*pDATA = *bufPtr++;
  }
  *pCLE = K9FXX_BLOCK_PROGRAM_2;

  __asm
  {
	nop
	nop
  }
  NANDFLASHRBCheck();
  return( NANDFLASHReadStatus( K9FXX_BLOCK_PROGRAM_1 ) );
}

/*****************************************************************************
** Function name:		NANDFLASHPageRead
**
** Descriptions:		Read the whole NAND FLASH memory page based on the
**						page number, the data will be stored in the pointer
**						to the buffer.
**
** parameters:			page number, block number, buffer pointer;			 
** 						
** Returned value:		Erase status: succeed or fail
** 
*****************************************************************************/
DWORD NANDFLASHPageRead( DWORD pageNum, DWORD blockNum, BYTE *bufPtr )
{
  volatile BYTE *pCLE;
  volatile BYTE *pALE;
  volatile BYTE *pDATA;
  DWORD i, curAddr;
  
  pCLE  = K9F1G_CLE;
  pALE  = K9F1G_ALE;
  pDATA = K9F1G_DATA;
  
   curAddr = NANDFLASH_BASE_ADDR + blockNum * NANDFLASH_BLOCKNUM
  							+ pageNum * NANDFLASH_RW_PAGE_SIZE;
  *pCLE = K9FXX_READ_1;
  *pALE =  (BYTE)(curAddr & 0x000000FF);		/* column address low */
  *pALE = (BYTE)((curAddr & 0x00000F00) >> 8);	/* column address high */
  *pALE = (BYTE)((curAddr & 0x00FF0000) >> 16);	/* row address low */
  *pALE = (BYTE)((curAddr & 0xFF000000) >> 24);	/* row address high */
  *pCLE = K9FXX_READ_2;

  NANDFLASHRBCheck();
  for ( i = 0; i < NANDFLASH_RW_PAGE_SIZE; i++ )
  {
	*bufPtr = *pDATA;
	bufPtr++;
  }
  return( TRUE );
}

/*********************************************************************************
**                            End Of File
*********************************************************************************/

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国内精品久久久久影院色| 亚洲色图在线播放| 欧美激情一区二区| 一区二区三区精品视频在线| 男女男精品视频| 成人免费视频国产在线观看| 欧美视频一区二区三区| 欧美不卡激情三级在线观看| 国产精品伦理在线| 日韩不卡一二三区| 成人激情图片网| 在线电影欧美成精品| 日本一区二区不卡视频| 五月开心婷婷久久| 成人在线综合网站| 欧美美女一区二区在线观看| 国产欧美综合在线观看第十页| 日韩毛片在线免费观看| 美国十次了思思久久精品导航| 99九九99九九九视频精品| 欧美精品第1页| 综合分类小说区另类春色亚洲小说欧美| 日韩电影在线一区二区三区| 成a人片国产精品| 日韩视频在线一区二区| 亚洲欧美日韩在线| 国产一区二区三区久久久| 在线观看国产日韩| 亚洲国产电影在线观看| 免费成人在线观看| 在线精品视频免费播放| 中文字幕精品三区| 国产在线一区二区| 欧美日韩极品在线观看一区| 中文字幕一区二区三区四区| 国内精品久久久久影院一蜜桃| 欧美日韩成人在线一区| 亚洲欧美韩国综合色| 国产成人精品综合在线观看| 日韩欧美一级在线播放| 亚洲gay无套男同| 成人av电影在线观看| 久久久不卡网国产精品一区| 日本视频免费一区| 欧美视频日韩视频在线观看| 国产精品国产三级国产专播品爱网| 看片的网站亚洲| 欧美精品色综合| 亚洲综合久久久| 91网址在线看| 国产精品免费视频网站| 国内精品第一页| 日韩精品中午字幕| 裸体歌舞表演一区二区| 欧美精品1区2区3区| 亚洲一级二级在线| 色先锋资源久久综合| 亚洲欧美在线观看| av综合在线播放| 亚洲丝袜制服诱惑| 99精品久久久久久| 136国产福利精品导航| 成人激情av网| 亚洲欧洲99久久| 一本高清dvd不卡在线观看| 久久久www成人免费毛片麻豆| 国产一区免费电影| 久久精品亚洲麻豆av一区二区| 国产综合久久久久影院| 久久久久久久久久久久电影| 精品无人码麻豆乱码1区2区| 欧美刺激脚交jootjob| 精品一区二区三区欧美| 精品国产自在久精品国产| 狠狠色狠狠色综合日日91app| 欧美大胆人体bbbb| 久久精品国产亚洲一区二区三区| 精品日产卡一卡二卡麻豆| 精东粉嫩av免费一区二区三区| 欧美xxxx老人做受| 国产精品系列在线观看| 欧美国产在线观看| 91看片淫黄大片一级| 亚洲在线中文字幕| 欧美久久久久久久久久| 麻豆高清免费国产一区| 国产丝袜美腿一区二区三区| 成人精品视频一区二区三区尤物| 国产精品私人影院| 色狠狠色狠狠综合| 肉肉av福利一精品导航| 日韩精品在线看片z| 国产成人丝袜美腿| 亚洲人成小说网站色在线| 欧美日韩视频不卡| 久久精品99久久久| 国产女主播视频一区二区| 色综合久久综合网| 日韩**一区毛片| 国产调教视频一区| 欧美在线制服丝袜| 美国一区二区三区在线播放| 国产日韩欧美一区二区三区综合| 色综合久久天天综合网| 日韩精品三区四区| 久久久久国产一区二区三区四区| 99riav久久精品riav| 午夜精品一区二区三区三上悠亚 | 国产精品国产三级国产a| 色综合天天做天天爱| 天堂久久久久va久久久久| 精品国产百合女同互慰| 成人免费视频播放| 婷婷一区二区三区| 国产欧美日韩在线| 欧美日韩日日摸| 国产一区二区美女诱惑| 亚洲男人的天堂av| 精品久久五月天| 色综合久久综合网欧美综合网| 美女在线视频一区| 日韩一区在线免费观看| 日韩一区二区三区在线视频| 99久久99久久精品免费观看| 青娱乐精品视频| 亚洲女女做受ⅹxx高潮| 精品欧美乱码久久久久久1区2区| 99精品在线观看视频| 激情综合色综合久久综合| 一级女性全黄久久生活片免费| 精品国产乱码久久久久久免费| 一本一道综合狠狠老| 国产乱一区二区| 日韩成人一区二区| 亚洲欧美日韩国产中文在线| 久久女同性恋中文字幕| 欧美男男青年gay1069videost| 成人激情综合网站| 精品系列免费在线观看| 亚洲成人免费看| 亚洲欧洲三级电影| 久久久久久久久久久久久女国产乱 | 91麻豆精品国产91久久久资源速度| 国产成人a级片| 美国欧美日韩国产在线播放| 亚洲午夜精品一区二区三区他趣| 国产亚洲制服色| 日韩一级在线观看| 欧美日韩国产高清一区二区三区 | 一区二区成人在线观看| 欧美国产在线观看| 欧美成人一区二区| 777亚洲妇女| 欧美色精品在线视频| 99视频超级精品| 懂色av一区二区三区蜜臀| 蜜桃视频免费观看一区| 午夜视黄欧洲亚洲| 一区二区三区欧美亚洲| 国产精品动漫网站| 国产女同性恋一区二区| 久久久蜜臀国产一区二区| 日韩欧美区一区二| 欧美乱熟臀69xxxxxx| 欧美在线一二三四区| 色综合久久久久综合体桃花网| av午夜一区麻豆| 99视频精品免费视频| 国产白丝精品91爽爽久久| 国产成人在线看| 国产一区二区在线电影| 国内成人自拍视频| 狠狠色丁香久久婷婷综合_中 | 欧美精品一区二区三区一线天视频| 91麻豆精品国产91久久久| 欧美日韩在线一区二区| 欧美专区日韩专区| 色94色欧美sute亚洲线路一ni| 91亚洲午夜精品久久久久久| 成人h动漫精品一区二区| 成人性视频免费网站| 国产成人8x视频一区二区| 国产98色在线|日韩| 国产不卡在线一区| 风间由美中文字幕在线看视频国产欧美| 国产精品一线二线三线| 国产精品一品视频| 成人免费毛片片v| 不卡视频一二三| 91视频在线观看免费| 91久久线看在观草草青青| 91美女在线观看| 欧美日韩一区高清| 欧美一区二区三区视频在线观看 | 三级不卡在线观看| 美国欧美日韩国产在线播放| 国产真实乱子伦精品视频| 成人精品国产福利| 在线精品视频免费播放| 欧美精品1区2区|