?? 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 + -