flowerb
驱动牛犊
驱动牛犊
  • 注册日期2001-05-28
  • 最后登录2002-07-19
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2238回复:6

PDIUSB12 中的IOCTL_READ_REGISTERS IOCTL调用问题

楼主#
更多 发布于:2002-06-15 02:23
我写的PDIUSB12 WDM驱动程序可以运行,可以选择CONFIG了。我做了几个IOCTL接口供应用程序调用,有
IOCTL_D12_GET_DEVICE_DESCRIPTOR,IOCTL_D12_GET_DEVICE_DESCRIPTOR,IOCTL_D12_GE
T_DEVICE_DESCRIPTOR,
这些都成功了,我自己写了一个WIN32程序可以成功地调用这三个接口了。但是我看了别人的WIN32源程序,就是在驱动开发网下载的那个,里边有一个IOCTL_READ_REGISTERS的IOCTL调用,我想应该是一个VENDOR自定义的IO操作,但我不知道如何用UsbBuildVendorRequest去
构建相应的URB。请问各位大侠知道怎么办吗?

最新喜欢:

r2109twr2109t...
为了中国IC
taoyijian
驱动牛犊
驱动牛犊
  • 注册日期2004-12-27
  • 最后登录2006-02-25
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-05-12 14:45
能把pdiusb12 的驱动程序代码给我一份么,我参考一下 ,谢谢了。

taoyijian@163.com
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-22 10:55
对已经写好的固件程序是如此。
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
flowerb
驱动牛犊
驱动牛犊
  • 注册日期2001-05-28
  • 最后登录2002-07-19
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-06-19 00:49
Request, Value, Index的定义应该是厂商事先定义好了的吧?
当然,自己可以通过驱动程序改变它和WIN32应该程序的接口,但是如果和硬件打交道,那些值好像应该就确定的,您说是吗。
为了中国IC
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-06-18 11:22
这就是USB灵活的地方,Request、Value、Index的定义和使用完全由设备驱动程序和固件程序定义,没有使用固件程序不好办。
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
flowerb
驱动牛犊
驱动牛犊
  • 注册日期2001-05-28
  • 最后登录2002-07-19
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-06-18 01:20
请看看,有重要问题:
我想问的正是它的Request和Index的号码。其中ReadRegister的操作我已经成功了。我是用了一个大大的循环来试出的Request和Index的值,也许某个文档上有它的值,只是我没有注意到罢了。下边是我的代码:
///////////////////////////////////////////////////////////////////////////////
#pragma LOCKEDCODE
NTSTATUS ReadRegister(PDEVICE_OBJECT fdo, PIRP Irp)
{ //ReadRegister
NTSTATUS status = STATUS_SUCCESS;
PURB urb = (PURB) ExAllocatePool(NonPagedPool, sizeof(_URB_BULK_OR_INTERRUPT_TRANSFER));
if (!urb)
{
KdPrint((DRIVERNAME \" - Unable to allocate interrupt polling URB\\n\"));
IoFreeIrp(Irp);
return STATUS_INSUFFICIENT_RESOURCES;
}

//This loop just for test, It\'s no use in final code.
for(ULONG i=0; i<1; i++)
{
UsbBuildVendorRequest(urb,
                          URB_FUNCTION_VENDOR_DEVICE,
 sizeof (struct _URB_CONTROL_DESCRIPTOR_REQUEST),
                          USBD_TRANSFER_DIRECTION_IN,
                          0,
                          IOCTL_READ_REGISTERS,      //Request,read_write_register
                          0, //Value
                          GET_FIRMWARE_VERSION, //Index
 Irp->UserBuffer, //Transfer Buffer
                          NULL, //TransferBufferMDL
 1, //TransferBufferLength
 NULL);


status = SendAwaitUrb(fdo, urb); //The same function is as CallUSBDI();
if(!NT_SUCCESS(status))
{
KdPrint((\"___Read 472 register failed status = %x i = %d\\n\", status, i));
}
else
{
KdPrint((\"___Read 472 register successfully. r = %x i = %d\\n\", (PCHAR)Irp->UserBuffer, i));
}
}
return status;
} //ReadRegister
现在我的问题是Write Register的操作我又不知道怎么办了,我写了如下代码,但是却是失败的:
///////////////////////////////////////////////////////////////////////////////
#pragma LOCKEDCODE
NTSTATUS WriteRegister(PDEVICE_OBJECT fdo, PIRP Irp)
{                                    //WriteRegister
NTSTATUS status = STATUS_SUCCESS;
PURB urb = (PURB) ExAllocatePool(NonPagedPool, sizeof(_URB_BULK_OR_INTERRUPT_TRANSFER));
if (!urb)
{
KdPrint((DRIVERNAME \" - Unable to allocate interrupt polling URB\\n\"));
IoFreeIrp(Irp);
return STATUS_INSUFFICIENT_RESOURCES;
}

PIO_REQUEST ioRequest;
PIO_BLOCK   ioBlock;
ioBlock = (PIO_BLOCK)Irp->AssociatedIrp.SystemBuffer;
ioRequest = (PIO_REQUEST)ioBlock->pbyData;

KdPrint((\"ioRequest->uAddressL = 0x%x \\n\", ioRequest->uAddressL));
KdPrint((\"ioRequest->bAddressH = 0x%x \\n\", ioRequest->bAddressH));
KdPrint((\"ioRequest->uSize     = 0x%x \\n\", ioRequest->uSize));
KdPrint((\"ioRequest->bCommand  = 0x%x \\n\", ioRequest->bCommand));

//This loop just for test, It\'s no use in final code.
for(ULONG i=0; i<1; i++)
{
UsbBuildVendorRequest(urb,
                          URB_FUNCTION_VENDOR_DEVICE,
 sizeof (struct _URB_CONTROL_DESCRIPTOR_REQUEST),
                          USBD_TRANSFER_DIRECTION_OUT,
                          0,
                          IOCTL_WRITE_REGISTERS,     //Request,read_write_register
                          0, //Value
                          SETUP_DMA_REQUEST, //Index
 (PVOID)ioRequest,          //ioRequest->uSize,             //Transfer Buffer
                          NULL, //TransferBufferMDL
 sizeof(PIO_REQUEST), //TransferBufferLength
 NULL);


status = SendAwaitUrb(fdo, urb); //The same function is as CallUSBDI();
if(!NT_SUCCESS(status))
{
KdPrint((\"___Write xSETUP_DMA_REQUEST register failed status = %x i = %d\\n\", status, i));
}
else
{
KdPrint((\"___Write xSETUP_DMA_REQUEST register successfully.  i = %d\\n\", i));
}
}
return status;
}                             //WriteRegister

请问大侠,应该怎么办? :D :cool: :D :(
为了中国IC
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-06-15 12:22
这是我经过无数次检验的代码,应该很适合你
NTSTATUS
UsbDriverControlVendorCommandWorker(
    IN PVOID DeviceContext,
    IN UCHAR Request,
    IN USHORT Value,
    IN USHORT Index,
    IN PVOID Buffer,
    IN OUT PULONG BufferLength,
    IN BOOLEAN GetData
    )
/*++

Routine Description:

    Send a vendor command to the camera to fetch data.

Arguments:

    DeviceObject - pointer to the device object for this instance of the USB camera
                    devcice.

    Request - Request code for setup packet.

    Value - Value for setup packet.

    Index - Index for setup packet.

    Buffer - Pointer to input buffer

    BufferLength - pointer size of input/output buffer (optional)

Return Value:

    NT status code

--*/
{
    NTSTATUS ntStatus;
    BOOLEAN allocated = FALSE;
    PUCHAR localBuffer;
    PUCHAR buffer;
    PURB urb;
PDEVICE_OBJECT deviceObject;
    ULONG length = BufferLength ? *BufferLength : 0;

USHORT i;
#if DBG
    DebugPrint(\"\'enter USBCAMD_ControlVendorCommand\\n\");
#endif
    deviceObject = (PDEVICE_OBJECT)DeviceContext;

    buffer = (PUCHAR)UsbDriverExAllocatePool(NonPagedPool,
                            sizeof(struct
                            _URB_CONTROL_VENDOR_OR_CLASS_REQUEST) + length);


    if (buffer) {
        urb = (PURB) (buffer + length);
#if DBG
        DebugPrint(\"enter UsbDriverControlVendorCommand() req %x val %x index %x\\n\",
            Request, Value, Index);
#endif
        if (BufferLength && *BufferLength != 0) {
            localBuffer = buffer;
            if (!GetData) {
                RtlCopyMemory(localBuffer, Buffer, *BufferLength);
            }    
        } else {
            localBuffer = NULL;
        }

        UsbBuildVendorRequest(urb,
                              URB_FUNCTION_VENDOR_DEVICE,
                              sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST),
                              GetData ? USBD_TRANSFER_DIRECTION_IN : 0,
                              0,
                              Request,
                              Value,
                              Index,
                              localBuffer,
                              NULL,
                              length,
                              NULL);
#if DBG
        DebugPrint(\"BufferLength =  0x%x buffer = 0x%x\\n\",
            length, localBuffer);
#endif
        ntStatus = UsbDriverCallUSBD(deviceObject, urb);

        if (NT_SUCCESS(ntStatus)) {
            if (BufferLength) {
                *BufferLength =
                    urb->UrbControlVendorClassRequest.TransferBufferLength;
#if DBG                                
                DebugPrint(\"\'BufferLength =  0x%x buffer = 0x%x\\n\",
                    *BufferLength, localBuffer);
#endif
                if (localBuffer && GetData) {
                    RtlCopyMemory(Buffer, localBuffer, *BufferLength);
                }                
            }                
        }

        UsbDriverExFreePool(buffer);
    } else {
        ntStatus = STATUS_INSUFFICIENT_RESOURCES;
    }
#if DBG
    DebugPrint(\"exit UsbDriverControlVendorCommand() 0x%x\\n\", ntStatus);
#endif
    return ntStatus;
}
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
游客

返回顶部