📄 upsd_usb.lst
字号:
193 // Load and arm EP0 to transmit data.
194
195 void TransmitDataEP0(uchar* pData, int nBytes)
196 {
197 1 if (nBytes > EP0_SIZE)
198 1 nBytes = EP0_SIZE;
199 1
200 1 UCON0 = ((UCON0 ^ uTSEQ0) & uTSEQ0) | uRX0E | uTX0E | nBytes;
201 1 while (nBytes--)
202 1 {
203 2 UDT0 = *pData++;
204 2 }
205 1 }
206
207 /////////////////// TransmitDataEPx()
208 //
209 // Loads and arms EP1 or EP2 transmit FIFO.
210
211 void TransmitDataEPx(int x, uchar* pData, int nBytes)
212 {
213 1 int i;
214 1
215 1 // Reset FIFO
216 1 UCON1 |= (uTX1E | 8);
217 1
218 1 if ((x == 1) && (nBytes > 8))
219 1 {
220 2 nBytes = 8;
221 2 }
222 1 else if ((x == 2) && (nBytes > 8))
223 1 {
224 2 nBytes = 8;
225 2 }
226 1
227 1 // Load data
228 1 for (i = 0; i < nBytes; i++)
229 1 {
230 2 UDT1 = *pData++;
231 2 }
232 1
233 1 // Arm endpoint
234 1 UCON1 = ((UCON1 ^ uTSEQ1) & uTSEQ1)
235 1 | uTX1E | ((x == 2) ? uEP12SEL : 0) | nBytes;
236 1 }
237
238 /////////////////// OnGetDescriptor()
239
240 static void OnGetDescriptor()
241 {
C51 COMPILER V7.00 Beta 6 UPSD_USB 02/19/2003 15:59:28 PAGE 5
242 1 int bytesRequested;
243 1
244 1 switch (setupPacket.wValue.hi)
245 1 {
246 2 case DT_DEVICE:
247 2 pTransmitBufferEP0 = (uchar*) &deviceDesc;
248 2 bytesToTransmitEP0 = sizeof(deviceDesc);
249 2 break;
250 2 case DT_CONFIGURATION:
251 2 pTransmitBufferEP0 = (uchar*) &configDesc;
252 2 bytesToTransmitEP0 = configDesc.wTotalLength.lo;
253 2 break;
254 2 case DT_STRING:
255 2 pTransmitBufferEP0 = (uchar*) stringDescTable[setupPacket.wValue.lo];
256 2 bytesToTransmitEP0 = *pTransmitBufferEP0;
257 2 break;
258 2 #if HID_DEVICE
259 2 case DT_HID_CLASS:
260 2 pTransmitBufferEP0 = (uchar*) &hidClassDesc;
261 2 bytesToTransmitEP0 = hidClassDescSize;
262 2 break;
263 2 case DT_HID_REPORT:
264 2 pTransmitBufferEP0 = (uchar*) &reportDesc;
265 2 bytesToTransmitEP0 = reportDescSize;
266 2 break;
267 2 #endif
268 2 default:
269 2 // Unrecognized descriptor, so stall EP0
270 2 // UCON0 |= uSTALL0; - problems, so try 0 length packet instead
271 2 UCON0 = uTSEQ0 | uRX0E | uTX0E;
272 2 return;
273 2 }
274 1
275 1 bytesRequested = (setupPacket.wLength.hi << 8) | setupPacket.wLength.lo;
276 1 shortTransfer = (bytesToTransmitEP0 < bytesRequested);
277 1 if (bytesToTransmitEP0 > bytesRequested)
278 1 {
279 2 bytesToTransmitEP0 = bytesRequested;
280 2 }
281 1
282 1 // TransmitDataEP0 will toggle sequence bit to DATA1
283 1 UCON0 &= ~uTSEQ0;
284 1 TransmitBufferEP0();
285 1 }
286
287 /////////////////// ReadSetupPacket()
288 //
289 // Reads a setup packet from EP0.
290 //
291 // Returns TRUE if successful; stalls the endpoint and returns
292 // FALSE on an invalid packet size.
293
294 BOOL ReadSetupPacket()
295 {
296 1 int i;
297 1 uchar* p = (uchar*) &setupPacket;
298 1
299 1 // Make sure the SETUP packet is the correct size
300 1 if ((USTA & 0x0F) != 8)
301 1 {
302 2 UCON0 |= uSTALL0;
303 2 return FALSE;
C51 COMPILER V7.00 Beta 6 UPSD_USB 02/19/2003 15:59:28 PAGE 6
304 2 }
305 1
306 1 // Read the setup packet
307 1 for (i = 0; i < sizeof(setup_buffer); i++)
308 1 {
309 2 *p++ = UDR0;
310 2 }
311 1
312 1 // Set data toggle bit (expecting DATA1)
313 1 USTA |= uRSEQ;
314 1
315 1 return TRUE;
316 1 }
317
318 /////////////////// OnSetupPacket()
319 //
320 // Basic handler for SETUP packets received on EP0.
321
322 void OnSetupPacket()
323 {
324 1 pTransmitBufferEP0 = NULL;
325 1 bytesToTransmitEP0 = 0;
326 1
327 1 // If it's a standard request...
328 1 if ((setupPacket.bmRequestType & 0x60) == 0)
329 1 {
330 2 // Handle the request
331 2 switch (setupPacket.bRequest)
332 2 {
333 3 case CLEAR_FEATURE:
334 3 OnClearFeature();
335 3 return;
336 3 case SET_ADDRESS:
337 3 OnSetAddress();
338 3 return;
339 3 case GET_DESCRIPTOR:
340 3 OnGetDescriptor();
341 3 return;
342 3 case SET_CONFIGURATION:
343 3 OnSetConfiguration();
344 3 return;
345 3 default:
346 3 break;
347 3 }
348 2 }
349 1
350 1 // It's not a request we handle so stall endpoint
351 1 // UCON0 |= uSTALL0; - problems, so try zero length packet instead
352 1 UCON0 = uTSEQ0 | uRX0E | uTX0E;
353 1 }
354
355 /////////////////// BaseEp0TxHandler()
356 //
357 // Handler for successful data transmission on control endpoint (EP0).
358
359 void BaseEp0TxHandler()
360 {
361 1 // Send next chunk of data in transaction
362 1 if (!TransmitBufferEP0())
363 1 {
364 2 // The current request has finished
365 2 if (setupPacket.bRequest == SET_ADDRESS)
C51 COMPILER V7.00 Beta 6 UPSD_USB 02/19/2003 15:59:28 PAGE 7
366 2 {
367 3 UADR = setupPacket.wValue.lo | uUSBEN;
368 3 if (setupPacket.wValue.lo != 0)
369 3 usbState = US_ADDRESSED;
370 3 else
371 3 usbState = US_DEFAULT;
372 3 }
373 2
374 2 setupPacket.bRequest = REQUEST_COMPLETE;
375 2 }
376 1 }
377
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 922 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 14 15
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = 2 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -