brought the code over from the amiga test
[lugburz] / src / amiga / serial.c
1 #include "hwregs.h"
2 #include "serial.h"
3
4 #define CLK             3546895
5 #define BVAL(b) (CLK / (b) - 1)
6
7 static inline uint16_t baudval(int baud)
8 {
9         switch(baud) {
10         case 110: return BVAL(110);
11         case 300: return BVAL(300);
12         case 600: return BVAL(600);
13         case 1200: return BVAL(1200);
14         case 2400: return BVAL(2400);
15         case 4800: return BVAL(4800);
16         case 9600: return BVAL(9600);
17         case 14400: return BVAL(14400);
18         case 19200: return BVAL(19200);
19         case 38400: return BVAL(38400);
20         case 57600: return BVAL(57600);
21         case 115200: return BVAL(115200);
22         default:
23                 break;
24         }
25         return BVAL(baud);
26 }
27
28 void ser_init(int baud)
29 {
30         REG_SERPER = baudval(baud) & 0x7fff;
31 }
32
33 /*
34 void ser_putchar(int c)
35 {
36         REG_SERDAT = ((uint16_t)c & 0xff) | 0x100;
37 }
38 */
39
40 void ser_print(const char *s)
41 {
42         while(*s) {
43                 if(*s == '\n') {
44                         ser_putchar('\r');
45                 }
46                 ser_putchar(*s++);
47         }
48 }