阅读:2153回复:0
68013如何相应用户自定义的厂商命令请求?
文字
大家好,我问一个关于68013用户自定义请求的问题: #define VX_B2 0xB2 // turn ON debug LEDs... #define VX_B3 0xB3 // turn OFF debug LEDs... #define VX_B7 0xB7 // re-initialize, call TD_Init( ); #define VX_B8 0xB8 // do a "soft reset", vector to org 00h #define VX_BA 0xBA // commit out pkt. new way #define VX_BB 0xBB // commit in pkt. new way #define VX_C2 0xC2 // source out pkt. #define VX_BC 0xBC // turn OFF debug LEDs... #define VX_BD 0xBD // turn OFF debug LEDs... #define VX_BE 0xBE // turn OFF debug LEDs... #define VX_BF 0xBF // turn OFF debug LEDs... #define VX_C3 0xC3 // turn OFF debug LEDs... // Core uses bRequest value 0xA0 for Anchor downloads/uploads... // Cypress Semiconductor reserves bRequest values 0xA1 through 0xAF... // Your implementation should not use the above bRequest values... // Also, previous fw.c versions trap all bRequest values 0x00 through 0x0F... // // bRequest value: SETUPDAT[1] // standard, 0x00 through 0x0F // // bmRequest value: SETUPDAT[0] // standard, 0x80 IN Token // vendor, 0xC0 IN Token // class, 0xA0 IN Token // standard, 0x00 OUT Token // vendor, 0x40 OUT Token // class, 0x60 OUT Token BOOL DR_VendorCmnd( void ) { // Registers which require a synchronization delay, see section 15.14 // FIFORESET FIFOPINPOLAR // INPKTEND OUTPKTEND // EPxBCH:L REVCTL // GPIFTCB3 GPIFTCB2 // GPIFTCB1 GPIFTCB0 // EPxFIFOPFH:L EPxAUTOINLENH:L // EPxFIFOCFG EPxGPIFFLGSEL // PINFLAGSxx EPxFIFOIRQ // EPxFIFOIE GPIFIRQ // GPIFIE GPIFADRH:L // UDMACRCH:L EPxGPIFTRIG // GPIFTRIG // Note: The pre-REVE EPxGPIFTCH/L register are affected, as well... // ...these have been replaced by GPIFTC[B3:B0] registers switch( SETUPDAT[ 1 ] ) { case VX_B2: { // turn OFF debug LEDs... ledX_rdvar = LED0_ON; // visual ledX_rdvar = LED1_ON; // visual ledX_rdvar = LED2_ON; // visual ledX_rdvar = LED3_ON; // visual *EP0BUF = VX_B2; EP0BCH = 0; EP0BCL = 1; // Arm endpoint with # bytes to transfer EP0CS |= bmHSNAK; // Acknowledge handshake phase of device request break; } case VX_B3: { // turn OFF debug LEDs... ledX_rdvar = LED0_OFF; // visual ledX_rdvar = LED1_OFF; // visual ledX_rdvar = LED2_OFF; // visual ledX_rdvar = LED3_OFF; // visual *EP0BUF = VX_B3; EP0BCH = 0; EP0BCL = 1; // Arm endpoint with # bytes to transfer EP0CS |= bmHSNAK; // Acknowledge handshake phase of device request break; } case VX_BC: { // turn OFF debug LEDs... *EP0BUF = num; //传输num EP0BCH = 0; EP0BCL = 1; // Arm endpoint with # bytes to transfer EP0CS |= bmHSNAK; // Acknowledge handshake phase of device request break; } default: { ledX_rdvar = LED3_ON; // debug visual, stuck "ON" to warn developer... return( FALSE ); // no error; command handled OK } } return( FALSE ); // no error; command handled OK } 红色部分为硬件响应用户请求的代码,注意:这里的VX_BC是自己定义的 而上层应用程序的deviceiocontrol中控制码用的是IOCTL_EZUSB_VENDOR_OR_CLASS_REQUEST bResult = DeviceIoControl (m_hDevice, IOCTL_EZUSB_VENDOR_OR_CLASS_REQUEST, &myRequest, //sizeof(IOCTL_EZUSB_GET_CURRENT_FRAME_NUMBER), sizeof(VENDOR_OR_CLASS_REQUEST_CONTROL), buffer, //固件返回的数值 bufferSize,//返回数值大小 (unsigned long *)&lenBytes, NULL); 头文件中#define IOCTL_EZUSB_VENDOR_OR_CLASS_REQUEST CTL_CODE(FILE_DEVICE_UNKNOWN, \ Ezusb_IOCTL_INDEX+22,\ METHOD_IN_DIRECT, \ FILE_ANY_ACCESS) 请问固件到底怎么相应用户定义的控制码? 具体流程是什么? 谢谢! |
|
最新喜欢:![]() |