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

📄 kw_fat32.lst

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


C51 COMPILER V7.50, COMPILATION OF MODULE KW_FAT32
OBJECT MODULE PLACED IN kw_FAT32.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE kw_FAT32.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          DWORD xdata     FM_ptr_fats;                            // FAT区首地址
  15          DWORD xdata     FM_ptr_data;                            // 数据区首地址
  16          DWORD xdata     FM_ptr_root;                                    // 目录区首地址
  17          DWORD xdata             FM_dirs_fat;                                    // FAT中目录数
  18          WORD  xdata     FM_sectors_fat;                                 // 每个FAT区扇区数
  19          BYTE  xdata     FM_num_fats;                                    // FAT区数量
  20          DWORD xdata     FM_unuse_clus;                                  // 未使用簇数量
  21          BYTE  xdata     FM_sectors_clus;                                // 每簇扇区数
  22          
  23          DWORD xdata     FM_CurrentDirLBA;                               // 当前打开文件的目录LBA地址
  24          DWORD xdata     FM_CurrentFileLength;                   // 当前打开文件长度
  25          Dir_tag xdata * FM_pCurrentDir;                                 // 当前文件名所在目录表页中偏移
  26          
  27          BYTE xdata      FM_DataBuff1[MAX_RS232_BUFF];   // 数据缓冲区1 用于接收RS232数据                                   
  28          BYTE xdata      FM_DataBuff2[MAX_RS232_BUFF];   // 数据缓冲区2 用于接收RS232数据
  29          WORD xdata              FM_DPointer1;                                   // 数据缓冲区1 索引
  30          WORD xdata              FM_DPointer2;                                   // 数据缓冲区2 索引
  31          BYTE xdata      FM_CurrentBuff;                                 // 数据缓冲指示,用于标识当前缓冲区
  32          BYTE xdata              FM_FileName[12];                                // 文件名,标识最后一个文件名
  33          BYTE xdata              FM_FileName_F[12];                              // 文件名,标识第一个文件名
  34          
  35          
  36          
  37          /************************************************************************************* 
  38            Function:       FM_fat_install
  39            Description:    安装FAT文件系统
  40            Called By:      
  41            Input:          N/A
  42            Output:         N/A
  43            Return:         1:成功 0:失败
  44            Others:         系统初始化时调用,仅调用一次,用于初始化FAT文件系统
  45                                            读取系统参数、创建并打开数据文件
  46          *************************************************************************************/                             
  47          bit FM_fat_install (void)
  48          {    
  49   1              NM_ReadPage(MBR_ADDRESS);                                                                                       //读取MBR信息
  50   1      
  51   1          FM_ptr_fats = 0x01;
  52   1          if ((EP6FIFOBUF[0] == 0xEB) && (EP6FIFOBUF[2] == 0x90))                     //检查跳转标志
  53   1          {
  54   2              if ((EP6FIFOBUF[21] & 0xF0) == 0xF0)                                                    //检查媒体类型
C51 COMPILER V7.50   KW_FAT32                                                              10/12/2007 17:05:47 PAGE 2   

  55   2              {
  56   3                      if ((EP6FIFOBUF[510] == 0x55) && (EP6FIFOBUF[511] == 0xAA)) //检查结束标志
  57   3                      {
  58   4                              FM_ptr_fats = 0x00000000;                                               //OK,FAT信息正确
  59   4                      }                                       
  60   3                      else
  61   3                      {
  62   4                              return 0;                                                                                               //FAT信息错误
  63   4                      }
  64   3              }
  65   2              }
  66   1      
  67   1              if (FM_ptr_fats)                                                                                //FAT信息错误,返回
  68   1              {
  69   2                      return 0;
  70   2              }
  71   1      
  72   1              //检查FAT16文件系统 
  73   1              FM_sectors_clus = EP6FIFOBUF[13];                                                                       //offset = 13: 每簇扇区数;
  74   1              ((BYTE*)&FM_ptr_fats)[3] = EP6FIFOBUF[14];                                                      //offset = 14: LSB of reserved sector.;
  75   1              ((BYTE*)&FM_ptr_fats)[2] = EP6FIFOBUF[15];                                              //offset = 15: MSB of reserved sector.;
  76   1              ((BYTE*)&FM_ptr_fats)[1] = 0;
  77   1              ((BYTE*)&FM_ptr_fats)[0] = 0;
  78   1      
  79   1      
  80   1              ((BYTE*)&FM_sectors_fat)[1] = EP6FIFOBUF[22];
  81   1              ((BYTE*)&FM_sectors_fat)[0] = EP6FIFOBUF[23];
  82   1      
  83   1              
  84   1              //获取根目录: root = reserved sectors + num of FATs * sectors per FAT
  85   1              FM_num_fats = EP6FIFOBUF[16];                                                                           //offset 16: FAT区数量
  86   1      
  87   1              FM_ptr_root = FM_ptr_fats + FM_num_fats * FM_sectors_fat;
  88   1      
  89   1              ((BYTE*)&FM_dirs_fat)[3] = EP6FIFOBUF[17];                                                      //获取每FAT区目录数量
  90   1              ((BYTE*)&FM_dirs_fat)[2] = EP6FIFOBUF[18]; 
  91   1          ((BYTE*)&FM_dirs_fat)[1] = 0;
  92   1              ((BYTE*)&FM_dirs_fat)[0] = 0;
  93   1      
  94   1              //获取数据区: data = FM_ptr_root +(32 * dir in FAT)/Byte per sector;
  95   1              FM_ptr_data = FM_ptr_root + (32 * FM_dirs_fat) / 512;
  96   1      
  97   1              FM_DPointer1 = FM_DPointer2 = 0;
  98   1              FM_CurrentBuff = 0;
  99   1      
 100   1              //FAT安装成功
 101   1              FM_DeleteFileInRoot("KWSYSTEM.LOG");
 102   1          if(CM_ReadConfigToParam() == 0)                                                                             //读取配置参数
 103   1              {
 104   2                      CM_SetConfigParameterDefault();                                                                 //如果配置参数错误则使用默认参数
 105   2              }
 106   1      
 107   1              if(CM_ConfigParameter.RTC_Valid == 1)                                                           //如果配置参数中RTC时间有效
 108   1              {
 109   2                      RM_SetRTCTime();                                                                                                //则设置RTC时间
 110   2              }
 111   1              FM_CreateNewFileName();                                                                                         //创建新文件名称,保存于FM_FileName
 112   1              FM_OpenFileInRoot(FM_FileName);                                                                         //打开新文件
 113   1              return 0;
 114   1      }
 115          
 116          
C51 COMPILER V7.50   KW_FAT32                                                              10/12/2007 17:05:47 PAGE 3   

 117          /************************************************************************************* 
 118            Function:       FM_GetFreeClu
 119            Description:    用于从文件分配表中获取一个空簇
 120            Called By:      
 121            Input:          N/A
 122            Output:         N/A
 123            Return:         空簇地址,0则表示没有空簇
 124            Others:         找到空簇后,将该簇设置为0xFFFF,标识占用
 125          *************************************************************************************/
 126          WORD FM_GetFreeClu()
 127          {
 128   1              DWORD xdata i,j;
 129   1              WORD xdata * pTmp;
 130   1              WORD xdata FreeClu = 0;
 131   1              for(i = 0; i < FM_sectors_fat; i++)                             //读取所有文件分配区
 132   1              {
 133   2                      NM_ReadPage(FM_ptr_fats + i);                           //读取一个扇区
 134   2                      pTmp = (WORD * )(&EP6FIFOBUF[0]);                       //从扇区开始地址查找
 135   2                      for(j=0;j<512/2;j++)                                            //扇区512字节,簇地址为Word型
 136   2                      {
 137   3                              if(*pTmp == 0x0000)                                             //找到空簇,设置占有标志,并回写
 138   3                              {
 139   4                                      *pTmp = 0xffff;                                         
 140   4                                      NM_WritePages(FM_ptr_fats + i);
 141   4                                      return FreeClu;
 142   4                              }
 143   3                              FreeClu += 1;                                                   //簇地址递增
 144   3                              pTmp++;                                                                 //下一簇号
 145   3                      }
 146   2              }
 147   1              return 0;
 148   1      }
 149          
 150          /************************************************************************************* 
 151            Function:       FM_OpenFileInRoot
 152            Description:    打开根目录一个文件,若文件不存在则创建
 153            Called By:      
 154            Input:          sFileName @ char *: 文件名
 155            Output:         N/A
 156            Return:         文件目录指针,NULL则创建(打开)失败
 157            Others:         
 158          *************************************************************************************/
 159          Dir_tag *  FM_OpenFileInRoot(char * sFileName)
 160          {
 161   1              WORD xdata i,j,StartClu;
 162   1              DWORD xdata tmpLBA = 0;
 163   1              Dir_tag xdata * pDir = 0;
 164   1              FM_pCurrentDir = 0;
 165   1      
 166   1              for(i=0; i<((32 * FM_dirs_fat) / 512); i++)     
 167   1              {
 168   2                      NM_ReadPage(FM_ptr_root + i);                           //读取目录表
 169   2                      pDir = ((Dir_tag * ) (& EP6FIFOBUF[0]));        //指向第一个目录
 170   2      
 171   2                      for(j=0;j<16;j++)                                                       //每扇区有16个目录
 172   2                      {
 173   3                              if(pDir->FileName[0] == 0x00                    //跳过空项及以删除项
 174   3                                      ||  pDir->FileName[0] == 0xe5)  
 175   3                              {
 176   4                                      if(FM_pCurrentDir == 0)                         //如果当前文件为空则记录该项的偏移及LBA
 177   4                                      {                                                                       //后面创建文件要用到。
 178   5                                              FM_pCurrentDir = pDir;
C51 COMPILER V7.50   KW_FAT32                                                              10/12/2007 17:05:47 PAGE 4   

 179   5                                              tmpLBA = FM_ptr_root + i;
 180   5                                      }
 181   4                                      pDir ++;
 182   4                                      continue;
 183   4                              }
 184   3                              if(pDir->attribute & 0x18)                              //如果时目录则跳过
 185   3                              {
 186   4                                      pDir ++;
 187   4                                      continue;
 188   4                              }
 189   3                              
 190   3                              //比较文件名是否相同,这个代码要修改

⌨️ 快捷键说明

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