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

📄 chap_9.lst

📁 STC51+PDIUSBD12 USB鼠标源代码
💻 LST
字号:
C51 COMPILER V8.02   CHAP_9                                                                03/04/2008 13:50:51 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE CHAP_9
OBJECT MODULE PLACED IN CHAP_9.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE CHAP_9.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include "mytype.h"
   2          #include "d12.h"
   3          #include "D12CI.H"
   4          #include "uart.h"
   5          #define SWAP(x)     ((((uint16)(x))<<8)|(((uint16)(x))>>8))
   6          #define MSB(x) ((uint8)(((uint16)(x))>>8)) 
   7          #define LSB(x) ((uint8)(x))
   8          #define DISABLE    EA=0
   9          #define ENABLE     EA=1
  10          #define CONFIG_DESCRIPTOR_LENGTH    sizeof(USB_CONFIGURATION_DESCRIPTOR) \
  11                                                                                  + sizeof(USB_INTERFACE_DESCRIPTOR) \
  12                                                                                  + (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR))
  13          #define NUM_ENDPOINTS   4
  14          extern CONTROL_XFER ControlData;
  15          //extern IO_REQUEST idata ioRequest;
  16          extern EPPFLAGS bEPPflags;
  17          code USB_DEVICE_DESCRIPTOR DeviceDescr=
  18          {
  19            0x12,
  20            0x01,
  21            0x1001,
  22            0xdc,
  23            0,0,
  24            0x10,
  25            0x7104,
  26            0x6606,
  27            0x0010,
  28            0,0,0,
  29            1
  30          };
  31          code USB_CONFIGURATION_DESCRIPTOR ConfigDescr=
  32          {
  33            0x09,
  34            0x02,
  35            0x2e00,
  36            1,
  37            1,
  38            0,
  39            0xa0,
  40            0x32
  41          };
  42          code USB_INTERFACE_DESCRIPTOR InterfaceDescr=
  43          {
  44            0x09,
  45            0x04,
  46            0,
  47            0,
  48            0x04,
  49            0xdc,
  50            0xa0,
  51            0xb0,
  52            0
  53          };
  54          code USB_ENDPOINT_DESCRIPTOR EP1_TXDescr=
  55          {
C51 COMPILER V8.02   CHAP_9                                                                03/04/2008 13:50:51 PAGE 2   

  56            0x07,
  57            0x05,
  58            0x81,
  59            0x03,
  60            0x1000,
  61            10
  62          };
  63          code USB_ENDPOINT_DESCRIPTOR EP1_RXDescr=
  64          {
  65            0x07,
  66            0x05,
  67            0x1,
  68            0x03,
  69            0x1000,
  70            10
  71          };
  72          code USB_ENDPOINT_DESCRIPTOR EP2_TXDescr=
  73          {
  74            0x07,
  75            0x05,
  76            0x82,
  77            0x02,
  78            0x4000,
  79            10
  80          };
  81          code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr=
  82          {
  83            0x07,
  84            0x05,
  85            0x2,
  86            0x02,
  87            0x4000,
  88            10
  89          };
  90          //从端点号1发送数据
  91          void single_transmit(unsigned char * buf, unsigned char len)
  92          {
  93   1              if( len <= EP0_PACKET_SIZE) 
  94   1                {
  95   2                      D12_WriteEndpoint(1, len, buf);
  96   2                }
  97   1      }
  98          //发送端点号1建立代码
  99          void code_transmit(unsigned char code * pRomData, unsigned short len)
 100          {
 101   1              ControlData.wCount = 0;
 102   1              if(ControlData.wLength > len)
 103   1                      ControlData.wLength = len;
 104   1      
 105   1              ControlData.pData = pRomData;
 106   1              if( ControlData.wLength >= EP0_PACKET_SIZE) 
 107   1              {
 108   2                      //write_endpoint_buff(1, EP0_PACKET_SIZE, ControlData.pData);
 109   2                      D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);//发送16字节数据
 110   2                      ControlData.wCount += EP0_PACKET_SIZE;
 111   2                      DISABLE;
 112   2                      bEPPflags.bits.control_state = USB_TRANSMIT;
 113   2                      ENABLE;
 114   2              }
 115   1              else 
 116   1              {
 117   2                      D12_WriteEndpoint(1, ControlData.wLength, pRomData);//发送16字节内数据
C51 COMPILER V8.02   CHAP_9                                                                03/04/2008 13:50:51 PAGE 3   

 118   2                      ControlData.wCount += ControlData.wLength;
 119   2                      DISABLE;
 120   2                      bEPPflags.bits.control_state = USB_IDLE;
 121   2                      ENABLE;
 122   2              }        
 123   1      }
 124          void stall_ep0(void)
 125          {
 126   1              D12_SetEndpointStatus(0, 1);
 127   1              D12_SetEndpointStatus(1, 1);
 128   1      }
 129          void reserved(void)
 130          {
 131   1              stall_ep0();
 132   1      }
 133          
 134          //获取设备状态
 135          void get_status(void)
 136          {
 137   1              unsigned char endp, txdat[2];
 138   1              unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
 139   1              unsigned char c;
 140   1      
 141   1              if (bRecipient == USB_RECIPIENT_DEVICE) {
 142   2                      if(bEPPflags.bits.remote_wakeup == 1)//获取远程唤醒状态
 143   2                              txdat[0] = 3;
 144   2                      else
 145   2                              txdat[0] = 1;
 146   2                      txdat[1]=0;
 147   2                      single_transmit(txdat, 2);
 148   2              } else if (bRecipient == USB_RECIPIENT_INTERFACE) {//获取接口状态
 149   2                      txdat[0]=0;
 150   2                      txdat[1]=0;
 151   2                      single_transmit(txdat, 2);
 152   2              } else if (bRecipient == USB_RECIPIENT_ENDPOINT) {//获取端点状态
 153   2                      endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 154   2                      if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
 155   2                              c = D12_SelectEndpoint(endp*2 + 1);     /* Control-in */
 156   2                      else
 157   2                              c = D12_SelectEndpoint(endp*2); /* Control-out */
 158   2                      if(c & D12_STALL)
 159   2                              txdat[0] = 1;
 160   2                      else
 161   2                              txdat[0] = 0;
 162   2                      txdat[1] = 0;
 163   2                      single_transmit(txdat, 2);
 164   2              } else
 165   1                      stall_ep0();
 166   1      }
 167          void clear_feature(void)
 168          {
 169   1              unsigned char endp;
 170   1              unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
 171   1      
 172   1              if (bRecipient == USB_RECIPIENT_DEVICE
 173   1                      && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {//清除远程唤醒功能
 174   2                      EA=0;
 175   2                      bEPPflags.bits.remote_wakeup = 0;
 176   2                      EA=1;
 177   2                      single_transmit(0, 0);
 178   2              }
 179   1              else if (bRecipient == USB_RECIPIENT_ENDPOINT
C51 COMPILER V8.02   CHAP_9                                                                03/04/2008 13:50:51 PAGE 4   

 180   1                      && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {//清除端点stall
 181   2                      endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 182   2                      if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
 183   2                              /* clear TX stall for IN on EPn. */
 184   2                              D12_SetEndpointStatus(endp*2 + 1, 0);
 185   2                      else
 186   2                              /* clear RX stall for OUT on EPn. */
 187   2                              D12_SetEndpointStatus(endp*2, 0);
 188   2                      single_transmit(0, 0);
 189   2              } else
 190   1                      stall_ep0();
 191   1      }
 192          //特性设置
 193          void set_feature(void)
 194          {
 195   1              unsigned char endp;
 196   1              unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
 197   1      
 198   1              if (bRecipient == USB_RECIPIENT_DEVICE
 199   1                      && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {//设置远程唤醒功能
 200   2                      EA=0;
 201   2                      bEPPflags.bits.remote_wakeup = 1;
 202   2                      EA=1;
 203   2                      single_transmit(0, 0);
 204   2              }
 205   1              else if (bRecipient == USB_RECIPIENT_ENDPOINT
 206   1                      && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {//设置端点stall
 207   2                      endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 208   2                      if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
 209   2                              /* clear TX stall for IN on EPn. */
 210   2                              D12_SetEndpointStatus(endp*2 + 1, 1);
 211   2                      else
 212   2                              /* clear RX stall for OUT on EPn. */
 213   2                              D12_SetEndpointStatus(endp*2, 1);
 214   2                      single_transmit(0, 0);
 215   2              } else
 216   1                      stall_ep0();
 217   1      }
 218          //设置地址
 219          void set_address(void)
 220          {
 221   1              D12_SetAddress_Enable((unsigned char)(ControlData.DeviceRequest.wValue &
 222   1                      DEVICE_ADDRESS_MASK), 1);
 223   1              single_transmit(0, 0);
 224   1      }
 225          //获取描述符
 226          void get_descriptor(void)
 227          {
 228   1              unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
 229   1      
 230   1              if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) 
 231   1               {//获取设备描述符
 232   2                      code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
 233   2                      Prints("\r\n获取设备描述符");
 234   2               }
 235   1          else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) 
 236   1                {//获取配置描述符
 237   2                      code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
 238   2                      Prints("\r\n获取配置描述符");
 239   2                } 
 240   1          else
 241   1                      stall_ep0();
C51 COMPILER V8.02   CHAP_9                                                                03/04/2008 13:50:51 PAGE 5   

 242   1      }
 243          //获取配置状态
 244          void get_configuration(void)
 245          {
 246   1              unsigned char c = bEPPflags.bits.configuration;
 247   1              single_transmit(&c, 1);
 248   1      }
 249          /****************************************************/
 250          //恢复到未配置状态
 251          void init_unconfig(void)
 252          {
 253   1      //      unsigned char i;
 254   1      
 255   1              D12_SetEndpointEnable(0);       /* Disable all endpoints but EPP0. */
 256   1      }
 257          //设置配置状态
 258          void init_config(void)
 259          {
 260   1              D12_SetEndpointEnable(1);       /* Enable  generic/iso endpoints. */
 261   1      }
 262          /******************************************/
 263          //设置配置状态
 264          void set_configuration(void)
 265          {
 266   1              if (ControlData.DeviceRequest.wValue == 0) {
 267   2                      //设备进入未配置状态
 268   2                      single_transmit(0, 0);
 269   2                      DISABLE;
 270   2                      bEPPflags.bits.configuration = 0;
 271   2                      ENABLE;
 272   2                      init_unconfig();
 273   2              } else if (ControlData.DeviceRequest.wValue == 1) {
 274   2                      //配置设备
 275   2                      single_transmit(0, 0);
 276   2      
 277   2                      init_unconfig();
 278   2                      init_config();
 279   2                      DISABLE;
 280   2                      bEPPflags.bits.configuration = 1;
 281   2                      ENABLE;
 282   2              } else
 283   1                      stall_ep0();
 284   1      }
 285          //获取接口状态
 286          void get_interface(void)
 287          {
 288   1              unsigned char txdat = 0;        /* Only/Current interface = 0 */
 289   1              single_transmit(&txdat, 1);
 290   1      }
 291          //设置接口状态
 292          void set_interface(void)
 293          {
 294   1              if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
 295   1                      single_transmit(0, 0);
 296   1              else
 297   1                      stall_ep0();
 298   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    618    ----
   CONSTANT SIZE    =     98    ----
C51 COMPILER V8.02   CHAP_9                                                                03/04/2008 13:50:51 PAGE 6   

   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      14
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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