阅读:1169回复:0
怎么通过固件程序得到buildvendorrequest中的参数?
NTSTATUS 1581_DriverDevice::D12_DRIVER_VENDOR_REQUEST_Handler(KIrp I)
{ PURB pUrb; NTSTATUS status; t << "1581_DRIVER_VENDOR_REQUEST_Handler, " << I << EOL; pUrb = m_Lower.BuildVendorRequest( (unsigned char *)I.IoctlBuffer(), // transfer buffer I.IoctlInputBufferSize(), // transfer buffer size 0, // ReservedBits 0x0c, // Request 0, // Value 0, // Direction 0, // bShortOk NULL, // Link 0x0471, // wIndex URB_FUNCTION_VENDOR_DEVICE, // Function NULL //pUrb ); if ( pUrb == NULL ) { status = STATUS_INSUFFICIENT_RESOURCES; } else { // submit the URB to USBD status = m_Lower.SubmitUrb(pUrb); delete pUrb; } return status; } 我是依据别人例子来设置的,请问这些参数设置要求很严格吗? 厂商请求在固件中有这样的函数 //*********************************************************************** //厂商请求处理 void Vendor_Specific_Command(void) { if(USB_Device_Request.bRequest == 0x0C) { switch (USB_Device_Request.wIndex) { case GET_FIRMWARE_VERSION ://获取固件版本 if(USB_Device_Request.wLength == 1) { //select endpoint D14_Cntrl_Reg.D14_ENDPT_INDEX = 1; //set the data length to 1 byte D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 1; D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0; //sent 0x21 as data D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x21;//版本号 wait_ep0tx(); ep0out_ack(); // ep0in_ack(); break; } case SETUP_DMA_REQUEST : //Out Token Ack detected wait_ep0rx(); D14_Cntrl_Reg.D14_ENDPT_INDEX = 0; // FileSize.Size.Address[0] = D14_Cntrl_Reg.D14_DATA_PORT_LSB; FileSize.Size.Address[1] = D14_Cntrl_Reg.D14_DATA_PORT_LSB; FileSize.Size.Address[2] = D14_Cntrl_Reg.D14_DATA_PORT_LSB; //读取传输字节数 Temp = D14_Cntrl_Reg.D14_DATA_PORT_LSB; bytecount = D14_Cntrl_Reg.D14_DATA_PORT_LSB; bytecount <<= 8; bytecount |= Temp; //读取传输方式 FileSize.Size.DIR = D14_Cntrl_Reg.D14_DATA_PORT_LSB; ep0in_ack(); Kernel_Flag.BITS.Transfer_Start = 1;//标志传输数据开始 break; default : if(USB_Device_Request.bmRequestType == 0xC0) { ep0in_ack(); break; } if(USB_Device_Request.bmRequestType == 0x40) { D14_Cntrl_Reg.D14_ENDPT_INDEX = 0; D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1; while(!USB_Int_Flag.BITS.EP0SETUP) { //读取ISP1581中断寄存器 USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE; //回写ISP1581中断寄存器 D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE; if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET) return; } USB_Int_Flag.BITS.EP0TX = 0; break; } } } } 但是我不知道怎么通过固件程序得到buildvendorrequest中的参数,哪位帮帮忙,多谢了 |
|