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

📄 halusbhost.lst

📁 威望公司MP3 + USB MCU 的参考软件
💻 LST
📖 第 1 页 / 共 3 页
字号:
 214   1              pIntfDesc pIfc;     // interface descriptor
 215   1              pEPDesc   pEnp;     // end-point descriptor
 216   1      
 217   1              TxAddr = 0x0;     // double make sure Address is zero
 218   1              // Get the first 8 bytes of USB Device Descriptors on EP0 & Addr 0
 219   1              uDev.wPayLoad[0] = 8;                           // default 8-byte payload for EP0
 220   1              usbstack.wPayload = 8;
 221   1              usbstack.buffer=DBUF;              // setup source and destination buffer 
 222   1              usbstack.usbaddr = 0;              // default address
 223   1              //if (!getDesc(DEVICE, 8))              
 224   1              UartOutText("-I-: GET_DESCRIPTOR, DEVICE, 8 \r\n ");
 225   1              _halStdDevReq(0x80, GET_DESCRIPTOR, WordSwap(DEVICE), 0, 8);
 226   1              
 227   1              pDev =(pDevDesc)DBUF;                         // device descriptor data structure overlay                  
 228   1              uDev.wPayLoad[0] = pDev->bMaxPacketSize0;
 229   1              usbstack.wPayload = pDev->bMaxPacketSize0;
 230   1      
 231   1              //------------------------------------------------
 232   1              // Set Slave USB Device Address
 233   1              //------------------------------------------------
 234   1              //if (!setAddress(USB_DEV_ADDR))                                                // set to specific USB address
 235   1              UartOutText("-I-: SET_ADDRESS \r\n ");
 236   1              _halStdDevReq(0x00, SET_ADDRESS, USB_DEV_ADDR, 0, 0);   
 237   1              TxAddr = USB_DEV_ADDR;
 238   1              //------------------------------------------------
 239   1              // Get USB Device Descriptors on EP0 & Addr X
C51 COMPILER V8.01   HALUSBHOST                                                            04/17/2008 09:46:30 PAGE 5   

 240   1              //------------------------------------------------
 241   1              usbstack.usbaddr=USB_DEV_ADDR;
 242   1              //usbstack.setup.wLength=pDev->bLength;
 243   1              //usbstack.setup.wValue=DEVICE;
 244   1              //usbstack.setup.wIndex=0;
 245   1              usbstack.buffer=DBUF;
 246   1              
 247   1      //      if (!getDesc(DEVICE, pDev->bLength))    
 248   1              //Get the whle device descriptor, len=0x12 
 249   1              _halStdDevReq(0x80, GET_DESCRIPTOR, WordSwap(DEVICE), 0, 0x12);
 250   1      
 251   1              //------------------------------------------------
 252   1              // Get Slave USB Configuration Descriptors
 253   1              //------------------------------------------------      
 254   1              //usbstack.setup.wValue=CONFIGURATION;
 255   1              //usbstack.setup.wIndex=0;
 256   1              //usbstack.setup.wLength=9;
 257   1              usbstack.buffer=DBUF;   
 258   1      //      if (!getDesc(CONFIGURATION, 9))                 
 259   1              _halStdDevReq(0x80, GET_DESCRIPTOR, WordSwap(CONFIGURATION), 0, 0x09);
 260   1              
 261   1              pCfg = (pCfgDesc)DBUF;  
 262   1              //usbstack.setup.wLength=WordSwap(pCfg->wLength);
 263   1              usbstack.buffer=DBUF;
 264   1              //      usbstack.setup.wLength=32;
 265   1              //if (!getDesc(CONFIGURATION, WordSwap(pCfg->wLength)))                 
 266   1              _halStdDevReq(0x80, GET_DESCRIPTOR, WordSwap(CONFIGURATION), 0, WordSwap(pCfg->wLength));
 267   1      
 268   1      //  the DBUF now should contain 32 bytes of configuration data:
 269   1      //  0-8: configuration descriptor
 270   1      //  9-17: interface descriptor
 271   1      //  18-24: EP0 descriptor
 272   1      //  25-31: EP1 descriptor
 273   1      
 274   1              pIfc = (pIntfDesc)(DBUF + 9);                   // point to Interface Descp
 275   1              uDev.bClass     = pIfc->iClass;                 // update to class type
 276   1              uDev.bNumOfEPs = (pIfc->bEndPoints <= MAX_EP) ? pIfc->bEndPoints : MAX_EP;
 277   1      
 278   1      //      if(uDev.bClass==8) //mass storage device
 279   1      //      {
 280   1      //              bXXGFlags.bMassDevice=TRUE;
 281   1      //      }
 282   1              //------------------------------------------------
 283   1              // Set configuration (except for HUB device)
 284   1              //------------------------------------------------
 285   1              //usbstack.setup.wValue=DEVICE;
 286   1              //------------------------------------------------
 287   1              // For each slave endpoints, get its attributes
 288   1              // Excluding endpoint0, only data endpoints
 289   1              //------------------------------------------------
 290   1              //if (!setConfiguration())              
 291   1              _halStdDevReq(0x00, SET_CONFIG, 0x01, 0x00, 0x00);
 292   1      
 293   1              epLen = 0;
 294   1              for (i=1; i<=uDev.bNumOfEPs; i++)                               // For each data endpoint
 295   1              {
 296   2                      pEnp = (pEPDesc)(DBUF + 18 + epLen);                            // point to Endpoint Descp(non-HID)
 297   2                      //if(pIfc->iClass == HIDCLASS)  
 298   2                      //      pEnp = (pEPDesc)(DBUF + 9 + 9 + 9 + epLen);             // update pointer to Endpoint(HID)
 299   2                      uDev.bEPAddr[i]         = pEnp->bEPAdd;                 // Ep address and direction
 300   2                      uDev.bAttr[i]           = pEnp->bAttr;                  // Attribute of Endpoint
 301   2      
C51 COMPILER V8.01   HALUSBHOST                                                            04/17/2008 09:46:30 PAGE 6   

 302   2                      uDev.wPayLoad[i]        = WordSwap(pEnp->wPayLoad);             // Payload of Endpoint
 303   2                      uDev.wPayLoad[i] = (uDev.wPayLoad[i] > 64) ? 64: uDev.wPayLoad[i];
 304   2                      
 305   2                      //uDev.bInterval[i]     = pEnp->bInterval;              // Polling interval
 306   2                      uDev.bData1[i] = 0;                                 // init data toggle
 307   2                      epLen += 7;
 308   2                      //////////////////////////////
 309   2                      if(uDev.bAttr[i]==0x2){                      // bulk endpoint
 310   3                              if(uDev.bEPAddr[i]&0x80)
 311   3                                      usbstack.epbulkin=i;  // bulk in
 312   3                              else
 313   3                                      usbstack.epbulkout=i; // bulk out
 314   3                      }
 315   2      
 316   2              }
 317   1      
 318   1              return TRUE;
 319   1      }
 320          
 321          
 322          //Control transfer: setup stage + data in/out + status
 323          BYTE _halHostEp0Xfer(void)
 324          {
 325   1              TxEpnum = 0x0;   // always set end point to zero!!
 326   1      
 327   1              // SETUP Transaction: setup + data0 + ACK
 328   1              usbstack.wLen   = sizeof(SetupPKG);       // set for 8-byte descriptor length
 329   1              usbstack.pid            = PID_SETUP;
 330   1              _halSetupTrans(); 
 331   1              UartOutText("-I-: Setup stage \r\n");
 332   1      
 333   1              usbstack.pid  = PID_IN;                   // default for setup stage
 334   1              // IN or OUT data stage on endpoint 0   
 335   1              usbstack.wLen = usbstack.setup.wLength;
 336   1              bXXGFlags.bToggle=1;                     // expect data1 from device    
 337   1              if (usbstack.wLen){                                                             // if there are data for transfer
 338   2                      if (usbstack.setup.bmRequest & 0x80){           // IN token
 339   3                              usbstack.pid  = PID_IN; 
 340   3                              _halInTrans();
 341   3                              //UartOutText("-I-: Data IN \r\n");
 342   3      
 343   3                              usbstack.pid  = PID_OUT;
 344   3                      }else{                                                                          // OUT token
 345   3                              usbstack.pid  = PID_OUT;
 346   3                              _halOutTrans();
 347   3                              //UartOutText("-I-: Data OUT \r\n");                    
 348   3                              
 349   3                              usbstack.pid  = PID_IN;
 350   3                      }
 351   2                      UartOutText("-I-: DATA stage \r\n");
 352   2              }
 353   1      
 354   1              // Status stage IN or OUT zero-length data packet
 355   1              usbstack.wLen=0;
 356   1              bXXGFlags.bToggle=1;   // status stage is always Data1
 357   1              if(usbstack.pid  == PID_IN){
 358   2                      _halInTrans();
 359   2                      //UartOutText("-I-: Status IN \r\n");           
 360   2              }else{
 361   2                      _halOutTrans();
 362   2                      //UartOutText("-I-: Status OUT \r\n");
 363   2              }
C51 COMPILER V8.01   HALUSBHOST                                                            04/17/2008 09:46:30 PAGE 7   

 364   1              UartOutText("-I-: Status stage \r\n");  
 365   1      
 366   1              return TRUE;                                                                                    
 367   1                                              
 368   1      }
 369          
 370          //setup stage: setup + data0 + ACK
 371          void _halSetupTrans(void)
 372          {
 373   1              //WORD tmp; 
 374   1              BYTE data stat0;
 375   1              //BYTE cmd;
 376   1      
 377   1              WDT = 0X1F;             
 378   1              TxPktlen = sizeof(SetupPKG);                                    // data transfer length
 379   1      
 380   1              //tmp = usbstack.setup.wLength;
 381   1              usbstack.setup.wValue           = WordSwap(usbstack.setup.wValue);
 382   1              usbstack.setup.wIndex           = WordSwap(usbstack.setup.wIndex);
 383   1              usbstack.setup.wLength  = WordSwap(usbstack.setup.wLength);
 384   1      
 385   1              _halBufRst(0x03);
 386   1              BufSel = MCU2USB;                      //src=CPU,dest=USB
 387   1      
 388   1              usbBufWrite((BYTE *)&usbstack.setup,sizeof(SetupPKG));
 389   1              usbstack.setup.wLength  = WordSwap(usbstack.setup.wLength);
 390   1              _halBufRst(0x03);                               //flip rw buffer
 391   1      
 392   1              SieStat0 = 0xff;        // clear status register before each transfer
 393   1              //SieStat1 = 0xff;
 394   1              TxCtrl = SETUP; // setup + data0
 395   1      
 396   1              while(1){
 397   2                      stat0 = SieStat0;       
 398   2      
 399   2                      if(stat0 & DEV_ACK){ //The function receiving a SETUP must accept the SETUP data and respond with ACK, 
 400   3                              SieStat0 = DEV_ACK;
 401   3                              break;
 402   3                      }else if(stat0 & DEV_TO){       // turnaround time expired
 403   3                              SieStat0 = DEV_TO;  //if the data is corrupted, discard the data and return no handshake. So we just re
             -send the cmd.
 404   3                              // glitch filter, don't need to clear
 405   3                              if (SieStat0 & DEV_TO){      // packet is not coming!
 406   4                                      _halBufRst(0x02);               // reset read pointer
 407   4                                      TxCtrl = SETUP;         // Send SETUP/OUT again!
 408   4                              }
 409   3                      }       
 410   2              }
 411   1              WDT = 0X00;
 412   1      
 413   1              return;
 414   1      }
 415          
 416          //usbstack.pid==PID_OUT
 417          BYTE _halOutTrans(void)
 418          {  
 419   1              BYTE data xferLen;
 420   1              BYTE data cmd;
 421   1              BYTE data stat0;
 422   1              WORD bufpos;
 423   1              BYTE data toFlag;
 424   1      
C51 COMPILER V8.01   HALUSBHOST                                                            04/17/2008 09:46:30 PAGE 8   

 425   1              WDT = 0X1F;
 426   1              bufpos = 0;
 427   1              BufSel = MCU2USB;                      //src=CPU,dest=USB       
 428   1              do{
 429   2                      toFlag = FALSE;
 430   2                      
 431   2                      // Define data transfer payload
 432   2                      if (usbstack.wLen >= usbstack.wPayload)                 // select proper data payload
 433   2                              xferLen = usbstack.wPayload;                            // limit to wPayload size 
 434   2                      else                                                                                    // else take < payload len

⌨️ 快捷键说明

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