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