zhonghong200
驱动牛犊
驱动牛犊
  • 注册日期2009-12-03
  • 最后登录2012-04-24
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望311点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1387回复:0

windows xp USB 摄像机驱动开发讨论,欢迎大家批评指正

楼主#
更多 发布于:2009-12-27 21:50
开发环境

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);
}
}
欢迎大家一起讨论,共同学习
游客

返回顶部