2 Routines to simplify the use of DMA for Sound Blaster driver
9 BOOLEAN
CheckDMA(PDEVICE_EXTENSION Device
)
11 // Don't forget to check for Compaq machines (they can't be configured
14 return TRUE
; // for now...
17 // return (BOOLEAN) !((INPORT(pHw, BOARD_ID) & 0x80) && Device->DMA == 0);
21 // UCHAR Expected = (UCHAR)(Device->DMA == 0 ? 0x40 :
22 // Device->DMA == 1 ? 0x80 :
24 // CompaqPIDR = READ_PORT_UCHAR(pHw->CompaqBA + BOARD_ID);
25 // if (CompaqPIDR != 0xff)
27 // if ((UCHAR)(CompaqPIDR & 0xc0) == Expected)
37 static IO_ALLOCATION_ACTION NTAPI
SoundProgramDMA(
38 IN PDEVICE_OBJECT DeviceObject
,
40 IN PVOID MapRegisterBase
,
43 PDEVICE_EXTENSION Device
= DeviceObject
->DeviceExtension
;
45 PUCHAR VirtualAddress
= (PUCHAR
) MmGetMdlVirtualAddress(Device
->Mdl
);
47 DPRINT("IoMapTransfer\n");
48 IoMapTransfer(Device
->Adapter
,
51 (PUCHAR
) MmGetMdlVirtualAddress(Device
->Mdl
),
52 &Device
->BufferSize
, // is this right?
55 DPRINT("VBuffer == 0x%x (really 0x%x?) Bufsize == %u\n", Device
->VirtualBuffer
, MmGetPhysicalAddress(Device
->VirtualBuffer
), Device
->BufferSize
);
57 DPRINT("Writing %u bytes of garbage...\n", Device
->BufferSize
);
58 // Write some garbage:
59 for (zzz
= 0; zzz
< Device
->BufferSize
; zzz
++)
60 *(VirtualAddress
+ zzz
) = (UCHAR
) zzz
% 200;
64 KeSetEvent(Context
, 0, FALSE
);
70 BOOLEAN
CreateDMA(PDEVICE_OBJECT DeviceObject
)
72 DEVICE_DESCRIPTION Desc
;
74 PDEVICE_EXTENSION Device
= DeviceObject
->DeviceExtension
;
78 // Buffersize should already be set but it isn't yet !
79 Device
->BufferSize
= SB_BUFSIZE
;
80 DPRINT("Bufsize == %u\n", Device
->BufferSize
);
82 RtlZeroMemory(&Desc
, sizeof(DEVICE_DESCRIPTION
));
85 Desc
.Version
= DEVICE_DESCRIPTION_VERSION
;
86 Desc
.Master
= FALSE
; // Slave
87 Desc
.ScatterGather
= FALSE
; // Don't think so anyway
88 Desc
.DemandMode
= FALSE
; // == !SingleModeDMA
89 Desc
.AutoInitialize
= TRUE
; // ?
90 Desc
.Dma32BitAddresses
= FALSE
; // I don't think we can
91 Desc
.IgnoreCount
= FALSE
; // Should be OK
93 // Desc.Reserved2 = 0;
95 Desc
.DmaChannel
= Device
->DMA
; // Our channel :)
96 Desc
.InterfaceType
= Isa
; // (BusType == MicroChannel) ? MicroChannel : Isa;
97 Desc
.DmaWidth
= 0; // hmm... 8 bits?
98 Desc
.DmaSpeed
= 0; // double hmm (Compatible it should be)
99 Desc
.MaximumLength
= Device
->BufferSize
;
100 // Desc.MinimumLength = 0;
103 DPRINT("Calling HalGetAdapter(), asking for %d mapped regs\n", MappedRegs
);
105 Device
->Adapter
= HalGetAdapter(&Desc
, &MappedRegs
);
109 if (! Device
->Adapter
)
111 DPRINT("HalGetAdapter() FAILED\n");
115 DPRINT("Bufsize == %u\n", Device
->BufferSize
);
117 if (MappedRegs
< BYTES_TO_PAGES(Device
->BufferSize
))
119 DPRINT("Could only allocate %u mapping registers\n", MappedRegs
);
124 Device
->BufferSize
= MappedRegs
* PAGE_SIZE
;
125 DPRINT("Bufsize == %u\n", Device
->BufferSize
);
128 DPRINT("Allocated %u mapping registers\n", MappedRegs
);
130 // Check if we already have memory here...
132 // Check to make sure we're >= minimum
134 DPRINT("Allocating buffer\n");
136 DPRINT("Bufsize == %u\n", Device
->BufferSize
);
138 Device
->VirtualBuffer
= HalAllocateCommonBuffer(Device
->Adapter
, Device
->BufferSize
,
139 &Device
->Buffer
, FALSE
);
141 // For some reason BufferSize == 0 here?!
142 // DPRINT("Buffer == 0x%x Bufsize == %u\n", Device->Buffer, Device->BufferSize);
143 DPRINT("Bufsize == %u,", Device
->BufferSize
);
144 DPRINT("Buffer == 0x%x\n", Device
->Buffer
);
146 if (! Device
->VirtualBuffer
)
148 DPRINT("Could not allocate buffer :(\n");
149 // should try again with smaller buffer...
153 // DPRINT("Buffer == 0x%x Bufsize == %u\n", Device->Buffer, Device->BufferSize);
154 DPRINT("Bufsize == %u,", Device
->BufferSize
);
155 DPRINT("Buffer == 0x%x\n", Device
->Buffer
);
157 DPRINT("Calling IoAllocateMdl()\n");
158 Device
->Mdl
= IoAllocateMdl(Device
->VirtualBuffer
, Device
->BufferSize
, FALSE
, FALSE
, NULL
);
159 DPRINT("Bufsize == %u\n", Device
->BufferSize
);
164 DPRINT("IoAllocateMdl() FAILED\n");
165 // Free the HAL buffer
169 DPRINT("VBuffer == 0x%x Mdl == %u Bufsize == %u\n", Device
->VirtualBuffer
, Device
->Mdl
, Device
->BufferSize
);
171 DPRINT("Calling MmBuildMdlForNonPagedPool\n");
172 MmBuildMdlForNonPagedPool(Device
->Mdl
);
174 DPRINT("Bufsize == %u\n", Device
->BufferSize
);
177 KeInitializeEvent(&DMAEvent
, SynchronizationEvent
, FALSE
);
179 KeRaiseIrql(DISPATCH_LEVEL
,&OldIrql
);
180 IoAllocateAdapterChannel(Device
->Adapter
, DeviceObject
,
181 BYTES_TO_PAGES(Device
->BufferSize
),
182 SoundProgramDMA
, &DMAEvent
);
184 KeLowerIrql(OldIrql
);
185 DPRINT("VBuffer == 0x%x Bufsize == %u\n", Device
->VirtualBuffer
, Device
->BufferSize
);
186 KeWaitForSingleObject(&DMAEvent
, Executive
, KernelMode
, FALSE
, NULL
);
189 // if (MappedRegs == 0)
195 // Status = IoAllocateAdapterChannel(
200 // DeviceObject); // Context