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 STDCALL
15 VGAFindAdapter(PVOID DeviceExtension,
18 PVIDEO_PORT_CONFIG_INFO ConfigInfo,
20 static BOOLEAN STDCALL
21 VGAInitialize(PVOID DeviceExtension);
22 static BOOLEAN STDCALL
23 VGAStartIO(PVOID DeviceExtension,
24 PVIDEO_REQUEST_PACKET RequestPacket);
26 static BOOLEAN STDCALL
27 VGAInterrupt(PVOID DeviceExtension);*/
28 static BOOLEAN STDCALL
29 VGAResetHw(PVOID DeviceExtension,
33 VGATimer(PVOID DeviceExtension);
36 /* Mandatory IoControl routines */
37 VOID VGAMapVideoMemory(IN PVIDEO_MEMORY RequestedAddress,
38 OUT PVIDEO_MEMORY_INFORMATION MapInformation,
39 OUT PSTATUS_BLOCK StatusBlock);
40 VOID VGAQueryAvailModes(OUT PVIDEO_MODE_INFORMATION ReturnedModes,
41 OUT PSTATUS_BLOCK StatusBlock);
42 VOID VGAQueryCurrentMode(OUT PVIDEO_MODE_INFORMATION CurrentMode,
43 OUT PSTATUS_BLOCK StatusBlock);
44 VOID VGAQueryNumAvailModes(OUT PVIDEO_NUM_MODES NumberOfModes,
45 OUT PSTATUS_BLOCK StatusBlock);
46 VOID VGAResetDevice(OUT PSTATUS_BLOCK StatusBlock);
47 VOID VGASetColorRegisters(IN PVIDEO_CLUT ColorLookUpTable,
48 OUT PSTATUS_BLOCK StatusBlock);
49 VOID VGASetPaletteRegisters(IN PWORD PaletteRegisters,
50 OUT PSTATUS_BLOCK StatusBlock);
51 VOID VGASetCurrentMode(IN PVIDEO_MODE RequestedMode,
52 OUT PSTATUS_BLOCK StatusBlock);
53 VOID VGAShareVideoMemory(IN PVIDEO_SHARE_MEMORY RequestedMemory,
54 OUT PVIDEO_MEMORY_INFORMATION ReturnedMemory,
55 OUT PSTATUS_BLOCK StatusBlock);
56 VOID VGAUnmapVideoMemory(IN PVIDEO_MEMORY MemoryToUnmap,
57 OUT PSTATUS_BLOCK StatusBlock);
58 VOID VGAUnshareVideoMemory(IN PVIDEO_MEMORY MemoryToUnshare,
59 OUT PSTATUS_BLOCK StatusBlock);
61 // ------------------------------------------------------- Public Interface
66 // This function initializes the driver.
72 // IN PVOID Context1 Context parameter to pass to VidPortInitialize
73 // IN PVOID Context2 Context parameter to pass to VidPortInitialize
78 DriverEntry(IN PVOID Context1,
81 VIDEO_HW_INITIALIZATION_DATA InitData;
83 VideoPortZeroMemory(&InitData, sizeof InitData);
85 /* FIXME: Fill in InitData members */
86 InitData.StartingDeviceNumber = 0;
88 /* Export driver entry points... */
89 InitData.HwFindAdapter = VGAFindAdapter;
90 InitData.HwInitialize = VGAInitialize;
91 InitData.HwStartIO = VGAStartIO;
92 /* InitData.HwInterrupt = VGAInterrupt; */
93 InitData.HwResetHw = VGAResetHw;
94 /* InitData.HwTimer = VGATimer; */
96 return VideoPortInitialize(Context1, Context2, &InitData, NULL);
102 // This routine is called by the videoport driver to find and allocate
103 // the adapter for a given bus. The miniport driver needs to do the
104 // following in this routine:
105 // - Determine if the adapter is present
106 // - Claim any necessary memory/IO resources for the adapter
107 // - Map resources into system memory for the adapter
108 // - fill in relevant information in the VIDEO_PORT_CONFIG_INFO buffer
109 // - update registry settings for adapter specifics.
110 // - Set 'Again' based on whether the function should be called again
111 // another adapter on the same bus.
117 // PVOID DeviceExtension
119 // PWSTR ArgumentString
120 // PVIDEO_PORT_CONFIG_INFO ConfigInfo
125 static VP_STATUS STDCALL
126 VGAFindAdapter(PVOID DeviceExtension,
128 PWSTR ArgumentString,
129 PVIDEO_PORT_CONFIG_INFO ConfigInfo,
132 /* FIXME: Determine if the adapter is present */
135 return STATUS_SUCCESS;
137 /* FIXME: Claim any necessary memory/IO resources for the adapter */
138 /* FIXME: Map resources into system memory for the adapter */
139 /* FIXME: Fill in relevant information in the VIDEO_PORT_CONFIG_INFO buffer */
140 /* FIXME: Update registry settings for adapter specifics. */
147 // Perform initialization tasks, but leave the adapter in the same
148 // user visible state
154 // PVOID DeviceExtension
156 // BOOLEAN Success or failure
157 static BOOLEAN STDCALL
158 VGAInitialize(PVOID DeviceExtension)
166 // This function gets called in responce to GDI EngDeviceIoControl
167 // calls. Device requests are passed in VRPs.
169 // IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES
170 // IOCTL_VIDEO_QUERY_AVAIL_MODES
171 // IOCTL_VIDEO_QUERY_CURRENT_MODE
172 // IOCTL_VIDEO_SET_CURRENT_MODE
173 // IOCTL_VIDEO_RESET_DEVICE
174 // IOCTL_VIDEO_MAP_VIDEO_MEMORY
175 // IOCTL_VIDEO_UNMAP_VIDEO_MEMORY
176 // IOCTL_VIDEO_SHARE_VIDEO_MEMORY
177 // IOCTL_VIDEO_UNSHARE_VIDEO_MEMORY
179 // IOCTL_VIDEO_GET_PUBLIC_ACCESS_RANGES
180 // IOCTL_VIDEO_FREE_PUBLIC_ACCESS_RANGES
181 // IOCTL_VIDEO_GET_POWER_MANAGEMENT
182 // IOCTL_VIDEO_SET_POWER_MANAGEMENT
183 // IOCTL_QUERY_COLOR_CAPABILITIES
184 // IOCTL_VIDEO_SET_COLOR_REGISTERS (required if the device has a palette)
185 // IOCTL_VIDEO_DISABLE_POINTER
186 // IOCTL_VIDEO_ENABLE_POINTER
187 // IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES
188 // IOCTL_VIDEO_QUERY_POINTER_ATTR
189 // IOCTL_VIDEO_SET_POINTER_ATTR
190 // IOCTL_VIDEO_QUERY_POINTER_POSITION
191 // IOCTL_VIDEO_SET_POINTER_POSITION
192 // IOCTL_VIDEO_SAVE_HARDWARE_STATE
193 // IOCTL_VIDEO_RESTORE_HARDWARE_STATE
194 // IOCTL_VIDEO_DISABLE_CURSOR
195 // IOCTL_VIDEO_ENABLE_CURSOR
196 // IOCTL_VIDEO_QUERY_CURSOR_ATTR
197 // IOCTL_VIDEO_SET_CURSOR_ATTR
198 // IOCTL_VIDEO_QUERY_CURSOR_POSITION
199 // IOCTL_VIDEO_SET_CURSOR_POSITION
200 // IOCTL_VIDEO_GET_BANK_SELECT_CODE
201 // IOCTL_VIDEO_SET_PALETTE_REGISTERS
202 // IOCTL_VIDEO_LOAD_AND_SET_FONT
208 // PVOID DeviceExtension
209 // PVIDEO_REQUEST_PACKET RequestPacket
211 // BOOLEAN This function must return TRUE, and complete the work or
212 // set an error status in the VRP.
214 static BOOLEAN STDCALL
215 VGAStartIO(PVOID DeviceExtension,
216 PVIDEO_REQUEST_PACKET RequestPacket)
218 switch (RequestPacket->IoControlCode)
220 case IOCTL_VIDEO_MAP_VIDEO_MEMORY:
221 VGAMapVideoMemory((PVIDEO_MEMORY) RequestPacket->InputBuffer,
222 (PVIDEO_MEMORY_INFORMATION)
223 RequestPacket->OutputBuffer,
224 RequestPacket->StatusBlock);
227 case IOCTL_VIDEO_QUERY_AVAIL_MODES:
228 VGAQueryAvailModes((PVIDEO_MODE_INFORMATION) RequestPacket->OutputBuffer,
229 RequestPacket->StatusBlock);
232 case IOCTL_VIDEO_QUERY_CURRENT_MODE:
233 VGAQueryCurrentMode((PVIDEO_MODE_INFORMATION) RequestPacket->OutputBuffer,
234 RequestPacket->StatusBlock);
237 case IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES:
238 VGAQueryNumAvailModes((PVIDEO_NUM_MODES) RequestPacket->OutputBuffer,
239 RequestPacket->StatusBlock);
242 case IOCTL_VIDEO_RESET_DEVICE:
243 VGAResetDevice(RequestPacket->StatusBlock);
246 case IOCTL_VIDEO_SET_COLOR_REGISTERS:
247 VGASetColorRegisters((PVIDEO_CLUT) RequestPacket->InputBuffer,
248 RequestPacket->StatusBlock);
251 case IOCTL_VIDEO_SET_CURRENT_MODE:
252 VGASetCurrentMode((PVIDEO_MODE) RequestPacket->InputBuffer,
253 RequestPacket->StatusBlock);
256 case IOCTL_VIDEO_SHARE_VIDEO_MEMORY:
257 VGAShareVideoMemory((PVIDEO_SHARE_MEMORY) RequestPacket->InputBuffer,
258 (PVIDEO_MEMORY_INFORMATION) RequestPacket->OutputBuffer,
259 RequestPacket->StatusBlock);
262 case IOCTL_VIDEO_UNMAP_VIDEO_MEMORY:
263 VGAUnmapVideoMemory((PVIDEO_MEMORY) RequestPacket->InputBuffer,
264 RequestPacket->StatusBlock);
267 case IOCTL_VIDEO_UNSHARE_VIDEO_MEMORY:
268 VGAUnshareVideoMemory((PVIDEO_MEMORY) RequestPacket->InputBuffer,
269 RequestPacket->StatusBlock);
271 case IOCTL_VIDEO_SET_PALETTE_REGISTERS:
272 VGASetPaletteRegisters((PWORD) RequestPacket->InputBuffer,
273 RequestPacket->StatusBlock);
277 case IOCTL_VIDEO_DISABLE_CURSOR:
278 case IOCTL_VIDEO_DISABLE_POINTER:
279 case IOCTL_VIDEO_ENABLE_CURSOR:
280 case IOCTL_VIDEO_ENABLE_POINTER:
282 case IOCTL_VIDEO_FREE_PUBLIC_ACCESS_RANGES:
283 VGAFreePublicAccessRanges((PVIDEO_PUBLIC_ACCESS_RANGES)
284 RequestPacket->InputBuffer,
285 RequestPacket->StatusBlock);
288 case IOCTL_VIDEO_GET_BANK_SELECT_CODE:
289 case IOCTL_VIDEO_GET_POWER_MANAGEMENT:
290 case IOCTL_VIDEO_LOAD_AND_SET_FONT:
291 case IOCTL_VIDEO_QUERY_CURSOR_POSITION:
292 case IOCTL_VIDEO_QUERY_COLOR_CAPABILITIES:
293 case IOCTL_VIDEO_QUERY_CURSOR_ATTR:
294 case IOCTL_VIDEO_QUERY_POINTER_ATTR:
295 case IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES:
296 case IOCTL_VIDEO_QUERY_POINTER_POSITION:
298 case IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES:
299 VGAQueryPublicAccessRanges((PVIDEO_PUBLIC_ACCESS_RANGES)
300 RequestPacket->OutputBuffer,
301 RequestPacket->StatusBlock);
304 case IOCTL_VIDEO_RESTORE_HARDWARE_STATE:
305 case IOCTL_VIDEO_SAVE_HARDWARE_STATE:
306 case IOCTL_VIDEO_SET_CURSOR_ATTR:
307 case IOCTL_VIDEO_SET_CURSOR_POSITION:
308 case IOCTL_VIDEO_SET_POINTER_ATTR:
309 case IOCTL_VIDEO_SET_POINTER_POSITION:
310 case IOCTL_VIDEO_SET_POWER_MANAGEMENT:
315 RequestPacket->StatusBlock->Status = STATUS_NOT_IMPLEMENTED;
326 // This function will be called upon receipt of a adapter generated
327 // interrupt when enabled.
333 // PVOID DeviceExtension
335 // BOOLEAN TRUE if the interrupt was handled by the routine
337 static BOOLEAN STDCALL
338 VGAInterrupt(PVOID DeviceExtension)
347 // This function is called to reset the hardware to a known state
348 // if calling a BIOS int 10 reset will not achieve this result.
354 // PVOID DeviceExtension
355 // ULONG Columns Columns and Rows specify the mode parameters
356 // ULONG Rows to reset to.
358 // BOOLEAN TRUE if no further action is necessary, FALSE if the system
359 // needs to still do a BOIS int 10 reset.
361 static BOOLEAN STDCALL
362 VGAResetHw(PVOID DeviceExtension,
366 /* We don't anything to the vga that int10 can't cope with. */
374 // This function will be called once a second when enabled
380 // PVOID DeviceExtension
385 VGATimer(PVOID DeviceExtension)
391 VOID VGAMapVideoMemory(IN PVIDEO_MEMORY RequestedAddress,
392 OUT PVIDEO_MEMORY_INFORMATION MapInformation,
393 OUT PSTATUS_BLOCK StatusBlock)
398 VOID VGAQueryAvailModes(OUT PVIDEO_MODE_INFORMATION ReturnedModes,
399 OUT PSTATUS_BLOCK StatusBlock)
404 VOID VGAQueryCurrentMode(OUT PVIDEO_MODE_INFORMATION CurrentMode,
405 OUT PSTATUS_BLOCK StatusBlock)
410 VOID VGAQueryNumAvailModes(OUT PVIDEO_NUM_MODES NumberOfModes,
411 OUT PSTATUS_BLOCK StatusBlock)
416 VOID VGASetPaletteRegisters(IN PWORD PaletteRegisters,
417 OUT PSTATUS_BLOCK StatusBlock)
422 We don't need the following code because the palette registers are set correctly on VGA initialization.
423 Still, we may include\test this is in the future.
428 tmp = VideoPortReadPortUchar(0x03da);
429 v = VideoPortReadPortUchar(0x03c0);
431 // Set the first 16 palette registers to map to the first 16 palette colors
432 for (i=PaletteRegisters[1]; i<PaletteRegisters[0]; i++)
434 tmp = VideoPortReadPortUchar(0x03da);
435 VideoPortWritePortUchar(0x03c0, i);
436 VideoPortWritePortUchar(0x03c0, PaletteRegisters[j++]);
439 tmp = VideoPortReadPortUchar(0x03da);
440 VideoPortWritePortUchar(0x03d0, v | 0x20);
444 VOID VGASetColorRegisters(IN PVIDEO_CLUT ColorLookUpTable,
445 OUT PSTATUS_BLOCK StatusBlock)
449 for (i=ColorLookUpTable->FirstEntry; i<ColorLookUpTable->NumEntries; i++)
451 VideoPortWritePortUchar((PUCHAR)0x03c8, i);
452 VideoPortWritePortUchar((PUCHAR)0x03c9, ColorLookUpTable->LookupTable[i].RgbArray.Red);
453 VideoPortWritePortUchar((PUCHAR)0x03c9, ColorLookUpTable->LookupTable[i].RgbArray.Green);
454 VideoPortWritePortUchar((PUCHAR)0x03c9, ColorLookUpTable->LookupTable[i].RgbArray.Blue);
458 VOID VGASetCurrentMode(IN PVIDEO_MODE RequestedMode,
459 OUT PSTATUS_BLOCK StatusBlock)
461 if(RequestedMode->RequestedMode == 12)
465 DbgPrint("Unrecognised mode for VGASetCurrentMode\n");
469 VOID VGAShareVideoMemory(IN PVIDEO_SHARE_MEMORY RequestedMemory,
470 OUT PVIDEO_MEMORY_INFORMATION ReturnedMemory,
471 OUT PSTATUS_BLOCK StatusBlock)
476 VOID VGAUnmapVideoMemory(IN PVIDEO_MEMORY MemoryToUnmap,
477 OUT PSTATUS_BLOCK StatusBlock)
482 VOID VGAUnshareVideoMemory(IN PVIDEO_MEMORY MemoryToUnshare,
483 OUT PSTATUS_BLOCK StatusBlock)