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

📄 kw_nand.lst

📁 linux下数据下载器的设计与实现
💻 LST
字号:
C51 COMPILER V7.50   KW_NAND                                                               10/12/2007 17:05:47 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE KW_NAND
OBJECT MODULE PLACED IN kw_nand.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE kw_nand.c OBJECTADVANCED OPTIMIZE(11,SIZE) REGFILE(.\nand_fw2k.ORC) BROWSE 
                    -ORDER INCDIR(c:\cypress\usb\target\inc) DEFINE(NAND_2K) DEBUG

line level    source

   1          /************************************************************************************** 
   2           Copyright (C), 1988-1999, Xi'an Keyway Control & Measurement Technology Co., Ltd
   3           FileName: kw_nand.c 
   4           Description     :nandflash 接口模块。      
   5           Version         :1.0 
   6           Function List   :    
   7           History:         // 历史修改记录 
   8                <author>      <time>        <version >       <desc> 
   9                LigangWang    07/08/08       1.0             build this moudle   
  10          *************************************************************************************/
  11          
  12          #include "globals.h"
  13          
  14          BYTE xdata gPageBuff[512];                                              //页缓冲区,用于临时备份数据
  15          
  16          /************************************************************************************* 
  17            Function:       NM_ReadPage
  18            Description:    读取指定LBA地址数据到EP6的缓冲区中,并完成数据校验
  19            Called By:      
  20            Input:          rdLBA @ DWORD: LBA地址
  21            Output:         N/A
  22            Return:         void
  23            Others:         
  24          *************************************************************************************/
  25          void NM_ReadPage(DWORD rdLBA)
  26          { 
  27   1         dwLBA = rdLBA;                                                               //LBA地址到全局LBA地址,Log2Phy函数用
  28   1        
  29   1         directionIn  =1;                                                             //读写标志,Log2Phy函数用
  30   1         Log2Phy();                                                                   //将LBA地址转换成物理Flash地址
  31   1      
  32   1         Fifo6In();                                                                   //设置EP6的端点缓冲为输入方式
  33   1         NandSetAdd(cNAND_READ_DATA, dwLBA&3);                //设置读地址,地址由Log2Phy转换
  34   1         P_ECCRESET=0;                                                                //复位ECC产生器
  35   1      
  36   1         P_GPIFTCB1=MSB(528),P_GPIFTCB0= LSB(528),    //设置GPIF读取数量
  37   1         GPIFTRIG = 0x04 | cEP6;                                              //启动GPIF
  38   1      
  39   1         AUTOPTR1H = MSB(cEP6FIFO);                                   //设置自动指针到EP6缓冲
  40   1         AUTOPTR1L = LSB(cEP6FIFO);
  41   1         while (P_GPIFTCB1);                                                  //等待首256字节读取完成
  42   1         ecc0[0] = P_ECC1B0[0];                                       //保存首256字节的ECC
  43   1         ecc0[1] = P_ECC1B0[1]; 
  44   1         ecc0[2] = P_ECC1B0[2]; 
  45   1         while (!gpifIdle());
  46   1         ecc0[3] = P_ECC1B0[3];                                       //保存后256字节的ECC   
  47   1         ecc0[4] = P_ECC1B0[4];       
  48   1         ecc0[5] = P_ECC1B0[5];       
  49   1      
  50   1         ecc1[0] = P_XAUTODAT1;                                       //保存ECC产生器中产生的ECC 
  51   1         ecc1[1] = P_XAUTODAT1;    
  52   1         ecc1[2] = P_XAUTODAT1;    
  53   1         ecc1[3] = P_XAUTODAT1;    
  54   1         ecc1[4] = P_XAUTODAT1;    
C51 COMPILER V7.50   KW_NAND                                                               10/12/2007 17:05:47 PAGE 2   

  55   1         ecc1[5] = P_XAUTODAT1;  
  56   1      
  57   1         bErr = 0;
  58   1         CheckECC();                                                  //检查ECC
  59   1         return;
  60   1      }
  61          
  62          /************************************************************************************* 
  63            Function:       NM_WritePages
  64            Description:    写EP6的缓冲区中的数据到指定LBA地址的扇区中
  65            Called By:      
  66            Input:          wrLBA @ DWORD: LBA地址
  67            Output:         N/A
  68            Return:         void
  69            Others:         
  70          *************************************************************************************/
  71          void NM_WritePages(DWORD wrLBA)
  72          {
  73   1              WORD xdata i;
  74   1      
  75   1          dwLBA = wrLBA;                                                              //LBA地址到全局LBA地址,Log2Phy函数用
  76   1              gSectorcount = 1;                                                       //写扇区数量
  77   1              directionIn  =0;                                                        //读写标志,Log2Phy函数用
  78   1      
  79   1              for(i = 0; i<512; i++)                                          //备份当前缓存区数据
  80   1                      gPageBuff[i] = EP6FIFOBUF[i];
  81   1          
  82   1              Log2Phy();                                                                      //LBA地址转换物理地址
  83   1      
  84   1              P_FIFORESET = 0x80;                                                     //设置EP6缓冲区为输出方式
  85   1              P_FIFORESET = 6;
  86   1              P_EP6CFG = EP6CFG_OUT_DEFAULT;  
  87   1              
  88   1              for(i = 0; i<512; i++)                                          //读取数据
  89   1                      EP6FIFOBUF[i] = gPageBuff[i];
  90   1      
  91   1      
  92   1              EP6BCH = MSB(512);                                                      //设置缓冲区数据量
  93   1              _nop_(); 
  94   1              EP6BCL = LSB(512);
  95   1              _nop_();
  96   1              
  97   1          NandSetAdd(cNAND_WRITE_DATA, (xLBA3 & 3));  //设置写地址
  98   1              
  99   1              P_ECCRESET =LSB(cNAND_DSIZE);
 100   1          FifoWr(cEP6, 512-1);                                //写数据
 101   1           
 102   1              WriteRedundant();                                                       //写ECC码及LBA地址
 103   1          NandSendCmd(cNAND_PROGRAM_PAGE);                    //编程,写入数据
 104   1      
 105   1      
 106   1              dwLBA++;                                                                        //因为写如数据为新块,故须复制当前块剩余页
 107   1              gPartialCpy = xLBA3;
 108   1              if((dwLBA & 3) == 0)
 109   1              {
 110   2                      xPhyAdd++; xSrcAdd++;   
 111   2              }
 112   1              if(gPartialCpy)
 113   1              {
 114   2                      gPartialCpy = 0 - gPartialCpy;
 115   2                      if(gPartialCpy)
 116   2                      {
C51 COMPILER V7.50   KW_NAND                                                               10/12/2007 17:05:47 PAGE 3   

 117   3                       NAND_PCPY(gPartialCpy, xLBA3);
 118   3                       gPartialCpy = 0;  
 119   3                       nEraseBlock();
 120   3                       DISABLE_NAND();
 121   3                      }
 122   2              }
 123   1              else
 124   1              {
 125   2                      nEraseBlock();
 126   2                      DISABLE_NAND();
 127   2              }
 128   1      }
 129          
 130          
 131          
 132          /************************************************************************************* 
 133            Function:       NM_WritePagesFromBuff
 134            Description:    写pBuffer中的数据到指定地址,该地址扇区Start前字节保持不变
 135            Called By:      
 136            Input:          wrLBA @ DWORD: LBA地址
 137                                            pBuffer @ BYTE* : 数据指针
 138                                            Start @ WORD: 扇区你偏移
 139                                            Length @ WORD: 数据长度
 140            Output:         N/A
 141            Return:         void
 142            Others:         
 143          *************************************************************************************/
 144          void NM_WritePagesFromBuff(DWORD wrLBA,BYTE * pBuffer,WORD Start, WORD Length)
 145          {
 146   1              WORD xdata i;
 147   1      
 148   1              dwLBA = wrLBA;                                                  //LBA地址到全局LBA地址,Log2Phy函数用
 149   1              gSectorcount = 1;                                               //写扇区数量
 150   1              directionIn  =0;                                                //读写标志,Log2Phy函数用
 151   1      
 152   1              for(i = 0; i<Start; i++)                                //备份当前缓存区数据
 153   1                      gPageBuff[i] = EP6FIFOBUF[i];
 154   1      
 155   1          Log2Phy();                                                          //LBA地址转换物理地址
 156   1      
 157   1              P_FIFORESET = 0x80;                                             //设置EP6缓冲区为输出方式
 158   1              P_FIFORESET = 6;
 159   1              P_EP6CFG = EP6CFG_OUT_DEFAULT;
 160   1      
 161   1      
 162   1              for(i = 0; i<Start; i++)                                //保持源Start个数据不变
 163   1                      EP6FIFOBUF[i] = gPageBuff[i];               
 164   1      
 165   1      
 166   1              for(i = Start;i<(Start+Length);i++)             //复制剩余length个数到EP6缓冲
 167   1              {
 168   2                      EP6FIFOBUF[i] = *pBuffer;
 169   2                      pBuffer ++;
 170   2              }
 171   1      
 172   1              EP6BCH = MSB(512);                                              //设置数据长度
 173   1              _nop_(); 
 174   1              EP6BCL = LSB(512);
 175   1              _nop_();
 176   1      
 177   1          NandSetAdd(cNAND_WRITE_DATA, (xLBA3 & 3));  //设置写物理地址
 178   1              
C51 COMPILER V7.50   KW_NAND                                                               10/12/2007 17:05:47 PAGE 4   

 179   1              P_ECCRESET =LSB(cNAND_DSIZE);                   //复位ECC产生器
 180   1          FifoWr(cEP6, 512-1);                        //写数据
 181   1           
 182   1              WriteRedundant();                                               //写ECC和LBA地址
 183   1          NandSendCmd(cNAND_PROGRAM_PAGE);            //编程,写入
 184   1      
 185   1              dwLBA++;                                                                //因为写如数据为新块,故须复制当前块剩余页
 186   1              gPartialCpy = xLBA3;
 187   1              if((dwLBA & 3) == 0)
 188   1              {
 189   2                      xPhyAdd++; xSrcAdd++;   
 190   2              }
 191   1              if(gPartialCpy)
 192   1              {
 193   2                      gPartialCpy = 0 - gPartialCpy;
 194   2                      if(gPartialCpy)
 195   2                      {
 196   3                       NAND_PCPY(gPartialCpy, xLBA3);
 197   3                       gPartialCpy = 0;  
 198   3                       nEraseBlock();
 199   3                       DISABLE_NAND();
 200   3                      }
 201   2              }
 202   1              else
 203   1              {
 204   2                      nEraseBlock();
 205   2                      DISABLE_NAND();
 206   2              }
 207   1      }
 208          
 209          
 210          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    931    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =    512       4
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      11
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
   EDATA SIZE       =   ----    ----
   HDATA SIZE       =   ----    ----
   XDATA CONST SIZE =   ----    ----
   FAR CONST SIZE   =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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