diff options
Diffstat (limited to 'c/src/lib/libbsp/i386/pc386/console/console_edison.c')
-rw-r--r-- | c/src/lib/libbsp/i386/pc386/console/console_edison.c | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/i386/pc386/console/console_edison.c b/c/src/lib/libbsp/i386/pc386/console/console_edison.c new file mode 100644 index 0000000000..d5e44aed86 --- /dev/null +++ b/c/src/lib/libbsp/i386/pc386/console/console_edison.c @@ -0,0 +1,94 @@ + +#include <bsp.h> +#include <libchip/serial.h> + +/* XXX hack until real support is available, code copied from libchip */ +#define NS16550_RECEIVE_BUFFER 0 +#define NS16550_TRANSMIT_BUFFER 0 +#define NS16550_INTERRUPT_ENABLE 1 +#define NS16550_INTERRUPT_ID 2 +#define NS16550_FIFO_CONTROL 2 +#define NS16550_LINE_CONTROL 3 +#define NS16550_MODEM_CONTROL 4 +#define NS16550_LINE_STATUS 5 +#define NS16550_MODEM_STATUS 6 +#define NS16550_SCRATCH_PAD 7 +#define NS16550_FRACTIONAL_DIVIDER 10 + +/* status bits we use in line status */ + +#define SP_LSR_TX 0x40 +#define SP_LSR_THOLD 0x20 +#define SP_LSR_RDY 0x01 +static volatile uint8_t *edison_com = (volatile uint8_t *)0xff010180; + +void edison_write_polled(int minor, char cChar); +int edison_inbyte_nonblocking_polled(int minor); + +static int edison_open(int major, int minor, void *arg) +{ + return 0; +} + +static int edison_close(int major, int minor, void *arg) +{ + return 0; +} + +int edison_inbyte_nonblocking_polled(int minor) +{ + if ( edison_com[NS16550_LINE_STATUS] & 0x01 ) + return (int) edison_com[NS16550_RECEIVE_BUFFER]; + return -1; +} + +static ssize_t edison_write_support_polled(int minor, const char *buf, size_t len) +{ + ssize_t i; + + for ( i=0 ; i<len ; i++ ) { +#if 0 + if ( (edison_com[NS16550_LINE_STATUS] & SP_LSR_TX) == 0 ) + break; +#else + while ( (edison_com[NS16550_LINE_STATUS] & SP_LSR_TX) == 0x00 ) + /* wait until ready */; +#endif + edison_com[NS16550_TRANSMIT_BUFFER] = (uint8_t) buf[i]; + } + return i; +} + +static void edison_init(int minor) +{ +} + +void edison_write_polled(int minor, char cChar) +{ + while ( (edison_com[NS16550_LINE_STATUS] & SP_LSR_TX) == 0x00 ) + /* wait until ready */; + edison_com[NS16550_TRANSMIT_BUFFER] = (uint8_t) cChar; +} + +static bool edison_probe(int minor) +{ + return true; +} + +static int edison_set_attributes(int minor, const struct termios *t) +{ + return 0; +} + +const console_fns edison_fns = +{ + edison_probe, /* deviceProbe */ + edison_open, /* deviceFirstOpen */ + edison_close, /* deviceLastClose */ + edison_inbyte_nonblocking_polled, /* deviceRead */ + edison_write_support_polled, /* deviceWrite */ + edison_init, /* deviceInitialize */ + edison_write_polled, /* deviceWritePolled */ + edison_set_attributes, /* deviceSetAttributes */ + FALSE, /* deviceOutputUsesInterrupts */ +}; |