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

📄 host_811.lst

📁 完整的usb_host_device源代码直接在keil下编译
💻 LST
📖 第 1 页 / 共 5 页
字号:
 155          // s    = return buffer address where data are to be save/read
 156          // c    = buffer data length
 157          //*****************************************************************************************
 158          void SL811BufRead(BYTE addr, BYTE *s, BYTE c)
 159          {       
 160   1              SL811H_ADDR = addr;     
 161   1              while (c--) 
 162   1                      *s++ = SL811H_DATA;
 163   1      }
 164          
 165          //*****************************************************************************************
 166          // Buffer Write  to SL811H
 167          // addr = buffer start address
 168          // s    = buffer address where data are to be written
 169          // c    = buffer data length
 170          //*****************************************************************************************
 171          void SL811BufWrite(BYTE addr, BYTE *s, BYTE c)
 172          {       
 173   1              SL811H_ADDR = addr;     
 174   1              while (c--) 
 175   1                      SL811H_DATA = *s++;
 176   1      }
 177          
 178          //*****************************************************************************************
C51 COMPILER V7.50   HOST_811                                                              10/27/2005 20:00:37 PAGE 4   

 179          // Swap high and low byte 
 180          //*****************************************************************************************
 181          WORD WordSwap(WORD input)
 182          {
 183   1              return(((input&0x00FF)<<8)|((input&0xFF00)>>8));
 184   1      }
 185          
 186          //*****************************************************************************************
 187          // UsbReset during enumeration of device attached directly to SL811HS
 188          //*****************************************************************************************
 189          void USBReset()
 190          {
 191   1              BYTE tmp;
 192   1          tmp =  SL811Read(CtrlReg);   
 193   1              SL811Write(CtrlReg,tmp|0x08);
 194   1              EZUSB_Delay(25);                        
 195   1          SL811Write(CtrlReg,tmp);    
 196   1      }
 197          
 198          //*****************************************************************************************
 199          // usbXfer:
 200          // successful transfer = return TRUE
 201          // fail transfer = return FALSE
 202          //*****************************************************************************************
 203          int usbXfer(BYTE usbaddr, BYTE endpoint, BYTE pid, BYTE iso, WORD wPayload, WORD wLen, BYTE *buffer)
 204          {  
 205   1              xdata BYTE      cmd, result, timeout, intr;
 206   1              xdata BYTE      xferLen, bufLen, data0, data1, dataX, addr;
 207   1              
 208   1              //------------------------------------------------
 209   1              // Default setting for usb trasnfer
 210   1              //------------------------------------------------
 211   1              bufLen = dataX = timeout = 0;                                   //reset all
 212   1              data0 = EP0_Buf;                                                                // DATA0 buffer address
 213   1              data1 = data0 + (BYTE)wPayload;                                 // DATA1 buffer address
 214   1              DATA_STOP =     TIMEOUT_ERR = FALSE;                            // set default conditions
 215   1      
 216   1              //------------------------------------------------
 217   1              // Define data transfer payload
 218   1              //------------------------------------------------
 219   1              if (wLen >= wPayload)                                                   // select proper data payload
 220   1                      xferLen = wPayload;                                                     // limit to wPayload size 
 221   1              else                                                                                    // else take < payload len
 222   1                      xferLen = wLen;                                                         //      
 223   1      
 224   1              //------------------------------------------------
 225   1              // For IN token
 226   1              //------------------------------------------------
 227   1              if (pid==PID_IN)                                                                // for current IN tokens
 228   1              {                                                                                               //
 229   2                      if(FULL_SPEED)                                                          //
 230   2                              cmd = sDATA0_RD;                                                // FS/FS on Hub, sync to sof
 231   2                      else                                                                            // LS, no sync to sof for IN
 232   2                              cmd = DATA0_RD;                                                 //
 233   2                      //-------------------------------------------- response to OUT can propagate to SL811HS
 234   2                      // handling LS device on HUB
 235   2                      //--------------------------------------------
 236   2                      if(HUB_DEVICE && usbaddr!=HUB_ADDR)                     // Transfer on Hub, USB addr #0, #2..#5 only
 237   2                      {
 238   3                              if(uHub.bPortSpeed[usbaddr])                    // If transfer of LS on Hub & previous is                       
 239   3                                      cmd = psDATA0_RD;                                       // SETUP & current is IN, no sync to sof,
 240   3                      }
C51 COMPILER V7.50   HOST_811                                                              10/27/2005 20:00:37 PAGE 5   

 241   2              }
 242   1              //------------------------------------------------
 243   1              // For OUT token
 244   1              //------------------------------------------------
 245   1              else if(pid==PID_OUT)                                                   // for OUT tokens
 246   1              {       
 247   2                      if(xferLen)                                                                     // only when there are  
 248   2                              SL811BufWrite(data0,buffer,xferLen);    // data to transfer on USB
 249   2      
 250   2                      if(FULL_SPEED)                                                          
 251   2                              cmd = sDATA0_WR;                                                // FS/FS on Hub, sync to sof
 252   2                      else                                                                            // LS, no sync to sof for OUT
 253   2                              cmd = DATA0_WR;                                                 
 254   2                      //--------------------------------------------
 255   2                      // handling LS device on HUB
 256   2                      //--------------------------------------------
 257   2                      if(HUB_DEVICE && usbaddr!=HUB_ADDR)                     // Transfer on Hub, USB addr #0, #2..#5 only
 258   2                      {
 259   3                              if(uHub.bPortSpeed[usbaddr])                    // If transfer of LS on Hub, previous
 260   3                                      cmd = psDATA0_WR;
 261   3                      }
 262   2                      // implement data toggle
 263   2                      bData1 = uDev[usbaddr].bData1[endpoint];
 264   2              uDev[usbaddr].bData1[endpoint] = (uDev[usbaddr].bData1[endpoint] ? 0 : 1); // DataToggle
 265   2                      if(bData1)
 266   2                cmd |= 0x40;                              // Set Data1 bit in command
 267   2              }
 268   1              //------------------------------------------------
 269   1              // For SETUP/OUT token
 270   1              //------------------------------------------------
 271   1              else                                                                                    // for current SETUP/OUT tokens
 272   1              {       
 273   2                      if(xferLen)                                                                     // only when there are  
 274   2                              SL811BufWrite(data0,buffer,xferLen);    // data to transfer on USB
 275   2      
 276   2                      if(FULL_SPEED)                                                          
 277   2                              cmd = sDATA0_WR;                                                // FS/FS on Hub, sync to sof
 278   2                      else                                                                            // LS, no sync to sof for OUT
 279   2                              cmd = DATA0_WR;                                                 
 280   2                      //--------------------------------------------
 281   2                      // handling LS device on HUB
 282   2                      //--------------------------------------------
 283   2                      if(HUB_DEVICE && usbaddr!=HUB_ADDR)                     // Transfer on Hub, USB addr #0, #2..#5 only
 284   2                      {
 285   3                              if(uHub.bPortSpeed[usbaddr])                    // If transfer of LS on Hub, previous
 286   3                                      cmd = psDATA0_WR;
 287   3                      }
 288   2              }
 289   1      
 290   1              //------------------------------------------------
 291   1              // Isochronous data transfer setting
 292   1              //------------------------------------------------
 293   1              if (iso) 
 294   1                      cmd |= ISO_BIT;                                 // if iso setup ISO mode
 295   1      
 296   1              //------------------------------------------------
 297   1              // For EP0's IN/OUT token data, start with DATA1
 298   1              // Control Endpoint0's status stage.
 299   1              // For data endpoint, IN/OUT data, start ????
 300   1              //------------------------------------------------
 301   1              if (endpoint == 0 && pid != PID_SETUP)                  // for Ep0's IN/OUT token
 302   1                      cmd |= 0x40;                                                            // always set DATA1
C51 COMPILER V7.50   HOST_811                                                              10/27/2005 20:00:37 PAGE 6   

 303   1      
 304   1              //------------------------------------------------
 305   1              // Arming of USB data transfer for the first pkt
 306   1              //------------------------------------------------
 307   1              SL811Write(EP0Status,((endpoint&0x0F)|pid));    // PID + EP address
 308   1              SL811Write(EP0Counter,usbaddr);                                 // USB address
 309   1              SL811Write(EP0Address,data0);                                   // buffer address, start with "data0"
 310   1              SL811Write(EP0XferLen,xferLen);                                 // data transfer length
 311   1              SL811Write(IntStatus,INT_CLEAR);                                // clear interrupt status
 312   1              SL811Write(EP0Control,cmd);                                             // Enable ARM and USB transfer start here
 313   1      
 314   1              //------------------------------------------------
 315   1              // Main loop for completing a wLen data trasnfer
 316   1              //------------------------------------------------

⌨️ 快捷键说明

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