X86: Put an RTC into the CMOS part of the southbridge.
--HG-- extra : convert_revision : a614373236fe75db6e6181fc152a02b541a131f3
This commit is contained in:
parent
e5bdae15f3
commit
93dd1978a7
2 changed files with 29 additions and 43 deletions
|
@ -71,27 +71,10 @@ uint8_t
|
||||||
X86ISA::Cmos::readRegister(uint8_t reg)
|
X86ISA::Cmos::readRegister(uint8_t reg)
|
||||||
{
|
{
|
||||||
assert(reg < numRegs);
|
assert(reg < numRegs);
|
||||||
switch(reg)
|
if (reg <= 0xD) {
|
||||||
{
|
return rtc.readData(reg);
|
||||||
case 0x0:
|
} else {
|
||||||
case 0x1:
|
|
||||||
case 0x2:
|
|
||||||
case 0x3:
|
|
||||||
case 0x4:
|
|
||||||
case 0x5:
|
|
||||||
case 0x6:
|
|
||||||
case 0x7:
|
|
||||||
case 0x8:
|
|
||||||
case 0x9:
|
|
||||||
case 0xA:
|
|
||||||
case 0xB:
|
|
||||||
case 0xC:
|
|
||||||
case 0xD:
|
|
||||||
warn("Reading RTC in the CMOS.\n");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
warn("Reading non-volitile CMOS address %x as %x.\n", reg, regs[reg]);
|
warn("Reading non-volitile CMOS address %x as %x.\n", reg, regs[reg]);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
return regs[reg];
|
return regs[reg];
|
||||||
}
|
}
|
||||||
|
@ -100,27 +83,11 @@ void
|
||||||
X86ISA::Cmos::writeRegister(uint8_t reg, uint8_t val)
|
X86ISA::Cmos::writeRegister(uint8_t reg, uint8_t val)
|
||||||
{
|
{
|
||||||
assert(reg < numRegs);
|
assert(reg < numRegs);
|
||||||
switch(reg)
|
if (reg <= 0xD) {
|
||||||
{
|
rtc.writeData(reg, val);
|
||||||
case 0x0:
|
return;
|
||||||
case 0x1:
|
} else {
|
||||||
case 0x2:
|
|
||||||
case 0x3:
|
|
||||||
case 0x4:
|
|
||||||
case 0x5:
|
|
||||||
case 0x6:
|
|
||||||
case 0x7:
|
|
||||||
case 0x8:
|
|
||||||
case 0x9:
|
|
||||||
case 0xA:
|
|
||||||
case 0xB:
|
|
||||||
case 0xC:
|
|
||||||
case 0xD:
|
|
||||||
warn("Writing RTC in the CMOS.\n");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
warn("Writing non-volitile CMOS address %x with %x.\n", reg, val);
|
warn("Writing non-volitile CMOS address %x with %x.\n", reg, val);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
regs[reg] = val;
|
regs[reg] = val;
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
|
|
||||||
#include "arch/x86/x86_traits.hh"
|
#include "arch/x86/x86_traits.hh"
|
||||||
#include "base/range.hh"
|
#include "base/range.hh"
|
||||||
|
#include "dev/mc146818.hh"
|
||||||
#include "dev/x86/south_bridge/sub_device.hh"
|
#include "dev/x86/south_bridge/sub_device.hh"
|
||||||
|
|
||||||
namespace X86ISA
|
namespace X86ISA
|
||||||
|
@ -43,6 +44,8 @@ class Cmos : public SubDevice
|
||||||
protected:
|
protected:
|
||||||
uint8_t address;
|
uint8_t address;
|
||||||
|
|
||||||
|
struct tm foo_time;
|
||||||
|
|
||||||
static const int numRegs = 128;
|
static const int numRegs = 128;
|
||||||
|
|
||||||
uint8_t regs[numRegs];
|
uint8_t regs[numRegs];
|
||||||
|
@ -50,22 +53,38 @@ class Cmos : public SubDevice
|
||||||
uint8_t readRegister(uint8_t reg);
|
uint8_t readRegister(uint8_t reg);
|
||||||
void writeRegister(uint8_t reg, uint8_t val);
|
void writeRegister(uint8_t reg, uint8_t val);
|
||||||
|
|
||||||
|
class X86RTC : public MC146818
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
X86RTC(const std::string &n, const struct tm time,
|
||||||
|
bool bcd, Tick frequency) : MC146818(n, time, bcd, frequency)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
protected:
|
||||||
|
void handleEvent()
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} rtc;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Cmos()
|
Cmos() : rtc("rtc", foo_time, true, 5000000000)
|
||||||
{
|
{
|
||||||
memset(regs, 0, numRegs * sizeof(uint8_t));
|
memset(regs, 0, numRegs * sizeof(uint8_t));
|
||||||
address = 0;
|
address = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Cmos(Tick _latency) : SubDevice(_latency)
|
Cmos(Tick _latency) : SubDevice(_latency),
|
||||||
|
rtc("rtc", foo_time, true, 5000000000)
|
||||||
{
|
{
|
||||||
memset(regs, 0, numRegs * sizeof(uint8_t));
|
memset(regs, 0, numRegs * sizeof(uint8_t));
|
||||||
address = 0;
|
address = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Cmos(Addr start, Addr size, Tick _latency) :
|
Cmos(Addr start, Addr size, Tick _latency) :
|
||||||
SubDevice(start, size, _latency)
|
SubDevice(start, size, _latency),
|
||||||
|
rtc("rtc", foo_time, true, 5000000000)
|
||||||
{
|
{
|
||||||
memset(regs, 0, numRegs * sizeof(uint8_t));
|
memset(regs, 0, numRegs * sizeof(uint8_t));
|
||||||
address = 0;
|
address = 0;
|
||||||
|
|
Loading…
Reference in a new issue