2 * VGA.C - a generic VGA miniport driver
6 #define NTOS_KERNEL_MODE
8 #include <ddk/ntddvdeo.h>
9 #include <ntos/ntddvid.h>
11 #define UNIMPLEMENTED do {DbgPrint("%s:%d: Function not implemented", __FILE__, __LINE__); for(;;);} while (0)
13 #define VERSION "0.0.0"
15 // ---------------------------------------------------- Forward Declarations
16 static VP_STATUS STDCALL
17 VGAFindAdapter(PVOID DeviceExtension
,
20 PVIDEO_PORT_CONFIG_INFO ConfigInfo
,
22 static BOOLEAN STDCALL
23 VGAInitialize(PVOID DeviceExtension
);
24 static BOOLEAN STDCALL
25 VGAStartIO(PVOID DeviceExtension
,
26 PVIDEO_REQUEST_PACKET RequestPacket
);
28 static BOOLEAN STDCALL
29 VGAInterrupt(PVOID DeviceExtension);
30 static BOOLEAN STDCALL
31 VGAResetHw(PVOID DeviceExtension,
35 VGATimer(PVOID DeviceExtension);
38 /* Mandatory IoControl routines */
39 VOID
VGAMapVideoMemory(IN PVIDEO_MEMORY RequestedAddress
,
40 OUT PVIDEO_MEMORY_INFORMATION MapInformation
,
41 OUT PSTATUS_BLOCK StatusBlock
);
42 VOID
VGAQueryAvailModes(OUT PVIDEO_MODE_INFORMATION ReturnedModes
,
43 OUT PSTATUS_BLOCK StatusBlock
);
44 VOID
VGAQueryCurrentMode(OUT PVIDEO_MODE_INFORMATION CurrentMode
,
45 OUT PSTATUS_BLOCK StatusBlock
);
46 VOID
VGAQueryNumAvailModes(OUT PVIDEO_NUM_MODES NumberOfModes
,
47 OUT PSTATUS_BLOCK StatusBlock
);
48 VOID
VGAResetDevice(OUT PSTATUS_BLOCK StatusBlock
);
49 VOID
VGASetColorRegisters(IN PVIDEO_CLUT ColorLookUpTable
,
50 OUT PSTATUS_BLOCK StatusBlock
);
51 VOID
VGASetPaletteRegisters(IN PWORD PaletteRegisters
,
52 OUT PSTATUS_BLOCK StatusBlock
);
53 VOID
VGASetCurrentMode(IN PVIDEO_MODE RequestedMode
,
54 OUT PSTATUS_BLOCK StatusBlock
);
55 VOID
VGAShareVideoMemory(IN PVIDEO_SHARE_MEMORY RequestedMemory
,
56 OUT PVIDEO_MEMORY_INFORMATION ReturnedMemory
,
57 OUT PSTATUS_BLOCK StatusBlock
);
58 VOID
VGAUnmapVideoMemory(IN PVIDEO_MEMORY MemoryToUnmap
,
59 OUT PSTATUS_BLOCK StatusBlock
);
60 VOID
VGAUnshareVideoMemory(IN PVIDEO_MEMORY MemoryToUnshare
,
61 OUT PSTATUS_BLOCK StatusBlock
);
63 // ------------------------------------------------------- Public Interface
68 // This function initializes the driver.
74 // IN PVOID Context1 Context parameter to pass to VidPortInitialize
75 // IN PVOID Context2 Context parameter to pass to VidPortInitialize
80 DriverEntry(IN PVOID Context1
,
83 VIDEO_HW_INITIALIZATION_DATA InitData
;
85 VideoPortZeroMemory(&InitData
, sizeof InitData
);
87 /* FIXME: Fill in InitData members */
88 InitData
.StartingDeviceNumber
= 0;
90 /* Export driver entry points... */
91 InitData
.HwFindAdapter
= VGAFindAdapter
;
92 InitData
.HwInitialize
= VGAInitialize
;
93 InitData
.HwStartIO
= VGAStartIO
;
94 /* InitData.HwInterrupt = VGAInterrupt; */
95 /* InitData.HwResetHw = VGAResetHw; */
96 /* InitData.HwTimer = VGATimer; */
98 return VideoPortInitialize(Context1
, Context2
, &InitData
, NULL
);
104 // This routine is called by the videoport driver to find and allocate
105 // the adapter for a given bus. The miniport driver needs to do the
106 // following in this routine:
107 // - Determine if the adapter is present
108 // - Claim any necessary memory/IO resources for the adapter
109 // - Map resources into system memory for the adapter
110 // - fill in relevant information in the VIDEO_PORT_CONFIG_INFO buffer
111 // - update registry settings for adapter specifics.
112 // - Set 'Again' based on whether the function should be called again
113 // another adapter on the same bus.
119 // PVOID DeviceExtension
121 // PWSTR ArgumentString
122 // PVIDEO_PORT_CONFIG_INFO ConfigInfo
127 static VP_STATUS STDCALL
128 VGAFindAdapter(PVOID DeviceExtension
,
130 PWSTR ArgumentString
,
131 PVIDEO_PORT_CONFIG_INFO ConfigInfo
,
134 /* FIXME: Determine if the adapter is present */
137 return STATUS_SUCCESS
;
139 /* FIXME: Claim any necessary memory/IO resources for the adapter */
140 /* FIXME: Map resources into system memory for the adapter */
141 /* FIXME: Fill in relevant information in the VIDEO_PORT_CONFIG_INFO buffer */
142 /* FIXME: Update registry settings for adapter specifics. */
149 // Perform initialization tasks, but leave the adapter in the same
150 // user visible state
156 // PVOID DeviceExtension
158 // BOOLEAN Success or failure
159 static BOOLEAN STDCALL
160 VGAInitialize(PVOID DeviceExtension
)
168 // This function gets called in responce to GDI EngDeviceIoControl
169 // calls. Device requests are passed in VRPs.
171 // IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES
172 // IOCTL_VIDEO_QUERY_AVAIL_MODES
173 // IOCTL_VIDEO_QUERY_CURRENT_MODE
174 // IOCTL_VIDEO_SET_CURRENT_MODE
175 // IOCTL_VIDEO_RESET_DEVICE
176 // IOCTL_VIDEO_MAP_VIDEO_MEMORY
177 // IOCTL_VIDEO_UNMAP_VIDEO_MEMORY
178 // IOCTL_VIDEO_SHARE_VIDEO_MEMORY
179 // IOCTL_VIDEO_UNSHARE_VIDEO_MEMORY
181 // IOCTL_VIDEO_GET_PUBLIC_ACCESS_RANGES
182 // IOCTL_VIDEO_FREE_PUBLIC_ACCESS_RANGES
183 // IOCTL_VIDEO_GET_POWER_MANAGEMENT
184 // IOCTL_VIDEO_SET_POWER_MANAGEMENT
185 // IOCTL_QUERY_COLOR_CAPABILITIES
186 // IOCTL_VIDEO_SET_COLOR_REGISTERS (required if the device has a palette)
187 // IOCTL_VIDEO_DISABLE_POINTER
188 // IOCTL_VIDEO_ENABLE_POINTER
189 // IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES
190 // IOCTL_VIDEO_QUERY_POINTER_ATTR
191 // IOCTL_VIDEO_SET_POINTER_ATTR
192 // IOCTL_VIDEO_QUERY_POINTER_POSITION
193 // IOCTL_VIDEO_SET_POINTER_POSITION
194 // IOCTL_VIDEO_SAVE_HARDWARE_STATE
195 // IOCTL_VIDEO_RESTORE_HARDWARE_STATE
196 // IOCTL_VIDEO_DISABLE_CURSOR
197 // IOCTL_VIDEO_ENABLE_CURSOR
198 // IOCTL_VIDEO_QUERY_CURSOR_ATTR
199 // IOCTL_VIDEO_SET_CURSOR_ATTR
200 // IOCTL_VIDEO_QUERY_CURSOR_POSITION
201 // IOCTL_VIDEO_SET_CURSOR_POSITION
202 // IOCTL_VIDEO_GET_BANK_SELECT_CODE
203 // IOCTL_VIDEO_SET_PALETTE_REGISTERS
204 // IOCTL_VIDEO_LOAD_AND_SET_FONT
210 // PVOID DeviceExtension
211 // PVIDEO_REQUEST_PACKET RequestPacket
213 // BOOLEAN This function must return TRUE, and complete the work or
214 // set an error status in the VRP.
216 static BOOLEAN STDCALL
217 VGAStartIO(PVOID DeviceExtension
,
218 PVIDEO_REQUEST_PACKET RequestPacket
)
220 switch (RequestPacket
->IoControlCode
)
222 case IOCTL_VIDEO_MAP_VIDEO_MEMORY
:
223 VGAMapVideoMemory((PVIDEO_MEMORY
) RequestPacket
->InputBuffer
,
224 (PVIDEO_MEMORY_INFORMATION
)
225 RequestPacket
->OutputBuffer
,
226 RequestPacket
->StatusBlock
);
229 case IOCTL_VIDEO_QUERY_AVAIL_MODES
:
230 VGAQueryAvailModes((PVIDEO_MODE_INFORMATION
) RequestPacket
->OutputBuffer
,
231 RequestPacket
->StatusBlock
);
234 case IOCTL_VIDEO_QUERY_CURRENT_MODE
:
235 VGAQueryCurrentMode((PVIDEO_MODE_INFORMATION
) RequestPacket
->OutputBuffer
,
236 RequestPacket
->StatusBlock
);
239 case IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES
:
240 VGAQueryNumAvailModes((PVIDEO_NUM_MODES
) RequestPacket
->OutputBuffer
,
241 RequestPacket
->StatusBlock
);
244 case IOCTL_VIDEO_RESET_DEVICE
:
245 VGAResetDevice(RequestPacket
->StatusBlock
);
248 case IOCTL_VIDEO_SET_COLOR_REGISTERS
:
249 VGASetColorRegisters((PVIDEO_CLUT
) RequestPacket
->InputBuffer
,
250 RequestPacket
->StatusBlock
);
253 case IOCTL_VIDEO_SET_CURRENT_MODE
:
254 VGASetCurrentMode((PVIDEO_MODE
) RequestPacket
->InputBuffer
,
255 RequestPacket
->StatusBlock
);
258 case IOCTL_VIDEO_SHARE_VIDEO_MEMORY
:
259 VGAShareVideoMemory((PVIDEO_SHARE_MEMORY
) RequestPacket
->InputBuffer
,
260 (PVIDEO_MEMORY_INFORMATION
) RequestPacket
->OutputBuffer
,
261 RequestPacket
->StatusBlock
);
264 case IOCTL_VIDEO_UNMAP_VIDEO_MEMORY
:
265 VGAUnmapVideoMemory((PVIDEO_MEMORY
) RequestPacket
->InputBuffer
,
266 RequestPacket
->StatusBlock
);
269 case IOCTL_VIDEO_UNSHARE_VIDEO_MEMORY
:
270 VGAUnshareVideoMemory((PVIDEO_MEMORY
) RequestPacket
->InputBuffer
,
271 RequestPacket
->StatusBlock
);
273 case IOCTL_VIDEO_SET_PALETTE_REGISTERS
:
274 VGASetPaletteRegisters((PWORD
) RequestPacket
->InputBuffer
,
275 RequestPacket
->StatusBlock
);
279 case IOCTL_VIDEO_DISABLE_CURSOR
:
280 case IOCTL_VIDEO_DISABLE_POINTER
:
281 case IOCTL_VIDEO_ENABLE_CURSOR
:
282 case IOCTL_VIDEO_ENABLE_POINTER
:
284 case IOCTL_VIDEO_FREE_PUBLIC_ACCESS_RANGES
:
285 VGAFreePublicAccessRanges((PVIDEO_PUBLIC_ACCESS_RANGES
)
286 RequestPacket
->InputBuffer
,
287 RequestPacket
->StatusBlock
);
290 case IOCTL_VIDEO_GET_BANK_SELECT_CODE
:
291 case IOCTL_VIDEO_GET_POWER_MANAGEMENT
:
292 case IOCTL_VIDEO_LOAD_AND_SET_FONT
:
293 case IOCTL_VIDEO_QUERY_CURSOR_POSITION
:
294 case IOCTL_VIDEO_QUERY_COLOR_CAPABILITIES
:
295 case IOCTL_VIDEO_QUERY_CURSOR_ATTR
:
296 case IOCTL_VIDEO_QUERY_POINTER_ATTR
:
297 case IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES
:
298 case IOCTL_VIDEO_QUERY_POINTER_POSITION
:
300 case IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES
:
301 VGAQueryPublicAccessRanges((PVIDEO_PUBLIC_ACCESS_RANGES
)
302 RequestPacket
->OutputBuffer
,
303 RequestPacket
->StatusBlock
);
306 case IOCTL_VIDEO_RESTORE_HARDWARE_STATE
:
307 case IOCTL_VIDEO_SAVE_HARDWARE_STATE
:
308 case IOCTL_VIDEO_SET_CURSOR_ATTR
:
309 case IOCTL_VIDEO_SET_CURSOR_POSITION
:
310 case IOCTL_VIDEO_SET_POINTER_ATTR
:
311 case IOCTL_VIDEO_SET_POINTER_POSITION
:
312 case IOCTL_VIDEO_SET_POWER_MANAGEMENT
:
317 RequestPacket
->StatusBlock
->Status
= STATUS_NOT_IMPLEMENTED
;
328 // This function will be called upon receipt of a adapter generated
329 // interrupt when enabled.
335 // PVOID DeviceExtension
337 // BOOLEAN TRUE if the interrupt was handled by the routine
339 static BOOLEAN STDCALL
340 VGAInterrupt(PVOID DeviceExtension
)
348 // This function is called to reset the hardware to a known state
349 // if calling a BIOS int 10 reset will not achieve this result.
355 // PVOID DeviceExtension
356 // ULONG Columns Columns and Rows specify the mode parameters
357 // ULONG Rows to reset to.
359 // BOOLEAN TRUE if no further action is necessary, FALSE if the system
360 // needs to still do a BOIS int 10 reset.
362 static BOOLEAN STDCALL
363 VGAResetHw(PVOID DeviceExtension
,
373 // This function will be called once a second when enabled
379 // PVOID DeviceExtension
384 VGATimer(PVOID DeviceExtension
)
390 VOID
VGAMapVideoMemory(IN PVIDEO_MEMORY RequestedAddress
,
391 OUT PVIDEO_MEMORY_INFORMATION MapInformation
,
392 OUT PSTATUS_BLOCK StatusBlock
)
397 VOID
VGAQueryAvailModes(OUT PVIDEO_MODE_INFORMATION ReturnedModes
,
398 OUT PSTATUS_BLOCK StatusBlock
)
403 VOID
VGAQueryCurrentMode(OUT PVIDEO_MODE_INFORMATION CurrentMode
,
404 OUT PSTATUS_BLOCK StatusBlock
)
409 VOID
VGAQueryNumAvailModes(OUT PVIDEO_NUM_MODES NumberOfModes
,
410 OUT PSTATUS_BLOCK StatusBlock
)
415 VOID
VGASetPaletteRegisters(IN PWORD PaletteRegisters
,
416 OUT PSTATUS_BLOCK StatusBlock
)
421 We don't need the following code because the palette registers are set correctly on VGA initialization.
422 Still, we may include\test this is in the future.
427 tmp = VideoPortReadPortUchar(0x03da);
428 v = VideoPortReadPortUchar(0x03c0);
430 // Set the first 16 palette registers to map to the first 16 palette colors
431 for (i=PaletteRegisters[1]; i<PaletteRegisters[0]; i++)
433 tmp = VideoPortReadPortUchar(0x03da);
434 VideoPortWritePortUchar(0x03c0, i);
435 VideoPortWritePortUchar(0x03c0, PaletteRegisters[j++]);
438 tmp = VideoPortReadPortUchar(0x03da);
439 VideoPortWritePortUchar(0x03d0, v | 0x20);
443 VOID
VGASetColorRegisters(IN PVIDEO_CLUT ColorLookUpTable
,
444 OUT PSTATUS_BLOCK StatusBlock
)
448 for (i
=ColorLookUpTable
->FirstEntry
; i
<ColorLookUpTable
->NumEntries
; i
++)
450 VideoPortWritePortUchar((PUCHAR
)0x03c8, i
);
451 VideoPortWritePortUchar((PUCHAR
)0x03c9, ColorLookUpTable
->LookupTable
[i
].RgbArray
.Red
);
452 VideoPortWritePortUchar((PUCHAR
)0x03c9, ColorLookUpTable
->LookupTable
[i
].RgbArray
.Green
);
453 VideoPortWritePortUchar((PUCHAR
)0x03c9, ColorLookUpTable
->LookupTable
[i
].RgbArray
.Blue
);
457 VOID
VGASetCurrentMode(IN PVIDEO_MODE RequestedMode
,
458 OUT PSTATUS_BLOCK StatusBlock
)
460 if(RequestedMode
->RequestedMode
== 12)
464 DbgPrint("Unrecognised mode for VGASetCurrentMode\n");
468 VOID
VGAShareVideoMemory(IN PVIDEO_SHARE_MEMORY RequestedMemory
,
469 OUT PVIDEO_MEMORY_INFORMATION ReturnedMemory
,
470 OUT PSTATUS_BLOCK StatusBlock
)
475 VOID
VGAUnmapVideoMemory(IN PVIDEO_MEMORY MemoryToUnmap
,
476 OUT PSTATUS_BLOCK StatusBlock
)
481 VOID
VGAUnshareVideoMemory(IN PVIDEO_MEMORY MemoryToUnshare
,
482 OUT PSTATUS_BLOCK StatusBlock
)