123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- #include <stddef.h>
- #include <stdint.h>
- #include <string.h>
- #include <stdio.h>
- #include <stdarg.h>
- #include "console.h"
- #include "io.h"
- void con_set_baudrate(uint32_t b)
- {
- uint32_t bauddiv;
- /*
- * Produce a CON_BAUD_BITS binary fraction. The +1 produces better
- * rounding behavior: see Hacker's Delight.
- */
- bauddiv = (b * ((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;
- }
- void con_putc(char c)
- {
- /* Wait for FIFO space */
- while (CON_STATUS & (1 << 4))
- pause();
- if (c == '\n')
- CONSOLE = '\r';
- CONSOLE = c;
- }
- void con_puts(const char *str)
- {
- while (*str)
- con_putc(*str++);
- }
- void con_vprintf(const char *fmt, va_list ap)
- {
- char buf[128]; /* Maximum text size */
- unsigned int len;
- const char *p;
- vsnprintf(buf, sizeof buf, fmt, ap);
- con_puts(buf);
- }
- void con_printf(const char *fmt, ...)
- {
- va_list ap;
- va_start(ap, fmt);
- con_vprintf(fmt, ap);
- va_end(ap);
- }
|