📄 kw_nand.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 + -