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;
相关文章
- 国产操作系统有实现弯道超车的可能吗?
- Linux 操作系统原理 — 操作系统的本质「建议收藏」
- 【Linux操作系统】如何实现Linux中软件安装进度条?
- user创建Linux用户:实现自由度的操作系统之旅(linuxcreate)
- 表 Linux 注册表:实现操作系统有力管理 (linux注册)
- Linux:学习操作系统的好选择(linux是学什么)
- Linux下运行QQ:实现多款操作系统共享即时通讯(linux下运行qq)
- 踏上Linux之旅:从专家视角看操作系统(linux专家)
- Linux:探索开源操作系统分支(linux的分支)
- 轻松实现:本地文件传输至 Linux 操作系统(本地文件传到linux)
- 克隆Linux克隆:实现多操作系统的灵活切换(多linux引导)
- 操作系统体验Linux达芬奇:开启新的操作系统时代(linux达芬奇)
- 基于Linux操作系统上实现 Java 编程(linux r java)
- Linux排行榜:开源操作系统的统治者!(linux 排行)
- Linux LCX——全面领航新时代的开源操作系统(linuxlcx)
- Linux虚拟机使用指南:轻松实现跨操作系统的迁移(linux虚拟机使用教程)
- 利用Javascript判断操作系统的类型实现不同操作系统下的兼容性