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

📄 chap_9.lst

📁 usblab usb程序开发实验 一个实例
💻 LST
📖 第 1 页 / 共 2 页
字号:
 189                  sizeof(USB_ENDPOINT_DESCRIPTOR),
 190                  USB_ENDPOINT_DESCRIPTOR_TYPE,
 191                  0x82,
 192                  USB_ENDPOINT_TYPE_BULK,
 193                  SWAP(EP2_PACKET_SIZE),
 194                  10
 195          };
 196          
 197          code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
 198          {
 199                  sizeof(USB_ENDPOINT_DESCRIPTOR),
 200                  USB_ENDPOINT_DESCRIPTOR_TYPE,
 201                  0x2,
 202                  USB_ENDPOINT_TYPE_BULK,
 203                  SWAP(EP2_PACKET_SIZE),
 204                  10
 205          };
 206          #endif
 207          /*
 208             //*************************************************************************
 209             // USB Protocol Layer
 210             //*************************************************************************
 211          */
 212          
 213          void reserved(void)
 214          {
 215   1              stall_ep0();
 216   1      }
 217          
 218          /*
 219             //*************************************************************************
 220             // USB standard device requests
 221             //*************************************************************************
 222          */
 223          
 224          void get_status(void)
 225          {
 226   1              unsigned char endp, txdat[2];
 227   1              unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
 228   1              unsigned char c;
 229   1      
 230   1              if (bRecipient == USB_RECIPIENT_DEVICE) {
 231   2                      if(bEPPflags.bits.remote_wakeup == 1)
 232   2                              txdat[0] = 3;
 233   2                      else
 234   2                              txdat[0] = 1;
 235   2                      txdat[1]=0;
 236   2                      single_transmit(txdat, 2);
 237   2              } else if (bRecipient == USB_RECIPIENT_INTERFACE) {
 238   2                      txdat[0]=0;
 239   2                      txdat[1]=0;
 240   2                      single_transmit(txdat, 2);
 241   2              } else if (bRecipient == USB_RECIPIENT_ENDPOINT) {
C51 COMPILER V8.01   CHAP_9                                                                04/24/2006 19:23:08 PAGE 5   

 242   2                      endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 243   2                      if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
 244   2                              c = D12_SelectEndpoint(endp*2 + 1);     /* Control-in */
 245   2                      else
 246   2                              c = D12_SelectEndpoint(endp*2); /* Control-out */
 247   2                      if(c & D12_STALL)
 248   2                              txdat[0] = 1;
 249   2                      else
 250   2                              txdat[0] = 0;
 251   2                      txdat[1] = 0;
 252   2                      single_transmit(txdat, 2);
 253   2              } else
 254   1                      stall_ep0();
 255   1      }
 256          
 257          void clear_feature(void)
 258          {
 259   1              unsigned char endp;
 260   1              unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
 261   1      
 262   1              if (bRecipient == USB_RECIPIENT_DEVICE
 263   1                      && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
 264   2                      DISABLE;
 265   2                      bEPPflags.bits.remote_wakeup = 0;
 266   2                      ENABLE;
 267   2                      single_transmit(0, 0);
 268   2              }
 269   1              else if (bRecipient == USB_RECIPIENT_ENDPOINT
 270   1                      && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
 271   2                      endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 272   2                      if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
 273   2                              /* clear TX stall for IN on EPn. */
 274   2                              D12_SetEndpointStatus(endp*2 + 1, 0);
 275   2                      else
 276   2                              /* clear RX stall for OUT on EPn. */
 277   2                              D12_SetEndpointStatus(endp*2, 0);
 278   2                      single_transmit(0, 0);
 279   2              } else
 280   1                      stall_ep0();
 281   1      }
 282          
 283          void set_feature(void)
 284          {
 285   1              unsigned char endp;
 286   1              unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
 287   1      
 288   1              if (bRecipient == USB_RECIPIENT_DEVICE
 289   1                      && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
 290   2                      DISABLE;
 291   2                      bEPPflags.bits.remote_wakeup = 1;
 292   2                      ENABLE;
 293   2                      single_transmit(0, 0);
 294   2              }
 295   1              else if (bRecipient == USB_RECIPIENT_ENDPOINT
 296   1                      && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
 297   2                      endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 298   2                      if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
 299   2                              /* clear TX stall for IN on EPn. */
 300   2                              D12_SetEndpointStatus(endp*2 + 1, 1);
 301   2                      else
 302   2                              /* clear RX stall for OUT on EPn. */
 303   2                              D12_SetEndpointStatus(endp*2, 1);
C51 COMPILER V8.01   CHAP_9                                                                04/24/2006 19:23:08 PAGE 6   

 304   2                      single_transmit(0, 0);
 305   2              } else
 306   1                      stall_ep0();
 307   1      }
 308          
 309          void set_address(void)
 310          {
 311   1              D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
 312   1                      DEVICE_ADDRESS_MASK), 1);
 313   1              single_transmit(0, 0);
 314   1      }
 315          
 316          void get_descriptor(void)
 317          {
 318   1              unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
 319   1      
 320   1              if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) {
 321   2                      code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
 322   2              } else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) {
 323   2                      code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
 324   2              } else
 325   1                      stall_ep0();
 326   1      }
 327          
 328          void get_configuration(void)
 329          {
 330   1              unsigned char c = bEPPflags.bits.configuration;
 331   1      
 332   1              single_transmit(&c, 1);
 333   1      }
 334          
 335          void set_configuration(void)
 336          {
 337   1              if (ControlData.DeviceRequest.wValue == 0) {
 338   2                      /* put device in unconfigured state */
 339   2                      single_transmit(0, 0);
 340   2                      DISABLE;
 341   2                      bEPPflags.bits.configuration = 0;
 342   2                      ENABLE;
 343   2                      init_unconfig();
 344   2              } else if (ControlData.DeviceRequest.wValue == 1) {
 345   2                      /* Configure device */
 346   2                      single_transmit(0, 0);
 347   2      
 348   2                      init_unconfig();
 349   2                      init_config();
 350   2                      
 351   2                      DISABLE;
 352   2                      bEPPflags.bits.configuration = 1;
 353   2                      ENABLE;
 354   2              } else
 355   1                      stall_ep0();
 356   1      }
 357          
 358          void get_interface(void)
 359          {
 360   1              unsigned char txdat = 0;        /* Only/Current interface = 0 */
 361   1              single_transmit(&txdat, 1);
 362   1      }
 363          
 364          void set_interface(void)
 365          {
C51 COMPILER V8.01   CHAP_9                                                                04/24/2006 19:23:08 PAGE 7   

 366   1              if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
 367   1                      single_transmit(0, 0);
 368   1              else
 369   1                      stall_ep0();
 370   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    448    ----
   CONSTANT SIZE    =     64    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      12
   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 + -