加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

reactos操作系统实现(102)

发布时间:2020-12-15 05:00:21 所属栏目:百科 来源:网络整理
导读:ATAPI 驱动程序的源码在目录 drivers/storage/ide/atapi 里,其实 ATAPI 是一个 IDE 的小端口驱动程序,主要初始化不同总线上的 ATAPI 设备,其中最重要的就是从 PCI 总线里查找到 IDE 控制器。下面来分析这个驱动程序的入口函数: #001 ULONG #002 NTAPI #0

ATAPI驱动程序的源码在目录drivers/storage/ide/atapi里,其实ATAPI是一个IDE的小端口驱动程序,主要初始化不同总线上的ATAPI设备,其中最重要的就是从PCI总线里查找到IDE控制器。下面来分析这个驱动程序的入口函数:

#001 ULONG

#002 NTAPI

#003 DriverEntry(

#004 IN PVOID DriverObject,

#005 IN PVOID Argument2

#006 )

#007

#008 /*++

#009

#010 Routine Description:

#011

#012 Installable driver initialization entry point for system.

#013

#014 Arguments:

#015

#016 Driver Object

#017

#018 Return Value:

#019

#020 Status from ScsiPortInitialize()

#021

#022 --*/

#023

#024 {

DriverObject是驱动程序对象。

Argument2是驱动程序在注册表里的路径。

#025 HW_INITIALIZATION_DATA hwInitializationData;

#026 ULONG adapterCount;

#027 ULONG i;

#028 ULONG statusToReturn,newStatus;

#029

#030 DebugPrint((1,"/n/nATAPI IDE MiniPort Driver/n"));

#031

设置返回状态码。

#032 statusToReturn = 0xffffffff;

#033

#034 //

#035 // Zero out structure.

#036 //

#037

清空硬件初始化数据结构。

#038 AtapiZeroMemory(((PUCHAR)&hwInitializationData),sizeof(HW_INITIALIZATION_DATA));

#039

#040 //

#041 // Set size of hwInitializationData.

#042 //

#043

设置结构的大小。

#044 hwInitializationData.HwInitializationDataSize =

#045 sizeof(HW_INITIALIZATION_DATA);

#046

#047 //

#048 // Set entry points.

#049 //

#050

设置实始化ATAPI时调用的函数。

#051 hwInitializationData.HwInitialize = AtapiHwInitialize;

#052 hwInitializationData.HwResetBus = AtapiResetController;

#053 hwInitializationData.HwStartIo = AtapiStartIo;

#054 hwInitializationData.HwInterrupt = AtapiInterrupt;

#055

#056 //

#057 // Specify size of extensions.

#058 //

#059

设置扩展结构的大小。

#060 hwInitializationData.DeviceExtensionSize = sizeof(HW_DEVICE_EXTENSION);

#061 hwInitializationData.SpecificLuExtensionSize = sizeof(HW_LU_EXTENSION);

#062

#063 //

#064 // Indicate PIO device.

#065 //

#066

设置为PIO的操作方式。

#067 hwInitializationData.MapBuffers = TRUE;

#068

初始化原始模式的设备。一般有两个通道,每个通道有两个IDE控制器,一个主控制器,一个从控制器。

#069 //

#070 // Native Mode Devices

#071 //

#072 for (i=0; i <NUM_NATIVE_MODE_ADAPTERS; i++) {

#073 hwInitializationData.HwFindAdapter = AtapiFindNativeModeController;

#074 hwInitializationData.NumberOfAccessRanges = 4;

#075 hwInitializationData.AdapterInterfaceType = PCIBus;

#076

#077 hwInitializationData.VendorId = NativeModeAdapters[i].VendorId;

#078 hwInitializationData.VendorIdLength = (USHORT) NativeModeAdapters[i].VendorIdLength;

#079 hwInitializationData.DeviceId = NativeModeAdapters[i].DeviceId;

#080 hwInitializationData.DeviceIdLength = (USHORT) NativeModeAdapters[i].DeviceIdLength;

#081

调用函数ScsiPortInitialize来初始化SCSI端口对象。

#082 newStatus = ScsiPortInitialize(DriverObject,

#083 Argument2,

#084 &hwInitializationData,

#085 (PVOID) i);

#086 if (newStatus < statusToReturn)

#087 statusToReturn = newStatus;

#088 }

#089

#090 hwInitializationData.VendorId = 0;

#091 hwInitializationData.VendorIdLength = 0;

#092 hwInitializationData.DeviceId = 0;

#093 hwInitializationData.DeviceIdLength = 0;

#094

#095 //

#096 // The adapter count is used by the find adapter routine to track how

#097 // which adapter addresses have been tested.

#098 //

#099

查找ISA总线的设备。

#100 adapterCount = 0;

#101

#102 hwInitializationData.HwFindAdapter = AtapiFindPCIController;

#103 hwInitializationData.NumberOfAccessRanges = 4;

#104 hwInitializationData.AdapterInterfaceType = Isa;

#105

#106 newStatus = ScsiPortInitialize(DriverObject,

#107 Argument2,

#108 &hwInitializationData,

#109 &adapterCount);

#110 if (newStatus < statusToReturn)

#111 statusToReturn = newStatus;

#112

#113 //

#114 // Indicate 2 access ranges and reset FindAdapter.

#115 //

#116

#117 hwInitializationData.NumberOfAccessRanges = 2;

#118 hwInitializationData.HwFindAdapter = AtapiFindController;

#119

初始化ISA总线的设备。

#120 //

#121 // Indicate ISA bustype.

#122 //

#123

#124 hwInitializationData.AdapterInterfaceType = Isa;

#125

#126 //

#127 // Call initialization for ISA bustype.

#128 //

#129

#130 newStatus = ScsiPortInitialize(DriverObject,

#131 Argument2,

#132 &hwInitializationData,

#133 &adapterCount);

#134 if (newStatus < statusToReturn)

#135 statusToReturn = newStatus;

#136

#137 //

#138 // Set up for MCA

#139 //

#140

初始化MCA总线的设备。

#141 hwInitializationData.AdapterInterfaceType = MicroChannel;

#142 adapterCount = 0;

#143

#144 newStatus = ScsiPortInitialize(DriverObject,

#145 Argument2,

#146 &hwInitializationData,

#147 &adapterCount);

#148 if (newStatus < statusToReturn)

#149 statusToReturn = newStatus;

#150

#151 return statusToReturn;

#152

#153} // end DriverEntry()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读