Added CMOS configuration space handler.

svn path=/trunk/; revision=2130
This commit is contained in:
Eric Kohl 2001-08-01 10:39:50 +00:00
parent 4032632974
commit cad3eb8c42
3 changed files with 203 additions and 62 deletions

View file

@ -1,4 +1,4 @@
/* $Id: bus.c,v 1.8 2001/06/13 22:17:01 ekohl Exp $
/* $Id: bus.c,v 1.9 2001/08/01 10:39:50 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -160,8 +160,8 @@ HalpInitBusHandlers(VOID)
0);
if (BusHandler == NULL)
return;
// BusHandler->GetBusData = (pGetSetBusData)HalpGetCmosData;
// BusHandler->SetBusData = (pGetSetBusData)HalpSetCmosData;
BusHandler->GetBusData = (pGetSetBusData)HalpGetCmosData;
BusHandler->SetBusData = (pGetSetBusData)HalpSetCmosData;
/* add isa bus handler */
BusHandler = HalpAllocateBusHandler(Isa,

View file

@ -11,8 +11,9 @@
#include <ddk/ntddk.h>
#include <string.h>
#include <internal/hal/mps.h>
#include <internal/hal/bus.h>
#define NDEBUG
//#define NDEBUG
#include <internal/debug.h>
/* MACROS and CONSTANTS ******************************************************/
@ -35,36 +36,69 @@
/* FUNCTIONS *****************************************************************/
static BYTE
HalQueryCMOS (BYTE Reg)
static UCHAR
HalpQueryCMOS(UCHAR Reg)
{
BYTE Val;
ULONG Flags;
UCHAR Val;
ULONG Flags;
Reg |= 0x80;
pushfl(Flags);
__asm__("cli\n"); // AP unsure as to whether to do this here
WRITE_PORT_UCHAR((PUCHAR)0x70, Reg);
Val = READ_PORT_UCHAR((PUCHAR)0x71);
WRITE_PORT_UCHAR((PUCHAR)0x70, 0);
popfl(Flags);
Reg |= 0x80;
pushfl(Flags);
__asm__("cli\n"); // AP unsure as to whether to do this here
WRITE_PORT_UCHAR((PUCHAR)0x70, Reg);
Val = READ_PORT_UCHAR((PUCHAR)0x71);
WRITE_PORT_UCHAR((PUCHAR)0x70, 0);
popfl(Flags);
return(Val);
return(Val);
}
static VOID
HalSetCMOS (BYTE Reg, BYTE Val)
HalpSetCMOS(UCHAR Reg,
UCHAR Val)
{
ULONG Flags;
ULONG Flags;
Reg |= 0x80;
pushfl(Flags);
__asm__("cli\n"); // AP unsure as to whether to do this here
WRITE_PORT_UCHAR((PUCHAR)0x70, Reg);
WRITE_PORT_UCHAR((PUCHAR)0x71, Val);
WRITE_PORT_UCHAR((PUCHAR)0x70, 0);
popfl(Flags);
Reg |= 0x80;
pushfl(Flags);
__asm__("cli\n"); // AP unsure as to whether to do this here
WRITE_PORT_UCHAR((PUCHAR)0x70, Reg);
WRITE_PORT_UCHAR((PUCHAR)0x71, Val);
WRITE_PORT_UCHAR((PUCHAR)0x70, 0);
popfl(Flags);
}
static UCHAR
HalpQueryECMOS(USHORT Reg)
{
UCHAR Val;
ULONG Flags;
pushfl(Flags);
__asm__("cli\n"); // AP unsure as to whether to do this here
WRITE_PORT_UCHAR((PUCHAR)0x74, (UCHAR)(Reg & 0x00FF));
WRITE_PORT_UCHAR((PUCHAR)0x75, (UCHAR)(Reg>>8));
Val = READ_PORT_UCHAR((PUCHAR)0x76);
popfl(Flags);
return(Val);
}
static VOID
HalpSetECMOS(USHORT Reg,
UCHAR Val)
{
ULONG Flags;
pushfl(Flags);
__asm__("cli\n"); // AP unsure as to whether to do this here
WRITE_PORT_UCHAR((PUCHAR)0x74, (UCHAR)(Reg & 0x00FF));
WRITE_PORT_UCHAR((PUCHAR)0x75, (UCHAR)(Reg>>8));
WRITE_PORT_UCHAR((PUCHAR)0x76, Val);
popfl(Flags);
}
@ -72,16 +106,16 @@ VOID STDCALL
HalQueryRealTimeClock(PTIME_FIELDS Time)
{
/* check 'Update In Progress' bit */
while (HalQueryCMOS (RTC_REGISTER_A) & RTC_REG_A_UIP)
while (HalpQueryCMOS (RTC_REGISTER_A) & RTC_REG_A_UIP)
;
Time->Second = BCD_INT(HalQueryCMOS (0));
Time->Minute = BCD_INT(HalQueryCMOS (2));
Time->Hour = BCD_INT(HalQueryCMOS (4));
Time->Weekday = BCD_INT(HalQueryCMOS (6));
Time->Day = BCD_INT(HalQueryCMOS (7));
Time->Month = BCD_INT(HalQueryCMOS (8));
Time->Year = BCD_INT(HalQueryCMOS (9));
Time->Second = BCD_INT(HalpQueryCMOS (0));
Time->Minute = BCD_INT(HalpQueryCMOS (2));
Time->Hour = BCD_INT(HalpQueryCMOS (4));
Time->Weekday = BCD_INT(HalpQueryCMOS (6));
Time->Day = BCD_INT(HalpQueryCMOS (7));
Time->Month = BCD_INT(HalpQueryCMOS (8));
Time->Year = BCD_INT(HalpQueryCMOS (9));
if (Time->Year > 80)
Time->Year += 1900;
@ -90,7 +124,7 @@ HalQueryRealTimeClock(PTIME_FIELDS Time)
#if 0
/* Century */
Time->Year += BCD_INT(HalQueryCMOS (RTC_REGISTER_CENTURY)) * 100;
Time->Year += BCD_INT(HalpQueryCMOS (RTC_REGISTER_CENTURY)) * 100;
#endif
#ifndef NDEBUG
@ -112,20 +146,20 @@ VOID STDCALL
HalSetRealTimeClock(PTIME_FIELDS Time)
{
/* check 'Update In Progress' bit */
while (HalQueryCMOS (RTC_REGISTER_A) & RTC_REG_A_UIP)
while (HalpQueryCMOS (RTC_REGISTER_A) & RTC_REG_A_UIP)
;
HalSetCMOS (0, INT_BCD(Time->Second));
HalSetCMOS (2, INT_BCD(Time->Minute));
HalSetCMOS (4, INT_BCD(Time->Hour));
HalSetCMOS (6, INT_BCD(Time->Weekday));
HalSetCMOS (7, INT_BCD(Time->Day));
HalSetCMOS (8, INT_BCD(Time->Month));
HalSetCMOS (9, INT_BCD(Time->Year % 100));
HalpSetCMOS (0, INT_BCD(Time->Second));
HalpSetCMOS (2, INT_BCD(Time->Minute));
HalpSetCMOS (4, INT_BCD(Time->Hour));
HalpSetCMOS (6, INT_BCD(Time->Weekday));
HalpSetCMOS (7, INT_BCD(Time->Day));
HalpSetCMOS (8, INT_BCD(Time->Month));
HalpSetCMOS (9, INT_BCD(Time->Year % 100));
#if 0
/* Century */
HalSetCMOS (RTC_REGISTER_CENTURY, INT_BCD(Time->Year / 100));
HalpSetCMOS (RTC_REGISTER_CENTURY, INT_BCD(Time->Year / 100));
#endif
}
@ -140,7 +174,7 @@ HalGetEnvironmentVariable(PCH Name,
return FALSE;
}
if (HalQueryCMOS(RTC_REGISTER_B) & 0x01)
if (HalpQueryCMOS(RTC_REGISTER_B) & 0x01)
{
strncpy(Value, "FALSE", ValueLength);
}
@ -157,27 +191,117 @@ BOOLEAN STDCALL
HalSetEnvironmentVariable(PCH Name,
PCH Value)
{
UCHAR Val;
UCHAR Val;
if (_stricmp(Name, "LastKnownGood") != 0)
{
return FALSE;
}
if (_stricmp(Name, "LastKnownGood") != 0)
return FALSE;
Val = HalQueryCMOS(RTC_REGISTER_B);
Val = HalpQueryCMOS(RTC_REGISTER_B);
if (_stricmp(Value, "TRUE") == 0)
{
HalSetCMOS(RTC_REGISTER_B, Val | 0x01);
}
else if (_stricmp(Value, "FALSE") == 0)
{
HalSetCMOS(RTC_REGISTER_B, Val & ~0x01);
}
else
{
return FALSE;
}
if (_stricmp(Value, "TRUE") == 0)
HalpSetCMOS(RTC_REGISTER_B, Val | 0x01);
else if (_stricmp(Value, "FALSE") == 0)
HalpSetCMOS(RTC_REGISTER_B, Val & ~0x01);
else
return FALSE;
return TRUE;
}
ULONG STDCALL
HalpGetCmosData(PBUS_HANDLER BusHandler,
ULONG BusNumber,
ULONG SlotNumber,
PVOID Buffer,
ULONG Offset,
ULONG Length)
{
PUCHAR Ptr = Buffer;
ULONG Address = SlotNumber;
ULONG Len = Length;
DPRINT("HalpGetCmosData() called.\n");
DPRINT(" BusNumber %lu\n", BusNumber);
DPRINT(" SlotNumber %lu\n", SlotNumber);
DPRINT(" Offset 0x%lx\n", Offset);
DPRINT(" Length 0x%lx\n", Length);
if (Length == 0)
return 0;
if (BusNumber == 0)
{
/* CMOS */
while ((Len > 0) && (Address < 0x100))
{
*Ptr = HalpQueryCMOS((UCHAR)Address);
Ptr = Ptr + 1;
Address++;
Len--;
}
}
else if (BusNumber == 1)
{
/* Extended CMOS */
while ((Len > 0) && (Address < 0x1000))
{
*Ptr = HalpQueryECMOS((USHORT)Address);
Ptr = Ptr + 1;
Address++;
Len--;
}
}
return(Length - Len);
}
ULONG STDCALL
HalpSetCmosData(PBUS_HANDLER BusHandler,
ULONG BusNumber,
ULONG SlotNumber,
PVOID Buffer,
ULONG Offset,
ULONG Length)
{
PUCHAR Ptr = (PUCHAR)Buffer;
ULONG Address = SlotNumber;
ULONG Len = Length;
DPRINT("HalpSetCmosData() called.\n");
DPRINT(" BusNumber %lu\n", BusNumber);
DPRINT(" SlotNumber %lu\n", SlotNumber);
DPRINT(" Offset 0x%lx\n", Offset);
DPRINT(" Length 0x%lx\n", Length);
if (Length == 0)
return 0;
if (BusNumber == 0)
{
/* CMOS */
while ((Len > 0) && (Address < 0x100))
{
HalpSetCMOS((UCHAR)Address, *Ptr);
Ptr = Ptr + 1;
Address++;
Len--;
}
}
else if (BusNumber == 1)
{
/* Extended CMOS */
while ((Len > 0) && (Address < 0x1000))
{
HalpSetECMOS((USHORT)Address, *Ptr);
Ptr = Ptr + 1;
Address++;
Len--;
}
}
return(Length - Len);
}
/* EOF */

View file

@ -99,6 +99,23 @@ HalpTranslateIsaBusAddress(PBUS_HANDLER BusHandler,
PULONG AddressSpace,
PPHYSICAL_ADDRESS TranslatedAddress);
/* time.c */
ULONG STDCALL
HalpGetCmosData(PBUS_HANDLER BusHandler,
ULONG BusNumber,
ULONG SlotNumber,
PVOID Buffer,
ULONG Offset,
ULONG Length);
ULONG STDCALL
HalpSetCmosData(PBUS_HANDLER BusHandler,
ULONG BusNumber,
ULONG SlotNumber,
PVOID Buffer,
ULONG Offset,
ULONG Length);
#endif /* __INTERNAL_HAL_BUS_H */
/* EOF */