📄 kw_fat32.lst
字号:
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 + -