Streaming Minidriver中如何使用中断的延迟过程调用

Ice55   2009-10-30 14:17 楼主
初学驱动开发,在testcap例子的基础上针对硬件做修改。中断服务程序已经能正常响应了,但是不知道怎样设置延迟过程调用。在DeviceExtension中定义DPC对象指针,初始化设备时初始化DPC,然后在ISR中调用IoRequestDpc。结果每次运行到这里就蓝屏了。
哪位好心人知道是怎么回事?应该怎么样使用DPC请告诉我吧,先谢过...

回复评论 (5)

自己顶起期待高手
点赞  2009-10-31 23:15
为什么老是没人理我呢...
点赞  2009-11-1 14:28
在DeviceExtension中定义DPC对象指针,初始化设备时初始化DPC,然后在ISR中调用IoRequestDpc。结果每次运行到这里就蓝屏了。




不贴代码你叫别人什么看哦,还有你硬件有没有问题先,一个一个排除的哦
点赞  2009-11-2 08:54
代码在这里:
  1. typedef struct _HW_DEVICE_EXTENSION
  2. {
  3. //省略原来部分,下面这些是我添加的,最后一行是DPC对象
  4.         PULONG                                        BAR0;
  5.         BYTE                                        FrameCount;
  6.         PHW_STREAM_REQUEST_BLOCK        CurrentSRB;
  7.         PUCHAR                                        CurrentVirtualAddress;
  8.         ULONG                                        CurrentCount;
  9.         KDPC                                        DpcForIsr;
  10. } HW_DEVICE_EXTENSION, *PHW_DEVICE_EXTENSION;
  11. BOOLEAN        STREAMAPI HwInitialize ( IN OUT PHW_STREAM_REQUEST_BLOCK pSrb )
  12. {
  13.     STREAM_PHYSICAL_ADDRESS     adr;
  14.     ULONG                       Size;
  15.     PUCHAR                      pDmaBuf;
  16.     int                         j;
  17.                                                                   
  18.     PPORT_CONFIGURATION_INFORMATION ConfigInfo = pSrb->CommandData.ConfigInfo;

  19.     PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)ConfigInfo->HwDeviceExtension;

  20.     DbgLogInfo(("Testcap: HwInitialize()\n"));
  21. /*                有无硬件无所谓
  22.     if (ConfigInfo->NumberOfAccessRanges != 0)
  23.         {
  24.         DbgLogError(("Testcap: illegal config info\n"));

  25.         pSrb->Status = STATUS_NO_SUCH_DEVICE;
  26.         return (FALSE);
  27.     }
  28. */
  29. //        ReadCfg();

  30.     if (ConfigInfo->NumberOfAccessRanges != 0)
  31.         {
  32.         pHwDevExt->BAR0 = (PULONG)(ULONG_PTR)(ConfigInfo->AccessRanges[0].RangeStart.LowPart);
  33. //        pHwDevExt->BAR2 = (PULONG)(ULONG_PTR)(ConfigInfo->AccessRanges[2].RangeStart.LowPart);
  34.                 pHwDevExt->ioBaseLocal = (PULONG)(ULONG_PTR)(ConfigInfo->AccessRanges[1].RangeStart.LowPart);
  35.     }

  36.     DbgLogInfo(("TestCap: Number of access ranges = %lx\n", ConfigInfo->NumberOfAccessRanges));
  37.     DbgLogInfo(("TestCap: Memory Range = %lx\n", pHwDevExt->ioBaseLocal));
  38.     DbgLogInfo(("TestCap: IRQ = %lx\n", ConfigInfo->BusInterruptLevel));

  39.     pHwDevExt->Irq  = (USHORT)(ConfigInfo->BusInterruptLevel);

  40.     ConfigInfo->StreamDescriptorSize = sizeof (HW_STREAM_HEADER) + DRIVER_STREAM_COUNT * sizeof (HW_STREAM_INFORMATION);

  41.     pDmaBuf = StreamClassGetDmaBuffer(pHwDevExt);

  42.     adr = StreamClassGetPhysicalAddress(pHwDevExt, NULL, pDmaBuf, DmaBuffer, &Size);

  43.     // Init VideoProcAmp properties
  44.     pHwDevExt->Brightness = BrightnessDefault;
  45.     pHwDevExt->BrightnessFlags = KSPROPERTY_VIDEOPROCAMP_FLAGS_AUTO;
  46.     pHwDevExt->Contrast = ContrastDefault;
  47.     pHwDevExt->ContrastFlags = KSPROPERTY_VIDEOPROCAMP_FLAGS_AUTO;
  48.     pHwDevExt->ColorEnable = ColorEnableDefault;
  49.     pHwDevExt->ColorEnableFlags = KSPROPERTY_VIDEOPROCAMP_FLAGS_MANUAL;

  50.     // Init CameraControl properties
  51.     pHwDevExt->Focus = FocusDefault;
  52.     pHwDevExt->FocusFlags = KSPROPERTY_CAMERACONTROL_FLAGS_AUTO;
  53.     pHwDevExt->Zoom = ZoomDefault;
  54.     pHwDevExt->ZoomFlags = KSPROPERTY_CAMERACONTROL_FLAGS_AUTO;

  55.     // Init VideoControl properties
  56.     pHwDevExt->VideoControlMode = 0;

  57.     // Init VideoCompression properties
  58.     pHwDevExt->CompressionSettings.CompressionKeyFrameRate = 15;
  59.     pHwDevExt->CompressionSettings.CompressionPFramesPerKeyFrame = 3;
  60.     pHwDevExt->CompressionSettings.CompressionQuality = 5000;

  61.     pHwDevExt->PDO = ConfigInfo->RealPhysicalDeviceObject;
  62.     pHwDevExt->FDO = ConfigInfo->ClassDeviceObject;
  63.     DbgLogInfo(("TestCap: Physical Device Object = %lx\n", pHwDevExt->PDO));

  64.     for (j = 0; j < MAX_TESTCAP_STREAMS; j++)
  65.         {
  66.         // For each stream, maintain a separate queue for data and control
  67.         InitializeListHead (&pHwDevExt->StreamSRBList[j]);
  68.         InitializeListHead (&pHwDevExt->StreamControlSRBList[j]);
  69.         KeInitializeSpinLock (&pHwDevExt->StreamSRBSpinLock[j]);
  70.         pHwDevExt->StreamSRBListSize[j] = 0;
  71.     }

  72.     // Init ProtectionStatus
  73.     pHwDevExt->ProtectionStatus = 0;


  74.     // The following allows multiple instance of identical hardware
  75.     // to be installed.  GlobalDriverMediumInstanceCount is set in the Medium.Id field.

  76.     pHwDevExt->DriverMediumInstanceCount = GlobalDriverMediumInstanceCount++;

  77.         /****************2009年10月21日初始化IO定时器、DPC和FrameCount***************/
  78.         IoInitializeTimer( pHwDevExt->PDO, OnTimer, &(pHwDevExt->FrameCount) );
  79.         pHwDevExt->FrameCount = 0;
  80.         [color=#FF0000]KeInitializeDpc( &(pHwDevExt->DpcForIsr), DpcForIsrRoutine, pHwDevExt );[/color]//此句初始化DPC对象
  81.     DbgLogInfo(("TestCap: Exit, HwInitialize()\n"));
  82.     pSrb->Status = STATUS_SUCCESS;
  83.     return (TRUE);
  84. }
  85. BOOLEAN HwInterrupt( IN PHW_DEVICE_EXTENSION  pHwDevExt )
  86. {
  87.         const        int        Count = 192;
  88.         PHYSICAL_ADDRESS                address;
  89.         BOOLEAN        fMyIRQ = FALSE;
  90.         ULONG        InterruptFlag;
  91.         ULONG                        Length;
  92.         ULONG                        BytesLeave;

  93.         InterruptFlag = READ_REGISTER_ULONG( pHwDevExt->BAR0+0X10/4 );

  94.         if(InterruptFlag)
  95.         {
  96.                 WRITE_REGISTER_ULONG( pHwDevExt->BAR0+0X10/4, 0 );
  97.                 fMyIRQ = TRUE;
  98.                                 if( pHwDevExt->CurrentCount )
  99.                                 {
  100. /*                                        if( InterruptFlag&0x00000010 )
  101.                                         {
  102.                                                 pHwDevExt->VCount = 1;
  103.                                                 //将地址修改为最后一行 即添加768*767
  104.                                                 address = StreamClassGetPhysicalAddress( pHwDevExt, pHwDevExt->CurrentSRB,
  105.                                                                                 pHwDevExt->CurrentVirtualAddress + 768*767, SRBDataBuffer, &Length );
  106. //                                                address = MmGetPhysicalAddress ( pHwDevExt->CurrentVirtualAddress );
  107.                                                 WRITE_REGISTER_ULONG( pHwDevExt->BAR0+10, address.LowPart );
  108.                                                 if( Length < 768 )
  109.                                                 {
  110.                                                         WRITE_REGISTER_ULONG( pHwDevExt->BAR0+12, Length/4 );
  111.                                                         BytesLeave = 768 - Length;
  112.                                                         address = StreamClassGetPhysicalAddress( pHwDevExt, pHwDevExt->CurrentSRB,
  113.                                                                                 pHwDevExt->CurrentVirtualAddress+Length + 768*767,
  114.                                                                                 SRBDataBuffer, &Length );
  115.                                                         WRITE_REGISTER_ULONG( pHwDevExt->BAR0+10, address.LowPart );
  116.                                                         WRITE_REGISTER_ULONG( pHwDevExt->BAR0+12, BytesLeave/4);
  117.                                                 }
  118.                                                 else
  119.                                                 {
  120.                                                         WRITE_REGISTER_ULONG( pHwDevExt->BAR0+12, Count );
  121.                                                 }       
  122.                                                 pHwDevExt->CurrentCount -= Count * 4;
  123.                                         }
  124.                                         else
  125.                                         {
  126.                                                 if(        pHwDevExt->VCount )
  127.                                                 {
  128.                                                         address = StreamClassGetPhysicalAddress( pHwDevExt, pHwDevExt->CurrentSRB,
  129.                                                                                         pHwDevExt->CurrentVirtualAddress + 768 * (767-pHwDevExt->VCount),
  130.                                                                                         SRBDataBuffer, &Length );
  131. //                                                        address = MmGetPhysicalAddress ( (pHwDevExt->CurrentVirtualAddress) + 768*(pHwDevExt->VCount) );
  132.                                                         WRITE_REGISTER_ULONG( pHwDevExt->BAR0+10, address.LowPart );
  133.                                                         if( Length < 768 )
  134.                                                         {
  135.                                                                 WRITE_REGISTER_ULONG( pHwDevExt->BAR0+12, Length/4 );
  136.                                                                 BytesLeave = 768 - Length;
  137.                                                                 address = StreamClassGetPhysicalAddress( pHwDevExt, pHwDevExt->CurrentSRB,
  138.                                                                                         pHwDevExt->CurrentVirtualAddress + 768 * (767-pHwDevExt->VCount)+Length,
  139.                                                                                         SRBDataBuffer, &Length );
  140.                                                                 WRITE_REGISTER_ULONG( pHwDevExt->BAR0+10, address.LowPart );
  141.                                                                 WRITE_REGISTER_ULONG( pHwDevExt->BAR0+12, BytesLeave/4);
  142.                                                         }
  143.                                                         else
  144.                                                         {
  145.                                                                 WRITE_REGISTER_ULONG( pHwDevExt->BAR0+12, Count );
  146.                                                         }       
  147.                                                         pHwDevExt->CurrentCount -= Count * 4;
  148.                                                         ++pHwDevExt->VCount;
  149.                                                 }
  150.                                                 else
  151.                                                 {
  152.                                                         WRITE_REGISTER_ULONG( pHwDevExt->BAR0+10, pHwDevExt->DMABaseAddress );
  153.                                                         WRITE_REGISTER_ULONG( pHwDevExt->BAR0+12, Count);
  154.                                                         pHwDevExt->CurrentCount -= Count * 4;
  155.                                                 }
  156. //                                                [color=#FF0000]IoRequestDpc( pHwDevExt->FDO, pHwDevExt->CurrentSRB->Irp, NULL);[/color]//此处调用DPC对象
  157.                                         }
  158. */                                        WRITE_REGISTER_ULONG( pHwDevExt->BAR0+10, pHwDevExt->DMABaseAddress+4 );
  159.                                         WRITE_REGISTER_ULONG( pHwDevExt->BAR0+12, 128 );
  160.                                         pHwDevExt->CurrentCount -= 768;
  161.                                 }
  162.                                 else
  163.                                 {
  164.                                         if(pHwDevExt->CurrentSRB)
  165.                                                 CompleteStreamSRB ( pHwDevExt->CurrentSRB );
  166.                                         pHwDevExt->CurrentSRB = NULL;
  167.                                         pHwDevExt->CurrentVirtualAddress = NULL;
  168.                                         pHwDevExt->DMABaseAddress = 0;
  169.                                 }
  170.         }
  171.         return        fMyIRQ;
  172. }
点赞  2009-11-2 10:48
添加颜色没有起作用...
KeInitializeDpc( &(pHwDevExt->DpcForIsr), DpcForIsrRoutine, pHwDevExt ); 此句是初始化DPC的语句。
IoRequestDpc( pHwDevExt->FDO, pHwDevExt->CurrentSRB->Irp, NULL); 此句是调用DPC的语句在ISR中,此句现在在注释中,添加后运行到此句,系统就崩溃了。
希望各位大哥大姐帮忙,感谢楼主大侠帮忙...^_^
点赞  2009-11-2 10:57
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复