diff --git a/os/include/terminal_session/connection.h b/os/include/terminal_session/connection.h index f82b317234..246bad1335 100644 --- a/os/include/terminal_session/connection.h +++ b/os/include/terminal_session/connection.h @@ -17,35 +17,37 @@ #include #include -#include - namespace Terminal { struct Connection : Genode::Connection, Session_client { - Connection() - : - Genode::Connection(session("ram_quota=%zd", 2*4096)), - Session_client(cap()) + /** + * Wait for connection-established signal + */ + static void wait_for_connection(Genode::Capability cap) { using namespace Genode; - /* - * Wait for connection-established signal - */ - /* create signal receiver, just for the single signal */ Signal_context sig_ctx; Signal_receiver sig_rec; Signal_context_capability sig_cap = sig_rec.manage(&sig_ctx); /* register signal handler */ - call(sig_cap); + cap.call(sig_cap); /* wati for signal */ sig_rec.wait_for_signal(); sig_rec.dissolve(&sig_ctx); } + + Connection() + : + Genode::Connection(session("ram_quota=%zd", 2*4096)), + Session_client(cap()) + { + wait_for_connection(cap()); + } }; } diff --git a/os/include/uart_session/client.h b/os/include/uart_session/client.h new file mode 100644 index 0000000000..0a63d0b0bc --- /dev/null +++ b/os/include/uart_session/client.h @@ -0,0 +1,82 @@ +/* + * \brief Client-side UART session interface + * \author Norman Feske + * \date 2012-10-29 + */ + +/* + * Copyright (C) 2012 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU General Public License version 2. + */ + +#ifndef _INCLUDE__UART_SESSION__CLIENT_H_ +#define _INCLUDE__UART_SESSION__CLIENT_H_ + +/* Genode includes */ +#include +#include + +namespace Uart { + + class Session_client : public Genode::Rpc_client + { + private: + + Terminal::Session_client _terminal; + + public: + + Session_client(Genode::Capability cap) + : + Genode::Rpc_client(cap), _terminal(cap) + { } + + + /******************** + ** UART interface ** + ********************/ + + void baud_rate(Genode::size_t bits_per_second) + { + call(bits_per_second); + } + + + /************************ + ** Terminal interface ** + ************************/ + + Size size() { return _terminal.size(); } + + bool avail() { return _terminal.avail(); } + + Genode::size_t read(void *buf, Genode::size_t buf_size) + { + return _terminal.read(buf, buf_size); + } + + Genode::size_t write(void const *buf, Genode::size_t num_bytes) + { + return _terminal.write(buf, num_bytes); + } + + void connected_sigh(Genode::Signal_context_capability cap) + { + _terminal.connected_sigh(cap); + } + + void read_avail_sigh(Genode::Signal_context_capability cap) + { + _terminal.read_avail_sigh(cap); + } + + Genode::size_t io_buffer_size() const + { + return _terminal.io_buffer_size(); + } + }; +} + +#endif /* _INCLUDE__UART_SESSION__CLIENT_H_ */ diff --git a/os/include/uart_session/connection.h b/os/include/uart_session/connection.h new file mode 100644 index 0000000000..71d2b71532 --- /dev/null +++ b/os/include/uart_session/connection.h @@ -0,0 +1,34 @@ +/* + * \brief Connection to UART service + * \author Norman Feske + * \date 2012-10-29 + */ + +/* + * Copyright (C) 2012 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU General Public License version 2. + */ + +#ifndef _INCLUDE__UART_SESSION__CONNECTION_H_ +#define _INCLUDE__UART_SESSION__CONNECTION_H_ + +#include +#include + +namespace Uart { + + struct Connection : Genode::Connection, Session_client + { + Connection() + : + Genode::Connection(session("ram_quota=%zd", 2*4096)), + Session_client(cap()) + { + Terminal::Connection::wait_for_connection(cap()); + } + }; +} + +#endif /* _INCLUDE__UART_SESSION__CONNECTION_H_ */ diff --git a/os/include/uart_session/uart_session.h b/os/include/uart_session/uart_session.h new file mode 100644 index 0000000000..cc2d8cb840 --- /dev/null +++ b/os/include/uart_session/uart_session.h @@ -0,0 +1,45 @@ +/* + * \brief UART session interface + * \author Norman Feske + * \date 2012-10-29 + * + * The UART session interface is an extended Terminal session interface. + */ + +/* + * Copyright (C) 2012 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU General Public License version 2. + */ + +#ifndef _INCLUDE__UART_SESSION__UART_SESSION_H_ +#define _INCLUDE__UART_SESSION__UART_SESSION_H_ + +/* Genode includes */ +#include + +namespace Uart { + + using namespace Terminal; + + struct Session : Terminal::Session + { + static const char *service_name() { return "Uart"; } + + /** + * Set baud rate + */ + virtual void baud_rate(Genode::size_t bits_per_second) = 0; + + + /******************* + ** RPC interface ** + *******************/ + + GENODE_RPC(Rpc_baud_rate, void, baud_rate, Genode::size_t); + GENODE_RPC_INTERFACE_INHERIT(Terminal::Session, Rpc_baud_rate); + }; +} + +#endif /* _INCLUDE__UART_SESSION__UART_SESSION_H_ */ diff --git a/os/run/uart.run b/os/run/uart.run index 375e0bef14..d160ba0174 100644 --- a/os/run/uart.run +++ b/os/run/uart.run @@ -41,7 +41,10 @@ set config { - + + + + diff --git a/os/src/drivers/uart/i8250/i8250.h b/os/src/drivers/uart/i8250/i8250.h index 93628084a0..f7e35209be 100644 --- a/os/src/drivers/uart/i8250/i8250.h +++ b/os/src/drivers/uart/i8250/i8250.h @@ -22,10 +22,10 @@ #include /* local includes */ -#include "terminal_driver.h" +#include "uart_driver.h" -class I8250 : public Terminal::Driver, public Genode::Irq_handler +class I8250 : public Uart::Driver, public Genode::Irq_handler { private: @@ -84,7 +84,7 @@ class I8250 : public Terminal::Driver, public Genode::Irq_handler _inb(); } - Terminal::Char_avail_callback &_char_avail_callback; + Uart::Char_avail_callback &_char_avail_callback; enum { IRQ_STACK_SIZE = 4096 }; Genode::Irq_activation _irq_activation; @@ -95,7 +95,7 @@ class I8250 : public Terminal::Driver, public Genode::Irq_handler * Constructor */ I8250(unsigned port_base, int irq_number, unsigned baud, - Terminal::Char_avail_callback &callback) + Uart::Char_avail_callback &callback) : _port_base(port_base), _io_port(port_base, 0xf), diff --git a/os/src/drivers/uart/i8250/main.cc b/os/src/drivers/uart/i8250/main.cc index 20db1276b4..262a5b0d00 100644 --- a/os/src/drivers/uart/i8250/main.cc +++ b/os/src/drivers/uart/i8250/main.cc @@ -18,7 +18,7 @@ #include #include "i8250.h" -#include "terminal_component.h" +#include "uart_component.h" int main(int argc, char **argv) @@ -28,9 +28,9 @@ int main(int argc, char **argv) printf("--- i8250 UART driver started ---\n"); /** - * Factory used by 'Terminal::Root' at session creation/destruction time + * Factory used by 'Uart::Root' at session creation/destruction time */ - struct I8250_driver_factory : Terminal::Driver_factory + struct I8250_driver_factory : Uart::Driver_factory { enum { UART_NUM = 4 }; I8250 *created[UART_NUM]; @@ -62,15 +62,15 @@ int main(int argc, char **argv) created[i] = 0; } - Terminal::Driver *create(unsigned index, - Terminal::Char_avail_callback &callback) + Uart::Driver *create(unsigned index, + Uart::Char_avail_callback &callback) { /* * We assume the underlying kernel uses UART0 and, therefore, start at * index 1 for the user-level driver. */ if (index < 1 || index >= UART_NUM) - throw Terminal::Driver_factory::Not_available(); + throw Uart::Driver_factory::Not_available(); I8250 *uart = created[index]; @@ -88,7 +88,7 @@ int main(int argc, char **argv) return uart; } - void destroy(Terminal::Driver *driver) { /* TODO */ } + void destroy(Uart::Driver *driver) { /* TODO */ } } driver_factory; @@ -96,7 +96,7 @@ int main(int argc, char **argv) static Cap_connection cap; static Rpc_entrypoint ep(&cap, STACK_SIZE, "uart_ep"); - static Terminal::Root uart_root(&ep, env()->heap(), driver_factory); + static Uart::Root uart_root(&ep, env()->heap(), driver_factory); env()->parent()->announce(ep.manage(&uart_root)); sleep_forever(); diff --git a/os/src/drivers/uart/pl011/main.cc b/os/src/drivers/uart/pl011/main.cc index 201111199c..40793a1f2a 100644 --- a/os/src/drivers/uart/pl011/main.cc +++ b/os/src/drivers/uart/pl011/main.cc @@ -20,7 +20,7 @@ /* local includes */ #include "pl011.h" -#include "terminal_component.h" +#include "uart_component.h" int main(int argc, char **argv) @@ -30,9 +30,9 @@ int main(int argc, char **argv) printf("--- PL011 UART driver started ---\n"); /** - * Factory used by 'Terminal::Root' at session creation/destruction time + * Factory used by 'Uart::Root' at session creation/destruction time */ - struct Pl011_driver_factory : Terminal::Driver_factory + struct Pl011_driver_factory : Uart::Driver_factory { Pl011 *created[PL011_NUM]; @@ -45,15 +45,15 @@ int main(int argc, char **argv) created[i] = 0; } - Terminal::Driver *create(unsigned index, - Terminal::Char_avail_callback &callback) + Uart::Driver *create(unsigned index, + Uart::Char_avail_callback &callback) { /* * We assume the underlying kernel uses UART0 and, therefore, start at * index 1 for the user-level driver. */ if (index < 1 || index >= PL011_NUM) - throw Terminal::Driver_factory::Not_available(); + throw Uart::Driver_factory::Not_available(); Pl011_uart *cfg = &pl011_uart[index]; Pl011 *uart = created[index]; @@ -71,7 +71,7 @@ int main(int argc, char **argv) return uart; } - void destroy(Terminal::Driver *driver) { /* TODO */ } + void destroy(Uart::Driver *driver) { /* TODO */ } } driver_factory; @@ -79,7 +79,7 @@ int main(int argc, char **argv) static Cap_connection cap; static Rpc_entrypoint ep(&cap, STACK_SIZE, "uart_ep"); - static Terminal::Root uart_root(&ep, env()->heap(), driver_factory); + static Uart::Root uart_root(&ep, env()->heap(), driver_factory); env()->parent()->announce(ep.manage(&uart_root)); sleep_forever(); diff --git a/os/src/drivers/uart/pl011/pl011.h b/os/src/drivers/uart/pl011/pl011.h index b806764aff..6c0659b665 100644 --- a/os/src/drivers/uart/pl011/pl011.h +++ b/os/src/drivers/uart/pl011/pl011.h @@ -22,9 +22,9 @@ #include /* local includes */ -#include "terminal_driver.h" +#include "uart_driver.h" -class Pl011 : public Terminal::Driver, public Genode::Irq_handler +class Pl011 : public Uart::Driver, public Genode::Irq_handler { private: @@ -78,7 +78,7 @@ class Pl011 : public Terminal::Driver, public Genode::Irq_handler Genode::Attached_io_mem_dataspace _io_mem; Genode::uint32_t volatile *_base; - Terminal::Char_avail_callback &_char_avail_callback; + Uart::Char_avail_callback &_char_avail_callback; enum { IRQ_STACK_SIZE = 4096 }; Genode::Irq_activation _irq_activation; @@ -100,7 +100,7 @@ class Pl011 : public Terminal::Driver, public Genode::Irq_handler */ Pl011(Genode::addr_t mmio_base, Genode::size_t mmio_size, unsigned ibrd, unsigned fbrd, int irq_number, - Terminal::Char_avail_callback &callback) + Uart::Char_avail_callback &callback) : _io_mem(mmio_base, mmio_size), _base(_io_mem.local_addr()), diff --git a/os/src/drivers/uart/terminal_component.h b/os/src/drivers/uart/uart_component.h similarity index 85% rename from os/src/drivers/uart/terminal_component.h rename to os/src/drivers/uart/uart_component.h index 825751d5ba..d309b46f8a 100644 --- a/os/src/drivers/uart/terminal_component.h +++ b/os/src/drivers/uart/uart_component.h @@ -11,8 +11,8 @@ * under the terms of the GNU General Public License version 2. */ -#ifndef _TERMINAL_COMPONENT_H_ -#define _TERMINAL_COMPONENT_H_ +#ifndef _UART_COMPONENT_H_ +#define _UART_COMPONENT_H_ /* Genode includes */ #include @@ -20,16 +20,16 @@ #include #include #include -#include +#include /* local includes */ -#include "terminal_driver.h" +#include "uart_driver.h" -namespace Terminal { +namespace Uart { using namespace Genode; - class Session_component : public Rpc_object { private: @@ -45,7 +45,7 @@ namespace Terminal { /** * Functor informing the client about new data to read */ - struct Char_avail_callback : Terminal::Char_avail_callback + struct Char_avail_callback : Uart::Char_avail_callback { Genode::Signal_context_capability sigh; @@ -57,15 +57,15 @@ namespace Terminal { } _char_avail_callback; - Terminal::Driver_factory &_driver_factory; - Terminal::Driver &_driver; + Uart::Driver_factory &_driver_factory; + Uart::Driver &_driver; public: /** * Constructor */ - Session_component(Terminal::Driver_factory &driver_factory, + Session_component(Uart::Driver_factory &driver_factory, unsigned index) : _io_buffer(Genode::env()->ram_session(), IO_BUFFER_SIZE), @@ -74,6 +74,16 @@ namespace Terminal { { } + /**************************** + ** Uart session interface ** + ****************************/ + + void baud_rate(Genode::size_t bits_per_second) + { + PWRN("Setting the baud rate is not supported."); + } + + /******************************** ** Terminal session interface ** ********************************/ @@ -174,4 +184,4 @@ namespace Terminal { }; } -#endif /* _TERMINAL_COMPONENT_H_ */ +#endif /* _UART_COMPONENT_H_ */ diff --git a/os/src/drivers/uart/terminal_driver.h b/os/src/drivers/uart/uart_driver.h similarity index 88% rename from os/src/drivers/uart/terminal_driver.h rename to os/src/drivers/uart/uart_driver.h index faaf4f3510..674b9bd155 100644 --- a/os/src/drivers/uart/terminal_driver.h +++ b/os/src/drivers/uart/uart_driver.h @@ -11,10 +11,10 @@ * under the terms of the GNU General Public License version 2. */ -#ifndef _TERMINAL_DRIVER_H_ -#define _TERMINAL_DRIVER_H_ +#ifndef _UART_DRIVER_H_ +#define _UART_DRIVER_H_ -namespace Terminal { +namespace Uart { /** * Functor, called by 'Driver' when data is ready for reading @@ -27,7 +27,7 @@ namespace Terminal { struct Driver { /** - * Write character to terminal + * Write character to UART */ virtual void put_char(char c) = 0; @@ -37,7 +37,7 @@ namespace Terminal { virtual bool char_avail() = 0; /** - * Read character from terminal + * Read character from UART */ virtual char get_char() = 0; }; @@ -72,4 +72,4 @@ namespace Terminal { } -#endif /* _TERMINAL_DRIVER_H_ */ +#endif /* _UART_DRIVER_H_ */ diff --git a/os/src/test/uart/main.cc b/os/src/test/uart/main.cc index b9772226f8..b3e98a24d8 100644 --- a/os/src/test/uart/main.cc +++ b/os/src/test/uart/main.cc @@ -13,7 +13,7 @@ #include #include -#include +#include using namespace Genode; @@ -22,14 +22,14 @@ int main() { printf("--- UART test started ---\n"); - static Timer::Connection timer; - static Terminal::Connection terminal; + static Timer::Connection timer; + static Uart::Connection uart; for (unsigned i = 0; ; ++i) { static char buf[100]; int n = snprintf(buf, sizeof(buf), "UART test message %d\n", i); - terminal.write(buf, n); + uart.write(buf, n); timer.msleep(2000); }