📄 ctrlreq.lst
字号:
C51 COMPILER V7.02b CTRLREQ 02/27/2008 12:54:49 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE CTRLREQ
OBJECT MODULE PLACED IN .\Output\CtrlReq.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE CtrlReq.c LARGE OPTIMIZE(SIZE) BROWSE DEBUG OBJECTEXTEND PRINT(.\Output\Ctr
-lReq.lst) OBJECT(.\Output\CtrlReq.obj)
stmt level source
1 /*
2 *********************************************************************************************************
3 * File: CtrlReq.C
4 * Contents: Firmware frameworks task dispatcher and device request parser source
5 *
6 * $Date: 04/06/06 Kimi V0.1
7 *
8 * Copyright (c) 2006 Fameg, Inc. All rights reserved
9 *********************************************************************************************************
10 */
11 #include "include\Include.h"
12 #include "include\dscr.h"
13 #define USB_STALL_EP0() EP0RXCS = EP0RXCS | bmRX0_SESTALL; \
14 EP0TXCS = EP0TXCS | bmTX0_SESTALL
15
16 /*
17 *********************************************************************************************************
18 * VARIABLE PROTOTYPES
19 *********************************************************************************************************
20 */
21 static INT8U SetupData[8];
22 INT8U Configuration=0, AlternateSetting=0;
23 BOOLEAN HighSpeed; //用来指示是高速(high speed)还是全速(full speed)接口
24 //1:HIGH SPEED 0:FULL SPEED
25 //BOOL Rwuen, Selfpwr;
26 /*
27 *********************************************************************************************************
28 * FUNCTION PROTOTYPES
29 *********************************************************************************************************
30 */
31 static void DR_ClearFeature (void);
32 static void DR_GetConfiguration (void);
33 static void DR_GetDescriptor (void);
34 static void DR_GetInterface (void);
35 static void DR_GetStatus (void);
36 static void DR_SetAddress (void);
37 static void DR_SetConfiguration (void);
38 static void DR_SetFeature (void);
39 static void DR_SetInterface (void);
40 static void GD_DeviceDscr (void);
41 static void GD_DeviceQualDscr (void);
42 static void GD_ConfigDscr (void);
43 static void GD_OtherConfigDscr (void);
44 static void GD_String (void);
45 static void CtrlReqGetMaxLun(void);
46 static void CtrlReqBulkReset(void);
47 void SetupCommand (void);
48
49 /*
50 *********************************************************************************************************
51 * KSOC_INT_ISR
52 *
53 * Description: KSOC Interrupt Service Routine
54 *
C51 COMPILER V7.02b CTRLREQ 02/27/2008 12:54:49 PAGE 2
55 * Arguments : none
56 *
57 * Returns : none
58 *********************************************************************************************************
59 */
60 //void KSOC_INT_ISR (void) interrupt 6
61 //{
62 //}
63 /*$PAGE*/
64
65 /*
66 *********************************************************************************************************
67 * SETUPCOMMAND
68 *
69 * Description: Parse command function
70 *
71 * Arguments : none
72 *
73 * Returns : none
74 *********************************************************************************************************
75 */
76 void SetupCommand (void)
77 {
78 1 INT8U i = 0, count = 8;
79 1
80 1 while (count) // Receive data
81 1 {
82 2 SetupData[i] = EP0RXDAT;
83 2 i++;
84 2 count--;
85 2 }
86 1
87 1 if((SetupData[0]& 0x60) == 0x00)
88 1 {
89 2 switch (SetupData[1]) // Parse
90 2 {
91 3 case SC_GET_STATUS:
92 3 DR_GetStatus();
93 3 break;
94 3 case SC_CLEAR_FEATURE:
95 3 DR_ClearFeature();
96 3 break;
97 3 case SC_SET_FEATURE:
98 3 DR_SetFeature();
99 3 break;
100 3 case SC_SET_ADDRESS:
101 3 DR_SetAddress();
102 3 break;
103 3 case SC_GET_DESCRIPTOR:
104 3 DR_GetDescriptor();
105 3 break;
106 3 case SC_GET_CONFIGURATION:
107 3 DR_GetConfiguration();
108 3 break;
109 3 case SC_SET_CONFIGURATION:
110 3 DR_SetConfiguration();
111 3 break;
112 3 case SC_GET_INTERFACE:
113 3 DR_GetInterface();
114 3 break;
115 3 case SC_SET_INTERFACE:
116 3 DR_SetInterface();
C51 COMPILER V7.02b CTRLREQ 02/27/2008 12:54:49 PAGE 3
117 3 break;
118 3 default:
119 3 USB_STALL_EP0(); // Send STALL
120 3 break;
121 3 }
122 2 }
123 1 else if((SetupData[0]& 0x60) == 0x20)
124 1 {
125 2 switch (SetupData[1])
126 2 {
127 3 case BULKONLY_GET_MAX_LUN:
128 3 CtrlReqGetMaxLun();
129 3 break;
130 3 case BULKONLY_RESET:
131 3 CtrlReqBulkReset();
132 3 break;
133 3 }
134 2 }
135 1 EP0RXCS = EP0RXCS | bmRX0_EN;
136 1 }
137
138 void CtrlReqGetMaxLun(void)
139 {
140 1 EP0TXCNT = 1;
141 1 EP0TXDAT = 0x00;
142 1 EP0TXCS = EP0TXCS | bmTX0_EN;
143 1 //while (EP0TXCS & bmTX0_EN);
144 1 }
145
146 void CtrlReqBulkReset(void)
147 {
148 1 BulkState = CBW_GET_COMPLETED;
149 1 CmdStatus = COMMAND_PASSED;
150 1 EP0TXCNT = 0;
151 1 EP0TXCS = EP0TXCS | bmTX0_EN;
152 1 }
153 /*$PAGE*/
154
155 /*
156 *********************************************************************************************************
157 * DR_GETSTATUS
158 *
159 * Description: Get status command
160 *
161 * Arguments : none
162 *
163 * Returns : none
164 *********************************************************************************************************
165 */
166 void DR_GetStatus (void)
167 {
168 1 EP0TXCNT = 2;
169 1 switch (SetupData[0])
170 1 {
171 2 case GS_DEVICE:
172 2 EP0TXDAT = ((INT8U)Rwuen << 1) | (INT8U)Selfpwr;
173 2 break;
174 2 case GS_INTERFACE:
175 2 EP0TXDAT = 0;
176 2 break;
177 2 case GS_ENDPOINT:
178 2 switch (SetupData[4] & 0x0F)
C51 COMPILER V7.02b CTRLREQ 02/27/2008 12:54:49 PAGE 4
179 2 {
180 3 case bmEP1MAP:
181 3 EP0TXDAT = (EP1CS & bmEP_SESTALL) >> 1;
182 3 break;
183 3 case bmEP2MAP:
184 3 EP0TXDAT = (EP2CS & bmEP_SESTALL) >> 1;
185 3 break;
186 3 default:
187 3 EP0TXDAT = 0;
188 3 break;
189 3 }
190 2 break;
191 2 default:
192 2 EP0TXDAT = 0;
193 2 break;
194 2 }
195 1 EP0TXDAT = 0;
196 1 EP0TXCS = EP0TXCS | bmTX0_EN;
197 1 }
198 /*$PAGE*/
199
200 /*
201 *********************************************************************************************************
202 * DR_CLEARFEATURE
203 *
204 * Description: Clear feature
205 *
206 * Arguments : none
207 *
208 * Returns : none
209 *********************************************************************************************************
210 */
211 void DR_ClearFeature (void)
212 { void BulkReportHandle();
213 1
214 1 switch (SetupData[0])
215 1 {
216 2 case FT_DEVICE:
217 2 if (SetupData[2] == 1)
218 2 {
219 3 Rwuen = FALSE;
220 3 }
221 2 break;
222 2 case FT_ENDPOINT:
223 2 if (SetupData[2] == 0)
224 2 {
225 3 switch (SetupData[4] & 0x0F)
226 3 {
227 4 case bmEP1MAP:
228 4 EP1CS = EP1CS & (~bmEP_SESTALL)|(bmEP_CLRTOG); //
229 4 break;
230 4 case bmEP2MAP:
231 4 EP2CS = EP2CS & (~bmEP_SESTALL)|(bmEP_CLRTOG); //EP_TOG位写1清零
232 4 break;
233 4 }
234 3 }
235 2 EP0TXCNT = 0;
236 2 EP0TXCS = EP0TXCS | bmTX0_EN;//使能EP0发送,给主机回复0字节的数据,完成clear feature的控制传输
237 2 while (EP0TXCS & bmTX0_EN); // Wait complete
238 2 break;
239 2 }
240 1
C51 COMPILER V7.02b CTRLREQ 02/27/2008 12:54:49 PAGE 5
241 1 if(ScsiCmdSTALLed) //如果STALL发生,准备回送CSW.Derek 06.09.04
242 1 {
243 2 BulkReportHandle();
244 2 ScsiCmdSTALLed = false;
245 2 }
246 1
247 1 }
248 /*$PAGE*/
249
250 /*
251 *********************************************************************************************************
252 * DR_SETFEATURE
253 *
254 * Description: Set feature
255 *
256 * Arguments : none
257 *
258 * Returns : none
259 *********************************************************************************************************
260 */
261 void DR_SetFeature (void)
262 {
263 1 switch (SetupData[0])
264 1 {
265 2 case FT_DEVICE:
266 2 if (SetupData[2] == 1)
267 2 {
268 3 Rwuen = TRUE;
269 3 }
270 2 break;
271 2 case FT_ENDPOINT:
272 2 if (SetupData[2] == 0)
273 2 {
274 3 switch (SetupData[4] & 0x0F)
275 3 {
276 4 case bmEP1MAP:
277 4 EP1CS = EP1CS | bmEP_SESTALL;
278 4 break;
279 4 case bmEP2MAP:
280 4 EP2CS = EP2CS | bmEP_SESTALL;
281 4 break;
282 4 }
283 3 }
284 2 break;
285 2 }
286 1 EP0TXCNT = 0;
287 1 EP0TXCS = EP0TXCS | bmTX0_EN;
288 1 }
289 /*$PAGE*/
290
291 /*
292 *********************************************************************************************************
293 * DR_SETADDRESS
294 *
295 * Description: Set address
296 *
297 * Arguments : none
298 *
299 * Returns : none
300 *********************************************************************************************************
301 */
302 void DR_SetAddress (void)
C51 COMPILER V7.02b CTRLREQ 02/27/2008 12:54:49 PAGE 6
303 {
304 1 EP0TXCNT = 0; // Write data length
305 1 EP0TXCS = EP0TXCS | bmTX0_EN; // Enable TX
306 1 while (EP0TXCS & bmTX0_EN); // Wait complete
307 1 USBFADDR = SetupData[2]; // Set address
308 1 }
309 /*$PAGE*/
310
311 /*
312 *********************************************************************************************************
313 * DR_GETDESCRIPTOR
314 *
315 * Description: Get descriptor
316 *
317 * Arguments : none
318 *
319 * Returns : none
320 *********************************************************************************************************
321 */
322 void DR_GetDescriptor (void)
323 {
324 1 switch (SetupData[3])
325 1 {
326 2 case GD_DEVICE:
327 2 GD_DeviceDscr();
328 2 break;
329 2 case GD_CONFIGURATION:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -