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 DbgPrint("VGA miniport Driver %s\n", VERSION
);
79 VideoPortZeroMemory(&InitData
, sizeof InitData
);
81 /* FIXME: Fill in InitData members */
82 InitData
.StartingDeviceNumber
= 0;
84 /* Export driver entry points... */
85 InitData
.HwFindAdapter
= VGAFindAdapter
;
86 InitData
.HwInitialize
= VGAInitialize
;
87 InitData
.HwStartIO
= VGAStartIO
;
88 /* InitData.HwInterrupt = VGAInterrupt; */
89 /* InitData.HwResetHw = VGAResetHw; */
90 /* InitData.HwTimer = VGATimer; */
92 return VideoPortInitialize(Context1
, Context2
, &InitData
, NULL
);
98 // This routine is called by the videoport driver to find and allocate
99 // the adapter for a given bus. The miniport driver needs to do the
100 // following in this routine:
101 // - Determine if the adapter is present
102 // - Claim any necessary memory/IO resources for the adapter
103 // - Map resources into system memory for the adapter
104 // - fill in relevant information in the VIDEO_PORT_CONFIG_INFO buffer
105 // - update registry settings for adapter specifics.
106 // - Set 'Again' based on whether the function should be called again
107 // another adapter on the same bus.
113 // PVOID DeviceExtension
115 // PWSTR ArgumentString
116 // PVIDEO_PORT_CONFIG_INFO ConfigInfo
122 VGAFindAdapter(PVOID DeviceExtension
,
124 PWSTR ArgumentString
,
125 PVIDEO_PORT_CONFIG_INFO ConfigInfo
,
128 /* FIXME: Determine if the adapter is present */
131 return STATUS_SUCCESS
;
133 /* FIXME: Claim any necessary memory/IO resources for the adapter */
134 /* FIXME: Map resources into system memory for the adapter */
135 /* FIXME: Fill in relevant information in the VIDEO_PORT_CONFIG_INFO buffer */
136 /* FIXME: Update registry settings for adapter specifics. */
143 // Perform initialization tasks, but leave the adapter in the same
144 // user visible state
150 // PVOID DeviceExtension
152 // BOOLEAN Success or failure
154 VGAInitialize(PVOID DeviceExtension
)
162 // This function gets called in responce to GDI EngDeviceIoControl
163 // calls. Device requests are passed in VRPs.
165 // IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES
166 // IOCTL_VIDEO_QUERY_AVAIL_MODES
167 // IOCTL_VIDEO_QUERY_CURRENT_MODE
168 // IOCTL_VIDEO_SET_CURRENT_MODE
169 // IOCTL_VIDEO_RESET_DEVICE
170 // IOCTL_VIDEO_MAP_VIDEO_MEMORY
171 // IOCTL_VIDEO_UNMAP_VIDEO_MEMORY
172 // IOCTL_VIDEO_SHARE_VIDEO_MEMORY
173 // IOCTL_VIDEO_UNSHARE_VIDEO_MEMORY
175 // IOCTL_VIDEO_GET_PUBLIC_ACCESS_RANGES
176 // IOCTL_VIDEO_FREE_PUBLIC_ACCESS_RANGES
177 // IOCTL_VIDEO_GET_POWER_MANAGEMENT
178 // IOCTL_VIDEO_SET_POWER_MANAGEMENT
179 // IOCTL_QUERY_COLOR_CAPABILITIES
180 // IOCTL_VIDEO_SET_COLOR_REGISTERS (required if the device has a palette)
181 // IOCTL_VIDEO_DISABLE_POINTER
182 // IOCTL_VIDEO_ENABLE_POINTER
183 // IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES
184 // IOCTL_VIDEO_QUERY_POINTER_ATTR
185 // IOCTL_VIDEO_SET_POINTER_ATTR
186 // IOCTL_VIDEO_QUERY_POINTER_POSITION
187 // IOCTL_VIDEO_SET_POINTER_POSITION
188 // IOCTL_VIDEO_SAVE_HARDWARE_STATE
189 // IOCTL_VIDEO_RESTORE_HARDWARE_STATE
190 // IOCTL_VIDEO_DISABLE_CURSOR
191 // IOCTL_VIDEO_ENABLE_CURSOR
192 // IOCTL_VIDEO_QUERY_CURSOR_ATTR
193 // IOCTL_VIDEO_SET_CURSOR_ATTR
194 // IOCTL_VIDEO_QUERY_CURSOR_POSITION
195 // IOCTL_VIDEO_SET_CURSOR_POSITION
196 // IOCTL_VIDEO_GET_BANK_SELECT_CODE
197 // IOCTL_VIDEO_SET_PALETTE_REGISTERS
198 // IOCTL_VIDEO_LOAD_AND_SET_FONT
204 // PVOID DeviceExtension
205 // PVIDEO_REQUEST_PACKET RequestPacket
207 // BOOLEAN This function must return TRUE, and complete the work or
208 // set an error status in the VRP.
211 VGAStartIO(PVOID DeviceExtension
,
212 PVIDEO_REQUEST_PACKET RequestPacket
)
214 switch (RequestPacket
->IoControlCode
)
216 case IOCTL_VIDEO_MAP_VIDEO_MEMORY
:
217 VGAMapVideoMemory((PVIDEO_MEMORY
) RequestPacket
->InputBuffer
,
218 (PVIDEO_MEMORY_INFORMATION
)
219 RequestPacket
->OutputBuffer
,
220 &RequestPacket
->StatusBlock
);
223 case IOCTL_VIDEO_QUERY_AVAIL_MODES
:
224 VGAQueryAvailModes((PVIDEO_MODE_INFORMATION
) RequestPacket
->OutputBuffer
,
225 &RequestPacket
->StatusBlock
);
228 case IOCTL_VIDEO_QUERY_CURRENT_MODE
:
229 VGAQueryCurrentMode((PVIDEO_MODE_INFORMATION
) RequestPacket
->OutputBuffer
,
230 &RequestPacket
->StatusBlock
);
233 case IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES
:
234 VGAQueryNumAvailModes((PVIDEO_NUM_MODES
) RequestPacket
->OutputBuffer
,
235 &RequestPacket
->StatusBlock
);
238 case IOCTL_VIDEO_RESET_DEVICE
:
239 VGAResetDevice(&RequestPacket
->StatusBlock
);
242 case IOCTL_VIDEO_SET_COLOR_REGISTERS
:
243 VGASetColorRegisters((PVIDEO_CLUT
) RequestPacket
->InputBuffer
,
244 &RequestPacket
->StatusBlock
);
247 case IOCTL_VIDEO_SET_CURRENT_MODE
:
248 VGASetCurrentMode((PVIDEO_MODE
) RequestPacket
->InputBuffer
,
249 &RequestPacket
->StatusBlock
);
252 case IOCTL_VIDEO_SHARE_VIDEO_MEMORY
:
253 VGAShareVideoMemory((PVIDEO_SHARE_MEMORY
) RequestPacket
->InputBuffer
,
254 (PVIDEO_MEMORY_INFORMATION
) RequestPacket
->OutputBuffer
,
255 &RequestPacket
->StatusBlock
);
258 case IOCTL_VIDEO_UNMAP_VIDEO_MEMORY
:
259 VGAUnmapVideoMemory((PVIDEO_MEMORY
) RequestPacket
->InputBuffer
,
260 &RequestPacket
->StatusBlock
);
263 case IOCTL_VIDEO_UNSHARE_VIDEO_MEMORY
:
264 VGAUnshareVideoMemory((PVIDEO_MEMORY
) RequestPacket
->InputBuffer
,
265 &RequestPacket
->StatusBlock
);
267 case IOCTL_VIDEO_SET_PALETTE_REGISTERS
:
268 VGASetPaletteRegisters((PVIDEO_CLUT
) RequestPacket
->InputBuffer
,
269 &RequestPacket
->StatusBlock
);
273 case IOCTL_VIDEO_DISABLE_CURSOR
:
274 case IOCTL_VIDEO_DISABLE_POINTER
:
275 case IOCTL_VIDEO_ENABLE_CURSOR
:
276 case IOCTL_VIDEO_ENABLE_POINTER
:
278 case IOCTL_VIDEO_FREE_PUBLIC_ACCESS_RANGES
:
279 VGAFreePublicAccessRanges((PVIDEO_PUBLIC_ACCESS_RANGES
)
280 RequestPacket
->InputBuffer
,
281 &RequestPacket
->StatusBlock
);
284 case IOCTL_VIDEO_GET_BANK_SELECT_CODE
:
285 case IOCTL_VIDEO_GET_POWER_MANAGEMENT
:
286 case IOCTL_VIDEO_LOAD_AND_SET_FONT
:
287 case IOCTL_VIDEO_QUERY_CURSOR_POSITION
:
288 case IOCTL_VIDEO_QUERY_COLOR_CAPABILITIES
:
289 case IOCTL_VIDEO_QUERY_CURSOR_ATTR
:
290 case IOCTL_VIDEO_QUERY_POINTER_ATTR
:
291 case IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES
:
292 case IOCTL_VIDEO_QUERY_POINTER_POSITION
:
294 case IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES
:
295 VGAQueryPublicAccessRanges((PVIDEO_PUBLIC_ACCESS_RANGES
)
296 RequestPacket
->OutputBuffer
,
297 &RequestPacket
->StatusBlock
);
300 case IOCTL_VIDEO_RESTORE_HARDWARE_STATE
:
301 case IOCTL_VIDEO_SAVE_HARDWARE_STATE
:
302 case IOCTL_VIDEO_SET_CURSOR_ATTR
:
303 case IOCTL_VIDEO_SET_CURSOR_POSITION
:
304 case IOCTL_VIDEO_SET_POINTER_ATTR
:
305 case IOCTL_VIDEO_SET_POINTER_POSITION
:
306 case IOCTL_VIDEO_SET_POWER_MANAGEMENT
:
311 RequestPacket
->StatusBlock
->Status
= STATUS_NOT_IMPLEMENTED
;
322 // This function will be called upon receipt of a adapter generated
323 // interrupt when enabled.
329 // PVOID DeviceExtension
331 // BOOLEAN TRUE if the interrupt was handled by the routine
333 static BOOLEAN
VGAInterrupt(PVOID DeviceExtension
);
338 // This function is called to reset the hardware to a known state
339 // if calling a BIOS int 10 reset will not achieve this result.
345 // PVOID DeviceExtension
346 // ULONG Columns Columns and Rows specify the mode parameters
347 // ULONG Rows to reset to.
349 // BOOLEAN TRUE if no further action is necessary, FALSE if the system
350 // needs to still do a BOIS int 10 reset.
352 static BOOLEAN
VGAResetHw(PVOID DeviceExtension
,
359 // This function will be called once a second when enabled
365 // PVOID DeviceExtension
369 static VOID
VGATimer(PVOID DeviceExtension
);
373 VOID
VGAMapVideoMemory(IN PVIDEO_MEMORY RequestedAddress
,
374 OUT PVIDEO_MEMORY_INFORMATION MapInformation
,
375 OUT PSTATUS_BLOCK StatusBlock
)
380 VOID
VGAQueryAvailModes(OUT PVIDEO_MODE_INFORMATION ReturnedModes
,
381 OUT PSTATUS_BLOCK StatusBlock
)
386 VOID
VGAQueryCurrentMode(OUT PVIDEO_MODE_INFORMATION CurrentMode
,
387 OUT PSTATUS_BLOCK StatusBlock
)
392 VOID
VGAQueryNumAvailModes(OUT PVIDEO_NUM_MODES NumberOfModes
,
393 OUT PSTATUS_BLOCK StatusBlock
)
398 VOID
VGASetPaletteRegisters(IN PWORD PaletteRegisters
,
399 OUT PSTATUS_BLOCK StatusBlock
)
404 We don't need the following code because the palette registers are set correctly on VGA initialization.
405 Still, we may include\test this is in the future.
410 tmp = VideoPortReadPortUchar(0x03da);
411 v = VideoPortReadPortUchar(0x03c0);
413 // Set the first 16 palette registers to map to the first 16 palette colors
414 for (i=PaletteRegisters[1]; i<PaletteRegisters[0]; i++)
416 tmp = VideoPortReadPortUchar(0x03da);
417 VideoPortWritePortUchar(0x03c0, i);
418 VideoPortWritePortUchar(0x03c0, PaletteRegisters[j++]);
421 tmp = VideoPortReadPortUchar(0x03da);
422 VideoPortWritePortUchar(0x03d0, v | 0x20);
426 VOID
VGASetColorRegisters(IN PVIDEO_CLUT ColorLookUpTable
,
427 OUT PSTATUS_BLOCK StatusBlock
)
431 for (i
=ColorLookUpTable
->FirstEntry
; i
<ColorLookUpTable
->NumEntries
; i
++)
433 VideoPortWritePortUchar(0x03c8, i
);
434 VideoPortWritePortUchar(0x03c9, ColorLookUpTable
->LookupTable
[i
].RgbArray
.Red
);
435 VideoPortWritePortUchar(0x03c9, ColorLookUpTable
->LookupTable
[i
].RgbArray
.Green
);
436 VideoPortWritePortUchar(0x03c9, ColorLookUpTable
->LookupTable
[i
].RgbArray
.Blue
);
440 VOID
VGASetCurrentMode(IN PVIDEO_MODE RequestedMode
,
441 OUT PSTATUS_BLOCK StatusBlock
)
443 if(RequestedMode
->RequestedMode
== 12)
447 DbgPrint("Unrecognised mode for VGASetCurrentMode\n");
451 VOID
VGAShareVideoMemory(IN PVIDEO_SHARE_MEMORY RequestedMemory
,
452 OUT PVIDEO_MEMORY_INFORMATION ReturnedMemory
,
453 OUT PSTATUS_BLOCK StatusBlock
)
458 VOID
VGAUnmapVideoMemory(IN PVIDEO_MEMORY MemoryToUnmap
,
459 OUT PSTATUS_BLOCK StatusBlock
)
464 VOID
VGAUnshareVideoMemory(IN PVIDEO_MEMORY MemoryToUnshare
,
465 OUT PSTATUS_BLOCK StatusBlock
)