nuclear@4: #include "hwregs.h" nuclear@4: #include "serial.h" nuclear@4: nuclear@4: #define CLK 3546895 nuclear@4: #define BVAL(b) (CLK / (b) - 1) nuclear@4: nuclear@4: static inline uint16_t baudval(int baud) nuclear@4: { nuclear@4: switch(baud) { nuclear@4: case 110: return BVAL(110); nuclear@4: case 300: return BVAL(300); nuclear@4: case 600: return BVAL(600); nuclear@4: case 1200: return BVAL(1200); nuclear@4: case 2400: return BVAL(2400); nuclear@4: case 4800: return BVAL(4800); nuclear@4: case 9600: return BVAL(9600); nuclear@4: case 14400: return BVAL(14400); nuclear@4: case 19200: return BVAL(19200); nuclear@4: case 38400: return BVAL(38400); nuclear@4: case 57600: return BVAL(57600); nuclear@4: case 115200: return BVAL(115200); nuclear@4: default: nuclear@4: break; nuclear@4: } nuclear@4: return BVAL(baud); nuclear@4: } nuclear@4: nuclear@4: void ser_init(int baud) nuclear@4: { nuclear@4: REG_SERPER = baudval(baud) & 0x7fff; nuclear@4: } nuclear@4: nuclear@4: /* nuclear@4: void ser_putchar(int c) nuclear@4: { nuclear@4: REG_SERDAT = ((uint16_t)c & 0xff) | 0x100; nuclear@4: } nuclear@4: */ nuclear@4: nuclear@4: void ser_print(const char *s) nuclear@4: { nuclear@4: while(*s) { nuclear@4: if(*s == '\n') { nuclear@4: ser_putchar('\r'); nuclear@4: } nuclear@4: ser_putchar(*s++); nuclear@4: } nuclear@4: }