mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 02:03:13 +00:00
[FREELDR] Add Serial ports detection in DetectIsaBios() (#1829)
CORE-16216
This commit is contained in:
parent
2faee11672
commit
7497b81e5b
4 changed files with 95 additions and 20 deletions
|
@ -636,23 +636,11 @@ DetectSerialPointerPeripheral(PCONFIGURATION_COMPONENT_DATA ControllerKey,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
ULONG
|
||||||
VOID
|
PcGetSerialPort(ULONG Index, PULONG Irq)
|
||||||
DetectSerialPorts(PCONFIGURATION_COMPONENT_DATA BusKey)
|
|
||||||
{
|
{
|
||||||
PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
|
static const ULONG PcIrq[MAX_COM_PORTS] = {4, 3, 4, 3};
|
||||||
PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
|
|
||||||
PCM_SERIAL_DEVICE_DATA SerialDeviceData;
|
|
||||||
ULONG Irq[MAX_COM_PORTS] = {4, 3, 4, 3};
|
|
||||||
ULONG Base;
|
|
||||||
CHAR Buffer[80];
|
|
||||||
PUSHORT BasePtr;
|
PUSHORT BasePtr;
|
||||||
ULONG ControllerNumber = 0;
|
|
||||||
PCONFIGURATION_COMPONENT_DATA ControllerKey;
|
|
||||||
ULONG i;
|
|
||||||
ULONG Size;
|
|
||||||
|
|
||||||
TRACE("DetectSerialPorts()\n");
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The BIOS data area 0x400 holds the address of the first valid COM port.
|
* The BIOS data area 0x400 holds the address of the first valid COM port.
|
||||||
|
@ -660,10 +648,30 @@ DetectSerialPorts(PCONFIGURATION_COMPONENT_DATA BusKey)
|
||||||
* Infos at: http://www.bioscentral.com/misc/bda.htm
|
* Infos at: http://www.bioscentral.com/misc/bda.htm
|
||||||
*/
|
*/
|
||||||
BasePtr = (PUSHORT)0x400;
|
BasePtr = (PUSHORT)0x400;
|
||||||
|
*Irq = PcIrq[Index];
|
||||||
|
|
||||||
for (i = 0; i < MAX_COM_PORTS; i++, BasePtr++)
|
return (ULONG) *(BasePtr + Index);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
DetectSerialPorts(PCONFIGURATION_COMPONENT_DATA BusKey, GET_SERIAL_PORT MachGetSerialPort, ULONG Count)
|
||||||
|
{
|
||||||
|
PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
|
||||||
|
PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
|
||||||
|
PCM_SERIAL_DEVICE_DATA SerialDeviceData;
|
||||||
|
ULONG Irq;
|
||||||
|
ULONG Base;
|
||||||
|
CHAR Buffer[80];
|
||||||
|
ULONG ControllerNumber = 0;
|
||||||
|
PCONFIGURATION_COMPONENT_DATA ControllerKey;
|
||||||
|
ULONG i;
|
||||||
|
ULONG Size;
|
||||||
|
|
||||||
|
TRACE("DetectSerialPorts()\n");
|
||||||
|
|
||||||
|
for (i = 0; i < Count; i++)
|
||||||
{
|
{
|
||||||
Base = (ULONG) * BasePtr;
|
Base = MachGetSerialPort(i, &Irq);
|
||||||
if ((Base == 0) || !CpDoesPortExist(UlongToPtr(Base)))
|
if ((Base == 0) || !CpDoesPortExist(UlongToPtr(Base)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -703,8 +711,8 @@ DetectSerialPorts(PCONFIGURATION_COMPONENT_DATA BusKey)
|
||||||
PartialDescriptor->Type = CmResourceTypeInterrupt;
|
PartialDescriptor->Type = CmResourceTypeInterrupt;
|
||||||
PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
|
PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
|
||||||
PartialDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED;
|
PartialDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED;
|
||||||
PartialDescriptor->u.Interrupt.Level = Irq[i];
|
PartialDescriptor->u.Interrupt.Level = Irq;
|
||||||
PartialDescriptor->u.Interrupt.Vector = Irq[i];
|
PartialDescriptor->u.Interrupt.Vector = Irq;
|
||||||
PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF;
|
PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF;
|
||||||
|
|
||||||
/* Set serial data (device specific) */
|
/* Set serial data (device specific) */
|
||||||
|
@ -1319,7 +1327,7 @@ DetectIsaBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
|
||||||
|
|
||||||
/* Detect ISA/BIOS devices */
|
/* Detect ISA/BIOS devices */
|
||||||
DetectBiosDisks(SystemKey, BusKey);
|
DetectBiosDisks(SystemKey, BusKey);
|
||||||
DetectSerialPorts(BusKey);
|
DetectSerialPorts(BusKey, PcGetSerialPort, MAX_COM_PORTS);
|
||||||
DetectParallelPorts(BusKey);
|
DetectParallelPorts(BusKey);
|
||||||
DetectKeyboardController(BusKey);
|
DetectKeyboardController(BusKey);
|
||||||
DetectPS2Mouse(BusKey);
|
DetectPS2Mouse(BusKey);
|
||||||
|
|
|
@ -35,6 +35,53 @@ XboxFindPciBios(PPCI_REGISTRY_INFO BusData)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern
|
||||||
|
VOID
|
||||||
|
DetectSerialPointerPeripheral(PCONFIGURATION_COMPONENT_DATA ControllerKey, PUCHAR Base);
|
||||||
|
|
||||||
|
static
|
||||||
|
ULONG
|
||||||
|
XboxGetSerialPort(ULONG Index, PULONG Irq)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Xbox may have maximum two Serial COM ports
|
||||||
|
* if the Super I/O chip is connected via LPC
|
||||||
|
*/
|
||||||
|
static const UCHAR Device[MAX_XBOX_COM_PORTS] = {LPC_DEVICE_SERIAL_PORT_1, LPC_DEVICE_SERIAL_PORT_2};
|
||||||
|
ULONG ComBase = 0;
|
||||||
|
|
||||||
|
// Enter Configuration
|
||||||
|
WRITE_PORT_UCHAR(LPC_IO_BASE, LPC_ENTER_CONFIG_KEY);
|
||||||
|
|
||||||
|
// Select serial device
|
||||||
|
WRITE_PORT_UCHAR(LPC_IO_BASE, LPC_CONFIG_DEVICE_NUMBER);
|
||||||
|
WRITE_PORT_UCHAR(LPC_IO_BASE + 1, Device[Index]);
|
||||||
|
|
||||||
|
// Check if selected device is active
|
||||||
|
WRITE_PORT_UCHAR(LPC_IO_BASE, LPC_CONFIG_DEVICE_ACTIVATE);
|
||||||
|
if (READ_PORT_UCHAR(LPC_IO_BASE + 1) == 1)
|
||||||
|
{
|
||||||
|
// Read LSB
|
||||||
|
WRITE_PORT_UCHAR(LPC_IO_BASE, LPC_CONFIG_DEVICE_BASE_ADDRESS_LOW);
|
||||||
|
ComBase = READ_PORT_UCHAR(LPC_IO_BASE + 1);
|
||||||
|
// Read MSB
|
||||||
|
WRITE_PORT_UCHAR(LPC_IO_BASE, LPC_CONFIG_DEVICE_BASE_ADDRESS_HIGH);
|
||||||
|
ComBase |= (READ_PORT_UCHAR(LPC_IO_BASE + 1) << 8);
|
||||||
|
// Read IRQ
|
||||||
|
WRITE_PORT_UCHAR(LPC_IO_BASE, LPC_CONFIG_DEVICE_INTERRUPT);
|
||||||
|
*Irq = READ_PORT_UCHAR(LPC_IO_BASE + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Exit Configuration
|
||||||
|
WRITE_PORT_UCHAR(LPC_IO_BASE, LPC_EXIT_CONFIG_KEY);
|
||||||
|
|
||||||
|
return ComBase;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern
|
||||||
|
VOID
|
||||||
|
DetectSerialPorts(PCONFIGURATION_COMPONENT_DATA BusKey, GET_SERIAL_PORT MachGetSerialPort, ULONG Count);
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
XboxGetExtendedBIOSData(PULONG ExtendedBIOSDataArea, PULONG ExtendedBIOSDataSize)
|
XboxGetExtendedBIOSData(PULONG ExtendedBIOSDataArea, PULONG ExtendedBIOSDataSize)
|
||||||
{
|
{
|
||||||
|
@ -155,6 +202,7 @@ DetectIsaBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
|
||||||
|
|
||||||
/* Detect ISA/BIOS devices */
|
/* Detect ISA/BIOS devices */
|
||||||
DetectBiosDisks(SystemKey, BusKey);
|
DetectBiosDisks(SystemKey, BusKey);
|
||||||
|
DetectSerialPorts(BusKey, XboxGetSerialPort, MAX_XBOX_COM_PORTS);
|
||||||
|
|
||||||
/* FIXME: Detect more ISA devices */
|
/* FIXME: Detect more ISA devices */
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,21 @@
|
||||||
#include "mm.h"
|
#include "mm.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define MAX_XBOX_COM_PORTS 2
|
||||||
|
|
||||||
|
#define LPC_IO_BASE 0x2E
|
||||||
|
#define LPC_ENTER_CONFIG_KEY 0x55
|
||||||
|
#define LPC_EXIT_CONFIG_KEY 0xAA
|
||||||
|
|
||||||
|
#define LPC_DEVICE_SERIAL_PORT_1 0x4
|
||||||
|
#define LPC_DEVICE_SERIAL_PORT_2 0x5
|
||||||
|
|
||||||
|
#define LPC_CONFIG_DEVICE_NUMBER 0x07
|
||||||
|
#define LPC_CONFIG_DEVICE_ACTIVATE 0x30
|
||||||
|
#define LPC_CONFIG_DEVICE_BASE_ADDRESS_HIGH 0x60
|
||||||
|
#define LPC_CONFIG_DEVICE_BASE_ADDRESS_LOW 0x61
|
||||||
|
#define LPC_CONFIG_DEVICE_INTERRUPT 0x70
|
||||||
|
|
||||||
extern UCHAR XboxFont8x16[256 * 16];
|
extern UCHAR XboxFont8x16[256 * 16];
|
||||||
|
|
||||||
VOID XboxMachInit(const char *CmdLine);
|
VOID XboxMachInit(const char *CmdLine);
|
||||||
|
|
|
@ -44,6 +44,10 @@ BOOLEAN
|
||||||
|
|
||||||
extern FIND_PCI_BIOS FindPciBios;
|
extern FIND_PCI_BIOS FindPciBios;
|
||||||
|
|
||||||
|
typedef
|
||||||
|
ULONG
|
||||||
|
(*GET_SERIAL_PORT)(ULONG Index, PULONG Irq);
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA SystemKey,
|
DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA SystemKey,
|
||||||
PCONFIGURATION_COMPONENT_DATA BusKey);
|
PCONFIGURATION_COMPONENT_DATA BusKey);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue