📄 halusbhost.lst
字号:
435 2 xferLen = usbstack.wLen;
436 2 TxPktlen = xferLen; // data transfer length
437 2
438 2 if(xferLen){ //Take care about zero length packet
439 3 _halBufRst(0x03);
440 3 usbBufWrite(usbstack.buffer+bufpos,xferLen); // data to transfer on USB
441 3
442 3 if (xferLen < 64)
443 3 _halBufRst(0x03); // flip buffer state for bus read
444 3 }
445 2
446 2 if (bXXGFlags.bToggle) // DATA0 or DATA1
447 2 cmd = WRITE1; //Out + data + toggle
448 2 else
449 2 cmd = WRITE0;
450 2
451 2 SieStat0 = 0xff; // clear status register before each transfer
452 2 TxCtrl = cmd; // Send packet
453 2
454 2 // Main loop for completing a wLen data trasnfer
455 2 while(TRUE){
456 3 stat0 = SieStat0;
457 3 if((stat0&DEV_ACK)||(toFlag==TRUE)){
458 4 SieStat0 = DEV_ACK;
459 4 usbstack.wLen -= xferLen;
460 4 bufpos += xferLen;
461 4 bXXGFlags.bToggle = ~bXXGFlags.bToggle;
462 4 break;
463 4 }else if(stat0&DEV_NAK){
464 4 SieStat0 = DEV_NAK;
465 4 _halBufRst(0x02); // reset read pointer
466 4 TxCtrl = cmd; // Send cmd again!
467 4 }else if(stat0&DEV_TO){
468 4 #if 0
SieStat0 = DEV_TO;
// glitch filter, don't need to clear
if (SieStat0 & DEV_TO){ // packet is not coming!
_halBufRst(0x02); // reset read pointer
TxCtrl = cmd; // Send cmd again!
}
#else
476 4 //Treat the DEV_TO as DEV_ACK
477 4 toFlag = TRUE;
478 4
479 4 #endif
480 4 }
481 3 }//end of while(TRUE)
482 2 }while(usbstack.wLen);
483 1
484 1 WDT = 0X00;
485 1 return TRUE; // fail transmission
486 1 }
C51 COMPILER V8.01 HALUSBHOST 04/17/2008 09:46:30 PAGE 9
487
488 //usbstack.pid==PID_IN
489 BYTE _halInTrans(void)
490 {
491 1 BYTE data xferLen;
492 1 BYTE data stat0;
493 1 BYTE data devTglSt; // device toggle state
494 1 BYTE *buf;
495 1
496 1 WDT = 0X1F;
497 1 buf = usbstack.buffer;
498 1 #if 0
if(!bXXGFlags.bIN_ISR)
BufSel = USB2MCU; //src=USB,dest=CPU
else
BufSel = USB2MP3; //src=USB, dest=MP3
#endif
504 1
505 1 do{
506 2
507 2 // ConsecutiveNAKCount = 0;
508 2 if (usbstack.wLen >= usbstack.wPayload)
509 2 xferLen = usbstack.wPayload;
510 2 else
511 2 xferLen = usbstack.wLen;
512 2 TxPktlen = xferLen; // data transfer length
513 2
514 2 BufSel = USB2MCU;
515 2 //_halBufRst(0x03); // reset RW ptr
516 2 _halBufRst(0x01); // reset write ptr
517 2 SieStat0 = 0xff; // clear status register before each transfer
518 2 TxCtrl = READ; // Send IN token
519 2
520 2 while(TRUE){
521 3 //DISABLE_INTERRUPTS;
522 3 stat0 = SieStat0;
523 3 if (stat0 & PKT_VLD){
524 4 devTglSt = (stat0 & DEV_TGL);
525 4 if (devTglSt == bXXGFlags.bToggle){
526 5 if(xferLen<64)
527 5 _halBufRst(0x03);
528 5
529 5 if(!bXXGFlags.bIN_ISR){
530 6 usbBufRead(buf, xferLen);
531 6 buf += xferLen;
532 6 }else{
533 6 BufSel = USB2MP3; //src=USB,dest=MP3
534 6 DelayUs(10); //waitting data transfer finished
535 6 }
536 5 bXXGFlags.bToggle = ~bXXGFlags.bToggle;
537 5 //UartOutText("xferLen: ");UartOutValue(xferLen, 2);
538 5 //UartOutText("usbstack.wLen: ");UartOutValue(usbstack.wLen, 4);
539 5 usbstack.wLen -= xferLen;
540 5 //UartOutText("NAK count: ");UartOutValue(ConsecutiveNAKCount, 4);
541 5 if(xferLen<64)
542 5 _halBufRst(0x03);
543 5 else
544 5 _halBufRst(0x01);
545 5 BufSel = USB2MCU; //src=USB,dest=CPU
546 5
547 5 break;
548 5 }else{
C51 COMPILER V8.01 HALUSBHOST 04/17/2008 09:46:30 PAGE 10
549 5 UartOutText("-E-: Toggle Fail \r\n");
550 5 //Fix Me: What we should do fo Toggle Fail!
551 5 //Resend the cmd!!!!
552 5 if(xferLen<64){ // set buffer empty flag
553 6 _halBufRst(0x03);
554 6 }
555 5
556 5 BufSel = USBFLSH; //src=USB,dest=FLUSH
557 5 Scratch = 0x0; // kill some time...
558 5
559 5 if(xferLen<64){ // set buffer empty flag
560 6 _halBufRst(0x03);
561 6 }else{
562 6 _halBufRst(0x01);
563 6 }
564 5 BufSel = USB2MCU; //src=USB,dest=CPU
565 5 TxCtrl = READ;
566 5 }
567 4 }else if(stat0 & DEV_NAK){
568 4 SieStat0 = DEV_NAK;
569 4 // ConsecutiveNAKCount = ConsecutiveNAKCount + 1;
570 4 _halBufRst(0x01); // reset write pointer
571 4 TxCtrl = READ;
572 4 }else if(stat0 & DEV_TO){ // turnaround time expired
573 4 SieStat0 = DEV_TO;
574 4 // glitch filter, don't need to clear
575 4 if (SieStat0 & DEV_TO){ // packet is not coming!
576 5 _halBufRst(0x01); // reset write pointer
577 5 TxCtrl = READ; // Send command again!
578 5 }
579 4 }
580 3 #if 0
else if (intr & DEV_STALL){
SieStat0 = DEV_STALL;
bXXGFlags.SLAVE_STALLED = TRUE;
UartOutText("-E-: Device Stalled \r\n");
break;
}
#endif
588 3 //ENABLE_INTERRUPTS;
589 3 }
590 2 }while(usbstack.wLen > 0);
591 1
592 1 WDT = 0X00;
593 1 return TRUE; // fail transmission
594 1 }
595
596 #if 0
void _halBufRst(BYTE rst)
{
BufRst = rst;
//BufRst = 0x00;
return;
}
#endif
605
606 void halUsbPhyBlksize(WORD size)
607 {
608 1 //DWORD blksize;
609 1 BYTE data blkexp;
610 1 BYTE data offset;
C51 COMPILER V8.01 HALUSBHOST 04/17/2008 09:46:30 PAGE 11
611 1
612 1 if(size & 0x1FF){
613 2 size = BLKSIZE_512;
614 2 }
615 1 blkexp = Value2Exp(size);
616 1 offset = ((1<<(blkexp - BLKSIZE_512_EXP))-1);
617 1
618 1 UartOutText("-I-: PhyBlkSize = ");UartOutValue(size, 4);
619 1 UartOutText("-I-: PhyBlkSizeExp = ");UartOutValue(blkexp, 2);
620 1
621 1 //512B_EXP
622 1 usbstack.wPhyBlkSize = size;
623 1 usbstack.bPhyBlkSizeExp = blkexp;// - 9;//512B_EXP;
624 1 usbstack.bMaxOffset = offset;
625 1 usbstack.bOffset = offset;
626 1 // usbstack.dwLba = 0xffffffff;
627 1
628 1 // DrivePhyBlkSize(size, blkexp, offset);
629 1
630 1 return;
631 1 }
632
633 //This function will return the exponent of the size of sector.
634 //Can be called after Enumeration.
635 BYTE halUsbInfo(void)
636 {
637 1 return usbstack.bPhyBlkSizeExp;
638 1 }
639
640
641
642
643
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1728 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 59 19
PDATA SIZE = ---- ----
DATA SIZE = 1 13
IDATA SIZE = ---- ----
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 + -