console.h 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #ifndef CONSOLE_H
  2. #define CONSOLE_H
  3. #include "compiler.h"
  4. #include "io.h"
  5. void __con_set_baudrate(uint32_t);
  6. void con_putc(char c);
  7. void con_puts(const char *);
  8. void __fmt_printf(1,0) con_vprintf(const char *, va_list);
  9. void __fmt_printf(1,2) con_printf(const char *, ...);
  10. static __always_inline void con_flush(void)
  11. {
  12. while (!(CON_STATUS & 1))
  13. /* wait */;
  14. }
  15. static __always_inline void __con_set_baudrate_inline(uint32_t baud)
  16. {
  17. uint32_t bauddiv;
  18. /*
  19. * Produce a CON_BAUD_BITS binary fraction. The +1 produces better
  20. * rounding behavior: see Hacker's Delight.
  21. */
  22. bauddiv = (baud * ((1ULL << (32+CON_BAUD_BITS))/CON_BAUD_BASE+1)) >> 32;
  23. /*
  24. * Not really a divisor, but a fractional multiplier. The -1
  25. * is simply a technicality of the implementation.
  26. */
  27. CON_BAUDDIV = bauddiv - 1;
  28. }
  29. static __always_inline void con_set_baudrate(uint32_t baud)
  30. {
  31. if (__is_constant(baud))
  32. __con_set_baudrate_inline(baud);
  33. else
  34. __con_set_baudrate(baud);
  35. }
  36. #endif /* CONSOLE_H */