00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
#ifndef _EISA_
00025
#define _EISA_
00026
00027
00028
00029
00030
00031 #define DMA_BANK_A31_A24_DR0 0xe05
00032 #define DMA_BANK_A31_A24_DR1 0xe07
00033 #define DMA_BANK_A31_A24_DR2 0xe09
00034 #define DMA_BANK_A31_A24_DR3 0xe0b
00035 #define DMA_INC_ENABLE_A31_A24 0xe0f
00036
00037
00038
00039
00040
00041 #define DMA2_BANK_A31_A24_DR5 0xf07
00042 #define DMA2_BANK_A31_A24_DR6 0xf09
00043 #define DMA2_BANK_A31_A24_DR7 0xf0b
00044 #define DMA2_INC_ENABLE_A31_A24 0xf0f
00045
00046
00047
00048
00049 #define DMA2_MODE_CHANGE 0xf4
00050 #define DMA2_MODE_8237_COMP 0x0
00051 #define DMA2_MODE_71037_A 0x1
00052 #define DMA2_MODE_71037_B 0x2
00053 #define DMA2_MODE_71037_C 0x3
00054
00055 #define DMA_STATUS 0xc8
00056 #define DMA_COMMAND 0xc8
00057 #define SINGLE_MASK 0xca
00058 #define MODE 0xcb
00059 #define CLEAR_BYTE_POINTER 0xcc
00060 #define CLEAR_MASK 0xce
00061
00062
typedef struct _DMA_PAGE{
00063 UCHAR
Reserved1;
00064 UCHAR
Channel1;
00065 UCHAR
Reserved2;
00066 UCHAR
Channel2;
00067 UCHAR
Reserved3;
00068 UCHAR
Channel3;
00069 UCHAR
Reserved4;
00070 UCHAR
Channel0;
00071 UCHAR
Reserved5[0x120-0x27];
00072 UCHAR
Channel5;
00073 UCHAR
Reserved6;
00074 UCHAR
Channel6;
00075 UCHAR
Reserved7;
00076 UCHAR
Channel7;
00077 UCHAR
Reserved8[4];
00078 }
DMA_PAGE, *
PDMA_PAGE;
00079
00080
00081
00082
00083
00084
typedef struct _DMA_CHANNEL_STOP {
00085 UCHAR
ChannelLsb;
00086 UCHAR
ChannelMsb;
00087 UCHAR
ChannelHsb;
00088 UCHAR
Reserved;
00089 }
DMA_CHANNEL_STOP, *
PDMA_CHANNEL_STOP;
00090
00091
00092
00093
00094
00095
typedef struct _DMA1_ADDRESS_COUNT {
00096 UCHAR
Reserved1;
00097 UCHAR
DmaBaseAddress;
00098 UCHAR
Reserved2;
00099 UCHAR
DmaBaseCount;
00100 }
DMA1_ADDRESS_COUNT, *
PDMA1_ADDRESS_COUNT;
00101
00102
00103
00104
00105
00106
00107
typedef struct _DMA2_ADDRESS_COUNT {
00108 UCHAR
Reserved1;
00109 UCHAR
DmaBaseAddress;
00110 UCHAR
Reserved2;
00111 UCHAR
DmaBaseCount;
00112 }
DMA2_ADDRESS_COUNT, *
PDMA2_ADDRESS_COUNT;
00113
00114
00115
00116
00117
00118
typedef struct _DMA1_CONTROL {
00119 DMA1_ADDRESS_COUNT DmaAddressCount[4];
00120 UCHAR
Reserved1;
00121 UCHAR
DmaStatus;
00122 UCHAR
Reserved2;
00123 UCHAR
DmaRequest;
00124 UCHAR
Reserved3;
00125 UCHAR
SingleMask;
00126 UCHAR
Reserved4;
00127 UCHAR
Mode;
00128 UCHAR
Reserved5;
00129 UCHAR
ClearBytePointer;
00130 UCHAR
Reserved6;
00131 UCHAR
MasterClear;
00132 UCHAR
Reserved7;
00133 UCHAR
ClearMask;
00134 UCHAR
Reserved;
00135 UCHAR
AllMask;
00136 }
DMA1_CONTROL, *
PDMA1_CONTROL;
00137
00138
00139
00140
00141
00142
typedef struct _DMA2_CONTROL {
00143 UCHAR
Reserved8[0x100-0x20];
00144 DMA2_ADDRESS_COUNT DmaAddressCount[4];
00145 UCHAR
Reserved1;
00146 UCHAR
DmaStatus;
00147 UCHAR
Reserved2;
00148 UCHAR
DmaRequest;
00149 UCHAR
Reserved3;
00150 UCHAR
SingleMask;
00151 UCHAR
Reserved4;
00152 UCHAR
Mode;
00153 UCHAR
Reserved5;
00154 UCHAR
ClearBytePointer;
00155 UCHAR
Reserved6;
00156 UCHAR
MasterClear;
00157 UCHAR
Reserved7;
00158 UCHAR
ClearMask;
00159 UCHAR
Reserved;
00160 UCHAR
AllMask;
00161 UCHAR
Reserved9[10];
00162 }
DMA2_CONTROL, *
PDMA2_CONTROL;
00163
00164
00165
00166
00167
00168
typedef struct _TIMER_CONTROL {
00169 UCHAR
BcdMode : 1;
00170 UCHAR
Mode : 3;
00171 UCHAR
SelectByte : 2;
00172 UCHAR
SelectCounter : 2;
00173 }
TIMER_CONTROL, *
PTIMER_CONTROL;
00174
00175
00176
00177
00178
00179
typedef struct _TIMER_STATUS {
00180 UCHAR
BcdMode : 1;
00181 UCHAR
Mode : 3;
00182 UCHAR
SelectByte : 2;
00183 UCHAR
CrContentsMoved : 1;
00184 UCHAR
OutPin : 1;
00185 }
TIMER_STATUS, *
PTIMER_STATUS;
00186
00187
00188
00189
00190
00191 #define TM_SIGNAL_END_OF_COUNT 0
00192 #define TM_ONE_SHOT 1
00193 #define TM_RATE_GENERATOR 2
00194 #define TM_SQUARE_WAVE 3
00195 #define TM_SOFTWARE_STROBE 4
00196 #define TM_HARDWARE_STROBE 5
00197
00198
00199
00200
00201
00202 #define SB_COUNTER_LATCH 0
00203 #define SB_LSB_BYTE 1
00204 #define SB_MSB_BYTE 2
00205 #define SB_LSB_THEN_MSB 3
00206
00207
00208
00209
00210
00211 #define SELECT_COUNTER_0 0
00212 #define SELECT_COUNTER_1 1
00213 #define SELECT_COUNTER_2 2
00214 #define SELECT_READ_BACK 3
00215
00216
00217
00218
00219
00220 #define TIMER_CLOCK_IN 1193167 // 1.193Mhz
00221
00222
00223
00224
00225
00226
typedef struct _NMI_STATUS {
00227 UCHAR
SpeakerGate : 1;
00228 UCHAR
SpeakerData : 1;
00229 UCHAR
DisableEisaParity : 1;
00230 UCHAR
DisableNmi : 1;
00231 UCHAR
RefreshToggle : 1;
00232 UCHAR
SpeakerTimer : 1;
00233 UCHAR
IochkNmi : 1;
00234 UCHAR
ParityNmi : 1;
00235 }
NMI_STATUS, *
PNMI_STATUS;
00236
00237
00238
00239
00240
00241
typedef struct _NMI_ENABLE {
00242 UCHAR
RtClockAddress : 7;
00243 UCHAR
NmiDisable : 1;
00244 }
NMI_ENABLE, *
PNMI_ENABLE;
00245
00246
00247
00248
00249
typedef struct _NMI_EXTENDED_CONTROL {
00250 UCHAR
BusReset : 1;
00251 UCHAR
EnableNmiPort : 1;
00252 UCHAR
EnableFailSafeNmi : 1;
00253 UCHAR
EnableBusMasterTimeout : 1;
00254 UCHAR
Reserved1 : 1;
00255 UCHAR
PendingPortNmi : 1;
00256 UCHAR
PendingBusMasterTimeout : 1;
00257 UCHAR
PendingFailSafeNmi : 1;
00258 }
NMI_EXTENDED_CONTROL, *
PNMI_EXTENDED_CONTROL;
00259
00260
00261
00262
00263
00264
typedef struct _EISA_CONTROL {
00265
union {
00266 DMA1_CONTROL Dma1BasePort;
00267
struct {
00268 UCHAR
Interrupt1ControlPort0;
00269 UCHAR
Reserved1;
00270 UCHAR
Interrupt1ControlPort1;
00271 UCHAR
Reserved2[5];
00272 UCHAR
Interrupt2ControlPort0;
00273 UCHAR
Reserved3;
00274 UCHAR
Interrupt2ControlPort1;
00275 UCHAR
Reserved4[
sizeof(
DMA1_CONTROL)-11];
00276
00277 };
00278 };
00279
union {
00280 DMA_PAGE DmaPageLowPort;
00281 DMA2_CONTROL Dma2BasePort;
00282
struct {
00283 UCHAR
Reserved20[9];
00284 UCHAR
PageIncrementMode;
00285 UCHAR
Reserved21;
00286 UCHAR
InDirectAddress;
00287 UCHAR
Reserved22;
00288 UCHAR
InDirectData;
00289 UCHAR
Reserved23[0x7f - 0x2e];
00290 UCHAR
PageIncrementMode2;
00291 UCHAR
Reserved24[0x129 - 0x80];
00292 UCHAR
DMA2PageIncrementMode;
00293 };
00294 };
00295 UCHAR
Reserved25[0xfffc - 0x130];
00296
00297
00298
00299
00300
00301 UCHAR
Dma1ExtendedModePort;
00302 UCHAR
Dma2ExtendedModePort;
00303 UCHAR
DmaPageHighPort;
00304 UCHAR
Interrupt1EdgeLevel;
00305 UCHAR
Interrupt2EdgeLevel;
00306
00307 }
EISA_CONTROL, *
PEISA_CONTROL;
00308
00309
00310
00311
00312
00313
typedef struct _INITIALIZATION_COMMAND_1 {
00314 UCHAR
Icw4Needed : 1;
00315 UCHAR
CascadeMode : 1;
00316 UCHAR
Unused1 : 2;
00317 UCHAR
InitializationFlag : 1;
00318 UCHAR
Unused2 : 3;
00319 }
INITIALIZATION_COMMAND_1, *
PINITIALIZATION_COMMAND_1;
00320
00321
00322
00323
00324
00325
typedef struct _INITIALIZATION_COMMAND_4 {
00326 UCHAR
I80x86Mode : 1;
00327 UCHAR
AutoEndOfInterruptMode : 1;
00328 UCHAR
Unused1 : 2;
00329 UCHAR
SpecialFullyNested : 1;
00330 UCHAR
Unused2 : 3;
00331 }
INITIALIZATION_COMMAND_4, *
PINITIALIZATION_COMMAND_4;
00332
00333
00334
00335
00336
00337
00338 #define NONSPECIFIC_END_OF_INTERRUPT 0x20
00339 #define SPECIFIC_END_OF_INTERRUPT 0x60
00340
00341
00342
00343
00344
00345 #define EISA_EXTERNAL_INTERRUPTS_1 0xf8
00346 #define EISA_EXTERNAL_INTERRUPTS_2 0xbe
00347
00348
00349
00350
00351
00352
typedef struct _DMA_EISA_MODE {
00353 UCHAR
Channel : 2;
00354 UCHAR
TransferType : 2;
00355 UCHAR
AutoInitialize : 1;
00356 UCHAR
AddressDecrement : 1;
00357 UCHAR
RequestMode : 2;
00358 }
DMA_EISA_MODE, *
PDMA_EISA_MODE;
00359
00360
00361
00362
00363
00364 #define VERIFY_TRANSFER 0x00
00365 #define READ_TRANSFER 0x01 // Read from the device.
00366 #define WRITE_TRANSFER 0x02 // Write to the device.
00367
00368
00369
00370
00371
00372 #define DEMAND_REQUEST_MODE 0x00
00373 #define SINGLE_REQUEST_MODE 0x01
00374 #define BLOCK_REQUEST_MODE 0x02
00375 #define CASCADE_REQUEST_MODE 0x03
00376
00377
00378
00379
00380
00381
typedef struct _DMA_EXTENDED_MODE {
00382 UCHAR
ChannelNumber : 2;
00383 UCHAR
TransferSize : 2;
00384 UCHAR
TimingMode : 2;
00385 UCHAR
EndOfPacketInput : 1;
00386 UCHAR
StopRegisterEnabled : 1;
00387 }
DMA_EXTENDED_MODE, *
PDMA_EXTENDED_MODE;
00388
00389
00390
00391
00392
00393 #define BY_BYTE_8_BITS 0
00394 #define BY_WORD_16_BITS 1
00395 #define BY_BYTE_32_BITS 2
00396 #define BY_BYTE_16_BITS 3
00397
00398
00399
00400
00401
00402 #define COMPATIBLITY_TIMING 0
00403 #define TYPE_A_TIMING 1
00404 #define TYPE_B_TIMING 2
00405 #define BURST_TIMING 3
00406
00407
#ifndef DMA1_COMMAND_STATUS
00408
00409
00410
00411
00412
00413
00414 #define DMA_SETMASK 4
00415 #define DMA_CLEARMASK 0
00416 #define DMA_READ 4 // These two appear backwards, but I think
00417 #define DMA_WRITE 8 // the DMA docs have them mixed up
00418 #define DMA_SINGLE_TRANSFER 0x40
00419 #define DMA_AUTO_INIT 0x10 // Auto initialization mode
00420
#endif
00421
00422
00423
00424
00425
00426
00427
00428 typedef struct _PARTITION_INFORMATION_NEC {
00429 UCHAR
PartitionType;
00430 BOOLEAN
RecognizedPartition;
00431 BOOLEAN
RewritePartition;
00432 ULONG
PartitionNumber;
00433 LARGE_INTEGER
IplStartOffset;
00434 LARGE_INTEGER
StartingOffset;
00435 LARGE_INTEGER
PartitionLength;
00436 UCHAR
BootableFlag;
00437 UCHAR
PartitionName[16];
00438 }
PARTITION_INFORMATION_NEC, *
PPARTITION_INFORMATION_NEC;
00439
00440 typedef struct _DRIVE_LAYOUT_INFORMATION_NEC {
00441 ULONG
PartitionCount;
00442 ULONG
Signature;
00443 UCHAR
BootRecordNec[8];
00444 PARTITION_INFORMATION_NEC PartitionEntry[1];
00445 }
DRIVE_LAYOUT_INFORMATION_NEC, *
PDRIVE_LAYOUT_INFORMATION_NEC;
00446
00447
00448
00449
00450 extern UCHAR
Over16MBMemoryFlag;
00451
00452
00453
00454
00455 #define NOTDMA_MINIMUM_PHYSICAL_ADDRESS 0x0f00000
00456
00457
00458
00459
00460
VOID
00461
FASTCALL
00462
xHalExamineMBR(
00463 IN
PDEVICE_OBJECT DeviceObject,
00464 IN ULONG SectorSize,
00465 IN ULONG MBRTypeIdentifier,
00466 OUT PVOID *Buffer
00467 );
00468
00469
VOID
00470
FASTCALL
00471
xHalIoAssignDriveLetters(
00472 IN
struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
00473 IN PSTRING NtDeviceName,
00474 OUT PUCHAR NtSystemPath,
00475 OUT PSTRING NtSystemPathString
00476 );
00477
00478
NTSTATUS
00479
FASTCALL
00480
xHalIoReadPartitionTable(
00481 IN
PDEVICE_OBJECT DeviceObject,
00482 IN ULONG SectorSize,
00483 IN BOOLEAN ReturnRecognizedPartitions,
00484 OUT
struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer
00485 );
00486
00487
NTSTATUS
00488
FASTCALL
00489
xHalIoSetPartitionInformation(
00490 IN
PDEVICE_OBJECT DeviceObject,
00491 IN ULONG SectorSize,
00492 IN ULONG PartitionNumber,
00493 IN ULONG PartitionType
00494 );
00495
00496
NTSTATUS
00497
FASTCALL
00498
xHalIoWritePartitionTable(
00499 IN
PDEVICE_OBJECT DeviceObject,
00500 IN ULONG SectorSize,
00501 IN ULONG SectorsPerTrack,
00502 IN ULONG NumberOfHeads,
00503 IN
struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer
00504 );
00505
00506
#endif //_EISA_