summaryrefslogtreecommitdiff
path: root/src/dev/terminal.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/dev/terminal.cc')
-rw-r--r--src/dev/terminal.cc18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/dev/terminal.cc b/src/dev/terminal.cc
index e70a8775f..895069774 100644
--- a/src/dev/terminal.cc
+++ b/src/dev/terminal.cc
@@ -99,8 +99,8 @@ Terminal::DataEvent::process(int revent)
* Terminal code
*/
Terminal::Terminal(const Params *p)
- : SimObject(p), listenEvent(NULL), dataEvent(NULL), number(p->number),
- data_fd(-1), txbuf(16384), rxbuf(16384), outfile(NULL)
+ : SimObject(p), termDataAvail(NULL), listenEvent(NULL), dataEvent(NULL),
+ number(p->number), data_fd(-1), txbuf(16384), rxbuf(16384), outfile(NULL)
#if TRACING_ON == 1
, linebuf(16384)
#endif
@@ -129,6 +129,17 @@ Terminal::~Terminal()
delete dataEvent;
}
+void
+Terminal::regDataAvailCallback(Callback *c)
+{
+ // This can happen if the user has connected multiple UARTs to the
+ // same terminal. In that case, each of them tries to register
+ // callbacks.
+ if (termDataAvail)
+ fatal("Terminal already has already been associated with a UART.\n");
+ termDataAvail = c;
+}
+
///////////////////////////////////////////////////////////////////////
// socket creation and terminal attach
//
@@ -215,7 +226,8 @@ Terminal::data()
if (len) {
rxbuf.write((char *)buf, len);
// Inform the UART there is data available
- uart->dataAvailable();
+ assert(termDataAvail);
+ termDataAvail->process();
}
}