X86: Hook the speaker device to the pit device.
authorGabe Black <gblack@eecs.umich.edu>
Thu, 12 Jun 2008 04:56:17 +0000 (00:56 -0400)
committerGabe Black <gblack@eecs.umich.edu>
Thu, 12 Jun 2008 04:56:17 +0000 (00:56 -0400)
src/dev/x86/south_bridge/SConscript
src/dev/x86/south_bridge/i8254.hh
src/dev/x86/south_bridge/south_bridge.cc
src/dev/x86/south_bridge/speaker.cc
src/dev/x86/south_bridge/speaker.hh

index a7cb77b9b93c091a135da77ec97b15a508e27f1d..d01106c5c3f34987c668196b320b15d42846d062 100644 (file)
@@ -1,6 +1,6 @@
 # -*- mode:python -*-
 
-# Copyright (c) 2006 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
@@ -40,3 +40,5 @@ if env['FULL_SYSTEM'] and env['TARGET_ISA'] == 'x86':
     Source('i8254.cc')
     Source('i8259.cc')
     Source('speaker.cc')
+
+    TraceFlag('PCSpeaker')
index 519049e931f94e00f2da9537b4341b5d2ba2b62a..6f718a8530f9bc67462848ef4fb1ce14362bd626 100644 (file)
@@ -43,10 +43,8 @@ namespace X86ISA
 
 class I8254 : public SubDevice
 {
-  protected:
-    Intel8254Timer pit;
-
   public:
+    Intel8254Timer pit;
 
     I8254(const std::string &name) : pit(name)
     {}
index cc20ea09edcda710678189aae5779f9c15519813..57cc27bccd285fc086edf0fdb996bbee2aeaaf3d 100644 (file)
@@ -70,7 +70,7 @@ SouthBridge::SouthBridge(const Params *p) : PioDevice(p),
     pic2(0xA0, 2, p->pio_latency),
     pit(p->name + ".pit", 0x40, 4, p->pio_latency),
     cmos(0x70, 2, p->pio_latency),
-    speaker(0x61, 1, p->pio_latency)
+    speaker(&pit, 0x61, 1, p->pio_latency)
 {
     addDevice(pic1);
     addDevice(pic2);
index 734dba4c2442190b4367585d1680e3dba7ad1e31..784c9504b7259ac4b9035823978448f4488380bc 100644 (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
  */
 
 #include "base/bitunion.hh"
+#include "base/trace.hh"
+#include "dev/x86/south_bridge/i8254.hh"
 #include "dev/x86/south_bridge/speaker.hh"
 #include "mem/packet_access.hh"
 
-BitUnion8(SpeakerControl)
-    Bitfield<0> gate;
-    Bitfield<1> speaker;
-    Bitfield<5> timer;
-EndBitUnion(SpeakerControl)
-
 Tick
 X86ISA::Speaker::read(PacketPtr pkt)
 {
     assert(pkt->getAddr() == addrRange.start);
     assert(pkt->getSize() == 1);
-    SpeakerControl val = 0xFF;
-    warn("Reading from speaker device: gate %s, speaker %s, output %s.\n",
-            val.gate ? "on" : "off",
-            val.speaker ? "on" : "off",
-            val.timer ? "on" : "off");
-    pkt->set((uint8_t)val);
+    controlVal.timer = timer->pit.counter2.outputHigh() ? 1 : 0;
+    DPRINTF(PCSpeaker,
+            "Reading from speaker device: gate %s, speaker %s, output %s.\n",
+            controlVal.gate ? "on" : "off",
+            controlVal.speaker ? "on" : "off",
+            controlVal.timer ? "on" : "off");
+    pkt->set((uint8_t)controlVal);
     return latency;
 }
 
@@ -58,7 +55,16 @@ X86ISA::Speaker::write(PacketPtr pkt)
     assert(pkt->getAddr() == addrRange.start);
     assert(pkt->getSize() == 1);
     SpeakerControl val = pkt->get<uint8_t>();
-    warn("Writing to speaker device: gate %s, speaker %s.\n",
-            val.gate ? "on" : "off", val.speaker ? "on" : "off");
+    controlVal.gate = val.gate;
+    //Change the gate value in the timer.
+    if (!val.gate)
+        warn("The gate bit of the pc speaker isn't implemented and "
+                "is always on.\n");
+    //This would control whether the timer output is hooked up to a physical
+    //speaker. Since M5 can't make noise, it's value doesn't actually do
+    //anything.
+    controlVal.speaker = val.speaker;
+    DPRINTF(PCSpeaker, "Writing to speaker device: gate %s, speaker %s.\n",
+            controlVal.gate ? "on" : "off", controlVal.speaker ? "on" : "off");
     return latency;
 }
index df738e42b1afcb8f727ecf9795393ee5d9ca299c..2385b80cc9cd4b4dcc10f9a15eea8240627e8798 100644 (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
 namespace X86ISA
 {
 
+class I8254;
+
 class Speaker : public SubDevice
 {
+  protected:
+    BitUnion8(SpeakerControl)
+        Bitfield<0> gate;
+        Bitfield<1> speaker;
+        Bitfield<5> timer;
+    EndBitUnion(SpeakerControl)
+
+    SpeakerControl controlVal;
+
+    I8254 * timer;
+
   public:
 
-    Speaker()
+    Speaker(I8254 * _timer) : timer(_timer)
     {}
-    Speaker(Tick _latency) : SubDevice(_latency)
+    Speaker(I8254 * _timer, Tick _latency) :
+        SubDevice(_latency), timer(_timer)
     {}
-    Speaker(Addr start, Addr size, Tick _latency) :
-        SubDevice(start, size, _latency)
+    Speaker(I8254 * _timer, Addr start, Addr size, Tick _latency) :
+        SubDevice(start, size, _latency), timer(_timer)
     {}
 
     Tick read(PacketPtr pkt);