#ifndef CONSOLE_H #define CONSOLE_H #include "compiler.h" #include "io.h" void __con_set_baudrate(uint32_t); void con_putc(char c); void con_puts(const char *); 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_flush(void) { while (!(CON_STATUS & 1)) /* wait */; } static __always_inline void __con_set_baudrate_inline(uint32_t baud) { uint32_t bauddiv; /* * Produce a CON_BAUD_BITS binary fraction. The +1 produces better * rounding behavior: see Hacker's Delight. */ bauddiv = (baud * ((1ULL << (32+CON_BAUD_BITS))/CON_BAUD_BASE+1)) >> 32; /* * Not really a divisor, but a fractional multiplier. The -1 * is simply a technicality of the implementation. */ CON_BAUDDIV = bauddiv - 1; } static __always_inline void con_set_baudrate(uint32_t baud) { if (__is_constant(baud)) __con_set_baudrate_inline(baud); else __con_set_baudrate(baud); } #endif /* CONSOLE_H */