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

📄 usbimpl.lst

📁 C8051F120与串口、并口、D12、USB、LCD应用
💻 LST
📖 第 1 页 / 共 3 页
字号:
 249                   0x81, 0x02,    //      Input (data, variable, absolute)
 250          
 251          /// The Output report
 252                   0x09, 0x05,     //       Usage (vendor defined)
 253                   0x09, 0x06,     //       Usage (vendor defined)
 254                   0x15, 0x80,    //      Logical minimum  (0x80 or -128)
 255                   0x25, 0x7F,    //      Logical maximum  (0x7F or 127)
 256                   0x35, 0x00,    //      Physical minimum (0)
 257                   0x45,  0xFF,   //      Physical maximum (255)
 258                   0x75, 0x08,    //      Report size (8 bits)
 259                   0x95, 0x40,    //      Report count (64 fields)
 260                   0x91, 0x02,    //      Output (data, variable, absolute)
 261          
 262                    0xC0,         //       End Collection 0x(Pysical)
 263                    0xC0         //       End Collection (Application)
 264          };
 265          #endif //_HID_DEVICE
 266          
 267          code void (*StandardDeviceRequest[])(void) =
 268          {
 269                  get_status,
 270                  clear_feature,
 271                  reserved,
 272                  set_feature,
 273                  reserved,
 274                  set_address,
 275                  get_descriptor,
 276                  reserved,
 277                  get_configuration,
 278                  set_configuration,
 279                  get_interface,
 280                  set_interface,
 281                  reserved,
 282                  reserved,
 283                  reserved,
 284                  reserved
 285          };
 286          code void (*VendorDeviceRequest[])(void) =
 287          {
 288                  reserved,
 289                  reserved,
 290                  reserved,
 291                  reserved,
 292                  reserved,
 293                  reserved,
 294                  reserved,
 295                  reserved,
 296                  reserved,
 297                  reserved,
 298                  reserved,
 299                  reserved,
 300                  read_write_register,
 301                  reserved,
 302                  reserved,
 303                  reserved
C51 COMPILER V7.01  USBIMPL                                                                06/30/2007 11:42:51 PAGE 6   

 304          };
 305          
 306          #ifdef _HID_DEVICE
 307          code void (*HidDeviceReuest[])(void) = 
 308          {
 309                  reserved,
 310                  get_report,     //0x1   mandatory request and must be support by all devices
 311                  get_idle,
 312                  get_protocol,   //required only for boot devices
 313                  reserved,       //0x4
 314                  reserved,
 315                  reserved,
 316                  reserved,
 317                  reserved,       //0x8
 318                  set_report,
 319                  set_idle,
 320                  set_protocol
 321          };
 322          #endif //_HID_DEVICE
 323          
 324          /*
 325          //*************************************************************************
 326          // USB Protocol Layer
 327          //*************************************************************************
 328          */
 329          void init_unconfig(void)
 330          {
 331   1      //      u8 i;
 332   1              D12_SetEndpointEnable(false); /* DISABLE all endpoints but EPP0. */
 333   1      }
 334          void init_config(void)
 335          {
 336   1              D12_SetEndpointEnable(true); /* ENABLE generic/iso endpoints. */
 337   1      }
 338          void single_transmit(u8 * buf, u8 len)
 339          {
 340   1              if( len <= EP0_PACKET_SIZE) {
 341   2                      D12_WriteEndpointBuffer(1, buf, len);
 342   2              }
 343   1      }
 344          
 345          void code_transmit(u8 code * pRomData, u16 len)
 346          {
 347   1              ControlData.wCount = 0;
 348   1              if(ControlData.wLength > len)
 349   1                      ControlData.wLength = len;
 350   1              ControlData.pData = pRomData;
 351   1              if( ControlData.wLength >= EP0_PACKET_SIZE) {
 352   2                      D12_WriteEndpointBuffer(1, ControlData.pData, EP0_PACKET_SIZE);
 353   2                      ControlData.wCount += EP0_PACKET_SIZE;
 354   2                      DISABLE_INTERRUPT;
 355   2                      bEppflags.flags.control_state = USB_TRANSMIT;
 356   2                      ENABLE_INTERRUPT;
 357   2              }
 358   1              else {
 359   2                      D12_WriteEndpointBuffer(1, pRomData, ControlData.wLength);
 360   2                      ControlData.wCount += ControlData.wLength;
 361   2                      DISABLE_INTERRUPT;
 362   2                      bEppflags.flags.control_state = USB_IDLE;
 363   2                      ENABLE_INTERRUPT;
 364   2              }
 365   1      }
C51 COMPILER V7.01  USBIMPL                                                                06/30/2007 11:42:51 PAGE 7   

 366          
 367          void stall_ep0(void)
 368          {
 369   1              D12_SetEndpointStatus(0, 1);
 370   1              D12_SetEndpointStatus(1, 1);
 371   1      }
 372          
 373          void reserved(void)
 374          {
 375   1              stall_ep0();
 376   1      }
 377          
 378          void control_handler()
 379          {
 380   1              u8 type, req;
 381   1              type = ControlData.DevRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
 382   1              req = ControlData.DevRequest.bRequest & USB_REQUEST_MASK;
 383   1      
 384   1              if (type == USB_STANDARD_REQUEST)
 385   1                      (*StandardDeviceRequest[req])();
 386   1      #ifdef _HID_DEVICE
 387   1              else if (type == USB_CLASS_REQUEST      //class request & receive is interface
 388   1                              && ControlData.DevRequest.bmRequestType&0x1)
 389   1                      (*HidDeviceReuest[req])();
 390   1      #endif //_HID_DEVICE
 391   1              else if (type == USB_VENDOR_REQUEST)
 392   1                      (*VendorDeviceRequest[req])();
 393   1              else
 394   1                      stall_ep0();
 395   1      }
 396          
 397          /*
 398          //*************************************************************************
 399          // USB standard device requests
 400          //*************************************************************************
 401          */
 402          void get_status(void)
 403          {
 404   1              //send 2B to pc
 405   1              u8 endp, txdat[2];
 406   1              u8 bRecipient = ControlData.DevRequest.bmRequestType & USB_RECIPIENT;
 407   1              u8 c;
 408   1      
 409   1      //      PRINT("get_status ");
 410   1              if (bRecipient == USB_RECIPIENT_DEVICE) 
 411   1              {
 412   2      //              if(bEppflags.flags.remote_wakeup == 1)
 413   2      //                      txdat[0] = 3;
 414   2      //              else
 415   2      //                      txdat[0] = 1;
 416   2                      txdat[0] = 0; //bus power, don't support remote wakeup
 417   2                      txdat[1]=0;
 418   2                      single_transmit(txdat, 2);
 419   2              } 
 420   1              else if (bRecipient == USB_RECIPIENT_INTERFACE)
 421   1              {
 422   2                      txdat[0]=0;
 423   2                      txdat[1]=0;
 424   2                      single_transmit(txdat, 2);
 425   2              } 
 426   1              else if (bRecipient == USB_RECIPIENT_ENDPOINT) 
 427   1              {
C51 COMPILER V7.01  USBIMPL                                                                06/30/2007 11:42:51 PAGE 8   

 428   2                      endp = (u8)(ControlData.DevRequest.wIndex & MAX_ENDPOINTS);
 429   2                      if (ControlData.DevRequest.wIndex & USB_ENDPOINT_DIRECTION_MASK)
 430   2                              c = D12_SelectEndpoint(endp*2 + 1); // Control-in 
 431   2                      else
 432   2                              c = D12_SelectEndpoint(endp*2); // Control-out 
 433   2                      if(c & D12_STALL)
 434   2                              txdat[0] = 1;   //ep stall
 435   2                      else
 436   2                              txdat[0] = 0;   //ep work
 437   2                      txdat[1] = 0;
 438   2                      single_transmit(txdat, 2);
 439   2              } 
 440   1              else
 441   1                      stall_ep0();
 442   1      }
 443          
 444          void clear_feature(void)
 445          {
 446   1              u8 endp;
 447   1              u8 bRecipient = ControlData.DevRequest.bmRequestType & USB_RECIPIENT;
 448   1      
 449   1      //      PRINT("clear_feature ");
 450   1      
 451   1              if (bRecipient == USB_RECIPIENT_DEVICE
 452   1                      && ControlData.DevRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
 453   1              {
 454   2      //              DISABLE_INTERRUPT;
 455   2      //              bEppflags.flags.remote_wakeup = 0;
 456   2      //              ENABLE_INTERRUPT;
 457   2                      single_transmit(0, 0);
 458   2              }
 459   1              else if (bRecipient == USB_RECIPIENT_ENDPOINT
 460   1                      && ControlData.DevRequest.wValue == USB_FEATURE_ENDPOINT_STALL) 
 461   1              {
 462   2                      endp = (u8)(ControlData.DevRequest.wIndex & MAX_ENDPOINTS);
 463   2                      if (ControlData.DevRequest.wIndex & (u8)USB_ENDPOINT_DIRECTION_MASK)
 464   2                              /* clear TX stall for IN on EPn. */
 465   2                              D12_SetEndpointStatus(endp*2 + 1, 0);
 466   2                      else
 467   2                              /* clear RX stall for OUT on EPn. */
 468   2                              D12_SetEndpointStatus(endp*2, 0);
 469   2                      single_transmit(0, 0);
 470   2              }
 471   1              else
 472   1                      stall_ep0();
 473   1      }
 474          void set_feature(void)
 475          {
 476   1              u8 endp;
 477   1              u8 bRecipient = ControlData.DevRequest.bmRequestType & USB_RECIPIENT;
 478   1      
 479   1      //      PRINT("set_feature ");
 480   1      
 481   1              if (bRecipient == USB_RECIPIENT_DEVICE
 482   1                      && ControlData.DevRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) 
 483   1              {
 484   2      //              DISABLE_INTERRUPT;
 485   2      //              bEppflags.flags.remote_wakeup = 1;
 486   2      //              ENABLE_INTERRUPT;
 487   2                      single_transmit(0, 0);
 488   2              }
 489   1              else if (bRecipient == USB_RECIPIENT_ENDPOINT
C51 COMPILER V7.01  USBIMPL                                                                06/30/2007 11:42:51 PAGE 9   

 490   1                      && ControlData.DevRequest.wValue == USB_FEATURE_ENDPOINT_STALL) 
 491   1              {
 492   2                      endp = (u8)(ControlData.DevRequest.wIndex & MAX_ENDPOINTS);
 493   2                      if (ControlData.DevRequest.wIndex & (u8)USB_ENDPOINT_DIRECTION_MASK)
 494   2                              /* clear TX stall for IN on EPn. */
 495   2                              D12_SetEndpointStatus(endp*2 + 1, 1);
 496   2                      else
 497   2                              /* clear RX stall for OUT on EPn. */
 498   2                              D12_SetEndpointStatus(endp*2, 1);
 499   2                      single_transmit(0, 0);
 500   2              }
 501   1              else
 502   1                      stall_ep0();
 503   1      }
 504          void set_address(void)
 505          {

⌨️ 快捷键说明

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