2 * VGA.C - a generic VGA miniport driver
7 #include <ddk/ntddvid.h>
9 #define UNIMPLEMENTED do {DbgPrint("%s:%d: Function not implemented", __FILE__, __LINE__); for(;;);} while (0)
11 #define VERSION "0.0.0"
13 // ---------------------------------------------------- Forward Declarations
14 static VP_STATUS
VGAFindAdapter(PVOID DeviceExtension
,
17 PVIDEO_PORT_CONFIG_INFO ConfigInfo
,
19 static BOOLEAN
VGAInitialize(PVOID DeviceExtension
);
20 static BOOLEAN
VGAStartIO(PVOID DeviceExtension
,
21 PVIDEO_REQUEST_PACKET RequestPacket
);
23 static BOOLEAN VGAInterrupt(PVOID DeviceExtension);
24 static BOOLEAN VGAResetHw(PVOID DeviceExtension,
27 static VOID VGATimer(PVOID DeviceExtension);
30 /* Mandatory IoControl routines */
31 VOID
VGAMapVideoMemory(IN PVIDEO_MEMORY RequestedAddress
,
32 OUT PVIDEO_MEMORY_INFORMATION MapInformation
,
33 OUT PSTATUS_BLOCK StatusBlock
);
34 VOID
VGAQueryAvailModes(OUT PVIDEO_MODE_INFORMATION ReturnedModes
,
35 OUT PSTATUS_BLOCK StatusBlock
);
36 VOID
VGAQueryCurrentMode(OUT PVIDEO_MODE_INFORMATION CurrentMode
,
37 OUT PSTATUS_BLOCK StatusBlock
);
38 VOID
VGAQueryNumAvailModes(OUT PVIDEO_NUM_MODES NumberOfModes
,
39 OUT PSTATUS_BLOCK StatusBlock
);
40 VOID
VGAResetDevice(OUT PSTATUS_BLOCK StatusBlock
);
41 VOID
VGASetColorRegisters(IN PVIDEO_CLUT ColorLookUpTable
,
42 OUT PSTATUS_BLOCK StatusBlock
);
43 VOID
VGASetPaletteRegisters(IN PWORD PaletteRegisters
,
44 OUT PSTATUS_BLOCK StatusBlock
);
45 VOID
VGASetCurrentMode(IN PVIDEO_MODE RequestedMode
,
46 OUT PSTATUS_BLOCK StatusBlock
);
47 VOID
VGAShareVideoMemory(IN PVIDEO_SHARE_MEMORY RequestedMemory
,
48 OUT PVIDEO_MEMORY_INFORMATION ReturnedMemory
,
49 OUT PSTATUS_BLOCK StatusBlock
);
50 VOID
VGAUnmapVideoMemory(IN PVIDEO_MEMORY MemoryToUnmap
,
51 OUT PSTATUS_BLOCK StatusBlock
);
52 VOID
VGAUnshareVideoMemory(IN PVIDEO_MEMORY MemoryToUnshare
,
53 OUT PSTATUS_BLOCK StatusBlock
);
55 // ------------------------------------------------------- Public Interface
60 // This function initializes the driver.
66 // IN PVOID Context1 Context parameter to pass to VidPortInitialize
67 // IN PVOID Context2 Context parameter to pass to VidPortInitialize
72 DriverEntry(IN PVOID Context1
,
75 VIDEO_HW_INITIALIZATION_DATA InitData
;
77 VideoPortZeroMemory(&InitData
, sizeof InitData
);
79 /* FIXME: Fill in InitData members */
80 InitData
.StartingDeviceNumber
= 0;
82 /* Export driver entry points... */
83 InitData
.HwFindAdapter
= VGAFindAdapter
;
84 InitData
.HwInitialize
= VGAInitialize
;
85 InitData
.HwStartIO
= VGAStartIO
;
86 /* InitData.HwInterrupt = VGAInterrupt; */
87 /* InitData.HwResetHw = VGAResetHw; */
88 /* InitData.HwTimer = VGATimer; */
90 return VideoPortInitialize(Context1
, Context2
, &InitData
, NULL
);
96 // This routine is called by the videoport driver to find and allocate
97 // the adapter for a given bus. The miniport driver needs to do the
98 // following in this routine:
99 // - Determine if the adapter is present
100 // - Claim any necessary memory/IO resources for the adapter
101 // - Map resources into system memory for the adapter
102 // - fill in relevant information in the VIDEO_PORT_CONFIG_INFO buffer
103 // - update registry settings for adapter specifics.
104 // - Set 'Again' based on whether the function should be called again
105 // another adapter on the same bus.
111 // PVOID DeviceExtension
113 // PWSTR ArgumentString
114 // PVIDEO_PORT_CONFIG_INFO ConfigInfo
120 VGAFindAdapter(PVOID DeviceExtension
,
122 PWSTR ArgumentString
,
123 PVIDEO_PORT_CONFIG_INFO ConfigInfo
,
126 /* FIXME: Determine if the adapter is present */
129 return STATUS_SUCCESS
;
131 /* FIXME: Claim any necessary memory/IO resources for the adapter */
132 /* FIXME: Map resources into system memory for the adapter */
133 /* FIXME: Fill in relevant information in the VIDEO_PORT_CONFIG_INFO buffer */
134 /* FIXME: Update registry settings for adapter specifics. */
141 // Perform initialization tasks, but leave the adapter in the same
142 // user visible state
148 // PVOID DeviceExtension
150 // BOOLEAN Success or failure
152 VGAInitialize(PVOID DeviceExtension
)
160 // This function gets called in responce to GDI EngDeviceIoControl
161 // calls. Device requests are passed in VRPs.
163 // IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES
164 // IOCTL_VIDEO_QUERY_AVAIL_MODES
165 // IOCTL_VIDEO_QUERY_CURRENT_MODE
166 // IOCTL_VIDEO_SET_CURRENT_MODE
167 // IOCTL_VIDEO_RESET_DEVICE
168 // IOCTL_VIDEO_MAP_VIDEO_MEMORY
169 // IOCTL_VIDEO_UNMAP_VIDEO_MEMORY
170 // IOCTL_VIDEO_SHARE_VIDEO_MEMORY
171 // IOCTL_VIDEO_UNSHARE_VIDEO_MEMORY
173 // IOCTL_VIDEO_GET_PUBLIC_ACCESS_RANGES
174 // IOCTL_VIDEO_FREE_PUBLIC_ACCESS_RANGES
175 // IOCTL_VIDEO_GET_POWER_MANAGEMENT
176 // IOCTL_VIDEO_SET_POWER_MANAGEMENT
177 // IOCTL_QUERY_COLOR_CAPABILITIES
178 // IOCTL_VIDEO_SET_COLOR_REGISTERS (required if the device has a palette)
179 // IOCTL_VIDEO_DISABLE_POINTER
180 // IOCTL_VIDEO_ENABLE_POINTER
181 // IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES
182 // IOCTL_VIDEO_QUERY_POINTER_ATTR
183 // IOCTL_VIDEO_SET_POINTER_ATTR
184 // IOCTL_VIDEO_QUERY_POINTER_POSITION
185 // IOCTL_VIDEO_SET_POINTER_POSITION
186 // IOCTL_VIDEO_SAVE_HARDWARE_STATE
187 // IOCTL_VIDEO_RESTORE_HARDWARE_STATE
188 // IOCTL_VIDEO_DISABLE_CURSOR
189 // IOCTL_VIDEO_ENABLE_CURSOR
190 // IOCTL_VIDEO_QUERY_CURSOR_ATTR
191 // IOCTL_VIDEO_SET_CURSOR_ATTR
192 // IOCTL_VIDEO_QUERY_CURSOR_POSITION
193 // IOCTL_VIDEO_SET_CURSOR_POSITION
194 // IOCTL_VIDEO_GET_BANK_SELECT_CODE
195 // IOCTL_VIDEO_SET_PALETTE_REGISTERS
196 // IOCTL_VIDEO_LOAD_AND_SET_FONT
202 // PVOID DeviceExtension
203 // PVIDEO_REQUEST_PACKET RequestPacket
205 // BOOLEAN This function must return TRUE, and complete the work or
206 // set an error status in the VRP.
209 VGAStartIO(PVOID DeviceExtension
,
210 PVIDEO_REQUEST_PACKET RequestPacket
)
212 switch (RequestPacket
->IoControlCode
)
214 case IOCTL_VIDEO_MAP_VIDEO_MEMORY
:
215 VGAMapVideoMemory((PVIDEO_MEMORY
) RequestPacket
->InputBuffer
,
216 (PVIDEO_MEMORY_INFORMATION
)
217 RequestPacket
->OutputBuffer
,
218 RequestPacket
->StatusBlock
);
221 case IOCTL_VIDEO_QUERY_AVAIL_MODES
:
222 VGAQueryAvailModes((PVIDEO_MODE_INFORMATION
) RequestPacket
->OutputBuffer
,
223 RequestPacket
->StatusBlock
);
226 case IOCTL_VIDEO_QUERY_CURRENT_MODE
:
227 VGAQueryCurrentMode((PVIDEO_MODE_INFORMATION
) RequestPacket
->OutputBuffer
,
228 RequestPacket
->StatusBlock
);
231 case IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES
:
232 VGAQueryNumAvailModes((PVIDEO_NUM_MODES
) RequestPacket
->OutputBuffer
,
233 RequestPacket
->StatusBlock
);
236 case IOCTL_VIDEO_RESET_DEVICE
:
237 VGAResetDevice(RequestPacket
->StatusBlock
);
240 case IOCTL_VIDEO_SET_COLOR_REGISTERS
:
241 VGASetColorRegisters((PVIDEO_CLUT
) RequestPacket
->InputBuffer
,
242 RequestPacket
->StatusBlock
);
245 case IOCTL_VIDEO_SET_CURRENT_MODE
:
246 VGASetCurrentMode((PVIDEO_MODE
) RequestPacket
->InputBuffer
,
247 RequestPacket
->StatusBlock
);
250 case IOCTL_VIDEO_SHARE_VIDEO_MEMORY
:
251 VGAShareVideoMemory((PVIDEO_SHARE_MEMORY
) RequestPacket
->InputBuffer
,
252 (PVIDEO_MEMORY_INFORMATION
) RequestPacket
->OutputBuffer
,
253 RequestPacket
->StatusBlock
);
256 case IOCTL_VIDEO_UNMAP_VIDEO_MEMORY
:
257 VGAUnmapVideoMemory((PVIDEO_MEMORY
) RequestPacket
->InputBuffer
,
258 RequestPacket
->StatusBlock
);
261 case IOCTL_VIDEO_UNSHARE_VIDEO_MEMORY
:
262 VGAUnshareVideoMemory((PVIDEO_MEMORY
) RequestPacket
->InputBuffer
,
263 RequestPacket
->StatusBlock
);
265 case IOCTL_VIDEO_SET_PALETTE_REGISTERS
:
266 VGASetPaletteRegisters((PWORD
) RequestPacket
->InputBuffer
,
267 RequestPacket
->StatusBlock
);
271 case IOCTL_VIDEO_DISABLE_CURSOR
:
272 case IOCTL_VIDEO_DISABLE_POINTER
:
273 case IOCTL_VIDEO_ENABLE_CURSOR
:
274 case IOCTL_VIDEO_ENABLE_POINTER
:
276 case IOCTL_VIDEO_FREE_PUBLIC_ACCESS_RANGES
:
277 VGAFreePublicAccessRanges((PVIDEO_PUBLIC_ACCESS_RANGES
)
278 RequestPacket
->InputBuffer
,
279 RequestPacket
->StatusBlock
);
282 case IOCTL_VIDEO_GET_BANK_SELECT_CODE
:
283 case IOCTL_VIDEO_GET_POWER_MANAGEMENT
:
284 case IOCTL_VIDEO_LOAD_AND_SET_FONT
:
285 case IOCTL_VIDEO_QUERY_CURSOR_POSITION
:
286 case IOCTL_VIDEO_QUERY_COLOR_CAPABILITIES
:
287 case IOCTL_VIDEO_QUERY_CURSOR_ATTR
:
288 case IOCTL_VIDEO_QUERY_POINTER_ATTR
:
289 case IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES
:
290 case IOCTL_VIDEO_QUERY_POINTER_POSITION
:
292 case IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES
:
293 VGAQueryPublicAccessRanges((PVIDEO_PUBLIC_ACCESS_RANGES
)
294 RequestPacket
->OutputBuffer
,
295 RequestPacket
->StatusBlock
);
298 case IOCTL_VIDEO_RESTORE_HARDWARE_STATE
:
299 case IOCTL_VIDEO_SAVE_HARDWARE_STATE
:
300 case IOCTL_VIDEO_SET_CURSOR_ATTR
:
301 case IOCTL_VIDEO_SET_CURSOR_POSITION
:
302 case IOCTL_VIDEO_SET_POINTER_ATTR
:
303 case IOCTL_VIDEO_SET_POINTER_POSITION
:
304 case IOCTL_VIDEO_SET_POWER_MANAGEMENT
:
309 RequestPacket
->StatusBlock
->Status
= STATUS_NOT_IMPLEMENTED
;
320 // This function will be called upon receipt of a adapter generated
321 // interrupt when enabled.
327 // PVOID DeviceExtension
329 // BOOLEAN TRUE if the interrupt was handled by the routine
331 static BOOLEAN
VGAInterrupt(PVOID DeviceExtension
);
336 // This function is called to reset the hardware to a known state
337 // if calling a BIOS int 10 reset will not achieve this result.
343 // PVOID DeviceExtension
344 // ULONG Columns Columns and Rows specify the mode parameters
345 // ULONG Rows to reset to.
347 // BOOLEAN TRUE if no further action is necessary, FALSE if the system
348 // needs to still do a BOIS int 10 reset.
350 static BOOLEAN
VGAResetHw(PVOID DeviceExtension
,
357 // This function will be called once a second when enabled
363 // PVOID DeviceExtension
367 static VOID
VGATimer(PVOID DeviceExtension
);
371 VOID
VGAMapVideoMemory(IN PVIDEO_MEMORY RequestedAddress
,
372 OUT PVIDEO_MEMORY_INFORMATION MapInformation
,
373 OUT PSTATUS_BLOCK StatusBlock
)
378 VOID
VGAQueryAvailModes(OUT PVIDEO_MODE_INFORMATION ReturnedModes
,
379 OUT PSTATUS_BLOCK StatusBlock
)
384 VOID
VGAQueryCurrentMode(OUT PVIDEO_MODE_INFORMATION CurrentMode
,
385 OUT PSTATUS_BLOCK StatusBlock
)
390 VOID
VGAQueryNumAvailModes(OUT PVIDEO_NUM_MODES NumberOfModes
,
391 OUT PSTATUS_BLOCK StatusBlock
)
396 VOID
VGASetPaletteRegisters(IN PWORD PaletteRegisters
,
397 OUT PSTATUS_BLOCK StatusBlock
)
402 We don't need the following code because the palette registers are set correctly on VGA initialization.
403 Still, we may include\test this is in the future.
408 tmp = VideoPortReadPortUchar(0x03da);
409 v = VideoPortReadPortUchar(0x03c0);
411 // Set the first 16 palette registers to map to the first 16 palette colors
412 for (i=PaletteRegisters[1]; i<PaletteRegisters[0]; i++)
414 tmp = VideoPortReadPortUchar(0x03da);
415 VideoPortWritePortUchar(0x03c0, i);
416 VideoPortWritePortUchar(0x03c0, PaletteRegisters[j++]);
419 tmp = VideoPortReadPortUchar(0x03da);
420 VideoPortWritePortUchar(0x03d0, v | 0x20);
424 VOID
VGASetColorRegisters(IN PVIDEO_CLUT ColorLookUpTable
,
425 OUT PSTATUS_BLOCK StatusBlock
)
429 for (i
=ColorLookUpTable
->FirstEntry
; i
<ColorLookUpTable
->NumEntries
; i
++)
431 VideoPortWritePortUchar((PUCHAR
)0x03c8, i
);
432 VideoPortWritePortUchar((PUCHAR
)0x03c9, ColorLookUpTable
->LookupTable
[i
].RgbArray
.Red
);
433 VideoPortWritePortUchar((PUCHAR
)0x03c9, ColorLookUpTable
->LookupTable
[i
].RgbArray
.Green
);
434 VideoPortWritePortUchar((PUCHAR
)0x03c9, ColorLookUpTable
->LookupTable
[i
].RgbArray
.Blue
);
438 VOID
VGASetCurrentMode(IN PVIDEO_MODE RequestedMode
,
439 OUT PSTATUS_BLOCK StatusBlock
)
441 if(RequestedMode
->RequestedMode
== 12)
445 DbgPrint("Unrecognised mode for VGASetCurrentMode\n");
449 VOID
VGAShareVideoMemory(IN PVIDEO_SHARE_MEMORY RequestedMemory
,
450 OUT PVIDEO_MEMORY_INFORMATION ReturnedMemory
,
451 OUT PSTATUS_BLOCK StatusBlock
)
456 VOID
VGAUnmapVideoMemory(IN PVIDEO_MEMORY MemoryToUnmap
,
457 OUT PSTATUS_BLOCK StatusBlock
)
462 VOID
VGAUnshareVideoMemory(IN PVIDEO_MEMORY MemoryToUnshare
,
463 OUT PSTATUS_BLOCK StatusBlock
)