?? 00000005.htm
字號:
// Workaround for rev D errata number 8 <br /> // If you're certain that you will never run on rev D, <br /> // you can just do this: <br /> // SUDPTRH = MSB(dscr_ptr); <br /> // SUDPTRL = LSB(dscr_ptr); <br /> STRINGDSCR *sdp; <br /> BYTE len; <br /> sdp = dscr_ptr; <br /> len = sdp->length; <br /> if (len > SETUPDAT[6]) <br /> len = SETUPDAT[6]; //limit to the requested length <br /> while (len) <br /> { <br /> for(i=0; i<min(len,64); i++) <br /> *(IN0BUF+i) = *((BYTE xdata *)sdp+i); <br /> //set length and arm Endpoint <br /> EZUSB_SET_EP_BYTES(IN0BUF_ID,min(len,64)); <br /> len -= min(len,64); <br /> // Wait for it to go out (Rev C and above) <br /> while(EP0CS & 0x04) <br /> ; <br /> } <br /> // Arm a 0 length packet just in case. There was some reflector tr <br />affic about <br /> // Apple hosts asking for too much data. This will keep them happy <br /> and will <br /> // not hurt valid hosts because the next SETUP will clear this. <br /> EZUSB_SET_EP_BYTES(IN0BUF_ID,0); <br /> // Clear the HS-nak bit <br /> EP0CS = bmHS; <br /> } <br /> else <br /> EZUSB_STALL_EP0(); // Stall End Point 0 <br /> break; <br /> default: // Invalid request <br /> EZUSB_STALL_EP0(); // Stall End Point 0 <br /> } <br /> break; <br /> case SC_GET_INTERFACE: // *** Get Interface <br /> DR_GetInterface(); <br /> break; <br /> case SC_SET_INTERFACE: // *** Set Interface <br /> DR_SetInterface(); <br /> break; <br /> case SC_SET_CONFIGURATION: // *** Set Configuration <br /> DR_SetConfiguration(); <br /> break; <br /> case SC_GET_CONFIGURATION: // *** Get Configuration <br /> DR_GetConfiguration(); <br /> break; <br /> case SC_GET_STATUS: // *** Get Status <br /> if(DR_GetStatus()) <br /> switch(SETUPDAT[0]) <br /> { <br /> case GS_DEVICE: // Device <br /> IN0BUF[0] = ((BYTE)Rwuen << 1) | (BYTE)Selfpwr; <br /> IN0BUF[1] = 0; <br /> EZUSB_SET_EP_BYTES(IN0BUF_ID,2); <br /> break; <br /> case GS_INTERFACE: // Interface <br /> IN0BUF[0] = 0; <br /> IN0BUF[1] = 0; <br /> EZUSB_SET_EP_BYTES(IN0BUF_ID,2); <br /> break; <br /> case GS_ENDPOINT: // End Point <br /> IN0BUF[0] = EPIO[EPID(SETUPDAT[4])].cntrl & bmEPSTALL; <br /> IN0BUF[1] = 0; <br /> EZUSB_SET_EP_BYTES(IN0BUF_ID,2); <br /> break; <br /> default: // Invalid Command <br /> EZUSB_STALL_EP0(); // Stall End Point 0 <br /> } <br /> break; <br /> case SC_CLEAR_FEATURE: // *** Clear Feature <br /> if(DR_ClearFeature()) <br /> switch(SETUPDAT[0]) <br /> { <br /> case FT_DEVICE: // Device <br /> if(SETUPDAT[2] == 1) <br /> Rwuen = FALSE; // Disable Remote Wakeup <br /> else <br /> EZUSB_STALL_EP0(); // Stall End Point 0 <br /> break; <br /> case FT_ENDPOINT: // End Point <br /> if(SETUPDAT[2] == 0) <br /> { <br /> EZUSB_UNSTALL_EP( EPID(SETUPDAT[4]) ); <br /> EZUSB_RESET_DATA_TOGGLE( SETUPDAT[4] ); <br /> } <br /> else <br /> EZUSB_STALL_EP0(); // Stall End Point 0 <br /> break; <br /> } <br /> break; <br /> case SC_SET_FEATURE: // *** Set Feature <br /> if(DR_SetFeature()) <br /> switch(SETUPDAT[0]) <br /> { <br /> case FT_DEVICE: // Device <br /> if(SETUPDAT[2] == 1) <br /> Rwuen = TRUE; // Enable Remote Wakeup <br /> else <br /> EZUSB_STALL_EP0(); // Stall End Point 0 <br /> break; <br /> case FT_ENDPOINT: // End Point <br /> if(SETUPDAT[2] == 0) <br /> EZUSB_STALL_EP( EPID(SETUPDAT[4]) ); <br /> else <br /> EZUSB_STALL_EP0(); // Stall End Point 0 <br /> break; <br /> } <br /> break; <br /> default: // *** Invalid Command <br /> EZUSB_STALL_EP0(); // Stall End Point 0 <br /> } <br /> break; <br /> case SETUP_VENDOR_REQUEST: //Vendor Request <br /> if(DR_VendorCmnd()) <br /> EZUSB_STALL_EP0(); // Stall End Point 0 <br /> break; <br /> case SETUP_CLASS_REQUEST: //Class Request <br /> if(DR_ClassRequest()) <br /> EZUSB_STALL_EP0(); // Stall End Point 0 <br /> break; <br /> default: //Reserved or illegal <br /> EZUSB_STALL_EP0(); // Stall End Point 0 <br /> break; <br /> } <br /> // Acknowledge handshake phase of device request <br /> // Required for rev C does not effect rev B <br /> EP0CS |= bmBIT1; <br />} <br />// Wake-up interrupt handler <br />void resume_isr(void) interrupt WKUP_VECT <br />{ <br /> EZUSB_CLEAR_RSMIRQ(); <br />} <br />#pragma NOIV // Do not generate interrupt vectors <br />//-------------------------------------------------------------------------- <br />--- <br />// File: ezkeyboard.c <br />// Contents: Hooks required to implement USB peripheral keyboard function. <br />// <br />// Copyright (c) 2001 Cypress Semiconductor, Inc. All rights reserved <br />//-------------------------------------------------------------------------- <br />--- <br />#include <ezusb.h> <br />#include <ezregs.h> <br />#define min(a,b) (((a)<(b))?(a):(b)) <br />#define GD_HID 0x21 <br />#define GD_REPORT 0x22 <br />#define CR_SET_REPORT 0x09 <br />#define HID_OUTPUT_REPORT 2 <br />#define BTN_ADDR 0x41 <br />#define LED_ADDR 0x42 <br />extern BOOL GotSUD; // Received setup data flag <br />extern BOOL Sleep; <br />WORD pHIDDscr; <br />WORD pReportDscr; <br />WORD pReportDscrEnd; <br />extern code HIDDscr; <br />extern code ReportDscr; <br />extern code ReportDscrEnd; <br />void TD_Poll(void); <br />BYTE Configuration; // Current configuration <br />BYTE AlternateSetting; // Alternate settings <br />BYTE buttons; <br />BYTE oldbuttons; <br />BYTE leds = 0xFF; <br />BYTE read_buttons (void); <br />void write_leds (BYTE d); <br />//-------------------------------------------------------------------------- <br />--- <br />// Task Dispatcher hooks <br />// The following hooks are called by the task dispatcher. <br />//-------------------------------------------------------------------------- <br />--- <br />void TD_Init(void) // Called once at startup <br />{ <br /> // Enable endpoint 2 in <br /> IN07VAL = bmEP2; // Validate all EP's <br /> OUT07VAL = bmEP2; <br /> // Setup breakpoint to trigger on TD_Poll() <br /> BPADDR = (WORD)TD_Poll; <br /> USBBAV |= bmBPEN; // Enable the breakpoint <br /> USBBAV &= ~bmBPPULSE; <br /> write_leds (0xFF); <br />} <br />BYTE read_buttons (void) <br />{ <br /> BYTE d; <br /> while (I2CS & 0x40); //Wait for stop to be done <br /> I2CS = 0x80; //Set start condition <br /> I2DAT = BTN_ADDR; //Write button address <br /> while (!(I2CS & 0x01)); //Wait for done <br /> I2CS = 0x20; //Set last read <br /> d = I2DAT; //Dummy read <br /> while (!(I2CS & 0x01)); //Wait for done <br /> I2CS = 0x40; //Set stop bit <br /> return(I2DAT); //Read the data <br />} <br />void write_leds (BYTE d) <br />
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -