您的位置:首页 > Web前端 > React

reactos操作系统实现(116)

2009-10-26 22:05 555 查看
PciIdeXFdoStartDevice函数是用来处理即插即用的启动设备消息,主要设置了DMA操作和保存设备端口的基地址,这里就是启动PCIIDE的物理设备,具体实现代码如下:

#001 static NTSTATUS
#002 PciIdeXFdoStartDevice(
#003 IN PDEVICE_OBJECT DeviceObject,
#004 IN PIRP Irp)
#005 {
#006 PPCIIDEX_DRIVER_EXTENSION DriverExtension;
#007 PFDO_DEVICE_EXTENSION DeviceExtension;
#008 PCM_RESOURCE_LIST ResourceList;
#009 NTSTATUS Status;
#010
#011 DPRINT("PciIdeXStartDevice(%p %p)/n", DeviceObject,
Irp);
#012

获取驱动程序扩展对象。
#013 DriverExtension =
IoGetDriverObjectExtension(DeviceObject->DriverObject,
DeviceObject->DriverObject);
#014 ASSERT(DriverExtension);
#015 DeviceExtension =
(PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
#016 ASSERT(DeviceExtension);
#017 ASSERT(DeviceExtension->Common.IsFDO);
#018

获取这个控制器的属性。
#019 DeviceExtension->Properties.Size =
sizeof(IDE_CONTROLLER_PROPERTIES);
#020 DeviceExtension->Properties.ExtensionSize =
DriverExtension->MiniControllerExtensionSize;
#021 Status = DriverExtension->HwGetControllerProperties(
#022 DeviceExtension->MiniControllerExtension,
#023 &DeviceExtension->Properties);
#024 if (!NT_SUCCESS(Status))
#025 return Status;
#026

设置这个设备的DMA操作函数。
#027 DriverExtension->HwUdmaModesSupported =
DeviceExtension->Properties.PciIdeUdmaModesSupported;
#028 if (!DriverExtension->HwUdmaModesSupported)
#029 /* This method is optional, so provide our own one */
#030 DriverExtension->HwUdmaModesSupported =
PciIdeXUdmaModesSupported;
#031

获取当前设备栈设备,并且判断设备是否合法,然后保存到这个设备的基地址到总线基地址里。
#032 /* Get bus master port base, if any */
#033 ResourceList = IoGetCurrentIrpStackLocation(Irp)->Parameters.StartDevice.AllocatedResources;
#034 if (ResourceList
#035 && ResourceList->Count == 1
#036 && ResourceList->List[0].PartialResourceList.Count
== 1
#037 &&
ResourceList->List[0].PartialResourceList.Version == 1
#038 && ResourceList->List[0].PartialResourceList.Revision
== 1
#039 &&
ResourceList->List[0].PartialResourceList.PartialDescriptors[0].Type ==
CmResourceTypePort
#040 &&
ResourceList->List[0].PartialResourceList.PartialDescriptors[0].u.Port.Length
== 16)
#041 {
#042 DeviceExtension->BusMasterPortBase =
ResourceList->List[0].PartialResourceList.PartialDescriptors[0].u.Port.Start;
#043 }
#044 return STATUS_SUCCESS;
#045 }
10.3.5IDE_CONTROLLER_PROPERTIES结构
IDE_CONTROLLER_PROPERTIES结构是保存一个IDE控制器属性和操作函数,如下:
#001 typedef struct
_IDE_CONTROLLER_PROPERTIES
#002 {

本结构的大小字节数。
#003 ULONG Size;
小端口驱动程序需要的内存大小。
#004 ULONG ExtensionSize;
IDE控制器支持的传送模式。
#005 ULONG
SupportedTransferMode[MAX_IDE_CHANNEL][MAX_IDE_DEVICE];
PCI的IDE通道是否有效函数。
#006 PCIIDE_CHANNEL_ENABLED
PciIdeChannelEnabled;
PCI的两个通道是否同时使用,还是只能分别使用。
#007
PCIIDE_SYNC_ACCESS_REQUIRED PciIdeSyncAccessRequired;
PCI的IDE设备的传输模式选择。
#008
PCIIDE_TRANSFER_MODE_SELECT_FUNC PciIdeTransferModeSelect;
是否需要清除主控位标识。
#009 BOOLEAN
IgnoreActiveBitForAtaDevice;
如果设置为TRUE,就清除中断控制位。
#010 BOOLEAN
AlwaysClearBusMasterInterrupt;
指向一个DMA是否使用的函数。
#011 PCIIDE_USEDMA_FUNC
PciIdeUseDma;
指明设备对象的对齐方式。
#012 ULONG
AlignmentRequirement;
保存是否只使用PIO的工作方式。
#013 ULONG DefaultPIO;
保存DMA的支持模式。
#014
PCIIDE_UDMA_MODES_SUPPORTED PciIdeUdmaModesSupported;
#015 } IDE_CONTROLLER_PROPERTIES,
*PIDE_CONTROLLER_PROPERTIES;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: