* 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
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
//
if (len) {
rxbuf.write((char *)buf, len);
// Inform the UART there is data available
- uart->dataAvailable();
+ assert(termDataAvail);
+ termDataAvail->process();
}
}
#include <iostream>
+#include "base/callback.hh"
#include "base/circlebuf.hh"
#include "base/pollevent.hh"
#include "base/socket.hh"
#include "sim/sim_object.hh"
class TerminalListener;
-class Uart;
class Terminal : public SimObject
{
public:
- Uart *uart;
+ /**
+ * Register a data available callback into the transport layer.
+ *
+ * The terminal needs to call the underlying transport layer to
+ * inform it of available data. The transport layer uses this
+ * method to register a callback that informs it of pending data.
+ *
+ * @param c Callback instance from transport layer.
+ */
+ void regDataAvailCallback(Callback *c);
+
+ protected:
+ /** Currently registered transport layer callbacks */
+ Callback *termDataAvail;
protected:
class ListenEvent : public PollEvent
using namespace std;
Uart::Uart(const Params *p, Addr pio_size)
- : BasicPioDevice(p, pio_size), platform(p->platform), term(p->terminal)
+ : BasicPioDevice(p, pio_size),
+ platform(p->platform), term(p->terminal),
+ callbackDataAvail(this)
{
status = 0;
- // set back pointers
- term->uart = this;
+ // setup terminal callbacks
+ term->regDataAvailCallback(&callbackDataAvail);
}
#define __UART_HH__
#include "dev/io_device.hh"
+#include "dev/terminal.hh"
#include "params/Uart.hh"
-class Terminal;
class Platform;
const int RX_INT = 0x1;
class Uart : public BasicPioDevice
{
-
protected:
int status;
Platform *platform;
* @return interrupt status
*/
bool intStatus() { return status ? true : false; }
+
+ protected:
+ MakeCallback<Uart, &Uart::dataAvailable> callbackDataAvail;
};
#endif // __UART_HH__