Prev: Application can not receive WM_DEVICECHANGE
Next: How can I request OIDs to Native 802.11 miniport driver?
From: 泛若不繫舟 on 20 Feb 2008 09:09 Hi all, I have a PCI card and I need to create a KMDF bus driver and create a static KMDF child driver above that bus driver. The bus driver can get hardware resources and the WDF automatically connects and disconnects interrupts for the driver . In the WDM, I can create a IOCTL to get interrupt resource from bus driver and connect/disconnect the interrupt in the child driver. I have no idea how to do that in WDF, because WDF will do that automatically. My KMDF child driver never get any hardware resouces when loaded. I try this method below, but it can't work. The child report there is no available resources and fail to load the driver. May you hlep me? Thanks. ^_^ Step1: Copy the CM_PARTIAL_RESOURCE_DESCRIPTOR about interrupt into the bus driver's device extension. Step2: //---------------------------------------------------------------------- // When the bus driver create PDO for that child //---------------------------------------------------------------------- WDF_PDO_EVENT_CALLBACKS_INIT(&pdoCallbacks); pdoCallbacks.EvtDeviceResourceRequirementsQuery = BusPdo_EvtDeviceResourceRequirementsQuery; WdfPdoInitSetEventCallbacks(pDeviceInit, &pdoCallbacks); Step3 In the BusPdo_EvtDeviceResourceRequirementsQuery function, I try to copy the interrupt resource from step 2. Like this //----------------------------------------------------------------------- NTSTATUS status = STATUS_SUCCESS; WDFIORESLIST logConfig; IO_RESOURCE_DESCRIPTOR descriptor; status = WdfIoResourceListCreate( IoResourceRequirementsList, WDF_NO_OBJECT_ATTRIBUTES, &logConfig ); if(!NT_SUCCESS(status)){ return status; } RtlZeroMemory(&descriptor, sizeof(descriptor)); descriptor.Option = 0; descriptor.Type = CmResourceTypeInterrupt; descriptor.ShareDisposition = CmResourceShareShared descriptor.Flags= RESOURCE_INTERRUPT_LEVEL_SENSITIVE descriptor.u.Interrupt.MinimumVector = fdoData->InterruptDescriptor.u.Interrupt.Vector; descriptor.u.Interrupt.MaximumVector = fdoData->InterruptDescriptor.u.Interrupt.Vector; descriptor.u.Interrupt.TargetedProcessors= fdoData->InterruptDescriptor.u.Interrupt.Affinity; descriptor.u.Interrupt.AffinityPolicy= IrqPolicyMachineDefault; descriptor.u.Interrupt.PriorityPolicy = IrqPriorityUndefined; status = WdfIoResourceListAppendDescriptor(logConfig, &descriptor); if(!NT_SUCCESS(status)){ return status; } status = WdfIoResourceRequirementsListAppendIoResList( IoResourceRequirementsList, logConfig ); status = WdfIoResourceListAppendDescriptor(logConfig, &descriptor); if(!NT_SUCCESS(status)){ return status; } return status;
From: Don Burn on 20 Feb 2008 09:24 Why do you want a bus driver here in the first place? Also, if you are having one you should not have used an IOCTL but instead used the bus driver model to start and stop the device giving it different resources? In general please describe what your architecture is, since this sounds like a design problem not an implementation question. -- Don Burn (MVP, Windows DDK) Windows 2k/XP/2k3 Filesystem and Driver Consulting Website: http://www.windrvr.com Blog: http://msmvps.com/blogs/WinDrvr Remove StopSpam to reply "?????" <ZivHuang(a)gmail.com> wrote in message news:cd6eec86-218b-4fac-999f-211ff514c11a(a)h25g2000hsf.googlegroups.com... > Hi all, > > I have a PCI card and I need to create a KMDF bus driver and create a > static KMDF child driver above that bus driver. > > The bus driver can get hardware resources and the WDF automatically > connects and disconnects interrupts for the driver . > > In the WDM, I can create a IOCTL to get interrupt resource from bus > driver and connect/disconnect the interrupt in the child driver. > > I have no idea how to do that in WDF, because WDF will do that > automatically. My KMDF child driver never get any hardware resouces > when loaded. > > I try this method below, but it can't work. The child report there is > no available resources and fail to load the driver. > > May you hlep me? Thanks. ^_^ > > Step1: > Copy the CM_PARTIAL_RESOURCE_DESCRIPTOR about interrupt into the bus > driver's device extension. > > Step2: > //---------------------------------------------------------------------- > // When the bus driver create PDO for that child > //---------------------------------------------------------------------- > WDF_PDO_EVENT_CALLBACKS_INIT(&pdoCallbacks); > pdoCallbacks.EvtDeviceResourceRequirementsQuery = > BusPdo_EvtDeviceResourceRequirementsQuery; > WdfPdoInitSetEventCallbacks(pDeviceInit, &pdoCallbacks); > > Step3 > > In the BusPdo_EvtDeviceResourceRequirementsQuery function, > I try to copy the interrupt resource from step 2. Like this > > //----------------------------------------------------------------------- > NTSTATUS status = STATUS_SUCCESS; > WDFIORESLIST logConfig; > IO_RESOURCE_DESCRIPTOR descriptor; > > status = WdfIoResourceListCreate( > IoResourceRequirementsList, > WDF_NO_OBJECT_ATTRIBUTES, > &logConfig > ); > if(!NT_SUCCESS(status)){ > return status; > } > > RtlZeroMemory(&descriptor, sizeof(descriptor)); > > descriptor.Option = 0; > descriptor.Type = CmResourceTypeInterrupt; > descriptor.ShareDisposition = CmResourceShareShared > descriptor.Flags= RESOURCE_INTERRUPT_LEVEL_SENSITIVE > descriptor.u.Interrupt.MinimumVector = > fdoData->InterruptDescriptor.u.Interrupt.Vector; > > descriptor.u.Interrupt.MaximumVector = > fdoData->InterruptDescriptor.u.Interrupt.Vector; > > descriptor.u.Interrupt.TargetedProcessors= > fdoData->InterruptDescriptor.u.Interrupt.Affinity; > > descriptor.u.Interrupt.AffinityPolicy= IrqPolicyMachineDefault; > descriptor.u.Interrupt.PriorityPolicy = IrqPriorityUndefined; > > status = WdfIoResourceListAppendDescriptor(logConfig, &descriptor); > if(!NT_SUCCESS(status)){ > return status; > } > > status = WdfIoResourceRequirementsListAppendIoResList( > > IoResourceRequirementsList, > logConfig > ); > > status = WdfIoResourceListAppendDescriptor(logConfig, &descriptor); > if(!NT_SUCCESS(status)){ > return status; > } > > return status; > >
From: 泛若不繫舟 on 20 Feb 2008 09:39 The chip has a radio function and that radio function can be shared between different protocols. So I may have child driver A and child driver B above that radio function. There is one BAR for radio control, one BAR for function A and the other BAR for function B. Each BAR has it's own interrupt enable/disable register, but there are all in one chip. So I need a bus driver for radion control, and may create one or two child driver above that bus driver. Thanks for your relpy. Thanks. ^_^ On 2$B7n(B20$BF|(B, $B2<8a(B10$B;~(B24$BJ,(B, "Don Burn" <b...(a)stopspam.windrvr.com> wrote: > Why do you want a bus driver here in the first place? Also, if you are > having one you should not have used an IOCTL but instead used the bus driver > model to start and stop the device giving it different resources? In > general please describe what your architecture is, since this sounds like a > design problem not an implementation question. > > -- > Don Burn (MVP, Windows DDK) > Windows 2k/XP/2k3 Filesystem and Driver Consulting > Website:http://www.windrvr.com > Blog:http://msmvps.com/blogs/WinDrvr > Remove StopSpam to reply > > "?????" <ZivHu...(a)gmail.com> wrote in message > > news:cd6eec86-218b-4fac-999f-211ff514c11a(a)h25g2000hsf.googlegroups.com... > > > > > Hi all, > > > I have a PCI card and I need to create a KMDF bus driver and create a > > static KMDF child driver above that bus driver. > > > The bus driver can get hardware resources and the WDF automatically > > connects and disconnects interrupts for the driver . > > > In the WDM, I can create a IOCTL to get interrupt resource from bus > > driver and connect/disconnect the interrupt in the child driver. > > > I have no idea how to do that in WDF, because WDF will do that > > automatically. My KMDF child driver never get any hardware resouces > > when loaded. > > > I try this method below, but it can't work. The child report there is > > no available resources and fail to load the driver. > > > May you hlep me? Thanks. ^_^ > > > Step1: > > Copy the CM_PARTIAL_RESOURCE_DESCRIPTOR about interrupt into the bus > > driver's device extension. > > > Step2: > > //---------------------------------------------------------------------- > > // When the bus driver create PDO for that child > > //---------------------------------------------------------------------- > > WDF_PDO_EVENT_CALLBACKS_INIT(&pdoCallbacks); > > pdoCallbacks.EvtDeviceResourceRequirementsQuery = > > BusPdo_EvtDeviceResourceRequirementsQuery; > > WdfPdoInitSetEventCallbacks(pDeviceInit, &pdoCallbacks); > > > Step3 > > > In the BusPdo_EvtDeviceResourceRequirementsQuery function, > > I try to copy the interrupt resource from step 2. Like this > > > //----------------------------------------------------------------------- > > NTSTATUS status = STATUS_SUCCESS; > > WDFIORESLIST logConfig; > > IO_RESOURCE_DESCRIPTOR descriptor; > > > status = WdfIoResourceListCreate( > > IoResourceRequirementsList, > > WDF_NO_OBJECT_ATTRIBUTES, > > &logConfig > > ); > > if(!NT_SUCCESS(status)){ > > return status; > > } > > > RtlZeroMemory(&descriptor, sizeof(descriptor)); > > > descriptor.Option = 0; > > descriptor.Type = CmResourceTypeInterrupt; > > descriptor.ShareDisposition = CmResourceShareShared > > descriptor.Flags= RESOURCE_INTERRUPT_LEVEL_SENSITIVE > > descriptor.u.Interrupt.MinimumVector = > > fdoData->InterruptDescriptor.u.Interrupt.Vector; > > > descriptor.u.Interrupt.MaximumVector = > > fdoData->InterruptDescriptor.u.Interrupt.Vector; > > > descriptor.u.Interrupt.TargetedProcessors= > > fdoData->InterruptDescriptor.u.Interrupt.Affinity; > > > descriptor.u.Interrupt.AffinityPolicy= IrqPolicyMachineDefault; > > descriptor.u.Interrupt.PriorityPolicy = IrqPriorityUndefined; > > > status = WdfIoResourceListAppendDescriptor(logConfig, &descriptor); > > if(!NT_SUCCESS(status)){ > > return status; > > } > > > status = WdfIoResourceRequirementsListAppendIoResList( > > > IoResourceRequirementsList, > > logConfig > > ); > > > status = WdfIoResourceListAppendDescriptor(logConfig, &descriptor); > > if(!NT_SUCCESS(status)){ > > return status; > > } > > > return status;- $Bp,i6Ho0zMQJ8;z(B - > > - $Bp}<(Ho0zMQJ8;z(B -
From: Doron Holan [MSFT] on 20 Feb 2008 13:38 1) if you want to control the interrupts connected state, you can do this. do not create a WDFINTERRUPT and then you can connect/disconnect however you choose 2) you can assign your own resources to child devices. this requires internal interfaces which are not exposed to KMDF or though KMDF. instead you need to create a private interface to query for the interrupt resources and assign them through this private interface, this article http://blogs.msdn.com/doronh/archive/2007/10/24/how-to-share-hw-resources-with-another-driver-not-in-the-same-pnp-hierarchy.aspx talks about the basic principles, although there are things you do not need to worry about like the interrupt resource going away before the child d -- Please do not send e-mail directly to this alias. this alias is for newsgroup purposes only. This posting is provided "AS IS" with no warranties, and confers no rights. "?????" <ZivHuang(a)gmail.com> wrote in message news:cd6eec86-218b-4fac-999f-211ff514c11a(a)h25g2000hsf.googlegroups.com... > Hi all, > > I have a PCI card and I need to create a KMDF bus driver and create a > static KMDF child driver above that bus driver. > > The bus driver can get hardware resources and the WDF automatically > connects and disconnects interrupts for the driver . > > In the WDM, I can create a IOCTL to get interrupt resource from bus > driver and connect/disconnect the interrupt in the child driver. > > I have no idea how to do that in WDF, because WDF will do that > automatically. My KMDF child driver never get any hardware resouces > when loaded. > > I try this method below, but it can't work. The child report there is > no available resources and fail to load the driver. > > May you hlep me? Thanks. ^_^ > > Step1: > Copy the CM_PARTIAL_RESOURCE_DESCRIPTOR about interrupt into the bus > driver's device extension. > > Step2: > //---------------------------------------------------------------------- > // When the bus driver create PDO for that child > //---------------------------------------------------------------------- > WDF_PDO_EVENT_CALLBACKS_INIT(&pdoCallbacks); > pdoCallbacks.EvtDeviceResourceRequirementsQuery = > BusPdo_EvtDeviceResourceRequirementsQuery; > WdfPdoInitSetEventCallbacks(pDeviceInit, &pdoCallbacks); > > Step3 > > In the BusPdo_EvtDeviceResourceRequirementsQuery function, > I try to copy the interrupt resource from step 2. Like this > > //----------------------------------------------------------------------- > NTSTATUS status = STATUS_SUCCESS; > WDFIORESLIST logConfig; > IO_RESOURCE_DESCRIPTOR descriptor; > > status = WdfIoResourceListCreate( > IoResourceRequirementsList, > WDF_NO_OBJECT_ATTRIBUTES, > &logConfig > ); > if(!NT_SUCCESS(status)){ > return status; > } > > RtlZeroMemory(&descriptor, sizeof(descriptor)); > > descriptor.Option = 0; > descriptor.Type = CmResourceTypeInterrupt; > descriptor.ShareDisposition = CmResourceShareShared > descriptor.Flags= RESOURCE_INTERRUPT_LEVEL_SENSITIVE > descriptor.u.Interrupt.MinimumVector = > fdoData->InterruptDescriptor.u.Interrupt.Vector; > > descriptor.u.Interrupt.MaximumVector = > fdoData->InterruptDescriptor.u.Interrupt.Vector; > > descriptor.u.Interrupt.TargetedProcessors= > fdoData->InterruptDescriptor.u.Interrupt.Affinity; > > descriptor.u.Interrupt.AffinityPolicy= IrqPolicyMachineDefault; > descriptor.u.Interrupt.PriorityPolicy = IrqPriorityUndefined; > > status = WdfIoResourceListAppendDescriptor(logConfig, &descriptor); > if(!NT_SUCCESS(status)){ > return status; > } > > status = WdfIoResourceRequirementsListAppendIoResList( > > IoResourceRequirementsList, > logConfig > ); > > status = WdfIoResourceListAppendDescriptor(logConfig, &descriptor); > if(!NT_SUCCESS(status)){ > return status; > } > > return status; > >
From: 泛若不繫舟 on 20 Feb 2008 21:22 Thanks Doronh, For answer 1: If I connect/disconnect interrupt by myself, which functions are the right places to place WDM IoConnectInterrupt/IoDisconnectInterrupt? If I connect/disconnect the interrupt by myself, how can I let the WDF management EvtInterruptEnable/EvtInterruptDisable for me? Or just to enable interrupt before leaving EvtDeviceD0Entry and disable interrupt when EvtDeviceD0Exit called? For answer 2: If I get the interrupt resource from private interface, does the WDF management all interrupt issue for me? Or I need to take care of all thing by myself (I think it's the right answer. Orz)? Thanks for your reply. ^_^ On 2$B7n(B21$BF|(B, $B>e8a(B2$B;~(B38$BJ,(B, "Doron Holan [MSFT]" <dor...(a)online.microsoft.com> wrote: > 1) if you want to control the interrupts connected state, you can do this. > do not create a WDFINTERRUPT and then you can connect/disconnect however you > choose > 2) you can assign your own resources to child devices. this requires > internal interfaces which are not exposed to KMDF or though KMDF. instead > you need to create a private interface to query for the interrupt resources > and assign them through this private interface, this articlehttp://blogs.msdn.com/doronh/archive/2007/10/24/how-to-share-hw-resou... > talks about the basic principles, although there are things you do not need > to worry about like the interrupt resource going away before the child > > d > > -- > Please do not send e-mail directly to this alias. this alias is for > newsgroup purposes only. > This posting is provided "AS IS" with no warranties, and confers no rights. > > "?????" <ZivHu...(a)gmail.com> wrote in message > > news:cd6eec86-218b-4fac-999f-211ff514c11a(a)h25g2000hsf.googlegroups.com... > > > > > Hi all, > > > I have a PCI card and I need to create a KMDF bus driver and create a > > static KMDF child driver above that bus driver. > > > The bus driver can get hardware resources and the WDF automatically > > connects and disconnects interrupts for the driver . > > > In the WDM, I can create a IOCTL to get interrupt resource from bus > > driver and connect/disconnect the interrupt in the child driver. > > > I have no idea how to do that in WDF, because WDF will do that > > automatically. My KMDF child driver never get any hardware resouces > > when loaded. > > > I try this method below, but it can't work. The child report there is > > no available resources and fail to load the driver. > > > May you hlep me? Thanks. ^_^ > > > Step1: > > Copy the CM_PARTIAL_RESOURCE_DESCRIPTOR about interrupt into the bus > > driver's device extension. > > > Step2: > > //---------------------------------------------------------------------- > > // When the bus driver create PDO for that child > > //---------------------------------------------------------------------- > > WDF_PDO_EVENT_CALLBACKS_INIT(&pdoCallbacks); > > pdoCallbacks.EvtDeviceResourceRequirementsQuery = > > BusPdo_EvtDeviceResourceRequirementsQuery; > > WdfPdoInitSetEventCallbacks(pDeviceInit, &pdoCallbacks); > > > Step3 > > > In the BusPdo_EvtDeviceResourceRequirementsQuery function, > > I try to copy the interrupt resource from step 2. Like this > > > //----------------------------------------------------------------------- > > NTSTATUS status = STATUS_SUCCESS; > > WDFIORESLIST logConfig; > > IO_RESOURCE_DESCRIPTOR descriptor; > > > status = WdfIoResourceListCreate( > > IoResourceRequirementsList, > > WDF_NO_OBJECT_ATTRIBUTES, > > &logConfig > > ); > > if(!NT_SUCCESS(status)){ > > return status; > > } > > > RtlZeroMemory(&descriptor, sizeof(descriptor)); > > > descriptor.Option = 0; > > descriptor.Type = CmResourceTypeInterrupt; > > descriptor.ShareDisposition = CmResourceShareShared > > descriptor.Flags= RESOURCE_INTERRUPT_LEVEL_SENSITIVE > > descriptor.u.Interrupt.MinimumVector = > > fdoData->InterruptDescriptor.u.Interrupt.Vector; > > > descriptor.u.Interrupt.MaximumVector = > > fdoData->InterruptDescriptor.u.Interrupt.Vector; > > > descriptor.u.Interrupt.TargetedProcessors= > > fdoData->InterruptDescriptor.u.Interrupt.Affinity; > > > descriptor.u.Interrupt.AffinityPolicy= IrqPolicyMachineDefault; > > descriptor.u.Interrupt.PriorityPolicy = IrqPriorityUndefined; > > > status = WdfIoResourceListAppendDescriptor(logConfig, &descriptor); > > if(!NT_SUCCESS(status)){ > > return status; > > } > > > status = WdfIoResourceRequirementsListAppendIoResList( > > > IoResourceRequirementsList, > > logConfig > > ); > > > status = WdfIoResourceListAppendDescriptor(logConfig, &descriptor); > > if(!NT_SUCCESS(status)){ > > return status; > > } > > > return status;- $Bp,i6Ho0zMQJ8;z(B - > > - $Bp}<(Ho0zMQJ8;z(B -
|
Next
|
Last
Pages: 1 2 Prev: Application can not receive WM_DEVICECHANGE Next: How can I request OIDs to Native 802.11 miniport driver? |