mirror of
https://github.com/reactos/reactos.git
synced 2024-12-29 02:25:17 +00:00
Detect serial ports and serial pointer devices (Mice/Trackballs).
svn path=/trunk/; revision=7035
This commit is contained in:
parent
b88b8a633f
commit
85ab8b5562
4 changed files with 530 additions and 8 deletions
|
@ -1,3 +1,7 @@
|
||||||
|
Changes in v1.8.18 (12/14/2003) (ekohl)
|
||||||
|
|
||||||
|
- Detect serial ports and serial pointer devices (Mice/Trackballs)
|
||||||
|
|
||||||
Changes in v1.8.17 (10/19/2003) (ekohl)
|
Changes in v1.8.17 (10/19/2003) (ekohl)
|
||||||
|
|
||||||
- Ignore case of registry key and value names
|
- Ignore case of registry key and value names
|
||||||
|
|
|
@ -38,6 +38,17 @@
|
||||||
#define LATCH (CLOCK_TICK_RATE / HZ)
|
#define LATCH (CLOCK_TICK_RATE / HZ)
|
||||||
|
|
||||||
|
|
||||||
|
/* No Mouse */
|
||||||
|
#define MOUSE_TYPE_NONE 0
|
||||||
|
/* Microsoft Mouse with 2 buttons */
|
||||||
|
#define MOUSE_TYPE_MICROSOFT 1
|
||||||
|
/* Logitech Mouse with 3 buttons */
|
||||||
|
#define MOUSE_TYPE_LOGITECH 2
|
||||||
|
/* Microsoft Wheel Mouse (aka Z Mouse) */
|
||||||
|
#define MOUSE_TYPE_WHEELZ 3
|
||||||
|
/* Mouse Systems Mouse */
|
||||||
|
#define MOUSE_TYPE_MOUSESYSTEMS 4
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct _CM_INT13_DRIVE_PARAMETER
|
typedef struct _CM_INT13_DRIVE_PARAMETER
|
||||||
|
@ -59,8 +70,6 @@ typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA
|
||||||
} CM_DISK_GEOMETRY_DEVICE_DATA, *PCM_DISK_GEOMETRY_DEVICE_DATA;
|
} CM_DISK_GEOMETRY_DEVICE_DATA, *PCM_DISK_GEOMETRY_DEVICE_DATA;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct _CM_PNP_BIOS_DEVICE_NODE
|
typedef struct _CM_PNP_BIOS_DEVICE_NODE
|
||||||
{
|
{
|
||||||
U16 Size;
|
U16 Size;
|
||||||
|
@ -89,6 +98,13 @@ typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK
|
||||||
} __attribute__((packed)) CM_PNP_BIOS_INSTALLATION_CHECK, *PCM_PNP_BIOS_INSTALLATION_CHECK;
|
} __attribute__((packed)) CM_PNP_BIOS_INSTALLATION_CHECK, *PCM_PNP_BIOS_INSTALLATION_CHECK;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _CM_SERIAL_DEVICE_DATA
|
||||||
|
{
|
||||||
|
U16 Version;
|
||||||
|
U16 Revision;
|
||||||
|
U32 BaudClock;
|
||||||
|
} CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
|
||||||
|
|
||||||
|
|
||||||
static char Hex[] = "0123456789ABCDEF";
|
static char Hex[] = "0123456789ABCDEF";
|
||||||
static unsigned int delay_count = 1;
|
static unsigned int delay_count = 1;
|
||||||
|
@ -411,7 +427,8 @@ SetHarddiskConfigurationData(HKEY DiskKey,
|
||||||
FullResourceDescriptor->InterfaceType = InterfaceTypeUndefined;
|
FullResourceDescriptor->InterfaceType = InterfaceTypeUndefined;
|
||||||
FullResourceDescriptor->BusNumber = 0;
|
FullResourceDescriptor->BusNumber = 0;
|
||||||
FullResourceDescriptor->PartialResourceList.Count = 1;
|
FullResourceDescriptor->PartialResourceList.Count = 1;
|
||||||
// FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].Type =
|
FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].Type =
|
||||||
|
CmResourceTypeDeviceSpecific;
|
||||||
// FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].ShareDisposition =
|
// FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].ShareDisposition =
|
||||||
// FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].Flags =
|
// FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].Flags =
|
||||||
FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].u.DeviceSpecificData.DataSize =
|
FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].u.DeviceSpecificData.DataSize =
|
||||||
|
@ -544,7 +561,7 @@ DetectBiosDisks(HKEY SystemKey,
|
||||||
PCM_FULL_RESOURCE_DESCRIPTOR FullResourceDescriptor;
|
PCM_FULL_RESOURCE_DESCRIPTOR FullResourceDescriptor;
|
||||||
PCM_INT13_DRIVE_PARAMETER Int13Drives;
|
PCM_INT13_DRIVE_PARAMETER Int13Drives;
|
||||||
GEOMETRY Geometry;
|
GEOMETRY Geometry;
|
||||||
char Buffer[80];
|
CHAR Buffer[80];
|
||||||
HKEY DiskKey;
|
HKEY DiskKey;
|
||||||
U32 DiskCount;
|
U32 DiskCount;
|
||||||
U32 Size;
|
U32 Size;
|
||||||
|
@ -578,7 +595,8 @@ DetectBiosDisks(HKEY SystemKey,
|
||||||
FullResourceDescriptor->InterfaceType = InterfaceTypeUndefined;
|
FullResourceDescriptor->InterfaceType = InterfaceTypeUndefined;
|
||||||
FullResourceDescriptor->BusNumber = -1;
|
FullResourceDescriptor->BusNumber = -1;
|
||||||
FullResourceDescriptor->PartialResourceList.Count = 1;
|
FullResourceDescriptor->PartialResourceList.Count = 1;
|
||||||
// FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].Type =
|
FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].Type =
|
||||||
|
CmResourceTypeDeviceSpecific;
|
||||||
// FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].ShareDisposition =
|
// FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].ShareDisposition =
|
||||||
// FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].Flags =
|
// FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].Flags =
|
||||||
FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].u.DeviceSpecificData.DataSize =
|
FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].u.DeviceSpecificData.DataSize =
|
||||||
|
@ -646,6 +664,495 @@ DetectBiosDisks(HKEY SystemKey,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
InitializeSerialPort(U32 Port,
|
||||||
|
U32 LineControl)
|
||||||
|
{
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)Port + 3, 0x80); /* set DLAB on */
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)Port, 0x60); /* speed LO byte */
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)Port + 1, 0); /* speed HI byte */
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)Port + 3, LineControl);
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)Port + 1, 0); /* set comm and DLAB to 0 */
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)Port + 4, 0x09); /* DR int enable */
|
||||||
|
READ_PORT_UCHAR((PUCHAR)Port + 5); /* clear error bits */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static U32
|
||||||
|
DetectMicrosoftMouse(U32 Port)
|
||||||
|
{
|
||||||
|
CHAR Buffer[4];
|
||||||
|
U32 i;
|
||||||
|
U32 TimeOut = 250;
|
||||||
|
U8 LineControl;
|
||||||
|
|
||||||
|
/* Shutdown mouse or something like that */
|
||||||
|
LineControl = READ_PORT_UCHAR((PUCHAR)Port + 4);
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)Port + 4, (LineControl & ~0x02) | 0x01);
|
||||||
|
KeStallExecutionProcessor(500000);
|
||||||
|
|
||||||
|
/* Clear buffer */
|
||||||
|
while (READ_PORT_UCHAR((PUCHAR)Port + 5) & 0x01)
|
||||||
|
READ_PORT_UCHAR((PUCHAR)Port);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Send modem control with 'Data Terminal Ready', 'Request To Send' and
|
||||||
|
* 'Output Line 2' message. This enables mouse to identify.
|
||||||
|
*/
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)Port + 4, 0x0b);
|
||||||
|
|
||||||
|
/* Wait 10 milliseconds for the mouse getting ready */
|
||||||
|
KeStallExecutionProcessor(10000);
|
||||||
|
|
||||||
|
/* Read first four bytes, which contains Microsoft Mouse signs */
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
while (((READ_PORT_UCHAR((PUCHAR)Port + 5) & 1) == 0) && (TimeOut > 0))
|
||||||
|
{
|
||||||
|
KeStallExecutionProcessor(1000);
|
||||||
|
--TimeOut;
|
||||||
|
if (TimeOut == 0)
|
||||||
|
return MOUSE_TYPE_NONE;
|
||||||
|
}
|
||||||
|
Buffer[i] = READ_PORT_UCHAR((PUCHAR)Port);
|
||||||
|
}
|
||||||
|
|
||||||
|
DbgPrint((DPRINT_HWDETECT,
|
||||||
|
"Mouse data: %x %x %x %x\n",
|
||||||
|
Buffer[0],Buffer[1],Buffer[2],Buffer[3]));
|
||||||
|
|
||||||
|
/* Check that four bytes for signs */
|
||||||
|
for (i = 0; i < 4; ++i)
|
||||||
|
{
|
||||||
|
if (Buffer[i] == 'B')
|
||||||
|
{
|
||||||
|
/* Sign for Microsoft Ballpoint */
|
||||||
|
// DbgPrint("Microsoft Ballpoint device detected\n");
|
||||||
|
// DbgPrint("THIS DEVICE IS NOT SUPPORTED, YET\n");
|
||||||
|
return MOUSE_TYPE_NONE;
|
||||||
|
}
|
||||||
|
else if (Buffer[i] == 'M')
|
||||||
|
{
|
||||||
|
/* Sign for Microsoft Mouse protocol followed by button specifier */
|
||||||
|
if (i == 3)
|
||||||
|
{
|
||||||
|
/* Overflow Error */
|
||||||
|
return MOUSE_TYPE_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (Buffer[i + 1])
|
||||||
|
{
|
||||||
|
case '3':
|
||||||
|
DbgPrint((DPRINT_HWDETECT,
|
||||||
|
"Microsoft Mouse with 3-buttons detected\n"));
|
||||||
|
return MOUSE_TYPE_LOGITECH;
|
||||||
|
|
||||||
|
case 'Z':
|
||||||
|
DbgPrint((DPRINT_HWDETECT,
|
||||||
|
"Microsoft Wheel Mouse detected\n"));
|
||||||
|
return MOUSE_TYPE_WHEELZ;
|
||||||
|
|
||||||
|
/* case '2': */
|
||||||
|
default:
|
||||||
|
DbgPrint((DPRINT_HWDETECT,
|
||||||
|
"Microsoft Mouse with 2-buttons detected\n"));
|
||||||
|
return MOUSE_TYPE_MICROSOFT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return MOUSE_TYPE_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static U32
|
||||||
|
GetMousePnpId(U32 Port, char *Buffer)
|
||||||
|
{
|
||||||
|
U32 TimeOut;
|
||||||
|
U32 i = 0;
|
||||||
|
char c;
|
||||||
|
char x;
|
||||||
|
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)Port + 4, 0x09);
|
||||||
|
|
||||||
|
/* Wait 10 milliseconds for the mouse getting ready */
|
||||||
|
KeStallExecutionProcessor(200000);
|
||||||
|
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)Port + 4, 0x0b);
|
||||||
|
|
||||||
|
KeStallExecutionProcessor(200000);
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
TimeOut = 250;
|
||||||
|
while (((READ_PORT_UCHAR((PUCHAR)Port + 5) & 1) == 0) && (TimeOut > 0))
|
||||||
|
{
|
||||||
|
KeStallExecutionProcessor(1000);
|
||||||
|
--TimeOut;
|
||||||
|
if (TimeOut == 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
c = READ_PORT_UCHAR((PUCHAR)Port);
|
||||||
|
if (c == 0x08 || c == 0x28)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Buffer[i++] = c;
|
||||||
|
x = c + 1;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
TimeOut = 250;
|
||||||
|
while (((READ_PORT_UCHAR((PUCHAR)Port + 5) & 1) == 0) && (TimeOut > 0))
|
||||||
|
{
|
||||||
|
KeStallExecutionProcessor(1000);
|
||||||
|
--TimeOut;
|
||||||
|
if (TimeOut == 0)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
c = READ_PORT_UCHAR((PUCHAR)Port);
|
||||||
|
Buffer[i++] = c;
|
||||||
|
if (c == x)
|
||||||
|
break;
|
||||||
|
if (i >= 256)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
DetectSerialPointerPeripheral(HKEY ControllerKey,
|
||||||
|
U32 Base)
|
||||||
|
{
|
||||||
|
CM_FULL_RESOURCE_DESCRIPTOR FullResourceDescriptor;
|
||||||
|
char Buffer[256];
|
||||||
|
char Identifier[256];
|
||||||
|
HKEY PeripheralKey;
|
||||||
|
U32 MouseType;
|
||||||
|
U32 Length;
|
||||||
|
U32 i;
|
||||||
|
U32 j;
|
||||||
|
S32 Error;
|
||||||
|
|
||||||
|
DbgPrint((DPRINT_HWDETECT,
|
||||||
|
"DetectSerialPointerPeripheral()\n"));
|
||||||
|
|
||||||
|
Identifier[0] = 0;
|
||||||
|
|
||||||
|
InitializeSerialPort(Base, 2);
|
||||||
|
MouseType = DetectMicrosoftMouse(Base);
|
||||||
|
|
||||||
|
if (MouseType != MOUSE_TYPE_NONE)
|
||||||
|
{
|
||||||
|
Length = GetMousePnpId(Base, Buffer);
|
||||||
|
DbgPrint((DPRINT_HWDETECT,
|
||||||
|
"PnP ID length: %u\n",
|
||||||
|
Length));
|
||||||
|
|
||||||
|
if (Length != 0)
|
||||||
|
{
|
||||||
|
/* Convert PnP sting to ASCII */
|
||||||
|
if (Buffer[0] == 0x08)
|
||||||
|
{
|
||||||
|
for (i = 0; i < Length; i++)
|
||||||
|
Buffer[i] += 0x20;
|
||||||
|
}
|
||||||
|
Buffer[Length] = 0;
|
||||||
|
|
||||||
|
DbgPrint((DPRINT_HWDETECT,
|
||||||
|
"PnP ID string: %s\n",
|
||||||
|
Buffer));
|
||||||
|
|
||||||
|
/* Copy PnpId string */
|
||||||
|
memcpy(&Identifier[0],
|
||||||
|
&Buffer[3],
|
||||||
|
7);
|
||||||
|
memcpy(&Identifier[7],
|
||||||
|
" - ",
|
||||||
|
4);
|
||||||
|
|
||||||
|
/* Skip device serial number */
|
||||||
|
i = 10;
|
||||||
|
if (Buffer[i] == '\\')
|
||||||
|
{
|
||||||
|
for (j = ++i; i < Length; ++i)
|
||||||
|
{
|
||||||
|
if (Buffer[i] == '\\')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i >= Length)
|
||||||
|
i -= 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Skip PnP class */
|
||||||
|
if (Buffer[i] == '\\')
|
||||||
|
{
|
||||||
|
for (j = ++i; i < Length; ++i)
|
||||||
|
{
|
||||||
|
if (Buffer[i] == '\\')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i >= Length)
|
||||||
|
i -= 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Skip compatible PnP Id */
|
||||||
|
if (Buffer[i] == '\\')
|
||||||
|
{
|
||||||
|
for (j = ++i; i < Length; ++i)
|
||||||
|
{
|
||||||
|
if (Buffer[i] == '\\')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (Buffer[j] == '*')
|
||||||
|
++j;
|
||||||
|
if (i >= Length)
|
||||||
|
i -= 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get product description */
|
||||||
|
if (Buffer[i] == '\\')
|
||||||
|
{
|
||||||
|
for (j = ++i; i < Length; ++i)
|
||||||
|
{
|
||||||
|
if (Buffer[i] == ';')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i >= Length)
|
||||||
|
i -= 3;
|
||||||
|
if (i > j + 1)
|
||||||
|
{
|
||||||
|
memcpy(&Identifier[10],
|
||||||
|
&Buffer[j],
|
||||||
|
i - j);
|
||||||
|
Identifier[10 + (i-j)] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DbgPrint((DPRINT_HWDETECT,
|
||||||
|
"Identifier string: %s\n",
|
||||||
|
Identifier));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Length == 0 || strlen(Identifier) < 11)
|
||||||
|
{
|
||||||
|
switch (MouseType)
|
||||||
|
{
|
||||||
|
case MOUSE_TYPE_LOGITECH:
|
||||||
|
strcpy (Identifier,
|
||||||
|
"LOGITECH SERIAL MOUSE");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MOUSE_TYPE_WHEELZ:
|
||||||
|
strcpy (Identifier,
|
||||||
|
"MICROSOFT SERIAL MOUSE WITH WHEEL");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MOUSE_TYPE_MICROSOFT:
|
||||||
|
default:
|
||||||
|
strcpy (Identifier,
|
||||||
|
"MICROSOFT SERIAL MOUSE");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create 'PointerPeripheral' key */
|
||||||
|
Error = RegCreateKey(ControllerKey,
|
||||||
|
"PointerPeripheral\\0",
|
||||||
|
&PeripheralKey);
|
||||||
|
if (Error != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
DbgPrint((DPRINT_HWDETECT,
|
||||||
|
"Failed to create peripheral key\n"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
DbgPrint((DPRINT_HWDETECT,
|
||||||
|
"Created key: PointerPeripheral\\0\n"));
|
||||||
|
|
||||||
|
/* Set 'ComponentInformation' value */
|
||||||
|
SetComponentInformation(PeripheralKey,
|
||||||
|
0x20,
|
||||||
|
0,
|
||||||
|
0xFFFFFFFF);
|
||||||
|
|
||||||
|
/* Set 'Configuration Data' value */
|
||||||
|
memset(&FullResourceDescriptor, 0, sizeof(CM_FULL_RESOURCE_DESCRIPTOR));
|
||||||
|
FullResourceDescriptor.InterfaceType = Isa;
|
||||||
|
FullResourceDescriptor.BusNumber = 0;
|
||||||
|
FullResourceDescriptor.PartialResourceList.Count = 0;
|
||||||
|
|
||||||
|
Error = RegSetValue(PeripheralKey,
|
||||||
|
"Configuration Data",
|
||||||
|
REG_FULL_RESOURCE_DESCRIPTOR,
|
||||||
|
(PU8)&FullResourceDescriptor,
|
||||||
|
sizeof(CM_FULL_RESOURCE_DESCRIPTOR));
|
||||||
|
if (Error != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
DbgPrint((DPRINT_HWDETECT,
|
||||||
|
"RegSetValue(Configuration Data) failed (Error %u)\n",
|
||||||
|
(int)Error));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set 'Identifier' value */
|
||||||
|
Error = RegSetValue(PeripheralKey,
|
||||||
|
"Identifier",
|
||||||
|
REG_SZ,
|
||||||
|
(PU8)Identifier,
|
||||||
|
strlen(Identifier) + 1);
|
||||||
|
if (Error != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
DbgPrint((DPRINT_HWDETECT,
|
||||||
|
"RegSetValue() failed (Error %u)\n",
|
||||||
|
(int)Error));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
DetectSerialPorts(HKEY SystemKey,
|
||||||
|
HKEY BusKey)
|
||||||
|
{
|
||||||
|
PCM_FULL_RESOURCE_DESCRIPTOR FullResourceDescriptor;
|
||||||
|
PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
|
||||||
|
PCM_SERIAL_DEVICE_DATA SerialDeviceData;
|
||||||
|
U32 Base[4] = {0x3F8, 0x2F8, 0x3E8, 0x2E8};
|
||||||
|
U32 Irq[4] = {4, 3, 4, 3};
|
||||||
|
char Buffer[80];
|
||||||
|
U32 ControllerNumber = 0;
|
||||||
|
HKEY ControllerKey;
|
||||||
|
U32 i;
|
||||||
|
S32 Error;
|
||||||
|
U32 Size;
|
||||||
|
|
||||||
|
DbgPrint((DPRINT_HWDETECT, "DetectSerialPorts()\n"));
|
||||||
|
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
WRITE_PORT_UCHAR ((PUCHAR)(Base[i] + 4), 0x10);
|
||||||
|
if (!(READ_PORT_UCHAR((PUCHAR)Base[i] + 6) & 0xf0))
|
||||||
|
{
|
||||||
|
DbgPrint((DPRINT_HWDETECT,
|
||||||
|
"Found COM%u port at 0x%x\n",
|
||||||
|
i + 1,
|
||||||
|
Base[i]));
|
||||||
|
|
||||||
|
/* Create controller key */
|
||||||
|
sprintf(Buffer,
|
||||||
|
"SerialController\\%u",
|
||||||
|
ControllerNumber);
|
||||||
|
|
||||||
|
Error = RegCreateKey(BusKey,
|
||||||
|
Buffer,
|
||||||
|
&ControllerKey);
|
||||||
|
if (Error != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
DbgPrint((DPRINT_HWDETECT, "Failed to create controller key\n"));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
DbgPrint((DPRINT_HWDETECT, "Created key: %s\n", Buffer));
|
||||||
|
|
||||||
|
/* Set 'ComponentInformation' value */
|
||||||
|
SetComponentInformation(ControllerKey,
|
||||||
|
0x78,
|
||||||
|
ControllerNumber,
|
||||||
|
0xFFFFFFFF);
|
||||||
|
|
||||||
|
/* Build full device descriptor */
|
||||||
|
Size = sizeof(CM_FULL_RESOURCE_DESCRIPTOR) +
|
||||||
|
2 * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) +
|
||||||
|
sizeof(CM_SERIAL_DEVICE_DATA);
|
||||||
|
FullResourceDescriptor = MmAllocateMemory(Size);
|
||||||
|
if (FullResourceDescriptor == NULL)
|
||||||
|
{
|
||||||
|
DbgPrint((DPRINT_HWDETECT,
|
||||||
|
"Failed to allocate resource descriptor\n"));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
memset(FullResourceDescriptor, 0, Size);
|
||||||
|
|
||||||
|
/* Initialize resource descriptor */
|
||||||
|
FullResourceDescriptor->InterfaceType = Isa;
|
||||||
|
FullResourceDescriptor->BusNumber = 0;
|
||||||
|
FullResourceDescriptor->PartialResourceList.Count = 3;
|
||||||
|
|
||||||
|
/* Set IO Port */
|
||||||
|
PartialDescriptor = &FullResourceDescriptor->PartialResourceList.PartialDescriptors[0];
|
||||||
|
PartialDescriptor->Type = CmResourceTypePort;
|
||||||
|
PartialDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
|
||||||
|
PartialDescriptor->Flags = CM_RESOURCE_PORT_IO;
|
||||||
|
PartialDescriptor->u.Port.Start = (U64)Base[i];
|
||||||
|
PartialDescriptor->u.Port.Length = 7;
|
||||||
|
|
||||||
|
/* Set Interrupt */
|
||||||
|
PartialDescriptor = &FullResourceDescriptor->PartialResourceList.PartialDescriptors[1];
|
||||||
|
PartialDescriptor->Type = CmResourceTypeInterrupt;
|
||||||
|
PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
|
||||||
|
PartialDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED;
|
||||||
|
PartialDescriptor->u.Interrupt.Level = Irq[i];
|
||||||
|
PartialDescriptor->u.Interrupt.Vector = Irq[i];
|
||||||
|
PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF;
|
||||||
|
|
||||||
|
/* Set serial data (device specific) */
|
||||||
|
PartialDescriptor = &FullResourceDescriptor->PartialResourceList.PartialDescriptors[2];
|
||||||
|
PartialDescriptor->Type = CmResourceTypeDeviceSpecific;
|
||||||
|
PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
|
||||||
|
PartialDescriptor->Flags = 0;
|
||||||
|
PartialDescriptor->u.DeviceSpecificData.DataSize = sizeof(CM_SERIAL_DEVICE_DATA);
|
||||||
|
|
||||||
|
SerialDeviceData =
|
||||||
|
(PCM_SERIAL_DEVICE_DATA)&FullResourceDescriptor->PartialResourceList.PartialDescriptors[3];
|
||||||
|
SerialDeviceData->BaudClock = 1843200; /* UART Clock frequency (Hertz) */
|
||||||
|
|
||||||
|
/* Set 'Configuration Data' value */
|
||||||
|
Error = RegSetValue(ControllerKey,
|
||||||
|
"Configuration Data",
|
||||||
|
REG_FULL_RESOURCE_DESCRIPTOR,
|
||||||
|
(PU8) FullResourceDescriptor,
|
||||||
|
Size);
|
||||||
|
MmFreeMemory(FullResourceDescriptor);
|
||||||
|
if (Error != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
DbgPrint((DPRINT_HWDETECT,
|
||||||
|
"RegSetValue(Configuration Data) failed (Error %u)\n",
|
||||||
|
(int)Error));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set 'Identifier' value */
|
||||||
|
sprintf(Buffer,
|
||||||
|
"COM%u",
|
||||||
|
i + 1);
|
||||||
|
Error = RegSetValue(BusKey,
|
||||||
|
"Identifier",
|
||||||
|
REG_SZ,
|
||||||
|
(PU8)Buffer,
|
||||||
|
5);
|
||||||
|
if (Error != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
DbgPrint((DPRINT_HWDETECT,
|
||||||
|
"RegSetValue() failed (Error %u)\n",
|
||||||
|
(int)Error));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
DbgPrint((DPRINT_HWDETECT,
|
||||||
|
"Created value: Identifier %s\n",
|
||||||
|
Buffer));
|
||||||
|
|
||||||
|
/* Detect serial mouse */
|
||||||
|
DetectSerialPointerPeripheral(ControllerKey, Base[i]);
|
||||||
|
|
||||||
|
ControllerNumber++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static VOID
|
static VOID
|
||||||
DetectIsaBios(HKEY SystemKey, U32 *BusNumber)
|
DetectIsaBios(HKEY SystemKey, U32 *BusNumber)
|
||||||
{
|
{
|
||||||
|
@ -719,8 +1226,10 @@ DetectIsaBios(HKEY SystemKey, U32 *BusNumber)
|
||||||
DetectBiosDisks(SystemKey, BusKey);
|
DetectBiosDisks(SystemKey, BusKey);
|
||||||
#if 0
|
#if 0
|
||||||
DetectBiosFloppyDisks(SystemKey, BusKey);
|
DetectBiosFloppyDisks(SystemKey, BusKey);
|
||||||
|
#endif
|
||||||
|
|
||||||
DetectBiosSerialPorts();
|
DetectSerialPorts(SystemKey, BusKey);
|
||||||
|
#if 0
|
||||||
DetectBiosParallelPorts();
|
DetectBiosParallelPorts();
|
||||||
|
|
||||||
DetectBiosKeyboard();
|
DetectBiosKeyboard();
|
||||||
|
|
|
@ -66,6 +66,7 @@ typedef enum _CM_SHARE_DISPOSITION
|
||||||
|
|
||||||
typedef U64 PHYSICAL_ADDRESS;
|
typedef U64 PHYSICAL_ADDRESS;
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
U8 Type;
|
U8 Type;
|
||||||
|
@ -105,6 +106,14 @@ typedef struct
|
||||||
} __attribute__((packed)) CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
|
} __attribute__((packed)) CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
|
||||||
|
|
||||||
|
|
||||||
|
/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags */
|
||||||
|
#define CM_RESOURCE_PORT_MEMORY 0x0000
|
||||||
|
#define CM_RESOURCE_PORT_IO 0x0001
|
||||||
|
|
||||||
|
#define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
|
||||||
|
#define CM_RESOURCE_INTERRUPT_LATCHED 0x0001
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
U16 Version;
|
U16 Version;
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
|
|
||||||
|
|
||||||
/* just some stuff */
|
/* just some stuff */
|
||||||
#define VERSION "FreeLoader v1.8.17"
|
#define VERSION "FreeLoader v1.8.18"
|
||||||
#define COPYRIGHT "Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>"
|
#define COPYRIGHT "Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>"
|
||||||
#define AUTHOR_EMAIL "<brianp@sginet.com>"
|
#define AUTHOR_EMAIL "<brianp@sginet.com>"
|
||||||
#define BY_AUTHOR "by Brian Palmer"
|
#define BY_AUTHOR "by Brian Palmer"
|
||||||
|
@ -36,7 +36,7 @@
|
||||||
//
|
//
|
||||||
#define FREELOADER_MAJOR_VERSION 1
|
#define FREELOADER_MAJOR_VERSION 1
|
||||||
#define FREELOADER_MINOR_VERSION 8
|
#define FREELOADER_MINOR_VERSION 8
|
||||||
#define FREELOADER_PATCH_VERSION 17
|
#define FREELOADER_PATCH_VERSION 18
|
||||||
|
|
||||||
|
|
||||||
#ifndef ASM
|
#ifndef ASM
|
||||||
|
|
Loading…
Reference in a new issue