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

📄 usb.lst

📁 51环境下的FAT及FAT32文件系统源码
💻 LST
📖 第 1 页 / 共 5 页
字号:
  95      =1  // Standard EndPoint Descriptor 7 bytes
  96      =1  typedef struct
  97      =1  {       BYTE bLength;
  98      =1          BYTE bType;                  //the constant endpoint(05h);
  99      =1          BYTE bEPAdd;             //includes the endpoint number(bits 0 through 3) and direction(bit 7);
 100      =1          BYTE bAttr;                  //bits 1 and 0 specify the type of transfer the endpoint supports.00=control,10=bulk...
             -;
 101      =1          WORD wPayLoad;       //maximum packet size supported; low-speed this must be 0x08
 102      =1          BYTE bInterval;      //for full-speed bulk and control transfers,the value is ignored.
 103      =1  } sEPDesc, *pEPDesc;
C51 COMPILER V8.02   USB                                                                   09/19/2006 15:01:22 PAGE 9   

 104      =1  
 105      =1  /*-------------------------------------------------------------------------
 106      =1   * Standard Chapter 9 definition
 107      =1   *-------------------------------------------------------------------------
 108      =1   */
 109      =1  #define GET_STATUS      0x00                                                                                                                              
 110      =1  #define CLEAR_FEATURE   0x01
 111      =1  #define SET_FEATURE     0x03
 112      =1  #define SET_ADDRESS     0x05
 113      =1  #define GET_DESCRIPTOR  0x06
 114      =1  #define SET_DESCRIPTOR  0x07
 115      =1  #define GET_CONFIG      0x08
 116      =1  #define SET_CONFIG      0x09
 117      =1  #define GET_INTERFACE   0x0a
 118      =1  #define SET_INTERFACE   0x0b
 119      =1  #define SYNCH_FRAME     0x0c
 120      =1  
 121      =1  
 122      =1  #define DEVICE          0x01
 123      =1  #define CONFIGURATION   0x02
 124      =1  #define STRING          0x03
 125      =1  #define INTERFACE       0x04
 126      =1  #define ENDPOINT        0x05
 127      =1  
 128      =1  #define STDCLASS        0x00
 129      =1  /*-------------------------------------------------------------------------
 130      =1   * USB Host control command definitions
 131      =1   *-------------------------------------------------------------------------
 132      =1   */
 133      =1   //cmd                       
 134      =1  #define WRITE0      0x42
 135      =1  #define WRITE1      0xc2   
 136      =1  #define READ        0x04
 137      =1  
 138      =1  #define SETUP       0x41
 139      =1  #define SEND_ACK    0x20
 140      =1  //pid
 141      =1  #define PID_SETUP   0xD0 
 142      =1  #define PID_IN      0x90
 143      =1  #define PID_OUT     0x10
 144      =1  //flag
 145      =1  #define DEV_TGL     0x01
 146      =1  #define PKT_VLD     0x04
 147      =1  #define PKT_ERR         0x02
 148      =1  #define PKT_DATA    0x40
 149      =1  #define PKT_SENT    0x02
 150      =1  #define DEV_ACK     0x20
 151      =1  #define DEV_NAK     0x10
 152      =1  #define DEV_STALL   0x08
 153      =1  #define DEV_TO      0x80
 154      =1  
 155      =1  
 156      =1  // Alarms
 157      =1  #define MP3_REQ         0x02
 158      =1  
 159      =1  void usbBufRead(unsigned char *s, unsigned char c);
 160      =1  void usbBufWrite(unsigned char *s, unsigned char c);
 161      =1  void usbReset(void);
 162      =1  unsigned char usbXfer(unsigned char endPoint);
 163      =1  unsigned char ep0Xfer(void);
 164      =1  unsigned char epBulkSend(unsigned char *pBuffer,unsigned int len);
 165      =1  unsigned char epBulkRcv(unsigned char *pBuffer,unsigned int len);
C51 COMPILER V8.02   USB                                                                   09/19/2006 15:01:22 PAGE 10  

 166      =1  unsigned char setAddress(unsigned char addr);
 167      =1  unsigned char setConfiguration(void);
 168      =1  unsigned char setDesc(void);
 169      =1  unsigned char enumUsbDev(BYTE usbaddr);
 170      =1  void usbInit(void);
 171      =1  void checkKeyLED(void);
 172      =1  
   3          
   4          unsigned char PassToggleCheckSoftware();
   5          
   6          extern XXGFLAGS bdata bXXGFlags;        //union XXGFLAGS is defined in common.h
   7          XXGPKG  usbstack;                                       //struct XXGPKG is defined in usb.h
   8                                                                  //usbstack holds parameters to be passed to low-level functions
   9          
  10          extern UINT8 xdata DBUF[SECT_LEN];
  11          //???\|/
  12          USBDEV  data  uDev;
  13          //pUSBDEV  xdata        uDev;   // Multiple USB devices attributes, Max 5 devices
  14          
  15          void usbBufRead(unsigned char *s, unsigned char c)
  16          {
  17   1        unsigned char  i;
  18   1        unsigned char *addr;  
  19   1        addr = s;     
  20   1      //  if(BufStatusAddr&0x01)   //bufstatus[0]=1:empty
  21   1      //  {
  22   1      //      Scratch = 0xab;  
  23   1      //  }
  24   1      //  else
  25   1      //  {  
  26   1          for(i=0;i<c;i++)
  27   1          {
  28   2                ACC = BufAddr;        
  29   2            *addr = ACC;
  30   2                addr++;         
  31   2          }
  32   1      //  }
  33   1      }
  34          
  35          void usbBufWrite(unsigned char *s, unsigned char c)
  36          {
  37   1        unsigned char *addr;  
  38   1        addr = s;
  39   1        if(BufStatusAddr&0x02) //bufstatus[1]=1:full
  40   1          return;
  41   1        else
  42   1        { 
  43   2          while(c)
  44   2          {
  45   3            ACC = *addr;
  46   3                BufAddr = ACC;
  47   3            addr++;
  48   3            c--;
  49   3          }
  50   2        }
  51   1      }
  52          
  53          //*****************************************************************************************
  54          // USB variables initialization
  55          //*****************************************************************************************
  56          void usbReset(void)
  57          {
C51 COMPILER V8.02   USB                                                                   09/19/2006 15:01:22 PAGE 11  

  58   1              unsigned char temp;
  59   1          temp = SieCtrl;
  60   1          SieCtrl = temp|0x04;        // SE0 reset
  61   1              DelayMs(20);            
  62   1          SieCtrl = temp;
  63   1              DelayMs(20);                        // reset recovery
  64   1              SieStat0 = 0xff;         // clear status regs
  65   1              SieStat1 = 0xff;
  66   1      }
  67          
  68          //*****************************************************************************************
  69          // usbXfer:
  70          // successful transfer = return TRUE
  71          // fail transfer = return FALSE
  72          //*****************************************************************************************
  73          #define MAX_NAK_CNT      200
  74          static unsigned char ConsecutiveNAKCount = 0;
  75          unsigned char usbXfer(unsigned char endPoint)
  76          {  
  77   1              unsigned char xferLen, cmd;
  78   1              unsigned char intr, result;
  79   1              unsigned char devTglSt;         // device toggle state
  80   1      
  81   1              bXXGFlags.DATA_STOP=FALSE;
  82   1              bXXGFlags.TIMEOUT_ERR=FALSE;
  83   1              //------------------------------------------------
  84   1              // Define data transfer payload
  85   1              //------------------------------------------------
  86   1              if (usbstack.wLen >= usbstack.wPayload)                 // select proper data payload
  87   1                      xferLen = usbstack.wPayload;                            // limit to wPayload size 
  88   1              else                                                                                    // else take < payload len
  89   1                      xferLen = usbstack.wLen;
  90   1      
  91   1              TxPktlen = xferLen;                                     // data transfer length
  92   1      
  93   1              // For IN token, simply send IN token
  94   1              if (usbstack.pid==PID_IN)
  95   1              {
  96   2      //              BufRst = 0x00;
  97   2                      BufSel = USB2MCU;                      //src=USB,dest=CPU
  98   2                      BufRst = 0x01;                                          // reset wr ptr
  99   2                      BufRst = 0x00;
 100   2                      cmd = READ;
 101   2              }                           
 102   1              // For OUT token
 103   1              else if(usbstack.pid==PID_OUT)                          // for OUT tokens
 104   1              {
 105   2                      if(xferLen)                                                                     
 106   2                      {
 107   3                              BufRst = 0x03;
 108   3                              BufRst = 0x00;
 109   3                              BufSel = MCU2USB;                      //src=CPU,dest=USB
 110   3                              usbBufWrite(usbstack.buffer,xferLen);   // data to transfer on USB
 111   3                              if (xferLen < 64)
 112   3                              {
 113   4                                      BufRst = 0x03;                    // flip buffer state for bus read
 114   4                      BufRst = 0x00;
 115   4                              }
 116   3                      }
 117   2      
 118   2                      if (bXXGFlags.bToggle)                      // DATA0 or DATA1
 119   2                              cmd = WRITE1;
C51 COMPILER V8.02   USB                                                                   09/19/2006 15:01:22 PAGE 12  

 120   2                      else
 121   2                              cmd = WRITE0;                                   
 122   2              }
 123   1              // For SETUP token
 124   1              else
 125   1              {       
 126   2                      if(xferLen)                     
 127   2                      {
 128   3                              intr=usbstack.setup.wLength;
 129   3                              usbstack.setup.wValue=WordSwap(usbstack.setup.wValue);
 130   3                              usbstack.setup.wIndex=WordSwap(usbstack.setup.wIndex);
 131   3                              usbstack.setup.wLength=WordSwap(usbstack.setup.wLength);
 132   3                              BufRst = 0x03;
 133   3                              BufRst = 0x00;
 134   3                              BufSel = MCU2USB;                      //src=CPU,dest=USB
 135   3                  usbBufWrite((unsigned char *)&usbstack.setup,xferLen);
 136   3                              if (xferLen < 64)
 137   3                              {
 138   4                      BufRst = 0x03;
 139   4                      BufRst = 0x00;
 140   4                          }
 141   3                      usbstack.setup.wLength=intr;
 142   3                      }
 143   2                      cmd = SETUP;                                            
 144   2              }
 145   1              // here goes the packet.....
 146   1          SieStat0 = 0xff;        // clear status register before each transfer
 147   1              SieStat1 = 0xff;
 148   1              TxCtrl = cmd;                   // Send packet
 149   1              //------------------------------------------------
 150   1              // Main loop for completing a wLen data trasnfer
 151   1              //------------------------------------------------
 152   1              DelayUs(20);                // add some delay here...
 153   1      
 154   1          ConsecutiveNAKCount = 0;
 155   1      
 156   1              while(TRUE)                                     //
 157   1              {
 158   2                      DelayUs(10);            // more delay before polling the status.
 159   2                      intr = SieStat0;                
 160   2      
 161   2                      if(usbstack.pid==PID_IN)
 162   2              { 
 163   3                      //
 164   3      //                      if (intr & PKT_DATA) // got data packet
 165   3      //                      {       
 166   3      //                              SieStat0 = PKT_DATA;

⌨️ 快捷键说明

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