⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 host_811.lst

📁 完整的usb_host_device源代码直接在keil下编译
💻 LST
📖 第 1 页 / 共 5 页
字号:
 317   1              while(TRUE)
 318   1              {   
 319   2                      //---------------Wait for done interrupt------------------
 320   2                      while(TRUE)                                                                                             // always ensure requested device is
 321   2                      {                                                                                                               // inserted at all time, then you will
 322   3                              intr = SL811Read(IntStatus);                                            // wait for interrupt to be done, and 
 323   3                              if((intr & USB_RESET) || (intr & INSERT_REMOVE))        // proceed to parse result from slave 
 324   3                              {                                                                                                       // device.
 325   4                                      DATA_STOP = TRUE;                                                               // if device is removed, set DATA_STOP
 326   4                                      return FALSE;                                                                   // flag true, so that main loop will 
 327   4                              }                                                                                                       // know this condition and exit gracefully
 328   3                              if(intr & USB_A_DONE)                                                           
 329   3                                      break;                                                                                  // interrupt done !!!
 330   3                      }
 331   2      
 332   2                      SL811Write(IntStatus,INT_CLEAR);                                                // clear interrupt status
 333   2                      result    = SL811Read(EP0Status);                                               // read EP0status register
 334   2                      remainder = SL811Read(EP0Counter);                                              // remainder value in last pkt xfer
 335   2      
 336   2                      //-------------------------ACK----------------------------
 337   2                      if (result & EP0_ACK)                                                                   // Transmission ACK
 338   2                      {       
 339   3      
 340   3                              // SETUP TOKEN
 341   3                              if(pid == PID_SETUP)                                                            // do nothing for SETUP/OUT token 
 342   3                                      break;                                                                                  // exit while(1) immediately
 343   3      
 344   3                              // OUT TOKEN                            
 345   3                              else if(pid == PID_OUT)
 346   3                                      break;
 347   3      
 348   3                              // IN TOKEN
 349   3                              else if(pid == PID_IN)
 350   3                              {                                                                                                       // for IN token only
 351   4                                      wLen  -= (WORD)xferLen;                                                 // update remainding wLen value
 352   4                                      cmd   ^= 0x40;                                                                  // toggle DATA0/DATA1
 353   4                                      dataX++;                                                                                // point to next dataX
 354   4      
 355   4                                      //------------------------------------------------      
 356   4                                      // If host requested for more data than the slave 
 357   4                                      // have, and if the slave's data len is a multiple
 358   4                                      // of its endpoint payload size/last xferLen. Do 
 359   4                                      // not overwrite data in previous buffer.
 360   4                                      //------------------------------------------------      
 361   4                                      if(remainder==xferLen)                                                  // empty data detected
 362   4                                              bufLen = 0;                                                                     // do not overwriten previous data
 363   4                                      else                                                                                    // reset bufLen to zero
 364   4                                              bufLen = xferLen;                                                       // update previous buffer length
C51 COMPILER V7.50   HOST_811                                                              10/27/2005 20:00:37 PAGE 7   

 365   4                                      
 366   4                                      //------------------------------------------------      
 367   4                                      // Arm for next data transfer when requested data 
 368   4                                      // length have not reach zero, i.e. wLen!=0, and
 369   4                                      // last xferlen of data was completed, i.e.
 370   4                                      // remainder is equal to zero, not a short pkt
 371   4                                      //------------------------------------------------      
 372   4                                      if(!remainder && wLen)                                                  // remainder==0 when last xferLen
 373   4                                      {                                                                                               // was all completed or wLen!=0
 374   5                                              addr    = (dataX & 1) ? data1:data0;            // select next address for data
 375   5                                              xferLen = (BYTE)(wLen>=wPayload) ? wPayload:wLen;       // get data length required
 376   5                                              if (FULL_SPEED)                                                         // sync with SOF transfer
 377   5                                                      cmd |= 0x20;                                                    // always sync SOF when FS, regardless 
 378   5                                              SL811Write(EP0XferLen, xferLen);                        // select next xfer length
 379   5                                              SL811Write(EP0Address, addr);                   // data buffer addr 
 380   5                                              SL811Write(IntStatus,INT_CLEAR);                        // is a LS is on Hub.
 381   5                                              SL811Write(EP0Control,cmd);                                     // Enable USB transfer and re-arm
 382   5                                      }                               
 383   4      
 384   4                                      //------------------------------------------------
 385   4                                      // Copy last IN token data pkt from prev transfer
 386   4                                      // Check if there was data available during the
 387   4                                      // last data transfer
 388   4                                      //------------------------------------------------
 389   4                                      if(bufLen)                                                                              
 390   4                                      {       
 391   5                                              SL811BufRead(((dataX&1)?data0:data1), buffer, bufLen);
 392   5                                              buffer += bufLen;                                                               
 393   5                                      }
 394   4      
 395   4                                      //------------------------------------------------
 396   4                                      // Terminate on short packets, i.e. remainder!=0
 397   4                                      // a short packet or empty data packet OR when 
 398   4                                      // requested data len have completed, i.e.wLen=0
 399   4                                      // For a LOWSPEED device, the 1st device descp,
 400   4                                      // wPayload is default to 64-byte, LS device will
 401   4                                      // only send back a max of 8-byte device descp,
 402   4                                      // and host detect this as a short packet, and 
 403   4                                      // terminate with OUT status stage
 404   4                                      //------------------------------------------------
 405   4                                      if(remainder || !wLen)
 406   4                                              break;
 407   4                              }                                                       
 408   3                      }
 409   2                      
 410   2                      //-------------------------NAK----------------------------
 411   2                      if (result & EP0_NAK)                                                                   // NAK Detected
 412   2                      {                                                                                                               
 413   3                              if(endpoint==0)                                                                         // on ep0 during enumeration of LS device
 414   3                              {                                                                                                       // happen when slave is not fast enough,
 415   4                                      SL811Write(IntStatus,INT_CLEAR);                                // clear interrupt status, need to
 416   4                                      SL811Write(EP0Control,cmd);                                             // re-arm and request for last cmd, IN token
 417   4                      result = 0;                                     // respond to NAK status only
 418   4                              }
 419   3                              else                                                                                            // normal data endpoint, exit now !!! , non-zero ep
 420   3                                      break;                                                                                  // main loop control the interval polling
 421   3                      }
 422   2                      
 423   2                      //-----------------------TIMEOUT--------------------------
 424   2                      if (result & EP0_TIMEOUT)                                                               // TIMEOUT Detected
 425   2                      {                                                                                                               
 426   3                              if(endpoint==0)                                                                         // happens when hub enumeration
C51 COMPILER V7.50   HOST_811                                                              10/27/2005 20:00:37 PAGE 8   

 427   3                              {
 428   4                                      if(++timeout >= TIMEOUT_RETRY)
 429   4                                      {       
 430   5                                          timeout--;
 431   5                                              break;                                                                          // exit on the timeout detected 
 432   5                                      }
 433   4                                      SL811Write(IntStatus,INT_CLEAR);                                // clear interrupt status, need to
 434   4                                      SL811Write(EP0Control,cmd);                                             // re-arm and request for last cmd again
 435   4                              }
 436   3                              else                                                                                            
 437   3                              {                                                                                                       // all other data endpoint, data transfer 
 438   4                                      TIMEOUT_ERR = TRUE;                                                             // failed, set flag to terminate transfer
 439   4                                      break;                                                                                  // happens when data transfer on a device
 440   4                              }                                                                                                       // through the hub
 441   3                      }
 442   2      
 443   2                      //-----------------------STALL----------------------------
 444   2                      if (result & EP0_STALL)                                                                 // STALL detected
 445   2                              return TRUE;                                                                            // for unsupported request.
 446   2                                                                                                                                                      
 447   2                      //----------------------OVEFLOW---------------------------
 448   2                      if (result & EP0_OVERFLOW)                                                      // OVERFLOW detected
 449   2                              break;
 450   2                      //-----------------------ERROR----------------------------
 451   2                      if (result & EP0_ERROR)                                                                 // ERROR detected
 452   2                              break;
 453   2              }       // end of While(1)
 454   1         
 455   1              if (result & EP0_ACK)   // on ACK transmission
 456   1                      return TRUE;            // return OK
 457   1      
 458   1              return FALSE;                   // fail transmission
 459   1      }
 460          
 461          //*****************************************************************************************
 462          // Control Endpoint 0's USB Data Xfer
 463          // ep0Xfer, endpoint 0 data transfer
 464          //*****************************************************************************************
 465          int ep0Xfer(BYTE usbaddr, WORD payload, pSetupPKG setup, BYTE *pData)
 466          {
 467   1              xdata BYTE      pid  = PID_IN;
 468   1              xdata WORD      wLen = WordSwap(setup->wLength);                // swap back for correct length
 469   1              xdata BYTE      ep0 = 0;                                                                // always endpoint zero
 470   1      
 471   1              //----------------------------------------------------
 472   1              // SETUP token with 8-byte request on endpoint 0
 473   1              //----------------------------------------------------
 474   1              if (!usbXfer(usbaddr, ep0, PID_SETUP, 0, payload, 8, (BYTE*)setup)) 
 475   1                      return FALSE;
 476   1      
 477   1              //----------------------------------------------------
 478   1              // IN or OUT data stage on endpoint 0   
 479   1              //----------------------------------------------------
 480   1              if (wLen)                                                                                       // if there are data for transfer

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -