阅读:1387回复:0
windows xp USB 摄像机驱动开发讨论,欢迎大家批评指正
开发环境
windows xp +ddk +driver studio 3.2 +vc6.0 我现在的主要问题是对usb端点的读写没有搞太清楚,我们的摄像机主要有2个端点 端点0用于发送控制命令,比如我发送一个F1 xx xx xx xx xx xx xx,给相机 然后相机就通过端点6给我返回一副图像 我现在的问题是想请教大家: 问题(1): 是不是driver studio 不要自己设置和获取设备,接口那些描述符呢,我看所有的driver studio 都没有设置描述符,是不是driver studio 生成的程序框架已经给我们生成了呢? 问题2:大家对usb端点的读写怎是怎么做的,可以指点一些方法,我是以控制的方式去读写端点的数据,比如Endpoint1IN等等 我是这么做的,我讲讲我的思路,大家看看我的正确不: (1)首先用driver studio 3.2 生成驱动框架,设置了一个端点6用于数据的读取,默认的端点0用于发送命令,我的通信协议是这样的,当上位机(PC)发送F1 xx xx xx xx xx xx xx 给相机时,相机就通过发送一副图像给端点6,然后上位机去读取端点6中的数据: 我在驱动中使用DeviceControl和应用程序进行通信, NTSTATUS CameraDevice::DeviceControl(KIrp I) { T.Trace(TraceInfo, __FUNCTION__"++. IRP %p\n", I); NTSTATUS status = STATUS_SUCCESS; switch (I.IoctlCode()) { case Camera_IOCTL_Control: status = Camera_IOCTL_Control_Handler(I);//设置控制参数; break; case Camera_IOCTL_Read: status = Camera_IOCTL_Read_Handler(I);//读端口6中的数据; break; case Camera_IOCTL_Write: status = Camera_IOCTL_Write_Handler(I); break; default: status = STATUS_INVALID_DEVICE_REQUEST; break; } if (status != STATUS_PENDING) { I.PnpComplete(this, status); } T.Trace(TraceInfo, __FUNCTION__"--. IRP %p, STATUS %x\n", I, status); return status; } 在应用程序中 使用openbyinterface()函数得到打开设备 然后使用DeviceIoControl 把控制命令发过去,我用bushound 查看,命令是发送过去了,但是相机没有给我 返回图像数据,是哪个地方出错了呢 void CTest_CameraDlg::TestControlParam()//这样参数传进去不行啊 { UCHAR bufInput[IOCTL_INBUF_SIZE]={0x40,0xF1,0x00,0x00,0x00,0x00,0x08,0x00}; // Input to device UCHAR bufOutput[IOCTL_OUTBUF_SIZE]; // Output from device ULONG nOutput; // Count written to bufOutput if (!DeviceIoControl(m_hDevice, Camera_IOCTL_Control, bufInput, IOCTL_INBUF_SIZE, bufOutput, IOCTL_OUTBUF_SIZE, &nOutput, NULL) ) { MessageBox("Camera_IOCTL_Control", "错误", MB_OK | MB_ICONHAND);// } else { CString str; str.Format("0x%x",bufOutput); SetDlgItemText(IDC_OutputEndpoint,str); } } 欢迎大家一起讨论,共同学习 |
|