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

📄 host_811.lst

📁 sl811 c8051F驱动程序 保证绝对可以使用 USB通信协议USB1.1
💻 LST
📖 第 1 页 / 共 3 页
字号:
 176   1              else                                                                                    // for current SETUP/OUT tokens
 177   1              {       
 178   2                      if(xferLen)                                                                     // only when there are  
C51 COMPILER V8.08   HOST_811                                                              04/25/2009 23:03:20 PAGE 4   

 179   2                              SL811BufWrite(data0,buffer,xferLen);    // data to transfer on USB
 180   2                      cmd = sDATA0_WR;
 181   2                      
 182   2              }       
 183   1              //------------------------------------------------
 184   1              // For EP0's IN/OUT token data, start with DATA1
 185   1              // Control Endpoint0's status stage.
 186   1              // For data endpoint, IN/OUT data, start ????
 187   1              //------------------------------------------------
 188   1              if (endpoint == 0 && pid != PID_SETUP)                  // for Ep0's IN/OUT token
 189   1                      cmd |= 0x40;                                                            // always set DATA1
 190   1                      
 191   1              //------------------------------------------------
 192   1              // Arming of USB data transfer for the first pkt
 193   1              //------------------------------------------------
 194   1              SL811Write(EP0Status,((endpoint&0x0F)|pid));    // PID + EP address
 195   1              SL811Write(EP0Counter,usbaddr);                                 // USB address
 196   1              SL811Write(EP0Address,data0);                                   // buffer address, start with "data0"
 197   1              SL811Write(EP0XferLen,xferLen);                                 // data transfer length
 198   1              SL811Write(IntStatus,INT_CLEAR); 
 199   1                                              // clear interrupt status
 200   1              SL811Write(EP0Control,cmd);                                             // Enable ARM and USB transfer start here
 201   1              //------------------------------------------------
 202   1              // Main loop for completing a wLen data trasnfer
 203   1              //---------------------- --------------------------
 204   1              while(TRUE)
 205   1              {   
 206   2                      //---------------Wait for done interrupt------------------
 207   2                      while(TRUE)                                                                                             // always ensure requested device is
 208   2                      {       
 209   3                              SL811Write(IntStatus,INT_CLEAR);                                                                                                // inserted at all time, then you will
 210   3                              intr = SL811Read(IntStatus);                                            // wait for interrupt to be done, and 
 211   3                          intr=0x81;
 212   3                              result    = SL811Read(EP0Status);
 213   3                              remainder = SL811Read(EP0Counter);      
 214   3                      
 215   3                               DelayMs(7);
 216   3                               
 217   3                              if((intr & USB_RESET) || (intr & INSERT_REMOVE))        // proceed to parse result from slave 
 218   3                              {                                                                                                       // device.
 219   4                                      USB_Control.DATA_STOP = TRUE;                                                           // if dhevice is removed, set DATA_STOP
 220   4                                      return FALSE;                                                                   // flag true, so that main loop will 
 221   4                              }                                                                                                       // know tis condition and exit gracefully
 222   3                              if(intr & USB_A_DONE)                                                           
 223   3                                      break;                                                                                  // interrupt done !!!
 224   3                      }
 225   2      
 226   2                      SL811Write(IntStatus,INT_CLEAR);                                                // clear interrupt status
 227   2                      result    = SL811Read(0x03);                                            // read EP0status register
 228   2                      remainder = SL811Read(EP0Counter);                                              // remainder value in last pkt xfer
 229   2              
 230   2                      //-------------------------ACK----------------------------
 231   2                      if (result & EP0_ACK)                                                                   // Transmission ACK
 232   2                      {       
 233   3      
 234   3                              // SETUP TOKEN
 235   3                              if(pid == PID_SETUP)                                                            // do nothing for SETUP/OUT token 
 236   3                                      break;                                                                                  // exit while(1) immediately
 237   3      
 238   3                              // OUT TOKEN                            
 239   3                              else if(pid == PID_OUT)
 240   3                                      break;
C51 COMPILER V8.08   HOST_811                                                              04/25/2009 23:03:20 PAGE 5   

 241   3      
 242   3                              // IN TOKEN
 243   3                              else if(pid == PID_IN)
 244   3                              {                                                                                                       // for IN token only
 245   4                                      wLen  -= (WORD)xferLen;                                                 // update remainding wLen value
 246   4                                      cmd   ^= 0x40;                                                                  // toggle DATA0/DATA1
 247   4                                      dataX++;                                                                                // point to next dataX
 248   4      
 249   4                                      //------------------------------------------------      
 250   4                                      // If host requested for more data than the slave 
 251   4                                      // have, and if the slave's data len is a multiple
 252   4                                      // of its endpoint payload size/last xferLen. Do 
 253   4                                      // not overwrite data in previous buffer.
 254   4                                      //------------------------------------------------      
 255   4                                      if(remainder==xferLen)                                                  // empty data detected
 256   4                                              bufLen = 0;                                                                     // do not overwriten previous data
 257   4                                      else                                                                                    // reset bufLen to zero
 258   4                                              bufLen = xferLen;                                                       // update previous buffer length
 259   4                                      
 260   4                                      //------------------------------------------------      
 261   4                                      // Arm for next data transfer when requested data 
 262   4                                      // length have not reach zero, i.e. wLen!=0, and
 263   4                                      // last xferlen of data was completed, i.e.
 264   4                                      // remainder is equal to zero, not a short pkt
 265   4                                      //------------------------------------------------      
 266   4                                      if(!remainder && wLen)                                                  // remainder==0 when last xferLen
 267   4                                      {                                                                                               // was all completed or wLen!=0
 268   5                                              addr    = (dataX & 1) ? data1:data0;            // select next address for data
 269   5                                              xferLen = (BYTE)(wLen>=wPayload) ? wPayload:wLen;       // get data length required
 270   5                                      //      if (FULL_SPEED)                                                         // sync with SOF transfer
 271   5                                                      cmd |= 0x20;                                                    // always sync SOF when FS, regardless 
 272   5                                              SL811Write(EP0XferLen, xferLen);                        // select next xfer length
 273   5                                              SL811Write(EP0Address, addr);                   // data buffer addr 
 274   5                                              SL811Write(IntStatus,INT_CLEAR);                        // is a LS is on Hub.
 275   5                                              SL811Write(EP0Control,cmd);                                     // Enable USB transfer and re-arm
 276   5                                      }                               
 277   4      
 278   4                                      //------------------------------------------------
 279   4                                      // Copy last IN token data pkt from prev transfer
 280   4                                      // Check if there was data available during the
 281   4                                      // last data transfer
 282   4                                      //------------------------------------------------
 283   4                                      if(bufLen)                                                                              
 284   4                                      {       
 285   5                                              SL811BufRead(((dataX&1)?data0:data1), buffer, bufLen);
 286   5                                              buffer += bufLen;                                                               
 287   5                                      }
 288   4      
 289   4                                      //------------------------------------------------
 290   4                                      // Terminate on short packets, i.e. remainder!=0
 291   4                                      // a short packet or empty data packet OR when 
 292   4                                      // requested data len have completed, i.e.wLen=0
 293   4                                      // For a LOWSPEED device, the 1st device descp,
 294   4                                      // wPayload is default to 64-byte, LS device will
 295   4                                      // only send back a max of 8-byte device descp,
 296   4                                      // and host detect this as a short packet, and 
 297   4                                      // terminate with OUT status stage
 298   4                                      //------------------------------------------------
 299   4                                      if(remainder || !wLen)
 300   4                                              break;
 301   4                              }                                                       
 302   3                      }
C51 COMPILER V8.08   HOST_811                                                              04/25/2009 23:03:20 PAGE 6   

 303   2                      
 304   2                      //-------------------------NAK----------------------------
 305   2                      if (result & EP0_NAK)                                                                   // NAK Detected
 306   2                      {                                                                                                               
 307   3                              if(endpoint==0)                                                                         // on ep0 during enumeration of LS device
 308   3                              {                                                                                                       // happen when slave is not fast enough,
 309   4                                      SL811Write(IntStatus,INT_CLEAR);                                // clear interrupt status, need to
 310   4                                      SL811Write(EP0Control,cmd);                                             // re-arm and request for last cmd, IN token
 311   4                      result = 0;                                     // respond to NAK status only
 312   4                              }
 313   3                              else                                                                                            // normal data endpoint, exit now !!! , non-zero ep
 314   3                                      break;                                                                                  // main loop control the interval polling
 315   3                      }
 316   2                      
 317   2                      //-----------------------TIMEOUT--------------------------
 318   2                      if (result & EP0_TIMEOUT)                                                               // TIMEOUT Detected
 319   2                      {                                                                                                               
 320   3                              if(endpoint==0)                                                                         // happens when hub enumeration
 321   3                              {
 322   4                                      if(++timeout >= TIMEOUT_RETRY)
 323   4                                      {       
 324   5                                          timeout--;
 325   5                                              break;                                                                          // exit on the timeout detected 
 326   5                                      }
 327   4                                      SL811Write(IntStatus ,INT_CLEAR);                               // clear interrupt status, need to
 328   4                                      SL811Write(EP0Control,cmd);                                             // re-arm and request for last cmd again
 329   4                              }
 330   3                              else                                                                                            
 331   3                              {                                                                                                       // all other data endpoint, data transfer 
 332   4                                      USB_Control.TIMEOUT_ERR = TRUE;                                 // failed, set flag to terminate transfer
 333   4                                      break;                                                                                  // happens when data transfer on a device
 334   4                              }                                                                                                       // through the hub
 335   3                      }
 336   2      
 337   2                      //-----------------------STALL----------------------------
 338   2                      if (result & EP0_STALL)                                                                 // STALL detected
 339   2                              return TRUE;                                                                            // for unsupported request.
 340   2                                                                                                                                                      
 341   2                      //----------------------OVEFLOW---------------------------
 342   2                      if (result & EP0_OVERFLOW)                                                      // OVERFLOW detected
 343   2                              break;
 344   2                      //-----------------------ERROR----------------------------
 345   2                      if (result & EP0_ERROR)                                                                 // ERROR detected
 346   2                              break;
 347   2              }       // end of While(1)
 348   1         
 349   1              if (result & EP0_ACK)                                                                           // on ACK transmission
 350   1                      return TRUE;                                                                                    // return OK
 351   1      
 352   1              return FALSE;                                                                                           // fail transmission
 353   1      }
 354          //*****************************************************************************************
 355          // Control Endpoint 0's USB Data Xfer
 356          // ep0Xfer, endpoint 0 data transfer
 357          //*****************************************************************************************
 358          unsigned  char ep0Xfer(BYTE usbaddr, WORD payload, pSetupPKG setup, BYTE *pData)

⌨️ 快捷键说明

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