From 2854aac2465416507a364b008ce89823b8c78750 Mon Sep 17 00:00:00 2001 From: Rex Jolliff Date: Sat, 22 May 1999 07:25:30 +0000 Subject: [PATCH] more work on the videoport driver. svn path=/trunk/; revision=505 --- reactos/drivers/dd/vidport/vidport.c | 107 +++++++++++++++++++++++++-- reactos/include/ddk/ntddvid.h | 45 ++++++++++- reactos/makefile.dos | 2 +- 3 files changed, 142 insertions(+), 12 deletions(-) diff --git a/reactos/drivers/dd/vidport/vidport.c b/reactos/drivers/dd/vidport/vidport.c index 51b314c5c42..9322542e17b 100644 --- a/reactos/drivers/dd/vidport/vidport.c +++ b/reactos/drivers/dd/vidport/vidport.c @@ -1,7 +1,16 @@ +/* + * VideoPort driver + * Written by Rex Jolliff + */ -#include -#include +#include +#include +#define UNIMPLEMENTED DbgPrint("%s:%d: Function not implemented", __FILE__, __LINE__) + +#define VERSION "0.0.0" + +static VOID VidStartIo(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); static NTSTATUS VidDispatchOpenClose(IN PDEVICE_OBJECT pDO, IN PIRP Irp); static NTSTATUS VidDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); @@ -32,12 +41,12 @@ DriverEntry(IN PDRIVER_OBJECT DriverObject, DbgPrint("VideoPort Driver %s\n", VERSION); // Export other driver entry points... - DriverObject->DriverStartIo = VidtartIo; + DriverObject->DriverStartIo = VidStartIo; DriverObject->MajorFunction[IRP_MJ_CREATE] = VidDispatchOpenClose; DriverObject->MajorFunction[IRP_MJ_CLOSE] = VidDispatchOpenClose; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = VidDispatchDeviceControl; -// FIXME: should the miniport driver be loaded here? + /* FIXME: should the miniport driver be loaded here? */ return STATUS_SUCCESS; } @@ -62,6 +71,7 @@ VideoPortDisableInterrupt(IN PVOID HwDeviceExtension) { UNIMPLEMENTED; } + VP_STATUS VideoPortEnableInterrupt(IN PVOID HwDeviceExtension) { @@ -139,7 +149,66 @@ VideoPortInitialize(IN PVOID Context1, IN PVIDEO_HW_INITIALIZATION_DATA HwInitializationData, IN PVOID HwContext) { - UNIMPLEMENTED; + UCHAR Again; + WCHAR UnicodeBuffer[18]; + NTSTATUS RC; + ANSI_STRING AnsiName; + UNICODE_STRING UnicodeName; + PDRIVER_OBJECT MPDriverObject = (PDRIVER_OBJECT) Context1; + PDEVICE_OBJECT MPDeviceObject; + VIDEO_PORT_CONFIG_INFO ConfigInfo; + + /* Build Dispatch table from passed data */ + MPDriverObject->DriverStartIo = HwInitializationData->HwStartIO; + + /* Create a unicode device name */ + do + { + /* FIXME: Need to add a device index for multiple adapters */ + RtlInitAnsiString(&AnsiName, "\\Device\\Display"); + UnicodeName.MaximumLength = 18 * sizeof(WCHAR); + UnicodeName.Buffer = UnicodeBuffer; + RtlAnsiStringToUnicodeString(&UnicodeName, &AnsiName, FALSE); + + /* Create the device */ + RC = IoCreateDevice(MPDriverObject, + HwInitializationData->HwDeviceExtensionSize, + &UnicodeName, + FILE_DEVICE_VIDEO, + 0, + TRUE, + &MPDeviceObject); + if (!NT_SUCCESS(RC)) + { + DbgPrint("IoCreateDevice call failed\n",0); + return RC; + } + + /* Set the buffering strategy here... */ + MPDeviceObject->Flags |= DO_BUFFERED_IO; + + /* Call HwFindAdapter entry point */ + /* FIXME: Need to figure out what string to pass as param 3 */ + if (!HwInitializationData->HwFindAdapter(MPDeviceObject->DeviceExtension, + Context2, + "", + &ConfigInfo, + &Again)) + { + DbgPrint("HwFindAdapter call failed"); + /* FIXME: should deallocate device here */ + + return STATUS_UNSUCCESSFUL; + } + + /* FIXME: Allocate hardware resources for device */ + /* FIXME: Allocate interrupt for device */ + } + while (&Again); + + /* FIXME: initialize timer routine for MP Driver */ + + return STATUS_SUCCESS; } VP_STATUS @@ -163,7 +232,7 @@ VideoPortMapBankedMemory(IN PVOID HwDeviceExtension, IN PHYSICAL_ADDRESS PhysicalAddress, IN PULONG Length, IN PULONG InIoSpace, - INOUT PVOID *VirtualAddress, + OUT PVOID *VirtualAddress, IN ULONG BankLength, IN UCHAR ReadWriteBank, IN PBANKED_SECTION_ROUTINE BankRoutine, @@ -177,7 +246,7 @@ VideoPortMapMemory(IN PVOID HwDeviceExtension, IN PHYSICAL_ADDRESS PhysicalAddress, IN PULONG Length, IN PULONG InIoSpace, - INOUT PVOID *VirtualAddress) + OUT PVOID *VirtualAddress) { UNIMPLEMENTED; } @@ -333,7 +402,7 @@ BOOLEAN VideoPortSynchronizeExecution(IN PVOID HwDeviceExtension, IN VIDEO_SYNCHRONIZE_PRIORITY Priority, IN PMINIPORT_SYNCHRONIZE_ROUTINE SynchronizeRoutine, - INOUT PVOID Context) + OUT PVOID Context) { UNIMPLEMENTED; } @@ -485,6 +554,28 @@ VidDispatchOpenClose(IN PDEVICE_OBJECT pDO, return STATUS_SUCCESS; } +// VidStartIo +// +// DESCRIPTION: +// Get the next requested I/O packet started +// +// RUN LEVEL: +// DISPATCH_LEVEL +// +// ARGUMENTS: +// Dispatch routine standard arguments +// +// RETURNS: +// NTSTATUS +// + +static VOID +VidStartIo(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + UNIMPLEMENTED; +} + // VidDispatchDeviceControl // // DESCRIPTION: diff --git a/reactos/include/ddk/ntddvid.h b/reactos/include/ddk/ntddvid.h index 4ab03944f13..f6be51204ce 100644 --- a/reactos/include/ddk/ntddvid.h +++ b/reactos/include/ddk/ntddvid.h @@ -2,6 +2,8 @@ * NTDDVID.H - Video Port and MiniPort driver interface */ +#include + /* * the rough idea: * init: @@ -31,6 +33,22 @@ #define VIDEO_MEMORY_SPACE_DENSE 0x04 #define VIDEO_MEMORY_SPACE_P6CACHE 0x08 +typedef enum _VIDEO_DEVICE_DATA_TYPE +{ + VpMachineData, + VpCmosData, + VpBusData, + VpControllerData, + VpMonitorData +} VIDEO_DEVICE_DATA_TYPE, *PVIDEO_DEVICE_DATA_TYPE; + +typedef enum _VIDEO_SYNCHRONIZE_PRIORITY +{ + VpLowPriority, + VpMediumPriority, + VpHighPriority +} VIDEO_SYNCHRONIZE_PRIORITY, *PVIDEO_SYNCHRONIZE_PRIORITY; + typedef LONG VP_STATUS, *PVP_STATUS; typedef struct _STATUS_BLOCK @@ -113,6 +131,27 @@ typedef VP_STATUS (*PMINIPORT_QUERY_DEVICE_ROUTINE)(PVOID HwDeviceExtension, ULONG ComponentInformationLength); typedef BOOLEAN (*PMINIPORT_SYNCHRONIZE_ROUTINE)(PVOID Context); +typedef struct _VIDEO_ACCESS_RANGE +{ + PHYSICAL_ADDRESS RangeStart; + ULONG RangeLength; + UCHAR RangeInIoSpace; + UCHAR RangeVisible; + UCHAR RangeShareable; +} VIDEO_ACCESS_RANGE, *PVIDEO_ACCESS_RANGE; + +typedef struct _VIDEO_X86_BIOS_ARGUMENTS +{ + ULONG Eax; + ULONG Ebx; + ULONG Ecx; + ULONG Edx; + ULONG Esi; + ULONG Edi; + ULONG Ebp; +} VIDEO_X86_BIOS_ARGUMENTS, *PVIDEO_X86_BIOS_ARGUMENTS; + +typedef VOID (*PBANKED_SECTION_ROUTINE)(IN ULONG ReadBank, IN ULONG WriteBank, IN PVOID Context); ULONG VideoPortCompareMemory(IN PVOID Source1, IN PVOID Source2, IN ULONG Length); VOID VideoPortDebugPrint(IN ULONG DebugPrintLevel, IN PCHAR DebugMessage, ...); @@ -161,7 +200,7 @@ VP_STATUS VideoPortMapBankedMemory(IN PVOID HwDeviceExtension, IN PHYSICAL_ADDRESS PhysicalAddress, IN PULONG Length, IN PULONG InIoSpace, - INOUT PVOID *VirtualAddress, + OUT PVOID *VirtualAddress, IN ULONG BankLength, IN UCHAR ReadWriteBank, IN PBANKED_SECTION_ROUTINE BankRoutine, @@ -170,7 +209,7 @@ VP_STATUS VideoPortMapMemory(IN PVOID HwDeviceExtension, IN PHYSICAL_ADDRESS PhysicalAddress, IN PULONG Length, IN PULONG InIoSpace, - INOUT PVOID *VirtualAddress); + OUT PVOID *VirtualAddress); VOID VideoPortMoveMemory(OUT PVOID Destination, IN PVOID Source, IN ULONG Length); @@ -209,7 +248,7 @@ VOID VideoPortStopTimer(IN PVOID HwDeviceExtension); BOOLEAN VideoPortSynchronizeExecution(IN PVOID HwDeviceExtension, IN VIDEO_SYNCHRONIZE_PRIORITY Priority, IN PMINIPORT_SYNCHRONIZE_ROUTINE SynchronizeRoutine, - INOUT PVOID Context); + OUT PVOID Context); VP_STATUS VideoPortUnmapMemory(IN PVOID HwDeviceExtension, IN PVOID VirtualAddress, IN HANDLE ProcessHandle); diff --git a/reactos/makefile.dos b/reactos/makefile.dos index 8b0577383e7..571c4998ac9 100644 --- a/reactos/makefile.dos +++ b/reactos/makefile.dos @@ -32,7 +32,7 @@ LOADERS = dos # # Select the device drivers and filesystems you want # -DEVICE_DRIVERS = blue ide keyboard mouse null parallel serial +DEVICE_DRIVERS = blue ide keyboard mouse null parallel serial vidport # DEVICE_DRIVERS = beep event floppy ide_test sound test test1 FS_DRIVERS = minix vfat ext2 # FS_DRIVERS = template