ÔÄ 6392|»Ø 8

69

Ìû×Ó

0

TAµÄ×ÊÔ´

Ò»Á£½ðÉ°£¨³õ¼¶£©

Â¥Ö÷
 

ΪʲôijЩ»úÆ÷ÉÏϵͳ»áhangÔÚIoCallDriver?Ö»ÓÐÖØÆô£¬ÄÚ¸½´úÂë [¸´ÖÆÁ´½Ó]

NTSTATUS
StartReadUrb(
        PDEVICE_EXTENSION Extension
        )
{                                                        // StartInterruptUrb

        // If the interrupt polling IRP is currently running, don't try to start
        // it again.
    USBD_PIPE_HANDLE PipeHandle;
        BOOLEAN startirp;
        KIRQL oldirql;
        PIRP Irp;
        PURB urb;
        PUSB_DATA_PIPE_CONTEXT rwcontext;
        PIO_STACK_LOCATION stack;
        NTSTATUS status;

        TRACE("Enter StartReadUrbnew() DO=%X\n",Extension->DeviceObject);
//        KeAcquireSpinLock(&Extension->polllock, &oldirql);
        if (Extension->readpending)
                startirp = FALSE;
        else
                startirp = TRUE, Extension->readpending = TRUE;
//        KeReleaseSpinLock(&Extension->polllock, oldirql);

        if (!startirp)
        {
                TRACE("Read Pending\n");
                return STATUS_DEVICE_BUSY;        // already pending
        }
        Irp = IoAllocateIrp(Extension->TopOfStackDeviceObject->StackSize + 1, FALSE);

        urb = ExAllocatePool(NonPagedPool,
                         sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER));
       
        rwcontext = ExAllocatePool(NonPagedPool,
                sizeof(struct _USB_DATA_PIPE_CONTEXT));

        rwcontext->Extension = Extension;
        rwcontext->urb = urb;
       
        if(Extension->UsbInterface == NULL)
        {
                TRACE("Extension->UsbInterface is NULL\n");
                return STATUS_INSUFFICIENT_RESOURCES;
        }
    PipeHandle = Extension->UsbInterface->Pipes[Extension->DataInPipe].PipeHandle;

        ASSERT(Irp && urb);

        TRACE("Prepare data for StartReadUrb()\n");
        // Acquire the remove lock so we can't remove the device while the IRP
        // is still active.
/*
        NTSTATUS status = IoAcquireRemoveLock(&Extension->RemoveLock, Irp);
        if (!NT_SUCCESS(status))
                {
                Extension->pollpending = 0;
                return status;
                }
*/
        // Initialize the URB we use for reading the interrupt pipe

        UsbBuildInterruptOrBulkTransferRequest(
                urb,
                sizeof (struct _URB_BULK_OR_INTERRUPT_TRANSFER),
                PipeHandle,
                Extension->ReadData,
                NULL,
                InPipeMaxSize,
                USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK,
                NULL);

        // Initialize the IRP for an internal control request

        stack = IoGetNextIrpStackLocation(Irp);
        RtlZeroMemory(stack, sizeof(IO_STACK_LOCATION));
        stack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
        stack->Parameters.Others.Argument1 = urb;
        stack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB;

        // Install "OnInterrupt" as the completion routine for the polling IRP.
       
        IoSetCompletionRoutine(
                Irp,
                (PIO_COMPLETION_ROUTINE) OnReadInterrupt,
                rwcontext,
                TRUE,
                TRUE,
                TRUE);
       
        // This IRP might have been cancelled the last time it was used, in which case
        // the cancel flag will still be on. Clear it to prevent USBD from thinking that it's
        // been cancelled again! A better way to do this would be to call IoReuseIrp,
        // but that function is not declared in WDM.H.

        Irp->Cancel = FALSE;

//        UsbCom_IncrementIoCount(Extension->DeviceObject); //

        TRACE("IoCallDriver\n");
        status = IoCallDriver(Extension->TopOfStackDeviceObject, Irp);
        TRACE("Exit StartReadUrbnew()\n");
        return status;
}       

¾­³£×ßµ½status = IoCallDriver(Extension->TopOfStackDeviceObject, Irp);»úÆ÷Õû¸ö¾ÍhangµôÁË
Çë¸ßÊÖÖ¸µãÒ»¶þ£¬Ê²Ã´Ô­Òò»áµ¼ÖÂÕâÖÖÏÖÏó£¿

×îлظ´

лл¸÷룬¹ûÈ»ÊÇIRQLevelÌ«¸ßÒýÆðµÄ£¬ÎÒÏÖÔÚÔÚPASSIVE_LEVELÏÂÃæµ÷ÓþÍûÓÐÎÊÌâ¡£ Õâ¸öÆäʵºÍÿ¸öϵͳҲÓйØϵ¡£  ÏêÇé »Ø¸´ ·¢±íÓÚ 2008-5-2 09:09
µãÔÞ ¹Ø×¢

»Ø¸´
¾Ù±¨

69

Ìû×Ó

0

TAµÄ×ÊÔ´

Ò»Á£½ðÉ°£¨³õ¼¶£©

ɳ·¢
 
¸½ÉÏlog
Entering DriverEntry(), RegistryPath=
exiting DriverEntry
enter UsbCom_PnPAddDevice()
enter UsbCom_CreateDeviceObject()
Enter SerialGetRegistryKeyValue
***** DRV=862d4040 PDO=8626dde8 FDO=86268030 (\Device\SOPE1USB1) *****
SUCCEEDED  IoSetDeviceInterfaceState()
DO=86268030 SYMBOLIC LINK =
UsbCom_QueryCapabilities() ntStatus from IoCallDriver to PCI = 0x0
Enter UsbCom_SelfSuspendOrActivate(),fSuspend = 1
ABORTING UsbCom_SelfSuspendOrActivate()
exit UsbCom_PnPAddDevice() (0)
enter UsbCom_ProcessPnPIrp() IRP_MJ_PNP, minor PowerSystemWorking, -- 18
UsbCom_ProcessPnPIrp() Minor PnP IOCTL not handled
UsbCom_ProcessPnPIrp() Passing PnP Irp down, status = 0
UsbCom_ProcessPnPIrp() Exit UsbCom_ProcessPnPIrp c00000bb
enter UsbCom_ProcessPnPIrp() IRP_MJ_PNP, minor IRP_MN_QUERY_RESOURCE_REQUIREMENTS, -- b
UsbCom_ProcessPnPIrp() Minor PnP IOCTL not handled
UsbCom_ProcessPnPIrp() Passing PnP Irp down, status = 0
UsbCom_ProcessPnPIrp() Exit UsbCom_ProcessPnPIrp 2
enter UsbCom_ProcessPnPIrp() IRP_MJ_PNP, minor IRP_MN_FILTER_RESOURCE_REQUIREMENTS, -- d
UsbCom_ProcessPnPIrp() Minor PnP IOCTL not handled
UsbCom_ProcessPnPIrp() Passing PnP Irp down, status = 0
UsbCom_ProcessPnPIrp() Exit UsbCom_ProcessPnPIrp c00000bb
enter UsbCom_ProcessPnPIrp() IRP_MJ_PNP, minor IRP_MN_START_DEVICE, -- 0
enter UsbCom_ProcessSysControlIrp()
enter UsbCom_StartDevice
UsbCom_ProcessSysControlIrp() Exit UsbCom_ProcessSysControlIrp 0
UsbCom_StartDevice() SUCCESS ExAllocatePool() for URB_CONTROL_DESCRIPTOR_REQUESTUsbCom_StartDevice() SUCESS ExAllocatePool() for deviceDescriptor
UsbCom_CallUSBD() (0) DO=86268030 Urb=87ad4fb0 Irp=87cdef20
Device Descriptor = 87918fe8, len 0x12
I82930 Device Descriptor:
-------------------------
bLength 18
bDescriptorType 0x1
bcdUSB 0x200
bDeviceClass 0x0
bDeviceSubClass 0x0
bDeviceProtocol 0x0
bMaxPacketSize0 0x40
idVendor 0xa5c
idProduct 0x2132
bcdDevice 0x202
iManufacturer 0x0
iProduct 0x0
iSerialNumber 0x0
bNumConfigurations 0x1
enter UsbCom_ConfigureDevice
UsbCom_CallUSBD() (1) DO=86268030 Urb=87e98fb0 Irp=87d22f20
UsbCom_CallUSBD() (2) DO=86268030 Urb=87e98fb0 Irp=8801cf20
UsbCom_SelectInterface() DO=86268030 Interfaces=1
UsbCom_CallUSBD() (3) DO=86268030 Urb=862794c8 Irp=877e0f20
---------
NumberOfPipes 0x3
Length 0x4c
Alt Setting 0x0
Interface Number 0x0
Class, subclass, protocol 0xff 0x0 0x0
---------
PipeType 0x3
EndpointAddress 0x81
MaxPacketSize 0x10
Interval 0x4
Handle 0x8630726c
MaximumTransferSize 0x400
InterruptPipe 0x0
---------
PipeType 0x2
EndpointAddress 0x2
MaxPacketSize 0x200
Interval 0x0
Handle 0x8630728c
MaximumTransferSize 0x400
DataOutPipe 0x1
---------
PipeType 0x2
EndpointAddress 0x82
MaxPacketSize 0x200
Interval 0x0
Handle 0x863072ac
MaximumTransferSize 0x400
DataInPipe 0x2
---------
SERIAL: The default interrupt read buffer size is: 0
------  The XoffLimit is                         : 0
------  The XonLimit is                          : 0
------  The pt 8 size is                         : 0
exit UsbCom_StartDevice (0)
enter UsbCom_ProcessPnPIrp() IRP_MJ_PNP, minor IRP_MN_QUERY_CAPABILITIES, -- 9
[ss] Allow surprise removals --
Allow surprise removals
enter UsbCom_ProcessPnPIrp() IRP_MJ_PNP, minor IRP_MN_QUERY_BUS_INFORMATION, -- 14
UsbCom_ProcessPnPIrp() Minor PnP IOCTL not handled
UsbCom_ProcessPnPIrp() Passing PnP Irp down, status = 0
UsbCom_ProcessPnPIrp() Exit UsbCom_ProcessPnPIrp 2
UsbCom_ProcessPowerIrp() IRP_MJ_POWER
UsbCom_ProcessPowerIrp() UNKNOWN POWER MESSAGE (ff)
Exit UsbCom_ProcessPowerIrp()  ntStatus = 0xc00000bb
enter UsbCom_ProcessSysControlIrp()
UsbCom_ProcessSysControlIrp() Exit UsbCom_ProcessSysControlIrp 0
enter UsbCom_ProcessPnPIrp() IRP_MJ_PNP, minor IRP_MJ_INTERNAL_DEVICE_CONTROL, -- ff
UsbCom_ProcessPnPIrp() Minor PnP IOCTL not handled
UsbCom_ProcessPnPIrp() Passing PnP Irp down, status = 0
UsbCom_ProcessPnPIrp() Exit UsbCom_ProcessPnPIrp c00000bb
enter UsbCom_ProcessPnPIrp() IRP_MJ_PNP, minor IRP_MN_QUERY_DEVICE_RELATIONS, -- 7
UsbCom_ProcessPnPIrp() Minor PnP IOCTL not handled
UsbCom_ProcessPnPIrp() Passing PnP Irp down, status = 0
UsbCom_ProcessPnPIrp() Exit UsbCom_ProcessPnPIrp c00000bb
enter UsbCom_ProcessPnPIrp() IRP_MJ_PNP, minor IRP_MN_QUERY_DEVICE_RELATIONS, -- 7
UsbCom_ProcessPnPIrp() Minor PnP IOCTL not handled
UsbCom_ProcessPnPIrp() Passing PnP Irp down, status = 0
UsbCom_ProcessPnPIrp() Exit UsbCom_ProcessPnPIrp c00000bb
enter UsbCom_ProcessPnPIrp() IRP_MJ_PNP, minor IRP_MN_QUERY_DEVICE_TEXT, -- c
UsbCom_ProcessPnPIrp() Minor PnP IOCTL not handled
UsbCom_ProcessPnPIrp() Passing PnP Irp down, status = 0
UsbCom_ProcessPnPIrp() Exit UsbCom_ProcessPnPIrp c00000bb
enter UsbCom_ProcessPnPIrp() IRP_MJ_PNP, minor IRP_MN_QUERY_PNP_DEVICE_STATE, -- 13
UsbCom_ProcessPnPIrp() Minor PnP IOCTL not handled
UsbCom_ProcessPnPIrp() Passing PnP Irp down, status = 0
UsbCom_ProcessPnPIrp() Exit UsbCom_ProcessPnPIrp c00000bb
enter UsbCom_ProcessPnPIrp() IRP_MJ_PNP, minor IRP_MN_QUERY_DEVICE_RELATIONS, -- 7
UsbCom_ProcessPnPIrp() Minor PnP IOCTL not handled
UsbCom_ProcessPnPIrp() Passing PnP Irp down, status = 0
UsbCom_ProcessPnPIrp() Exit UsbCom_ProcessPnPIrp 2
enter UsbCom_ProcessPnPIrp() IRP_MJ_PNP, minor IRP_MN_QUERY_INTERFACE, -- 8
UsbCom_ProcessPnPIrp() Minor PnP IOCTL not handled
UsbCom_ProcessPnPIrp() Passing PnP Irp down, status = 0
UsbCom_ProcessPnPIrp() Exit UsbCom_ProcessPnPIrp c00000bb
enter UsbCom_ProcessPnPIrp() IRP_MJ_PNP, minor IRP_MN_QUERY_INTERFACE, -- 8
UsbCom_ProcessPnPIrp() Minor PnP IOCTL not handled
UsbCom_ProcessPnPIrp() Passing PnP Irp down, status = 0
UsbCom_ProcessPnPIrp() Exit UsbCom_ProcessPnPIrp 0
enter UsbCom_ProcessPnPIrp() IRP_MJ_PNP, minor IRP_MN_QUERY_DEVICE_RELATIONS, -- 7
UsbCom_ProcessPnPIrp() Minor PnP IOCTL not handled
UsbCom_ProcessPnPIrp() Passing PnP Irp down, status = 0
UsbCom_ProcessPnPIrp() Exit UsbCom_ProcessPnPIrp 2
entering UsbCom_Create DO=86268030 Irp=87338eb8
exit UsbCom_Create 0
SERIAL: Dispatch InternalIoControl entry for: 87750ed8
USBSerial IOCTL: beginning set baud rate.
enter UsbCom_SetBaud() DO=86268030 Irp=87ef6ed8 BaudRate=1200
exit UsbCom_SetBaud() Status=00000000
SERIAL: Complete Irp: 882c2ed8

Enter SerialRead
Interrupt Buffer less than half full - Submitting next Read URB
Enter StartReadUrbnew() DO=86268030
Prepare data for StartReadUrb()
IoCallDriver
 
 

»Ø¸´

79

Ìû×Ó

0

TAµÄ×ÊÔ´

Ò»Á£½ðÉ°£¨³õ¼¶£©

°åµÊ
 
OnReadInterruptÖ´ÐÐÁËÂð£¿ÊDz»ÊÇÎÊÌâ³öÔÚÕâÀïÃ棿
 
 
 

»Ø¸´

71

Ìû×Ó

0

TAµÄ×ÊÔ´

Ò»Á£½ðÉ°£¨³õ¼¶£©

4Â¥
 
ûִÐÐOnReadInterrupt£¬Ö±½Ó¾ÍhangµôÁË£¬¶¼Ã»Í˳öStartReadUrb
 
 
 

»Ø¸´

70

Ìû×Ó

0

TAµÄ×ÊÔ´

Ò»Á£½ðÉ°£¨³õ¼¶£©

5Â¥
 
º¹¡£¡£Ì«³¤ÁË¡£¡£¡£
¾«ÉñÉÏÖ§³ÖÄã
 
 
 

»Ø¸´

79

Ìû×Ó

0

TAµÄ×ÊÔ´

Ò»Á£½ðÉ°£¨³õ¼¶£©

6Â¥
 
ÓÐЩʱºòÔÚIoCallDriverÀïÃæ¾Í»áµ÷Íê³ÉÀý³Ì£¬ÎÒµÄÒâ˼ÊÇÄãÔÚÍê³ÉÀý³ÌÖÐÉèÖÃÒ»¸ö¶ÏµãÀ´µ÷ÊÔ¡£Èç¹û²»ÊÇÕâ¸öÎÊÌ⣬¾ÍÖ»Äܸú×Ùµ½IoCallDriverÀïÃæÈ¥²éÎÊÌâÁË¡£
 
 
 

»Ø¸´

62

Ìû×Ó

0

TAµÄ×ÊÔ´

Ò»Á£½ðÉ°£¨³õ¼¶£©

7Â¥
 
ûÓöµ½¹ýÕâÖÖÇé¿ö.
 
 
 

»Ø¸´

61

Ìû×Ó

0

TAµÄ×ÊÔ´

Ò»Á£½ðÉ°£¨³õ¼¶£©

8Â¥
 
ÒýÓà 5 Â¥ cnzdgs µÄ»Ø¸´:
ÓÐЩʱºòÔÚIoCallDriverÀïÃæ¾Í»áµ÷Íê³ÉÀý³Ì£¬ÎÒµÄÒâ˼ÊÇÄãÔÚÍê³ÉÀý³ÌÖÐÉèÖÃÒ»¸ö¶ÏµãÀ´µ÷ÊÔ¡£Èç¹û²»ÊÇÕâ¸öÎÊÌ⣬¾ÍÖ»Äܸú×Ùµ½IoCallDriverÀïÃæÈ¥²éÎÊÌâÁË¡£
ÎÒÔÚÍê³ÉÀý³ÌÀïÃæÓÐlog£¬Ã»Óз¢ÏÖÊä³öÏà¹Ølog.
ÓÐÒ»µã¿ÉÄÜҪ˵һÏ£¬ÎÒµÄwriteUrbºÍReadUrb֮ǰ¶¼µ÷Óùýspinlock£¬²»ÖªµÀ»á²»»áÓÐÓ°Ï죬Ê×ÏÈIRQ level»áÔÚDispatch_levelÉÏÃ棬ÁíÍâ²»ÖªµÀspinlock»á²»»áÓÐÓ°ÏìÄØ£¿
 
 
 

»Ø¸´

74

Ìû×Ó

0

TAµÄ×ÊÔ´

Ò»Á£½ðÉ°£¨³õ¼¶£©

9Â¥
 
лл¸÷룬¹ûÈ»ÊÇIRQLevelÌ«¸ßÒýÆðµÄ£¬ÎÒÏÖÔÚÔÚPASSIVE_LEVELÏÂÃæµ÷ÓþÍûÓÐÎÊÌâ¡£
Õâ¸öÆäʵºÍÿ¸öϵͳҲÓйØϵ¡£
 
 
 

»Ø¸´
ÄúÐèÒªµÇ¼ºó²Å¿ÉÒÔ»ØÌû µÇ¼ | ×¢²á

Ëæ±ã¿´¿´
²éÕÒÊý¾ÝÊÖ²á?

EEWorld Datasheet ¼¼ÊõÖ§³Ö

Ïà¹ØÎÄÕ ¸ü¶à>>
¹Ø±Õ
Õ¾³¤ÍƼöÉÏÒ»Ìõ 1/6 ÏÂÒ»Ìõ

 
EEWorld¶©ÔĺÅ

 
EEWorld·þÎñºÅ

 
Æû³µ¿ª·¢È¦

µç×Ó¹¤³ÌÊÀ½ç°æȨËùÓÐ ¾©B2-20211791 ¾©ICP±¸10001474ºÅ-1 µçÐÅÒµÎñÉóÅú[2006]×ÖµÚ258ºÅº¯ ¾©¹«Íø°²±¸ 11010802033920ºÅ Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
¿ìËٻظ´ ·µ»Ø¶¥²¿ ·µ»ØÁбí