12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- #ifndef CONSOLE_H
- #define CONSOLE_H
- #include "compiler.h"
- #include "io.h"
- #define CON_FLOW_CTL 0 /* Block on connected and output full? */
- #define CON_OUT_OF_LINE 0
- #define CON_DELAY 0 /* us delay after output */
- void __fmt_printf(1,0) con_vprintf(const char *, va_list);
- void __fmt_printf(1,2) con_printf(const char *, ...);
- static __always_inline void __con_wait_tx_ready(void)
- {
- /*
- * If CON_FLOW_CTL is set, wait here if the TX buffer is above
- * the high index mark *if* we are connected to a host
- */
- while (CON_FLOW_CTL &&
- (CON_STATUS & (TTY_STATUS_TX_HIGH|TTY_STATUS_DTR_IN))
- == (TTY_STATUS_TX_HIGH|TTY_STATUS_DTR_IN))
- relax();
- }
- static __always_inline void __con_putc(char c)
- {
- if (c == '\n') {
- CON_DATA = '\r';
- udelay(CON_DELAY);
- }
- CON_DATA = c;
- udelay(CON_DELAY);
- }
- static __always_inline void _con_putc(char c)
- {
- __con_wait_tx_ready();
- __con_putc(c);
- }
- static __always_inline void _con_puts(const char *str)
- {
- char c;
- __con_wait_tx_ready();
- while ((c = *str++))
- __con_putc(c);
- }
- #if CON_OUT_OF_LINE
- void con_putc(char c);
- void con_puts(const char *);
- #else
- /* Simple enough to inline if we don't care about flow control */
- static __always_inline void con_putc(char c)
- {
- _con_putc(c);
- }
- static __always_inline void con_puts(const char *str)
- {
- _con_puts(str);
- }
- #endif
- static __always_inline void con_flush_unconditional(void)
- {
- while (!(CON_STATUS & TTY_STATUS_TX_EMPTY))
- relax();
- }
- static __always_inline void con_flush(void)
- {
- if (CON_FLOW_CTL)
- con_flush_unconditional();
- }
- void con_print_hex(unsigned int); /* For pre-SDRAM capable code */
- void con_hexdump(const void *data, size_t len); /* For debugging */
- #endif /* CONSOLE_H */
|