1
2/*
3 * Debug routines which directly access the uart.
4 */
5
6#include <linux/types.h>
7#include <asm/galileo-boards/ev96100.h>
8
9
10//#define SERIAL_BASE    EV96100_UART0_REGS_BASE
11#define SERIAL_BASE    0xBD000020
12#define NS16550_BASE   SERIAL_BASE
13
14#define SERA_CMD       0x0D
15#define SERA_DATA      0x08
16//#define SERB_CMD       0x05
17#define SERB_CMD       20
18#define SERB_DATA      0x00
19#define TX_BUSY        0x20
20
21#define TIMEOUT    0xffff
22#undef SLOW_DOWN
23
24static const char digits[16] = "0123456789abcdef";
25static volatile unsigned char * const com1 = (unsigned char *)SERIAL_BASE;
26
27
28#ifdef SLOW_DOWN
29static inline void slow_down()
30{
31    int k;
32    for (k=0; k<10000; k++);
33}
34#else
35#define slow_down()
36#endif
37
38void
39putch(const unsigned char c)
40{
41    unsigned char ch;
42    int i = 0;
43
44    do {
45        ch = com1[SERB_CMD];
46        slow_down();
47        i++;
48        if (i>TIMEOUT) {
49            break;
50        }
51    } while (0 == (ch & TX_BUSY));
52    com1[SERB_DATA] = c;
53}
54
55void
56putchar(const unsigned char c)
57{
58    unsigned char ch;
59    int i = 0;
60
61    do {
62        ch = com1[SERB_CMD];
63        slow_down();
64        i++;
65        if (i>TIMEOUT) {
66            break;
67        }
68    } while (0 == (ch & TX_BUSY));
69    com1[SERB_DATA] = c;
70}
71
72void
73puts(unsigned char *cp)
74{
75    unsigned char ch;
76    int i = 0;
77
78    while (*cp) {
79        do {
80             ch = com1[SERB_CMD];
81            slow_down();
82            i++;
83            if (i>TIMEOUT) {
84                break;
85            }
86        } while (0 == (ch & TX_BUSY));
87        com1[SERB_DATA] = *cp++;
88    }
89    putch('\r');
90    putch('\n');
91}
92
93void
94fputs(unsigned char *cp)
95{
96    unsigned char ch;
97    int i = 0;
98
99    while (*cp) {
100
101        do {
102             ch = com1[SERB_CMD];
103             slow_down();
104            i++;
105            if (i>TIMEOUT) {
106                break;
107            }
108        } while (0 == (ch & TX_BUSY));
109        com1[SERB_DATA] = *cp++;
110    }
111}
112
113
114void
115put64(uint64_t ul)
116{
117    int cnt;
118    unsigned ch;
119
120    cnt = 16;            /* 16 nibbles in a 64 bit long */
121    putch('0');
122    putch('x');
123    do {
124        cnt--;
125        ch = (unsigned char)(ul >> cnt * 4) & 0x0F;
126                putch(digits[ch]);
127    } while (cnt > 0);
128}
129
130void
131put32(unsigned u)
132{
133    int cnt;
134    unsigned ch;
135
136    cnt = 8;            /* 8 nibbles in a 32 bit long */
137    putch('0');
138    putch('x');
139    do {
140        cnt--;
141        ch = (unsigned char)(u >> cnt * 4) & 0x0F;
142                putch(digits[ch]);
143    } while (cnt > 0);
144}
145