?? ctrlrequest.lst
字號:
C51 COMPILER V7.02b CTRLREQUEST 02/01/2007 10:35:43 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE CTRLREQUEST
OBJECT MODULE PLACED IN .\Output\CtrlRequest.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE CtrlRequest.c OPTIMIZE(9,SPEED) BROWSE INCDIR(Include) DEFINE(READER) DEBUG
- OBJECTEXTEND PRINT(.\Output\CtrlRequest.lst) OBJECT(.\Output\CtrlRequest.obj)
stmt level source
1 /*
2 **********************************************************************************************
3 * Project: TK7821
4 * File: CtrlRequest.c
5 * Contents:
6 *
7 *
8 * $Date: 02/25/05 Jason v0.1
9 * 05/12/05 Mingo v0.2 www.fameg.com
10 *
11 * Copyright (c) 2005 Fameg, Inc. All rights reserved
12 ***********************************************************************************************
13 */
14
15 #include <reg51.h>
16 #include <stdio.h>
17 #include <string.h>
18 #include "sotatype.h"
19 #include "usbdisk.h"
20 #include "device.h"
21 #include "CtrlRequest.h"
22 #include "ScsiCmd.h"
23
24 void InitBulkPipe();
25
26 /*************************************************
27 Global Variables
28 *************************************************/
29 BYTE xdata UsbBuf[USB_BUFFER_SIZE];
30 xdata PSOTA_USB_REQUEST pSotaUsbRequest;
31 xdata BYTE CtrlPktSize;
32
33 /*************************************************
34 Local Variables
35 *************************************************/
36 static xdata SOTA_USB_REQUEST SotaUsbRequest;
37 static xdata BYTE UsbAddr = 0;
38 static xdata BYTE TestModeParam;
39
40 /* H/W b1 only support ep0~2 so we add this variable to pass chapter9 */
41 static bit EP3Halt = 0;
42
43 //----------------------------------------------------------------------------
44 // EP Index to Register Offset
45 // Note: Return value 0xff = Invalid EP Index
46 // 0x00 = EP0
47 //----------------------------------------------------------------------------
48 BYTE CtrlEPIndex2RegOffset(BYTE Index)
49 {
50 1 BYTE Offset = 0xff;
51 1
52 1 if ( (Index == 0) || (Index==0x80) )
53 1 Offset = 0;
54 1 switch(Index)
C51 COMPILER V7.02b CTRLREQUEST 02/01/2007 10:35:43 PAGE 2
55 1 {
56 2 case EP1IN_NUMBER:
57 2 Offset = EP1_TXCSR;
58 2 break;
59 2
60 2 case EP2OUT_NUMBER:
61 2 Offset = EP2_RXCSR;
62 2 break;
63 2
64 2 default:
65 2 break;
66 2 }
67 1 return Offset;
68 1 }
69
70 //----------------------------------------------------------------------------
71 // Clear Halt Feature
72 //----------------------------------------------------------------------------
73 void CtrlClearHaltFeature()
74 {
75 1 // EP0
76 1 pSotaUsbRequest->HaltStatus = false;
77 1 // EP1
78 1 ClearRegBit(USB_BASE + EP1_TXCSR, ~EN_TX1_STL);
79 1 // EP2
80 1 ClearRegBit(USB_BASE + EP2_RXCSR, BulkStallMask);
81 1 }
82
83 //----------------------------------------------------------------------------
84 // Prepare status report data
85 // Note: Unexpected condition, return false
86 //----------------------------------------------------------------------------
87 bool CtrlStatusReport(BYTE Recipient, BYTE Index, PBYTE Data)
88 {
89 1 bit Rc = true;
90 1 Data[1] = 0; // Reserved
91 1
92 1 switch(Recipient)
93 1 {
94 2 case 0x80: // Device
95 2 case 0x81: // Interface
96 2 Data[0] = 0;
97 2 break;
98 2
99 2 case 0x82: // Endpoint
100 2 {
101 3 BYTE Offset = CtrlEPIndex2RegOffset(Index);
102 3 Data[0] = 0;
103 3
104 3 if (Offset != 0xff)
105 3 {
106 4 if (Offset)
107 4 {
108 5 if (CSRRead(USB_BASE + Offset) & 0x02)
109 5 Data[0] = 0x01;
110 5 }
111 4 else
112 4 {
113 5 if (pSotaUsbRequest->HaltStatus)
114 5 Data[0] = 0x01;
115 5 }
116 4 }
C51 COMPILER V7.02b CTRLREQUEST 02/01/2007 10:35:43 PAGE 3
117 3 break;
118 3 }
119 2
120 2 default:
121 2 Rc = false;
122 2 break;
123 2 }
124 1
125 1 return Rc;
126 1 }
127
128 //----------------------------------------------------------------------------
129 // Get Status Request
130 //----------------------------------------------------------------------------
131 void CtrlReqGetStatus()
132 {
133 1 BYTE Token = pSotaUsbRequest->Token;
134 1
135 1 switch(Token)
136 1 {
137 2 case SETUP_TOKEN:
138 2 pSotaUsbRequest->LoadInDataOk = true;
139 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);
140 2 break;
141 2
142 2 case IN_TOKEN:
143 2 {
144 3 PUSB_REQUEST pReq = &(pSotaUsbRequest->Request);
145 3 BYTE i;
146 3 BYTE Len = (BYTE)(pReq->wLength);
147 3 BYTE Data[2];
148 3 BYTE Index = ((TDataCast *)&(pReq->wIndex))->ucByte[0];
149 3
150 3 BYTE Recipient = pReq->bmRequestType;
151 3
152 3 if (pSotaUsbRequest->LoadInDataOk)
153 3 {
154 4 if (Len > 2)
155 4 Len = 2;
156 4 if (!CtrlStatusReport(Recipient, Index, Data))
157 4 Len = 0;
158 4 CSRWrite(USB_BASE + EP0_TXCNT, Len);
159 4 for (i = 0; i < Len; i++)
160 4 CSRWrite(USB_BASE + EP0_TXDATA, Data[i]);
161 4 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);
162 4 pSotaUsbRequest->LoadInDataOk = false;
163 4 }
164 3 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);
165 3 break;
166 3 }
167 2
168 2 case IN_OK_TOKEN:
169 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);
170 2 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);
171 2 break;
172 2
173 2 case OUT_TOKEN:
174 2 default:
175 2 // Ctrl Read End
176 2 pSotaUsbRequest->InProgress = false;
177 2 break;
178 2 }
C51 COMPILER V7.02b CTRLREQUEST 02/01/2007 10:35:43 PAGE 4
179 1 }
180
181 //--------------------------------------------------------------------
182 // Clear Feature Request
183 //--------------------------------------------------------------------
184 static bit FeatureCleared = 0;
185
186 void ClrFeatureEP()
187 {
188 1 PUSB_REQUEST pReq = &(pSotaUsbRequest->Request);
189 1 BYTE RegValue;
190 1 BYTE wValue = (BYTE)ConvertEndian16(pReq->wValue);
191 1 bit ReqAccept = true;
192 1 bit ClrEP0 = false;
193 1 bit ClrEP1 = false;
194 1 bit ClrEP2 = false;
195 1
196 1 if(wValue == ENDPOINT_HALT)
197 1 {
198 2 if((pReq->bmRequestType == 0x00)|| // Recipient = Device
199 2 (pReq->bmRequestType == 0x01) ) // Recipient = Interface
200 2 {
201 3 RegValue = CSRRead(USB_BASE + EP0_RXCSR);
202 3 if(RegValue & EN_RX0_STL)
203 3 ClrEP0 = true;
204 3
205 3 RegValue = CSRRead(USB_BASE + EP0_TXCSR);
206 3 if(RegValue & EN_TX0_STL)
207 3 ClrEP0 = true;
208 3
209 3 RegValue = CSRRead(USB_BASE + EP1_TXCSR);
210 3 if(RegValue & EN_TX1_STL)
211 3 ClrEP1 = true;
212 3
213 3 RegValue = CSRRead(USB_BASE + EP2_RXCSR);
214 3 if(RegValue & EN_RX2_STL)
215 3 ClrEP2 = true;
216 3 }
217 2 else if(pReq->bmRequestType == 0x02) // Recipient = EndPoint
218 2 {
219 3 BYTE Index = ((TDataCast *)&(pReq->wIndex))->ucByte[0];
220 3
221 3 if((Index == 0)||(Index == 0x80)) // Clear EP0
222 3 ClrEP0 = true;
223 3
224 3 else if(Index == EP1IN_NUMBER)
225 3 ClrEP1 = true;
226 3
227 3 else if(Index == EP2OUT_NUMBER)
228 3 ClrEP2 = true;
229 3
230 3 else
231 3 ReqAccept = false;
232 3 }
233 2 else
234 2 ReqAccept = false;
235 2
236 2 // Clear Endpoint Toggle Feature
237 2 RegValue = CSRRead(USB_BASE + EPCTL);
238 2 if(ClrEP0) RegValue |= CLR_EP0_TOG;
239 2 if(ClrEP1) RegValue |= CLR_EP1_TOG;
240 2 if(ClrEP2) RegValue |= CLR_EP2_TOG;
C51 COMPILER V7.02b CTRLREQUEST 02/01/2007 10:35:43 PAGE 5
241 2 CSRWrite(USB_BASE + EPCTL, RegValue);
242 2
243 2 if(ClrEP0)
244 2 {
245 3 pSotaUsbRequest->HaltStatus = false;
246 3
247 3 RegValue = CSRRead(USB_BASE + EP0_RXCSR);
248 3 RegValue &= ~EN_RX0_STL;
249 3 CSRWrite(USB_BASE + EP0_RXCSR, RegValue);
250 3
251 3 RegValue = CSRRead(USB_BASE + EP0_TXCSR);
252 3 RegValue &= ~EN_TX0_STL;
253 3 CSRWrite(USB_BASE + EP0_TXCSR, RegValue);
254 3 }
255 2
256 2 if(ClrEP1 | ClrEP2)
257 2 {
258 3 RegValue = CSRRead(USB_BASE + EP1_TXCSR);
259 3 RegValue &= ~EN_TX1_STL;
260 3 CSRWrite(USB_BASE + EP1_TXCSR, RegValue);
261 3
262 3 RegValue = CSRRead(USB_BASE + EP2_RXCSR);
263 3 RegValue &= ~(EN_RX2_STL | EN_RX2);
264 3 CSRWrite(USB_BASE + EP2_RXCSR, RegValue);
265 3 }
266 2
267 2 FeatureCleared = 1;
268 2 }
269 1
270 1 if(ReqAccept)
271 1 {
272 2 CSRWrite(USB_BASE + EP0_TXCNT, 0);
273 2 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);
274 2 }
275 1 else
276 1 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);
277 1 }
278
279 void BulkReportHandle();
280
281 void CtrlReqClearFeature()
282 {
283 1 BYTE Token = pSotaUsbRequest->Token;
284 1
285 1 switch(Token)
286 1 {
287 2 case SETUP_TOKEN:
288 2 FeatureCleared = 0;
289 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);
290 2 break;
291 2
292 2 case IN_TOKEN:
293 2 ClrFeatureEP();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -