?? ctrlrequest.lst
字號:
294 2 break;
295 2
296 2 case OUT_TOKEN:
297 2 case IN_OK_TOKEN:
298 2 default:
299 2 pSotaUsbRequest->InProgress = false;
300 2 if(FeatureCleared)
301 2 {
302 3 if(ScsiCmdSTALLed)
C51 COMPILER V7.02b CTRLREQUEST 02/01/2007 10:35:43 PAGE 6
303 3 {
304 4 BulkReportHandle();
305 4 ScsiCmdSTALLed = false;
306 4 }
307 3 }
308 2 break;
309 2 }
310 1 }
311
312 //----------------------------------------------------------------------------
313 // Set USB Test Mode.
314 //----------------------------------------------------------------------------
315 void CtrlSetTestMode(BYTE TestItem)
316 {
317 1 BYTE TestModeReg;
318 1
319 1 if ((((UINT32)HwId() << 16) | HwVersion()) >= 0x60340100)
320 1 TestModeReg = USB_TEST_MODE1;
321 1 else
322 1 TestModeReg = USB_TEST_MODE0;
323 1
324 1 switch (TestItem)
325 1 {
326 2 case TEST_J:
327 2 CSRWrite(USB_BASE + TestModeReg, SET_TM_J);
328 2 break;
329 2
330 2 case TEST_K:
331 2 CSRWrite(USB_BASE + TestModeReg, SET_TM_K);
332 2 break;
333 2
334 2 case TEST_SE0_NAK:
335 2 CSRWrite(USB_BASE + TestModeReg, SET_TM_SE0_NAK);
336 2 break;
337 2
338 2 case TEST_PACKET:
339 2 while (true)
340 2 {
341 3 BYTE i;
342 3
343 3 CSRWrite(USB_BASE + TestModeReg, SET_TM_PKT);
344 3 for (i = 0; i < 120; i++); // Delay about 111us under 11MHz
345 3 CSRWrite(USB_BASE + TestModeReg, 0);
346 3 }
347 2 break;
348 2
349 2 case TEST_FORCE_ENABLE:
350 2 // Not Support.
351 2 default:
352 2 TestModeParam = NO_TEST_PARAM;
353 2 break;
354 2 }
355 1 }
356
357 //----------------------------------------------------------------------------
358 // Check USB Test Mode Parameters.
359 //----------------------------------------------------------------------------
360 bool CtrlChkTestMode(PUSB_REQUEST pReq, PBYTE Param)
361 {
362 1 bit Rc = false;
363 1
364 1 if (pReq->bmRequestType == 0)
C51 COMPILER V7.02b CTRLREQUEST 02/01/2007 10:35:43 PAGE 7
365 1 {
366 2 if (((TDataCast *)&(pReq->wIndex))->ucByte[0] == 0)
367 2 {
368 3 if (pReq->wLength == 0)
369 3 {
370 4 *Param = (BYTE)(pReq->wIndex);
371 4 Rc = true;
372 4 }
373 3 }
374 2 }
375 1
376 1 return Rc;
377 1 }
378
379 //----------------------------------------------------------------------------
380 // Set Feature Request,Only Support EP0 ~ EP3.
381 //----------------------------------------------------------------------------
382 void CtrlReqSetFeature()
383 {
384 1 BYTE Token = pSotaUsbRequest->Token;
385 1
386 1 switch(Token)
387 1 {
388 2 case SETUP_TOKEN:
389 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);
390 2 TestModeParam = NO_TEST_PARAM;
391 2 break;
392 2
393 2 case IN_TOKEN:
394 2 {
395 3 PUSB_REQUEST pReq = &(pSotaUsbRequest->Request);
396 3 bit ReqAccept = false;
397 3 BYTE Value = (BYTE)ConvertEndian16(pReq->wValue);
398 3
399 3 if (ENDPOINT_HALT == Value)
400 3 {
401 4 if (pReq->bmRequestType == 0x02)
402 4 {
403 5 BYTE Index = ((TDataCast *)&(pReq->wIndex))->ucByte[0];
404 5 BYTE Offset = CtrlEPIndex2RegOffset(Index);
405 5
406 5 if (Offset == 0xff)
407 5 ReqAccept = false;
408 5 else
409 5 {
410 6 ReqAccept = true;
411 6 if (Offset)
412 6 CSRWrite(USB_BASE + Offset, 0x02);
413 6 else // Set EP0
414 6 pSotaUsbRequest->HaltStatus = true;
415 6 }
416 5 }
417 4 }
418 3 if (TEST_MODE == Value)
419 3 ReqAccept = CtrlChkTestMode(pReq, &TestModeParam);
420 3
421 3 if (DEVICE_REMOTE_WAKEUP == Value)
422 3 {
423 4 // Not Support Yet!
424 4 ReqAccept = true;
425 4 }
426 3
C51 COMPILER V7.02b CTRLREQUEST 02/01/2007 10:35:43 PAGE 8
427 3 if (ReqAccept)
428 3 {
429 4 CSRWrite(USB_BASE + EP0_TXCNT, 0);
430 4 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);
431 4 }
432 3 else
433 3 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);
434 3 break;
435 3 }
436 2
437 2 case IN_OK_TOKEN:
438 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);
439 2 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);
440 2
441 2 case OUT_TOKEN:
442 2 default:
443 2 pSotaUsbRequest->InProgress = false;
444 2 if (TestModeParam != NO_TEST_PARAM)
445 2 {
446 3 CtrlSetTestMode(TestModeParam);
447 3 // Clear Test Mode until power reset(power cycled).
448 3 while(1);
449 3 }
450 2 break;
451 2 }
452 1 }
453
454 //----------------------------------------------------------------------------
455 // Set Address Request
456 // NOTE:
457 // It is critical on the timing of changing USB address. We must do it
458 // before next Setup Token (With new address) and after now running
459 // transaction has been finished.So we end this request without using
460 // state machine.
461 //----------------------------------------------------------------------------
462 void CtrlReqSetAddress()
463 {
464 1 BYTE Token = pSotaUsbRequest->Token;
465 1
466 1 switch(Token)
467 1 {
468 2 case SETUP_TOKEN:
469 2 {
470 3 PUSB_REQUEST pReq = &(pSotaUsbRequest->Request);
471 3
472 3 UsbAddr = ((TDataCast *)&(pReq->wValue))->ucByte[0];
473 3 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);
474 3 break;
475 3 }
476 2
477 2 case IN_TOKEN:
478 2 CSRWrite(USB_BASE + USBADDR, UsbAddr);
479 2 CSRWrite(USB_BASE + EP0_TXCNT, 0);
480 2 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);
481 2 /*
482 2 Before host set address,it would issue usb reset so we
483 2 must enable EP1,EP2 again.(These pipe were disable default)
484 2 */
485 2 CSRWrite(USB_BASE + EPCTL, EN_EP0 | EN_EP1 | EN_EP2 );
486 2 // Clear the Bulk IN/OUT stall bits.
487 2 CSRWrite(USB_BASE + EP1_TXCSR, 0x00);
488 2 CSRWrite(USB_BASE + EP2_RXCSR, EN_RX2);
C51 COMPILER V7.02b CTRLREQUEST 02/01/2007 10:35:43 PAGE 9
489 2 pSotaUsbRequest->InProgress = false;
490 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);
491 2 break;
492 2
493 2 case IN_OK_TOKEN:
494 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);
495 2 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);
496 2 break;
497 2
498 2 case OUT_TOKEN:
499 2 default:
500 2 break;
501 2 }
502 1 }
503
504 static BYTE ConfigSetValue = 1;
505 //----------------------------------------------------------------------------
506 // Get Configuration Request
507 //----------------------------------------------------------------------------
508 void CtrlReqGetConfiguration()
509 {
510 1 BYTE Token = pSotaUsbRequest->Token;
511 1
512 1 switch(Token)
513 1 {
514 2 case SETUP_TOKEN:
515 2 pSotaUsbRequest->LoadInDataOk = true;
516 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);
517 2 break;
518 2
519 2 case IN_TOKEN:
520 2 if (pSotaUsbRequest->LoadInDataOk)
521 2 {
522 3 CSRWrite(USB_BASE + EP0_TXCNT, 1);
523 3 CSRWrite(USB_BASE + EP0_TXDATA, ConfigSetValue);
524 3 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);
525 3 pSotaUsbRequest->LoadInDataOk = false;
526 3 }
527 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);
528 2 break;
529 2
530 2 case IN_OK_TOKEN:
531 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);
532 2 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);
533 2 break;
534 2
535 2 case OUT_TOKEN:
536 2 default:
537 2 // Ctrl Read End
538 2 pSotaUsbRequest->InProgress = false;
539 2 break;
540 2 }
541 1 }
542
543 //----------------------------------------------------------------------------
544 // Set Configuration Request
545 //----------------------------------------------------------------------------
546 void CtrlReqSetConfiguration()
547 {
548 1 BYTE Token = pSotaUsbRequest->Token;
549 1
550 1 switch(Token)
C51 COMPILER V7.02b CTRLREQUEST 02/01/2007 10:35:43 PAGE 10
551 1 {
552 2 case SETUP_TOKEN:
553 2 {
554 3 PUSB_REQUEST pReq = &(pSotaUsbRequest->Request);
555 3 BYTE Value = ((TDataCast *)&(pReq->wValue))->ucByte[0];
556 3
557 3 ConfigSetValue = Value;
558 3 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);
559 3 break;
560 3 }
561 2
562 2 case IN_TOKEN:
563 2 CtrlClearHaltFeature();
564 2 CSRWrite(USB_BASE + EP0_TXCNT, 0);
565 2 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);
566 2 break;
567 2
568 2 case IN_OK_TOKEN:
569 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);
570 2 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);
571 2
572 2 case OUT_TOKEN:
573 2 default:
574 2 pSotaUsbRequest->InProgress = false;
575 2 break;
576 2 }
577 1 }
578
579 //----------------------------------------------------------------------------
580 // Get Interface Request
581 //----------------------------------------------------------------------------
582 void CtrlReqGetInterface()
583 {
584 1 BYTE Token = pSotaUsbRequest->Token;
585 1
586 1 switch(Token)
587 1 {
588 2 case SETUP_TOKEN:
589 2 pSotaUsbRequest->LoadInDataOk = true;
590 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);
591 2 break;
592 2
593 2 case IN_TOKEN:
594 2 if (pSotaUsbRequest->LoadInDataOk)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -