darydl
驱动小牛
驱动小牛
  • 注册日期2003-06-29
  • 最后登录2017-05-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1169回复:0

怎么通过固件程序得到buildvendorrequest中的参数?

楼主#
更多 发布于:2004-06-20 16:44
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中的参数,哪位帮帮忙,多谢了
游客

返回顶部