📄 mscuser.lst
字号:
ARM COMPILER V2.53, mscuser 03/05/07 22:10:49 PAGE 1
ARM COMPILER V2.53, COMPILATION OF MODULE mscuser
OBJECT MODULE PLACED IN .\Obj\mscuser.obj
COMPILER INVOKED BY: C:\Keil\ARM\BIN\CA.exe mscuser.c THUMB DEBUG PRINT(.\LST\MSCUSER.LST) TABS(4) OBJECT(.\Obj\mscuser.
-obj)
stmt level source
1 /*----------------------------------------------------------------------------
2 * U S B - K e r n e l
3 *----------------------------------------------------------------------------
4 * Name: MSCUSER.C
5 * Purpose: Mass Storage Class Custom User Module
6 * Version: V1.10
7 *----------------------------------------------------------------------------
8 * This software is supplied "AS IS" without any warranties, express,
9 * implied or statutory, including but not limited to the implied
10 * warranties of fitness for purpose, satisfactory quality and
11 * noninfringement. Keil extends you a royalty-free right to reproduce
12 * and distribute executable files created using this software for use
13 * on Philips LPC2xxx microcontroller devices only. Nothing else gives
14 * you the right to use this software.
15 *
16 * Copyright (c) 2005-2006 Keil Software.
17 *---------------------------------------------------------------------------*/
18
19 #include <LPC214X.H> /* LPC214x definitions */
20
21 #include "type.h"
22
23 #include "usb.h"
24 #include "msc.h"
25 #include "usbcfg.h"
26 #include "usbhw.h"
27 #include "usbcore.h"
28 #include "mscuser.h"
29
30 #include "memory.h"
31
32
33 BYTE Memory[MSC_MemorySize] __at MSC_MemoryStart; /* MSC RAM */
34
35 BOOL MemOK; /* Memory OK */
36
37 DWORD Offset; /* R/W Offset */
38 DWORD Length; /* R/W Length */
39
40 BYTE BulkStage; /* Bulk Stage */
41
42 BYTE BulkBuf[MSC_MAX_PACKET]; /* Bulk In/Out Buffer */
43 BYTE BulkLen; /* Bulk In/Out Length */
44
45 MSC_CBW CBW; /* Command Block Wrapper */
46 MSC_CSW CSW; /* Command Status Wrapper */
47
48
49 /*
50 * MSC Mass Storage Reset Request Callback
51 * Called automatically on Mass Storage Reset Request
52 * Parameters: None (global SetupPacket and EP0Buf)
53 * Return Value: TRUE - Success, FALSE - Error
54 */
55
56 BOOL MSC_Reset (void) {
57 1
58 1 IOCLR1 = (LED_RD | LED_WR); /* Turn Off R/W LED */
ARM COMPILER V2.53, mscuser 03/05/07 22:10:49 PAGE 2
59 1 BulkStage = MSC_BS_CBW;
60 1 return (TRUE);
61 1 }
62
63
64 /*
65 * MSC Get Max LUN Request Callback
66 * Called automatically on Get Max LUN Request
67 * Parameters: None (global SetupPacket and EP0Buf)
68 * Return Value: TRUE - Success, FALSE - Error
69 */
70
71 BOOL MSC_GetMaxLUN (void) {
72 1
73 1 EP0Buf[0] = 0; /* No LUN associated with this device */
74 1 return (TRUE);
75 1 }
76
77
78 /*
79 * MSC Memory Read Callback
80 * Called automatically on Memory Read Event
81 * Parameters: None (global variables)
82 * Return Value: None
83 */
84
85 void MSC_MemoryRead (void) {
86 1 DWORD n;
87 1
88 1 if (Length > MSC_MAX_PACKET) {
89 2 n = MSC_MAX_PACKET;
90 2 } else {
91 2 n = Length;
92 2 }
93 1
94 1 if ((Offset + n) > MSC_MemorySize) {
95 2 n = MSC_MemorySize - Offset;
96 2 BulkStage = MSC_BS_DATA_IN_LAST_STALL;
97 2 }
98 1
99 1 USB_WriteEP(MSC_EP_IN, (BYTE *)(MSC_MemoryStart + Offset), n);
100 1 Offset += n;
101 1 Length -= n;
102 1
103 1 CSW.dDataResidue -= n;
104 1
105 1 if (Length == 0) {
106 2 BulkStage = MSC_BS_DATA_IN_LAST;
107 2 }
108 1
109 1 if (BulkStage != MSC_BS_DATA_IN) {
110 2 IOCLR1 = LED_RD; /* Turn Off Read LED */
111 2 CSW.bStatus = CSW_CMD_PASSED;
112 2 }
113 1 }
114
115
116 /*
117 * MSC Memory Write Callback
118 * Called automatically on Memory Write Event
119 * Parameters: None (global variables)
120 * Return Value: None
121 */
122
123 void MSC_MemoryWrite (void) {
124 1 DWORD n;
ARM COMPILER V2.53, mscuser 03/05/07 22:10:49 PAGE 3
125 1
126 1 if ((Offset + BulkLen) > MSC_MemorySize) {
127 2 BulkLen = MSC_MemorySize - Offset;
128 2 BulkStage = MSC_BS_CSW;
129 2 USB_SetStallEP(MSC_EP_OUT);
130 2 }
131 1
132 1 for (n = 0; n < BulkLen; n++) {
133 2 Memory[Offset + n] = BulkBuf[n];
134 2 }
135 1
136 1 Offset += BulkLen;
137 1 Length -= BulkLen;
138 1
139 1 CSW.dDataResidue -= BulkLen;
140 1
141 1 if ((Length == 0) || (BulkStage == MSC_BS_CSW)) {
142 2 IOCLR1 = LED_WR; /* Turn Off Write LED */
143 2 CSW.bStatus = CSW_CMD_PASSED;
144 2 MSC_SetCSW();
145 2 }
146 1 }
147
148
149 /*
150 * MSC Memory Verify Callback
151 * Called automatically on Memory Verify Event
152 * Parameters: None (global variables)
153 * Return Value: None
154 */
155
156 void MSC_MemoryVerify (void) {
157 1 DWORD n;
158 1
159 1 if ((Offset + BulkLen) > MSC_MemorySize) {
160 2 BulkLen = MSC_MemorySize - Offset;
161 2 BulkStage = MSC_BS_CSW;
162 2 USB_SetStallEP(MSC_EP_OUT);
163 2 }
164 1
165 1 for (n = 0; n < BulkLen; n++) {
166 2 if (Memory[Offset + n] != BulkBuf[n]) {
167 3 MemOK = FALSE;
168 3 break;
169 3 }
170 2 }
171 1
172 1 Offset += BulkLen;
173 1 Length -= BulkLen;
174 1
175 1 CSW.dDataResidue -= BulkLen;
176 1
177 1 if ((Length == 0) || (BulkStage == MSC_BS_CSW)) {
178 2 CSW.bStatus = (MemOK) ? CSW_CMD_PASSED : CSW_CMD_FAILED;
179 2 MSC_SetCSW();
180 2 }
181 1 }
182
183
184 /*
185 * MSC SCSI Read/Write Setup Callback
186 * Parameters: None (global variables)
187 * Return Value: TRUE - Success, FALSE - Error
188 */
189
190 BOOL MSC_RWSetup (void) {
ARM COMPILER V2.53, mscuser 03/05/07 22:10:49 PAGE 4
191 1 DWORD n;
192 1
193 1 /* Logical Block Address of First Block */
194 1 n = (CBW.CB[2] << 24) |
195 1 (CBW.CB[3] << 16) |
196 1 (CBW.CB[4] << 8) |
197 1 (CBW.CB[5] << 0);
198 1
199 1 Offset = n * MSC_BlockSize;
200 1
201 1 /* Number of Blocks to transfer */
202 1 n = (CBW.CB[7] << 8) |
203 1 (CBW.CB[8] << 0);
204 1
205 1 Length = n * MSC_BlockSize;
206 1
207 1 if (CBW.dDataLength != Length) {
208 2 USB_SetStallEP(MSC_EP_IN);
209 2 USB_SetStallEP(MSC_EP_OUT);
210 2 CSW.bStatus = CSW_PHASE_ERROR;
211 2 MSC_SetCSW();
212 2 return (FALSE);
213 2 }
214 1
215 1 return (TRUE);
216 1 }
217
218
219 /*
220 * Check Data IN Format
221 * Parameters: None (global variables)
222 * Return Value: TRUE - Success, FALSE - Error
223 */
224
225 BOOL DataInFormat (void) {
226 1
227 1 if (CBW.dDataLength == 0) {
228 2 CSW.bStatus = CSW_PHASE_ERROR;
229 2 MSC_SetCSW();
230 2 return (FALSE);
231 2 }
232 1 if ((CBW.bmFlags & 0x80) == 0) {
233 2 USB_SetStallEP(MSC_EP_OUT);
234 2 CSW.bStatus = CSW_PHASE_ERROR;
235 2 MSC_SetCSW();
236 2 return (FALSE);
237 2 }
238 1 return (TRUE);
239 1 }
240
241
242 /*
243 * Perform Data IN Transfer
244 * Parameters: None (global variables)
245 * Return Value: TRUE - Success, FALSE - Error
246 */
247
248 void DataInTransfer (void) {
249 1
250 1 if (BulkLen > CBW.dDataLength) {
251 2 BulkLen = CBW.dDataLength;
252 2 }
253 1
254 1 USB_WriteEP(MSC_EP_IN, BulkBuf, BulkLen);
255 1 BulkStage = MSC_BS_DATA_IN_LAST;
256 1
ARM COMPILER V2.53, mscuser 03/05/07 22:10:49 PAGE 5
257 1 CSW.dDataResidue -= BulkLen;
258 1 CSW.bStatus = CSW_CMD_PASSED;
259 1 }
260
261
262 /*
263 * MSC SCSI Test Unit Ready Callback
264 * Parameters: None (global variables)
265 * Return Value: None
266 */
267
268 void MSC_TestUnitReady (void) {
269 1
270 1 if (CBW.dDataLength != 0) {
271 2 if ((CBW.bmFlags & 0x80) != 0) {
272 3 USB_SetStallEP(MSC_EP_IN);
273 3 } else {
274 3 USB_SetStallEP(MSC_EP_OUT);
275 3 }
276 2 }
277 1
278 1 CSW.bStatus = CSW_CMD_PASSED;
279 1 MSC_SetCSW();
280 1 }
281
282
283 /*
284 * MSC SCSI Request Sense Callback
285 * Parameters: None (global variables)
286 * Return Value: None
287 */
288
289 void MSC_RequestSense (void) {
290 1
291 1 if (!DataInFormat()) return;
292 1
293 1 BulkBuf[ 0] = 0x70; /* Response Code */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -