1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- #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 */
|