refactoring/reformatting fun...
[pyfrprog.git] / pkernel / uart.c
1 #include "mb91465k.h"
2
3 #pragma section CODE=IRAM,attr=CODE
4 const char ASCII[] = "0123456789ABCDEF";
5
6 void InitUart4(void)
7 {
8         // Initialize UART asynchronous mode
9         BGR04 = 416; // 38400 Baud @ 16MHz
10         SCR04 = 0x17; // 8N1
11         SMR04 = 0x0d; // enable SOT3, Reset, normal mode
12         SSR04 = 0x00; // LSB first
13         PFR19 = (PFR19 & 0xFC) | 0x03; // enable UART: SIN,SOT for async. transfer
14         EPFR19 = 0x00; // enable UART
15 }
16
17 void Putch4(unsigned char ch) /* sends a char */
18 {
19         while (SSR04_TDRE == 0); /* wait for transmit buffer empty */
20         TDR04 = ch; /* put ch into buffer */
21 }
22
23 unsigned char Getch4(void) /* waits for and returns incomming char      */
24 {
25         volatile unsigned ch;
26         for(;;) {
27                 while(SSR04_RDRF == 0) /* wait for data received */
28                         HWWD = 0x00;
29                 ch = RDR04;
30
31                 if ((SSR04 & 0xE0) != 0) { /* Check for errors PE, ORE, FRE */
32                         SCR04_CRE = 1; /* Clear error flags */
33                 } else {
34                         return (ch); /* return char*/
35                 }
36         }
37 }
38
39
40 void Puts4(const char *Name2)
41 {
42         volatile int i,len;
43         len = strlen(Name2);
44         
45         for(i=0; i<strlen(Name2); i++) {
46         if(Name2[i] == 10)
47                 Putch4(13);
48         Putch4(Name2[i]);
49         }
50 }
51
52
53 void Puthex4(unsigned long n, unsigned char digits)
54 {
55         unsigned char digit=0,div=0,i;
56
57         div=(4*(digits-1));     /* init shift divisor */
58         for (i=0;i<digits;i++) {
59                 digit = ((n >> div)&0xF); /* get hex-digit value */
60                 Putch4(digit + ((digit < 0xA) ? '0' : 'A' - 0xA));
61                 div-=4; /* next digit shift */
62         }
63 }
64
65 void Putdec4(unsigned long x, int digits)
66 {
67         int i;
68         char buf[10],sign=1;
69         
70         if (digits < 0) {     /* should be print of zero? */
71                 digits *= (-1);
72                 sign =1;
73         }  
74         buf[digits]='\0';                       /* end sign of string */
75         
76         for (i=digits; i>0; i--) {
77                 buf[i-1] = ASCII[x % 10]; // + '0' enough? :o
78                 x = x/10;
79         }
80
81         if (sign) {
82                 for (i=0; buf[i]=='0'; i++) { /* no print of zero */
83                         if ( i<digits-1)
84                                 buf[i] = ' ';
85                 }
86         }
87         Puts4(buf); /* send string */
88 }
89