C51 COMPILER V7.06 CHAP_9 08/18/2005 15:30:26 PAGE 1 C51 COMPILER V7.06, COMPILATION OF MODULE CHAP_9 OBJECT MODULE PLACED IN CHAP_9.OBJ COMPILER INVOKED BY: d:\Keil777\C51\BIN\C51.EXE CHAP_9.C BROWSE DEBUG OBJECTEXTEND stmt level source 1 2 #include 3 #include 4 #include "BasicTyp.h" 5 #include "common.h" 6 #include "usb.h" 7 #include "chap_9.h" 8 #include "Hal4D13.h" 9 #include "ISO.H" 10 11 // ************************************************************************* 12 // Public Data 13 // ************************************************************************* 14 15 extern D13FLAGS bD13flags; 16 extern USBCHECK_DEVICE_STATES bUSBCheck_Device_State; 17 extern CONTROL_XFER ControlData; 18 19 UCHAR ALTERNATIVE_SETTING = 0; 20 21 // ************************************************************************* 22 // USB Device Descriptor 23 // ************************************************************************* 24 25 #define NUM_ENDPOINTS 4 26 27 #define NUM_INTERFACE 2 28 #define NUM_ALTINTERFACE 2 29 30 #define CONFIG_DESCRIPTOR_LENGTH sizeof(USB_CONFIGURATION_DESCRIPTOR) \ 31 + NUM_ALTINTERFACE * sizeof(USB_INTERFACE_DESCRIPTOR) \ 32 + (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR)) 33 34 USB_DEVICE_DESCRIPTOR DeviceDescr = 35 { 36 sizeof(USB_DEVICE_DESCRIPTOR), 37 USB_DEVICE_DESCRIPTOR_TYPE, 38 SWAP(0x110), //usb spec1.1 39 0, 40 0, 41 0, 42 EP0_PACKET_SIZE, 43 SWAP(0x0471), 44 SWAP(0x1A62), //0x1A61: ISA kit, 0x1A62: PCI kit, 0X1A65: Cotulla kit 45 SWAP(0x0100), 46 STR_INDEX_MANUFACTURER, 47 STR_INDEX_PRODUCT, 48 // STR_INDEX_SERIALNUMBER, 49 0, 50 1 51 }; 52 53 USB_CONFIGURATION_DESCRIPTOR ConfigDescr = 54 { 55 sizeof(USB_CONFIGURATION_DESCRIPTOR), C51 COMPILER V7.06 CHAP_9 08/18/2005 15:30:26 PAGE 2 56 USB_CONFIGURATION_DESCRIPTOR_TYPE, 57 SWAP(CONFIG_DESCRIPTOR_LENGTH), 58 1, //NO OF I/F: 1, 59 1, 60 STR_INDEX_CONFIGURATION, 61 0xC0,// no remote wakeup 62 0x01 // 2mA 63 }; 64 65 66 USB_INTERFACE_DESCRIPTOR InterfaceDescr0 = 67 { 68 sizeof(USB_INTERFACE_DESCRIPTOR), 69 USB_INTERFACE_DESCRIPTOR_TYPE, 70 0, //InterfaceNumber 71 0, //Alternate Setting 72 NUM_ENDPOINTS, // No of Endpoints 73 USB_CLASS_CODE_UNKNOWN, 74 USB_SUBCLASS_CODE_UNKNOWN, 75 USB_PROTOCOL_CODE_UNKNOWN, 76 STR_INDEX_INTERFACE 77 }; 78 79 80 USB_ENDPOINT_DESCRIPTOR EP_Descr[NUM_ENDPOINTS] = 81 { 82 83 // EP01 Interrupt Out 84 { 85 sizeof(USB_ENDPOINT_DESCRIPTOR), 86 USB_ENDPOINT_DESCRIPTOR_TYPE, 87 0x01, 88 USB_ENDPOINT_TYPE_INTERRUPT, 89 SWAP(NONISO_FIFOSIZE_8), 90 1 91 }, 92 // EP02 Interrupt In 93 { 94 sizeof(USB_ENDPOINT_DESCRIPTOR), 95 USB_ENDPOINT_DESCRIPTOR_TYPE, 96 0x82, 97 USB_ENDPOINT_TYPE_INTERRUPT, 98 SWAP(NONISO_FIFOSIZE_8), 99 1 100 }, 101 // EP03 Bulk Out 102 { 103 sizeof(USB_ENDPOINT_DESCRIPTOR), 104 USB_ENDPOINT_DESCRIPTOR_TYPE, 105 0x03, 106 USB_ENDPOINT_TYPE_BULK, 107 SWAP(NONISO_FIFOSIZE_8), 108 0 109 }, 110 // EP04 Bulk IN 111 { 112 sizeof(USB_ENDPOINT_DESCRIPTOR), 113 USB_ENDPOINT_DESCRIPTOR_TYPE, 114 0x84, 115 USB_ENDPOINT_TYPE_BULK, 116 SWAP(NONISO_FIFOSIZE_8), 117 0 C51 COMPILER V7.06 CHAP_9 08/18/2005 15:30:26 PAGE 3 118 /* }, 119 120 // EP05 ISO OUT 121 { 122 sizeof(USB_ENDPOINT_DESCRIPTOR), 123 USB_ENDPOINT_DESCRIPTOR_TYPE, 124 0x05, 125 USB_ENDPOINT_TYPE_ISOCHRONOUS, 126 SWAP(ISO_FIFOSIZE_16), 127 1 128 }, 129 // EP06 ISO IN 130 { 131 sizeof(USB_ENDPOINT_DESCRIPTOR), 132 USB_ENDPOINT_DESCRIPTOR_TYPE, 133 0x86, 134 USB_ENDPOINT_TYPE_ISOCHRONOUS, 135 SWAP(ISO_FIFOSIZE_16), 136 1 137 */ } 138 }; 139 140 141 142 USB_STRING_LANGUAGE_DESCRIPTOR strLanguage = 143 { 144 sizeof(USB_STRING_LANGUAGE_DESCRIPTOR), 145 // sizeof(strLanguage), 146 USB_STRING_DESCRIPTOR_TYPE, 147 SWAP(0x0409) 148 }; 149 150 151 152 /* 153 USB_DEVICE_DESCRIPTOR DeviceDescr = 154 { 155 sizeof(USB_DEVICE_DESCRIPTOR), 156 USB_DEVICE_DESCRIPTOR_TYPE, 157 SWAP(0x200), //Complient to USB2.0 FullSpeed 158 0,//bDeviceClass 159 0,//bDeviceSubClass 160 0,//bDeviceProtocol 161 EP0_PACKET_SIZE, 162 SWAP(0x4cc), // Vendor ID for PHILIPS 163 SWAP(0x1a62),// Product ID for ISP 1362 164 SWAP(0x0100),// Device Release Number 1.0 165 0,//STR_INDEX_MANUFACTURER, 166 0,//STR_INDEX_PRODUCT, 167 0,//STR_INDEX_SERIALNUMBER, 168 1 169 }; 170 171 USB_CONFIGURATION_DESCRIPTOR ConfigDescr = 172 { 173 sizeof(USB_CONFIGURATION_DESCRIPTOR), 174 USB_CONFIGURATION_DESCRIPTOR_TYPE, 175 SWAP(CONFIG_DESCRIPTOR_LENGTH), 176 1, //NO OF I/F: 1, 177 1, //bConfigurationValue 178 0,//iConfiguration 179 0xC0,//bmAttributes =>no remote wakeup C51 COMPILER V7.06 CHAP_9 08/18/2005 15:30:26 PAGE 4 180 0x1//Max Power 181 }; 182 183 USB_INTERFACE_DESCRIPTOR InterfaceDescr0 = 184 { 185 sizeof(USB_INTERFACE_DESCRIPTOR), 186 USB_INTERFACE_DESCRIPTOR_TYPE, 187 0,//bInterfaceNumber 188 0,//bAlternateSetting 189 0,//bNumEndpoints 190 USB_CLASS_CODE_UNKNOWN, 191 USB_SUBCLASS_CODE_UNKNOWN, 192 USB_PROTOCOL_CODE_UNKNOWN, 193 0,//STR_INDEX_INTERFACE 194 }; 195 196 197 USB_INTERFACE_DESCRIPTOR InterfaceDescr1 = 198 { 199 sizeof(USB_INTERFACE_DESCRIPTOR), 200 USB_INTERFACE_DESCRIPTOR_TYPE, 201 0,//bInterfaceNumber 202 1,//bAlternateSetting 203 NUM_ENDPOINTS, 204 USB_CLASS_CODE_UNKNOWN, 205 USB_SUBCLASS_CODE_UNKNOWN, 206 USB_PROTOCOL_CODE_UNKNOWN, 207 0,//STR_INDEX_INTERFACE 208 }; 209 210 211 USB_ENDPOINT_DESCRIPTOR EP_Descr[4] = 212 { 213 214 { 215 sizeof(USB_ENDPOINT_DESCRIPTOR), 216 USB_ENDPOINT_DESCRIPTOR_TYPE, 217 0x03,//EP03, 0x4, OUT 218 USB_ENDPOINT_TYPE_BULK, 219 SWAP(NONISO_FIFOSIZE_64), 220 0 221 }, 222 223 224 { 225 sizeof(USB_ENDPOINT_DESCRIPTOR), 226 USB_ENDPOINT_DESCRIPTOR_TYPE, 227 0x84,// EP4, 0x5, IN 228 USB_ENDPOINT_TYPE_BULK, 229 SWAP(NONISO_FIFOSIZE_64), 230 0 231 }, 232 233 234 { 235 sizeof(USB_ENDPOINT_DESCRIPTOR), 236 USB_ENDPOINT_DESCRIPTOR_TYPE, 237 0x05,// EP5 ISO OUT 238 USB_ENDPOINT_TYPE_ISOCHRONOUS, 239 SWAP(ISO_FIFOSIZE_512), 240 1 241 }, C51 COMPILER V7.06 CHAP_9 08/18/2005 15:30:26 PAGE 5 242 243 244 { 245 sizeof(USB_ENDPOINT_DESCRIPTOR), 246 USB_ENDPOINT_DESCRIPTOR_TYPE, 247 0x86,// EP6 ISO IN 248 USB_ENDPOINT_TYPE_ISOCHRONOUS, 249 SWAP(ISO_FIFOSIZE_512), 250 1 251 }, 252 }; 253 254 255 256 USB_STRING_LANGUAGE_DESCRIPTOR strLanguage = 257 { 258 sizeof(USB_STRING_LANGUAGE_DESCRIPTOR), 259 USB_STRING_DESCRIPTOR_TYPE, 260 SWAP(0x0409) 261 }; 262 */ 263 USB_STRING_INTERFACE_DESCRIPTOR strInterface = 264 { 265 sizeof(USB_STRING_INTERFACE_DESCRIPTOR), 266 USB_STRING_DESCRIPTOR_TYPE, 267 {'I',0,'n',0,'t',0,'e',0,'r',0,'f',0,'a',0,'c',0,'e',0,'0',0,'0',0} 268 }; 269 270 USB_STRING_CONFIGURATION_DESCRIPTOR strConfiguration = 271 { 272 sizeof(USB_STRING_CONFIGURATION_DESCRIPTOR), 273 USB_STRING_DESCRIPTOR_TYPE, 274 { 275 'C',0, 276 'o',0, 277 'n',0, 278 'f',0, 279 'i',0, 280 'g',0, 281 '0',0, 282 '0',0 283 } 284 }; 285 286 USB_STRING_SERIALNUMBER_DESCRIPTOR strSerialNum = 287 { 288 sizeof(strSerialNum), 289 USB_STRING_DESCRIPTOR_TYPE, 290 { 291 '0',0, 292 '0',0, 293 '0',0, 294 '0',0, 295 296 '0',0, 297 '0',0, 298 '0',0, 299 '0',0, 300 301 '0',0, 302 '0',0, 303 '0',0, C51 COMPILER V7.06 CHAP_9 08/18/2005 15:30:26 PAGE 6 304 '0',0 305 } 306 }; 307 USB_STRING_PRODUCT_DESCRIPTOR strProduct = 308 { 309 sizeof(USB_STRING_PRODUCT_DESCRIPTOR), 310 USB_STRING_DESCRIPTOR_TYPE, 311 { 312 'P', 0, 313 'H', 0, 314 'I', 0, 315 'L', 0, 316 'I', 0, 317 'P', 0, 318 'S', 0, 319 ' ', 0, 320 'I', 0, 321 'S', 0, 322 'P', 0, 323 '1', 0, 324 '1', 0, 325 '8', 0, 326 '1', 0, 327 ' ', 0, 328 'T', 0, 329 'e', 0, 330 's', 0, 331 't', 0, 332 ' ', 0, 333 ' ', 0, 334 ' ', 0 335 } 336 }; 337 338 USB_STRING_MANUFACTURER_DESCRIPTOR strManufacturer = 339 { 340 sizeof(USB_STRING_MANUFACTURER_DESCRIPTOR), 341 USB_STRING_DESCRIPTOR_TYPE, 342 { 343 'P', 0, 344 'H', 0, 345 'I', 0, 346 'L', 0, 347 'I', 0, 348 'P', 0, 349 'S', 0, 350 ' ', 0, 351 'S', 0, 352 'e', 0, 353 'm', 0, 354 'i', 0, 355 'c', 0, 356 'o', 0, 357 'n', 0, 358 'd', 0, 359 'u', 0, 360 'c', 0, 361 't', 0, 362 'o', 0, 363 'r', 0, 364 's', 0, 365 ' ', 0, C51 COMPILER V7.06 CHAP_9 08/18/2005 15:30:26 PAGE 7 366 'A', 0, 367 'P', 0, 368 'I', 0, 369 'C', 0} 370 }; 371 372 // ************************************************************************* 373 // USB Protocol Layer 374 // ************************************************************************ 375 376 377 378 // ************************************************************************* 379 // USB standard device requests 380 // ************************************************************************* 381 382 void Chap9_GetStatus(void) 383 { 384 1 UCHAR endp, txdat[2]; 385 1 UCHAR c; 386 1 UCHAR bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT; 387 1 388 1 389 1 if(bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE) 390 1 { 391 2 switch(bRecipient) 392 2 { 393 3 case USB_RECIPIENT_DEVICE: 394 3 if(bD13flags.bits.remote_wakeup == 1) 395 3 txdat[0] = DEVSTS_SELFPOWERED|DEVSTS_REMOTEWAKEUP; /* remote wakeup and Self-powered */ 396 3 else 397 3 txdat[0] = DEVSTS_SELFPOWERED; /* Self-powered*/ 398 3 txdat[1]=0; 399 3 400 3 Chap9_SingleTransmitEP0(txdat, 2); 401 3 break; 402 3 403 3 case USB_RECIPIENT_INTERFACE: 404 3 405 3 Chap9_StallEP0InControlRead(); 406 3 break; 407 3 408 3 case USB_RECIPIENT_ENDPOINT: 409 3 410 3 if( ControlData.DeviceRequest.wIndex == 0x00 ) 411 3 { 412 4 endp = -1; 413 4 c = Hal4D13_GetEndpointStatusWOInteruptClear(endp + 1); 414 4 if(c & D13REG_EPSTS_STALL) 415 4 txdat[0] = ENDPSTS_HALT; /* Halt */ 416 4 else 417 4 txdat[0] = 0; 418 4 419 4 txdat[1] = 0; 420 4 421 4 Chap9_SingleTransmitEP0(txdat, 2); 422 4 } 423 3 else 424 3 Chap9_StallEP0InControlRead(); 425 3 426 3 break; 427 3 C51 COMPILER V7.06 CHAP_9 08/18/2005 15:30:26 PAGE 8 428 3 default: 429 3 Chap9_StallEP0InControlRead(); 430 3 break; 431 3 } 432 2 } 433 1 434 1 435 1 else 436 1 { 437 2 if(ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wLength == 2 ) 438 2 { 439 3 switch(bRecipient) 440 3 { 441 4 case USB_RECIPIENT_DEVICE: 442 4 if(bD13flags.bits.remote_wakeup == 1) 443 4 txdat[0] = DEVSTS_SELFPOWERED|DEVSTS_REMOTEWAKEUP; /* remote wakeup and Self-powered */ 444 4 else 445 4 txdat[0] = DEVSTS_SELFPOWERED; /* Self-powered*/ 446 4 txdat[1]=0; 447 4 448 4 Chap9_SingleTransmitEP0(txdat, 2); 449 4 break; 450 4 451 4 case USB_RECIPIENT_INTERFACE: 452 4 txdat[0]=0; 453 4 txdat[1]=0; 454 4 455 4 Chap9_SingleTransmitEP0(txdat, 2); 456 4 break; 457 4 458 4 case USB_RECIPIENT_ENDPOINT: 459 4 460 4 if( ControlData.DeviceRequest.wIndex == 0x00 ) 461 4 endp = -1; 462 4 else 463 4 endp = (UCHAR)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS); 464 4 465 4 c = Hal4D13_GetEndpointStatusWOInteruptClear(endp + 1); 466 4 if(c & D13REG_EPSTS_STALL) 467 4 txdat[0] = ENDPSTS_HALT; /* Halt */ 468 4 else 469 4 txdat[0] = 0; 470 4 471 4 txdat[1] = 0; 472 4 473 4 Chap9_SingleTransmitEP0(txdat, 2); 474 4 break; 475 4 476 4 default: 477 4 Chap9_StallEP0InControlRead(); 478 4 break; 479 4 } 480 3 } 481 2 } 482 1 483 1 } 484 485 void Chap9_ClearFeature(void) 486 { 487 1 UCHAR endp; 488 1 UCHAR bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT; 489 1 USHORT wFeature = ControlData.DeviceRequest.wValue; C51 COMPILER V7.06 CHAP_9 08/18/2005 15:30:26 PAGE 9 490 1 491 1 if(bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE) 492 1 { 493 2 if( ControlData.DeviceRequest.wLength == 0 ) 494 2 { 495 3 switch(bRecipient) 496 3 { 497 4 case USB_RECIPIENT_DEVICE: 498 4 if(wFeature == USB_FEATURE_REMOTE_WAKEUP) 499 4 { 500 5 bD13flags.bits.remote_wakeup = 0; 501 5 Chap9_SingleTransmitEP0(0, 0); 502 5 } 503 4 else 504 4 Chap9_StallEP0InControlWrite(); 505 4 506 4 break; 507 4 508 4 509 4 510 4 case USB_RECIPIENT_ENDPOINT: 511 4 512 4 if(wFeature == USB_FEATURE_ENDPOINT_STALL) 513 4 { 514 5 if( ControlData.DeviceRequest.wIndex == 0x00 ) 515 5 { 516 6 endp = 0; 517 6 Hal4D13_SetEndpointStatus(endp, 0); 518 6 519 6 Chap9_SingleTransmitEP0(0, 0); 520 6 } 521 5 else 522 5 { 523 6 Chap9_StallEP0InControlWrite(); 524 6 break; 525 6 } 526 5 527 5 } 528 4 529 4 else 530 4 Chap9_StallEP0InControlWrite(); 531 4 532 4 break; 533 4 534 4 535 4 default: 536 4 Chap9_StallEP0InControlWrite(); 537 4 break; 538 4 } 539 3 } 540 2 } 541 1 542 1 else 543 1 { 544 2 545 2 if( ControlData.DeviceRequest.wLength == 0 ) 546 2 { 547 3 switch(bRecipient) 548 3 { 549 4 case USB_RECIPIENT_DEVICE: 550 4 if(wFeature == USB_FEATURE_REMOTE_WAKEUP) 551 4 { C51 COMPILER V7.06 CHAP_9 08/18/2005 15:30:26 PAGE 10 552 5 bD13flags.bits.remote_wakeup = 0; 553 5 Chap9_SingleTransmitEP0(0, 0); 554 5 } 555 4 else 556 4 { 557 5 Chap9_StallEP0InControlWrite(); 558 5 } 559 4 560 4 break; 561 4 562 4 case USB_RECIPIENT_ENDPOINT: 563 4 564 4 if(wFeature == USB_FEATURE_ENDPOINT_STALL) 565 4 { 566 5 if( ControlData.DeviceRequest.wIndex == 0x00 ) 567 5 endp = -1; 568 5 else 569 5 endp = (UCHAR)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS); 570 5 571 5 Hal4D13_SetEndpointStatus(endp+1, 0); 572 5 Hal4D13_SetEndpointStatus(endp+1, 0); 573 5 574 5 Chap9_SingleTransmitEP0(0, 0); 575 5 } 576 4 else 577 4 { 578 5 Chap9_StallEP0InControlWrite(); 579 5 } 580 4 break; 581 4 582 4 default: 583 4 Chap9_StallEP0InControlWrite(); 584 4 break; 585 4 } 586 3 } 587 2 } 588 1 589 1 } 590 591 void Chap9_SetFeature(void) 592 { 593 1 UCHAR endp = 0; 594 1 UCHAR bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT; 595 1 USHORT wFeature = ControlData.DeviceRequest.wValue; 596 1 597 1 598 1 if(bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE) 599 1 { 600 2 switch(bRecipient) 601 2 { 602 3 case USB_RECIPIENT_DEVICE: 603 3 if(wFeature == USB_FEATURE_REMOTE_WAKEUP) 604 3 { 605 4 bD13flags.bits.remote_wakeup = 1; 606 4 Chap9_SingleTransmitEP0(0, 0); 607 4 } 608 3 else 609 3 { 610 4 Chap9_StallEP0InControlWrite(); 611 4 } 612 3 break; 613 3 C51 COMPILER V7.06 CHAP_9 08/18/2005 15:30:26 PAGE 11 614 3 case USB_RECIPIENT_ENDPOINT: 615 3 if( wFeature == USB_FEATURE_ENDPOINT_STALL) 616 3 { 617 4 if( ControlData.DeviceRequest.wIndex == 0x00 ) 618 4 endp = -1; 619 4 620 4 Hal4D13_SetEndpointStatus(endp+1, D13REG_EPSTS_STALL); 621 4 Chap9_SingleTransmitEP0(0, 0); 622 4 623 4 } 624 3 else 625 3 Chap9_StallEP0InControlWrite(); 626 3 627 3 break; 628 3 default: 629 3 Chap9_StallEP0InControlWrite(); 630 3 break; 631 3 } 632 2 } 633 1 634 1 635 1 else 636 1 { 637 2 if( ControlData.DeviceRequest.wLength == 0 ) 638 2 { 639 3 switch(bRecipient) 640 3 { 641 4 case USB_RECIPIENT_DEVICE: 642 4 if(wFeature == USB_FEATURE_REMOTE_WAKEUP) 643 4 { 644 5 bD13flags.bits.remote_wakeup = 1; 645 5 Chap9_SingleTransmitEP0(0, 0); 646 5 } 647 4 else 648 4 { 649 5 Chap9_StallEP0InControlWrite(); 650 5 } 651 4 break; 652 4 case USB_RECIPIENT_ENDPOINT: 653 4 if( wFeature == USB_FEATURE_ENDPOINT_STALL) 654 4 { 655 5 if( ControlData.DeviceRequest.wIndex == 0x00 ) 656 5 endp = -1; 657 5 else 658 5 endp = (UCHAR)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS); 659 5 660 5 Hal4D13_SetEndpointStatus(endp+1, D13REG_EPSTS_STALL); 661 5 662 5 Chap9_SingleTransmitEP0(0, 0); 663 5 664 5 } 665 4 else 666 4 { 667 5 Hal4D13_SetEndpointStatus(endp+1, 0); 668 5 Chap9_SingleTransmitEP0(0, 0); 669 5 } 670 4 break; 671 4 default: 672 4 Chap9_StallEP0InControlWrite(); 673 4 break; 674 4 } 675 3 } C51 COMPILER V7.06 CHAP_9 08/18/2005 15:30:26 PAGE 12 676 2 } 677 1 678 1 679 1 680 1 } 681 682 void Chap9_SetAddress(void) 683 { 684 1 685 1 UCHAR j; 686 1 687 1 { 688 2 RaiseIRQL(); 689 2 disable(); 690 2 if(!ControlData.Abort) 691 2 { 692 3 if(bUSBCheck_Device_State.State_bits.DEVICE_DEFAULT_STATE) 693 3 { 694 4 if((ControlData.DeviceRequest.wValue & DEVICE_ADDRESS_MASK) != 0 ) 695 4 { 696 5 bUSBCheck_Device_State.State_bits.DEVICE_DEFAULT_STATE = 0; 697 5 Hal4D13_SetAddressEnable((UCHAR)(ControlData.DeviceRequest.wValue & 698 5 DEVICE_ADDRESS_MASK), 1); 699 5 bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE = 1; 700 5 Chap9_SingleTransmitEP0(0, 0); 701 5 702 5 } 703 4 704 4 else 705 4 bUSBCheck_Device_State.State_bits.DEVICE_DEFAULT_STATE = 1; 706 4 } 707 3 708 3 else if(bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE) 709 3 { 710 4 if((ControlData.DeviceRequest.wValue & DEVICE_ADDRESS_MASK) == 0 ) 711 4 { 712 5 Hal4D13_SetAddressEnable((UCHAR)(ControlData.DeviceRequest.wValue & 713 5 DEVICE_ADDRESS_MASK), 1); 714 5 bUSBCheck_Device_State.State_bits.DEVICE_DEFAULT_STATE = 1; 715 5 bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE = 0; 716 5 Chap9_SingleTransmitEP0(0, 0); 717 5 718 5 } 719 4 720 4 else 721 4 { 722 5 bUSBCheck_Device_State.State_bits.DEVICE_DEFAULT_STATE = 0; 723 5 Hal4D13_SetAddressEnable((UCHAR)(ControlData.DeviceRequest.wValue & 724 5 DEVICE_ADDRESS_MASK), 1); 725 5 bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE = 1; 726 5 Chap9_SingleTransmitEP0(0, 0); 727 5 728 5 } 729 4 730 4 } 731 3 732 3 else 733 3 { 734 4 735 4 bUSBCheck_Device_State.State_bits.DEVICE_CONFIGURATION_STATE = 0; 736 4 bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE = 0; 737 4 bUSBCheck_Device_State.State_bits.DEVICE_DEFAULT_STATE = 1; C51 COMPILER V7.06 CHAP_9 08/18/2005 15:30:26 PAGE 13 738 4 j = DEV_BEHAVIOUR_NOT_SPECIFIED; 739 4 Chap9_SingleTransmitEP0(&j, 0); 740 4 } 741 3 742 3 } 743 2 LowerIRQL(); 744 2 enable(); 745 2 746 2 } 747 1 748 1 } 749 750 751 void Chap9_GetDescriptor(void) 752 { 753 1 UCHAR bDescriptor = MSB(ControlData.DeviceRequest.wValue); 754 1 UCHAR bDescriptorIndex = LSB(ControlData.DeviceRequest.wValue); 755 1 756 1 switch(bDescriptor) 757 1 { 758 2 case USB_DEVICE_DESCRIPTOR_TYPE: 759 2 Chap9_BurstTransmitEP0((PUCHAR)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR)); 760 2 break; 761 2 case USB_CONFIGURATION_DESCRIPTOR_TYPE: 762 2 Chap9_BurstTransmitEP0((PUCHAR)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH); 763 2 break; 764 2 case USB_STRING_DESCRIPTOR_TYPE: 765 2 switch(bDescriptorIndex) 766 2 { 767 3 case STR_INDEX_LANGUAGE: 768 3 Chap9_BurstTransmitEP0((PUCHAR)&strLanguage, sizeof(USB_STRING_LANGUAGE_DESCRIPTOR)); 769 3 break; 770 3 case STR_INDEX_MANUFACTURER: 771 3 Chap9_BurstTransmitEP0((PUCHAR)&strManufacturer, sizeof(USB_STRING_MANUFACTURER_DESCRIPTOR)); 772 3 break; 773 3 case STR_INDEX_PRODUCT: 774 3 Chap9_BurstTransmitEP0((PUCHAR)&strProduct, sizeof(USB_STRING_PRODUCT_DESCRIPTOR)); 775 3 break; 776 3 case STR_INDEX_SERIALNUMBER: 777 3 Chap9_BurstTransmitEP0((PUCHAR)&ConfigDescr, sizeof(CONFIG_DESCRIPTOR_LENGTH)); 778 3 break; 779 3 case STR_INDEX_CONFIGURATION: 780 3 Chap9_BurstTransmitEP0((PUCHAR)&strConfiguration, sizeof(USB_STRING_CONFIGURATION_DESCRIPTOR) ); 781 3 break; 782 3 case STR_INDEX_INTERFACE: 783 3 Chap9_BurstTransmitEP0((PUCHAR)&strInterface, sizeof(USB_STRING_INTERFACE_DESCRIPTOR) ); 784 3 break; 785 3 default: 786 3 Chap9_StallEP0InControlRead(); 787 3 break; 788 3 } 789 2 case USB_INTERFACE_DESCRIPTOR_TYPE: 790 2 case USB_ENDPOINT_DESCRIPTOR_TYPE: 791 2 case USB_POWER_DESCRIPTOR_TYPE: 792 2 default: 793 2 Chap9_StallEP0InControlRead(); 794 2 break; 795 2 } 796 1 } 797 798 void Chap9_GetConfiguration(void) 799 { C51 COMPILER V7.06 CHAP_9 08/18/2005 15:30:26 PAGE 14 800 1 UCHAR c = bD13flags.bits.configuration; 801 1 UCHAR j; 802 1 803 1 if(bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE) 804 1 { 805 2 j = 0; 806 2 Chap9_SingleTransmitEP0(&j, 1); 807 2 } 808 1 809 1 else 810 1 { 811 2 if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0 && ControlData.Device -Request.wLength == 1) 812 2 { 813 3 814 3 Chap9_SingleTransmitEP0(&c, 1); 815 3 } 816 2 } 817 1 818 1 } 819 820 void Chap9_SetConfiguration(void) 821 { 822 1 823 1 if(bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE) 824 1 { 825 2 if(ControlData.DeviceRequest.wIndex == 0 && ControlData.DeviceRequest.wLength == 0) 826 2 { 827 3 if (ControlData.DeviceRequest.wValue == 0) 828 3 { 829 4 /* put device in unconfigured state */ 830 4 bD13flags.bits.configuration = 0; 831 4 bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE = 1; 832 4 Chap9_SingleTransmitEP0(0, 0); 833 4 } 834 3 else if (ControlData.DeviceRequest.wValue == 1) 835 3 { 836 4 /* Configure device */ 837 4 bD13flags.bits.configuration = 1; 838 4 bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE = 0; 839 4 bUSBCheck_Device_State.State_bits.DEVICE_CONFIGURATION_STATE = 1; 840 4 Chap9_SingleTransmitEP0(0, 0); 841 4 } 842 3 843 3 else 844 3 Chap9_StallEP0InControlWrite(); 845 3 } 846 2 } 847 1 848 1 else 849 1 { 850 2 if (ControlData.DeviceRequest.wValue == 0) 851 2 { 852 3 /* put device in unconfigured state */ 853 3 bD13flags.bits.configuration = 0; 854 3 bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE = 1; 855 3 bUSBCheck_Device_State.State_bits.DEVICE_CONFIGURATION_STATE = 0; 856 3 Chap9_SingleTransmitEP0(0, 0); 857 3 858 3 } 859 2 860 2 else if (ControlData.DeviceRequest.wValue == 1) C51 COMPILER V7.06 CHAP_9 08/18/2005 15:30:26 PAGE 15 861 2 { 862 3 /* Configure device */ 863 3 bD13flags.bits.configuration = 1; 864 3 bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE = 0; 865 3 bUSBCheck_Device_State.State_bits.DEVICE_CONFIGURATION_STATE = 1; 866 3 Chap9_SingleTransmitEP0(0, 0); 867 3 } 868 2 else 869 2 Chap9_StallEP0InControlWrite(); 870 2 } 871 1 872 1 } 873 874 void Chap9_GetInterface(void) 875 { 876 1 877 1 if(bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE) 878 1 Chap9_StallEP0InControlRead(); 879 1 880 1 881 1 else 882 1 { 883 2 884 2 if ((ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0 && ControlData.Devic -eRequest.wLength == 1)) 885 2 Chap9_SingleTransmitEP0(&ALTERNATIVE_SETTING, 1); //txdat 886 2 else 887 2 Chap9_StallEP0InControlRead(); 888 2 } 889 1 890 1 } 891 892 void Chap9_SetInterface(void) 893 { 894 1 UCHAR dir = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_DIR_MASK; 895 1 896 1 if(dir) 897 1 Chap9_StallEP0InControlRead(); 898 1 899 1 900 1 if(bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE) 901 1 Chap9_StallEP0InControlRead(); 902 1 903 1 904 1 905 1 else 906 1 { 907 2 908 2 if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0) 909 2 { 910 3 ALTERNATIVE_SETTING = 0; 911 3 Chap9_SingleTransmitEP0(0,0); 912 3 } 913 2 914 2 else if (ControlData.DeviceRequest.wValue == 1 && ControlData.DeviceRequest.wIndex == 0) 915 2 { 916 3 ALTERNATIVE_SETTING = 1; 917 3 Chap9_SingleTransmitEP0(0,0); 918 3 } 919 2 else 920 2 { 921 3 Chap9_StallEP0InControlWrite(); C51 COMPILER V7.06 CHAP_9 08/18/2005 15:30:26 PAGE 16 922 3 } 923 2 } 924 1 925 1 } 926 927 // ************************************************************************* 928 // Chap9 support functions 929 // ************************************************************************* 930 931 void Chap9_StallEP0(void) 932 { 933 1 UCHAR dir; 934 1 dir = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_DIR_MASK; 935 1 if(dir) 936 1 { 937 2 Hal4D13_StallEP0InControlRead(); 938 2 } 939 1 else 940 1 { 941 2 Hal4D13_StallEP0InControlWrite(); 942 2 } 943 1 944 1 RaiseIRQL(); 945 1 if(!ControlData.Abort) 946 1 { 947 2 bD13flags.bits.DCP_state = USBFSM4DCP_STALL; 948 2 949 2 } 950 1 LowerIRQL(); 951 1 } 952 void Chap9_StallEP0InControlWrite(void) 953 { 954 1 Hal4D13_StallEP0InControlWrite(); 955 1 956 1 RaiseIRQL(); 957 1 if(!ControlData.Abort) 958 1 { 959 2 bD13flags.bits.DCP_state = USBFSM4DCP_STALL; 960 2 961 2 } 962 1 LowerIRQL(); 963 1 } 964 965 void Chap9_StallEP0InControlRead(void) 966 { 967 1 Hal4D13_StallEP0InControlRead(); 968 1 RaiseIRQL(); 969 1 if(!ControlData.Abort) 970 1 { 971 2 bD13flags.bits.DCP_state = USBFSM4DCP_STALL; 972 2 973 2 } 974 1 LowerIRQL(); 975 1 } 976 977 void Chap9_SingleTransmitEP0(PUCHAR buf, USHORT len) 978 { 979 1 980 1 Hal4D13_SingleTransmitEP0(buf, len); 981 1 982 1 RaiseIRQL(); 983 1 if(!ControlData.Abort) C51 COMPILER V7.06 CHAP_9 08/18/2005 15:30:26 PAGE 17 984 1 { 985 2 ControlData.wLength = ControlData.wCount = len; 986 2 bD13flags.bits.DCP_state = USBFSM4DCP_HANDSHAKE; 987 2 988 2 } 989 1 LowerIRQL(); 990 1 } 991 992 void Chap9_BurstTransmitEP0(PUCHAR pData, USHORT len) 993 { 994 1 ControlData.wCount = 0; 995 1 if(ControlData.wLength > len) 996 1 ControlData.wLength = len; 997 1 998 1 ControlData.Addr.pData = pData; 999 1 1000 1 if( ControlData.wLength >= EP0_PACKET_SIZE) 1001 1 { 1002 2 Hal4D13_WriteEndpoint(EPINDEX4EP0_CONTROL_IN, pData, EP0_PACKET_SIZE); 1003 2 1004 2 RaiseIRQL(); 1005 2 if(!ControlData.Abort) 1006 2 { 1007 3 ControlData.wCount += EP0_PACKET_SIZE; 1008 3 bD13flags.bits.DCP_state = USBFSM4DCP_DATAIN; 1009 3 1010 3 } 1011 2 LowerIRQL(); 1012 2 } 1013 1 else 1014 1 { 1015 2 Hal4D13_WriteEndpoint(EPINDEX4EP0_CONTROL_IN, pData, ControlData.wLength); 1016 2 1017 2 RaiseIRQL(); 1018 2 if(!ControlData.Abort) 1019 2 { 1020 3 ControlData.wCount += ControlData.wLength; 1021 3 bD13flags.bits.DCP_state = USBFSM4DCP_HANDSHAKE; 1022 3 1023 3 } 1024 2 LowerIRQL(); 1025 2 } 1026 1 } 1027 *** ERROR C249 IN LINE 1027 OF CHAP_9.C: 'DATA': SEGMENT TOO LARGE C51 COMPILATION COMPLETE. 0 WARNING(S), 1 ERROR(S)