?? ctrlreq.lst
字號:
C51 COMPILER V7.50 CTRLREQ 04/17/2007 10:42:46 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE CTRLREQ
OBJECT MODULE PLACED IN .\Output\CtrlReq.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE CtrlReq.c LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\Output\CtrlReq.lst) OBJEC
-T(.\Output\CtrlReq.obj)
line 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 * $Date: 04/25/06 Kimi v0.2
8 * $Date: 04/30/06 Kimi v0.3
9 * $Date: 01/23/07 Kevin v0.4
10 * Copyright (c) 2006 Fameg, Inc. All rights reserved
11 *********************************************************************************************************
12 */
13
14 #include "fs7805.h"
15 #include "fs7805regs.h"
16 #include "dscr.h"
17
18 #define USB_STALL_EP0() EP0RXCS = EP0RXCS | bmRX0_SESTALL; \
19 EP0TXCS = EP0TXCS | bmTX0_SESTALL
20
21 /*
22 *********************************************************************************************************
23 * VARIABLE PROTOTYPES
24 *********************************************************************************************************
25 */
26 static INT8U SetupData[8], PacketSize;
27 static INT8U AlternateSetting;
28 static BOOLEAN HighSpeed;
29 static INT8U EnterSuspend = 0;
30 /*
31 *********************************************************************************************************
32 * FUNCTION PROTOTYPES
33 *********************************************************************************************************
34 */
35 static void DR_ClearFeature (void);
36 static void DR_GetConfiguration (void);
37 static void DR_GetDescriptor (void);
38 static void DR_GetInterface (void);
39 static void DR_GetStatus (void);
40 static void DR_SetAddress (void);
41 static void DR_SetConfiguration (void);
42 static void DR_SetFeature (void);
43 static void DR_SetInterface (void);
44 static void GD_DeviceDscr (void);
45 static void GD_DeviceQualDscr (void);
46 static void GD_ConfigDscr (void);
47 static void GD_OtherConfigDscr (void);
48 static void GD_String (void);
49 static void SetupCommand (void);
50
51 /*
52 *********************************************************************************************************
53 * USB_INT_ISR
54 *
C51 COMPILER V7.50 CTRLREQ 04/17/2007 10:42:46 PAGE 2
55 * Description: Interrupt Service Routine
56 *
57 * Arguments : none
58 *
59 * Returns : none
60 *********************************************************************************************************
61 */
62 void USB_INT_ISR (void) interrupt 5
63 {
64 1 if (STINT & bmIDLE3MSINT) // idle interrupt
65 1 {
66 2 if (EnterSuspend++)
67 2 {
68 3 USBGCTRL = USBGCTRL | bmSUSPEND;
69 3 }
70 2 STINT = STINT & (~bmIDLE3MSINT);
71 2 }
72 1
73 1 if (STINT & bmRESUMEIE) // resume interrupt
74 1 {
75 2 STINT = STINT & (~bmRESUMEIE);
76 2 }
77 1
78 1 if (STINT & bmUSBRSTINT) // reset interrupt
79 1 {
80 2 while (!(USBGCTRL & bmHS_DETECTED)); // detect USB speed
81 2 HighSpeed = USBGCTRL & bmSPEED;
82 2 if (HighSpeed) // High speed
83 2 {
84 3 PacketSize = 64;
85 3 }
86 2 else // Full speed
87 2 {
88 3 PacketSize = 64;
89 3 }
90 2 STINT = STINT & (~bmUSBRSTINT);
91 2 }
92 1
93 1 if ((EPINT & bmRX0INT) && ((EP0RXTKN & bmEP0_SETUP) | (EP0RXTKN & bmEP0_SETUPOW)))
94 1 { // enquire the EP0 RX setup interrupt
95 2 EP0RXTKN = EP0RXTKN & (~bmEP0_SETUP) & (~bmEP0_SETUPOW);
96 2 SetupCommand(); // Parse command
97 2 }
98 1
99 1 if ((EPINT & bmRX0INT) && (EP0RXTKN & bmEP0_OUT)) // out packet
100 1 {
101 2 EP0RXTKN = EP0RXTKN & (~bmEP0_OUT);
102 2 }
103 1
104 1 #ifndef ISOCHRONOUS
105 1 if ((EPINT & bmEP2INT) && (EP2CS & bmEP_ACK))
106 1 {
107 2 EPINT = EPINT & (~bmEP2INT); // Clear EP2 interrupt
108 2 OutData = TRUE;
109 2 }
110 1 else
111 1 {
112 2 EPINT = EPINT & (~bmEP2INT); // Clear EP2 interrupt
113 2 }
114 1 #else
if (EPINT & bmEP2INT)
{
C51 COMPILER V7.50 CTRLREQ 04/17/2007 10:42:46 PAGE 3
EPINT = EPINT & (~bmEP2INT); // Clear EP2 interrupt
OutData = TRUE;
}
#endif
121 1
122 1 #ifndef ISOCHRONOUS
123 1 if ((EPINT & bmEP1INT) && (EP1CS & bmEP_ACK))
124 1 {
125 2 EPINT = EPINT & (~bmEP1INT); // Clear EP1 interrupt
126 2 InData = TRUE;
127 2 }
128 1 else
129 1 {
130 2 EPINT = EPINT & (~bmEP1INT); // Clear EP1 interrupt
131 2 }
132 1 #else
if (EPINT & bmEP1INT)
{
EPINT = EPINT & (~bmEP1INT); // Clear EP1 interrupt
InData = TRUE;
}
#endif
139 1 }
140
141
142 /*
143 *********************************************************************************************************
144 * SETUPCOMMAND
145 *
146 * Description: Parse command function
147 *
148 * Arguments : none
149 *
150 * Returns : none
151 *********************************************************************************************************
152 */
153 void SetupCommand (void)
154 {
155 1 INT8U i, count;
156 1
157 1 count = EP0RXCNT;
158 1 if (count == 8)
159 1 {
160 2 for (i = 0; i < 8; i++) // Receive data
161 2 {
162 3 SetupData[i] = EP0RXDAT;
163 3 }
164 2
165 2 switch (SetupData[1]) // Parse
166 2 {
167 3 case SC_GET_STATUS:
168 3 DR_GetStatus();
169 3 break;
170 3 case SC_CLEAR_FEATURE:
171 3 DR_ClearFeature();
172 3 break;
173 3 case SC_SET_FEATURE:
174 3 DR_SetFeature();
175 3 break;
176 3 case SC_SET_ADDRESS:
177 3 DR_SetAddress();
178 3 break;
C51 COMPILER V7.50 CTRLREQ 04/17/2007 10:42:46 PAGE 4
179 3 case SC_GET_DESCRIPTOR:
180 3 DR_GetDescriptor();
181 3 break;
182 3 case SC_GET_CONFIGURATION:
183 3 DR_GetConfiguration();
184 3 break;
185 3 case SC_SET_CONFIGURATION:
186 3 DR_SetConfiguration();
187 3 break;
188 3 case SC_GET_INTERFACE:
189 3 DR_GetInterface();
190 3 break;
191 3 case SC_SET_INTERFACE:
192 3 DR_SetInterface();
193 3 break;
194 3 default:
195 3 USB_STALL_EP0(); // Send STALL
196 3 break;
197 3 }
198 2 }
199 1 EP0RXCS = EP0RXCS | bmRX0_EN;
200 1 }
201 /*$PAGE*/
202
203 /*
204 *********************************************************************************************************
205 * DR_GETSTATUS
206 *
207 * Description: Get status command
208 *
209 * Arguments : none
210 *
211 * Returns : none
212 *********************************************************************************************************
213 */
214 void DR_GetStatus (void)
215 {
216 1 switch (SetupData[0])
217 1 {
218 2 case GS_DEVICE:
219 2 EP0TXDAT = (Rwuen << 1) | Selfpwr;
220 2 break;
221 2 case GS_INTERFACE:
222 2 EP0TXDAT = 0;
223 2 break;
224 2 case GS_ENDPOINT:
225 2 switch (SetupData[4] & 0x0F)
226 2 {
227 3 case bmEP1MAP:
228 3 EP0TXDAT = (EP1CS & bmEP_SESTALL) >> 1;
229 3 break;
230 3 case bmEP2MAP:
231 3 EP0TXDAT = (EP2CS & bmEP_SESTALL) >> 1;
232 3 break;
233 3 default:
234 3 USB_STALL_EP0(); // Send STALL
235 3 return;
236 3 }
237 2 break;
238 2 default:
239 2 USB_STALL_EP0(); // Send STALL
240 2 return;
C51 COMPILER V7.50 CTRLREQ 04/17/2007 10:42:46 PAGE 5
241 2 }
242 1 EP0TXDAT = 0;
243 1 EP0TXCNT = 2;
244 1 EP0TXCS = EP0TXCS | bmTX0_EN;
245 1 while (EP0TXCS & bmTX0_EN);
246 1 }
247 /*$PAGE*/
248
249 /*
250 *********************************************************************************************************
251 * DR_CLEARFEATURE
252 *
253 * Description: Clear feature
254 *
255 * Arguments : none
256 *
257 * Returns : none
258 *********************************************************************************************************
259 */
260 void DR_ClearFeature (void)
261 {
262 1 switch (SetupData[0])
263 1 {
264 2 case FT_DEVICE:
265 2 if (SetupData[2] == 1)
266 2 {
267 3 Rwuen = FALSE;
268 3 }
269 2 else
270 2 {
271 3 USB_STALL_EP0();
272 3 return;
273 3 }
274 2 break;
275 2 case FT_ENDPOINT:
276 2 if (SetupData[2] == 0)
277 2 {
278 3 switch (SetupData[4] & 0x0F)
279 3 {
280 4 case bmEP1MAP:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -