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