X86: Make the platform object initialize channel 0 of the PIT.

This commit is contained in:
Gabe Black
2008-06-12 00:56:54 -04:00
parent 16e26fbf03
commit 1f5b992b58
4 changed files with 43 additions and 12 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2004-2005 The Regents of The University of Michigan
* Copyright (c) 2008 The Regents of The University of Michigan
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -37,6 +37,7 @@
#include <vector>
#include "arch/x86/x86_traits.hh"
#include "dev/intel_8254_timer.hh"
#include "cpu/intr_control.hh"
#include "dev/simconsole.hh"
#include "dev/x86/pc.hh"
@@ -48,10 +49,25 @@ using namespace TheISA;
PC::PC(const Params *p)
: Platform(p), system(p->system)
{
southBridge = NULL;
// set the back pointer from the system to myself
system->platform = this;
}
void
PC::init()
{
assert(southBridge);
Intel8254Timer & timer = southBridge->pit.pit;
//Timer 0, mode 2, no bcd, 16 bit count
timer.writeControl(0x34);
//Timer 0, latch command
timer.writeControl(0x00);
//Write a 16 bit count of 0
timer.counter0.write(0);
timer.counter0.write(0);
}
Tick
PC::intrFrequency()
{

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2004-2005 The Regents of The University of Michigan
* Copyright (c) 2008 The Regents of The University of Michigan
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -38,6 +38,7 @@
#define __DEV_PC_HH__
#include "dev/platform.hh"
#include "dev/x86/south_bridge/south_bridge.hh"
#include "params/PC.hh"
class IdeController;
@@ -48,10 +49,16 @@ class PC : public Platform
public:
/** Pointer to the system */
System *system;
SouthBridge * southBridge;
public:
typedef PCParams Params;
/**
* Do platform initialization stuff
*/
void init();
PC(const Params *p);
/**

View File

@@ -30,6 +30,7 @@
#include "arch/x86/x86_traits.hh"
#include "base/range.hh"
#include "dev/x86/pc.hh"
#include "dev/x86/south_bridge/south_bridge.hh"
using namespace X86ISA;
@@ -77,6 +78,11 @@ SouthBridge::SouthBridge(const Params *p) : PioDevice(p),
addDevice(pit);
addDevice(cmos);
addDevice(speaker);
// Let the platform know where we are
PC * pc = dynamic_cast<PC *>(platform);
assert(pc);
pc->southBridge = this;
}
SouthBridge *

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2004-2005 The Regents of The University of Michigan
* Copyright (c) 2008 The Regents of The University of Michigan
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -43,6 +43,16 @@
class SouthBridge : public PioDevice
{
protected:
AddrRangeList rangeList;
typedef range_map<Addr, X86ISA::SubDevice *> RangeMap;
typedef RangeMap::iterator RangeMapIt;
RangeMap rangeMap;
void addDevice(X86ISA::SubDevice &);
public:
// PICs
X86ISA::I8259 pic1;
X86ISA::I8259 pic2;
@@ -56,16 +66,8 @@ class SouthBridge : public PioDevice
// PC speaker
X86ISA::Speaker speaker;
AddrRangeList rangeList;
typedef range_map<Addr, X86ISA::SubDevice *> RangeMap;
typedef RangeMap::iterator RangeMapIt;
RangeMap rangeMap;
void addDevice(X86ISA::SubDevice &);
public:
void addressRanges(AddrRangeList &range_list);
Tick read(PacketPtr pkt);