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

📄 nandmtd.c

📁 原创
💻 C
📖 第 1 页 / 共 3 页
字号:
  if (len & 1)    *(dst + len-1) = val;}/*----------------------------------------------------------------------*//*                      w a i t F o r R e a d y				*//*									*//* Wait for the selected device to be ready.				*//*                                                                      *//* Author: 王辉              Date: 2004-8-21                            *//*									*//* Parameters:                                                          *//*	   void                                      			*//*									*//* Returns:								*//*	   TRUE if device is ready                          		*//*                                                                      *//*----------------------------------------------------------------------*/FLBoolean waitForReady (void){    int val;        do    {        READ_REG(val);        val &= 0x0040;    /* R/B 接 P6.6 读R/B状态判断设备状态 */     } while(val == 0);    return TRUE; }/*----------------------------------------------------------------------*//*		          m a k e C o m m a n d				*//*									*//* Set Page Pointer to Area A, B or C in page.				*//*                                                                      *//* Author: 王辉              Date:2004-8-21                            *//*                                                                      *//* Parameters:                                                          *//*	vol     : Pointer identifying drive			        *//*	cmd	: receives command relevant to area			*//*	addr	: receives the address to the right area.		*//*	modes	: mode of operation (EXTRA ...)				*//*                                                                      *//*----------------------------------------------------------------------*/static void makeCommand (PointerOp *cmd, CardAddress address, int modes){    int bit8;    if (modes & EXTRA)      *cmd = AREA_C;    else      {       	bit8 = (unsigned short)address & 0x100;      	if(bit8 == 0)      	  *cmd = AREA_A;      	else      	  *cmd = AREA_B;      }}/*----------------------------------------------------------------------*//*		          s e t A d d r e s s				*//*									*//* Latch address to selected flash device.				*//*									*//* Parameters:                                                          *//*	address		: address to set.				*//*                                                                      *//*----------------------------------------------------------------------*/static void setAddress(CardAddress address ){  WRITE_ADDRESS((unsigned char)address);  WRITE_ADDRESS((unsigned char)(address >> 9));  WRITE_ADDRESS((unsigned char)(address >> 17));}/*----------------------------------------------------------------------*//*		          r e a d C o m m a n d				*//*									*//* Issue read command.							*//*									*//* Parametes:                                                          	*//*      cmd		: Command to issue (according to area). 	*//*	address		: address to read from.				*//*									*//*----------------------------------------------------------------------*/static void readCommand (PointerOp  cmd, CardAddress address){  WRITE_COMMAND (cmd);       /* move flash pointer to respective area of the page*/  setAddress (address);  waitForReady();}/*----------------------------------------------------------------------*//*		          w r i t e C o m m a n d			*//*									*//* Issue write command.							*//*									*//* Parametes:                                                          	*//*      cmd		: Command to issue (according to area). 	*//*	address		: address to write to.				*//*									*//*----------------------------------------------------------------------*/static void writeCommand (PointerOp  cmd, CardAddress address){  WRITE_COMMAND(cmd);       /* move flash pointer to respective area of the page  */  WRITE_COMMAND(SERIAL_DATA_INPUT);       /* start data loading for write  */  setAddress (address);}/*----------------------------------------------------------------------*//*		          r e a d S t a t u s				*//*									*//* Read status of selected flash device.				*//*									*//* Parameters:								*//*									*//* Returns:                                                          	*//*      Chip status.							*//*									*//*----------------------------------------------------------------------*/unsigned char readStatus(void){  unsigned char chipStatus ;  WRITE_COMMAND(READ_STATUS);  READ_DATA(chipStatus);   return chipStatus;}/*----------------------------------------------------------------------*//*		          w r i t e E x e c u t e			*//*									*//* Execute write.							*//*									*//* Parametes:								*//* Returns:                                                          	*//*	FLStatus	: 0 on success, otherwise failed.		*//*									*//*----------------------------------------------------------------------*/static FLStatus writeExecute (void){  WRITE_COMMAND(SETUP_WRITE);             /* execute page program*/  waitForReady();  if(readStatus() & FAIL)    return flWriteFault ;  return flOK ;}/*----------------------------------------------------------------------*//*		          r e a d O n e S e c t o r			*//*									*//* Read up to one 512-byte block from flash.				*//*									*//* Parameters:								*//*	vol		: Pointer identifying drive			*//* 	address	: Address to read from.					*//*	buffer	: buffer to read to.					*//*	length	: number of bytes to read (up to sector size).		*//*	modes	: EDC flag etc.						*//*									*//* Returns:                                                          	*//*	FLStatus: 0 on success, otherwise failed.			*//*									*//*----------------------------------------------------------------------*/static FLStatus readOnePage (FLFlash vol,			     CardAddress address,  /* starting flash address*/			     char FAR1 *buffer,     /* target buffer */			     int length,           /* bytes to read */			     int modes)            /* EDC flag etc.*/{  FLStatus  status = flOK;  PointerOp   cmd;  int bit8;  /* move flash pointer to areas A,B or C of page*/  makeCommand (&cmd, address, modes);  readCommand (cmd, address);     tffscpy16((unsigned char*)buffer, (const unsigned char *) 0x1000000, length );  return status;}/*----------------------------------------------------------------------*//*		          w r i t e O n e S e c t o r			*//*									*//* Write data in one 512-byte block to flash.				*//* Assuming that EDC mode never requested on partial block writes.    	*//*                                                                      *//* Author: 王辉              Date:2004-8-21                            *//*									*//* Parameters:								*//*	vol	: Pointer identifying drive			*//* 	address	: Address of sector to write to.			*//*	buffer	: buffer to write from.					*//*	length	: number of bytes to write (up to sector size).		*//*	modes	: OVERWRITE, EDC flags etc.				*//*									*//* Returns:                                                          	*//*	FLStatus: 0 on success, otherwise failed.			*//*									*//*----------------------------------------------------------------------*/static FLStatus writeOnePage(FLFlash vol,			     CardAddress address,    /* target flash addres  */			     const char FAR1 *buffer, /* source RAM buffer   */			     int length,             /* bytes to write (up to BLOCK) */			     int modes)              /* OVERWRITE, EDC flags etc.  */{  FLStatus    status;  PointerOp cmd;  int bit8;    if (flWriteProtected(vol.socket))    return flWriteProtect;  /* move flash pointer to areas A,B or C of page  */  makeCommand (&cmd, address, modes);  writeCommand (cmd, address);    /* load data and syndrom*/  tffscpy16((unsigned char FAR0 *) 0x1000000, (const unsigned char *)buffer, length );  status = writeExecute();  #ifdef DEBUG_PRINT  DEBUG_PRINT("WRITE: address = 0x%x, length = 0x%x, mode = %d\n", address, length, modes);#endif  return status;}    /* Core MTD methods - read, write and erase *//*----------------------------------------------------------------------*//*		          n a n d  R e a d				*//*									*//* Read some data from the flash. This routine will be registered as 	*//* the read routine for this MTD.					*//*                                                                      *//* Author: 王辉              Date:2004-8-21                            *//*									*//* Parameters:								*//*	vol		: Pointer identifying drive			*//* 	address	: Address to read from.					*//*	buffer	: buffer to read to.					*//*	length	: number of bytes to read (up to sector size).		*//*	modes	: EDC flag etc.						*//*									*//* Returns:                                                          	*//*	FLStatus: 0 on success, otherwise failed.			*//*									*//*----------------------------------------------------------------------*/static FLStatus nandMTDRead(  FLFlash vol,			 CardAddress address, /* target flash address */			 void FAR1 *buffer,    /* source RAM buffer  */			 int length,          /* bytes to write      */			 int modes)           /* Overwrite, EDC flags etc. */{  char FAR1 *temp;  int readNow;	      /* read in sectors; first and last might be partial */  int page = modes & EXTRA ? 16 : 512;  readNow = page - ((unsigned short)address & (page - 1));  temp = (char FAR1 *)buffer;  #ifdef DEBUG_PRINT  DEBUG_PRINT("READ: address = 0x%x, length = 0x%x\n", address, length);#endif    for ( ; length > 0 ; )  {    if (readNow > length)   /* 如果要读的长度小于一个页面中偏移地址之后的空间大小 */      readNow = length;     /* 那要读的就是该长度 04-8-6 */    /* turn off EDC on partial block read*/   /* 如果要读的长度大于一个页面的大小,就先读一个页面 */    checkStatus( readOnePage(&vol, address, temp, readNow,				(readNow != SECTOR_SIZE ? (modes & ~EDC) : modes)) );    length -= readNow;    address += readNow;    temp += readNow;    /* align at sector */    readNow = page;  }  return flOK ;}/*----------------------------------------------------------------------*//*		          n a n d W r i t e				*//*									*//* Write some data to the flash. This routine will be registered as the	*//* write routine for this MTD.						*//*                                                                      *//* Author: 王辉              Date:2004-8-21                            *//*									*//* Parameters:								*//*	vol	: Pointer identifying drive			*//* 	address	: Address of sector to write to.			*//*	buffer	: buffer to write from.					*//*	length	: number of bytes to write (up to sector size).		*//*	modes	: OVERWRITE, EDC flags etc.				*//*									*//* Returns:                                                          	*//*	FLStatus: 0 on success, otherwise failed.			*//*									*//*----------------------------------------------------------------------*/static FLStatus nandMTDWrite( FLFlash vol,			 CardAddress address,       /* target flash address*/			 const void FAR1 *buffer,    /* source RAM buffer  */			 int length,                /* bytes to write      */			 int modes)                 /* Overwrite, EDC flags etc.*/{  int writeNow;  const char FAR1 *temp;  FLStatus      status = flOK;  #ifdef VERIFY_AFTER_WRITE  CardAddress  saveAddress = address;  unsigned short flReadback[SECTOR_SIZE / sizeof(unsigned short)];#endif   /* write in sectors; first and last might be partial*/  int page = modes & EXTRA ? 16 : 512;  writeNow = page - ((unsigned short)address & (page - 1));  temp = (const char FAR1 *)buffer;

⌨️ 快捷键说明

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