reactos操作系统实现(116)
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.5 IDE_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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |