source: XOpenSparcT1/trunk/sw/uart.c @ 33

Revision 33, 3.6 KB checked in by pntsvt00, 13 years ago (diff)

checkpoint

Line 
1#include "uart.h"
2
3const long UART_BASE_ADR[1] = {0x800000FFF0C2C000};
4const int UART_BAUDS[1] = {0};
5const int IN_CLK =50000000;
6
7#define REG8(add) *((volatile unsigned char *)(add))
8
9#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
10
11#define WAIT_FOR_XMITR(core)                    \
12do { \
13lsr = REG8(UART_BASE_ADR[core] + UART_LSR); \
14} while ((lsr & BOTH_EMPTY) != BOTH_EMPTY)
15
16#define WAIT_FOR_THRE(core)                     \
17do { \
18lsr = REG8(UART_BASE_ADR[core] + UART_LSR); \
19} while ((lsr & UART_LSR_THRE) != UART_LSR_THRE)
20
21#define CHECK_FOR_CHAR(core) (REG8(UART_BASE_ADR[core] + UART_LSR) & UART_LSR_DR)
22
23#define WAIT_FOR_CHAR(core)                     \
24do { \
25lsr = REG8(UART_BASE_ADR[core] + UART_LSR); \
26} while ((lsr & UART_LSR_DR) != UART_LSR_DR)
27
28#define UART_TX_BUFF_LEN 32
29#define UART_TX_BUFF_MASK (UART_TX_BUFF_LEN -1)
30
31char tx_buff[UART_TX_BUFF_LEN];
32volatile int tx_level, rx_level;
33
34void sal_main() __attribute__((noreturn));
35void sal_main() 
36{
37
38
39/*
40  #define CONFIG_SYS_GBL_DATA_SIZE       128     / size in bytes reserved for  initial data
41  #define CONFIG_SYS_GBL_DATA_OFFSET     (CONFIG_SYS_INIT_RAM_END - CONFIG_SYS_GBL_DATA_SIZE)
42  #define CONFIG_SYS_INIT_SP_OFFSET      CONFIG_SYS_GBL_DATA_OFFSET
43
44
45stackp:
46                set     CONFIG_SYS_INIT_SP_OFFSET, %fp
47                andn    %fp, 0x0f, %fp
48                sub     %fp, 64, %sp
49*/
50        uart_init(0);
51        for(;;) { 
52                uart_puts(0,"XOpenSparc is alive \n"); 
53        } 
54        //return;
55}
56
57void uart_init(char core)
58{
59        long allone=0xffffffffffffffff;
60        int divisor;
61        float float_divisor;
62        /* Reset receiver and transmiter */
63        REG8( UART_FCR ) = UART_FCR_ENABLE_FIFO | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT | UART_FCR_TRIGGER_14;
64        //asm("clr %sp \n");   
65        //asm("sethi %hi(8), %sp \n"); 
66        //asm("mov 0xfff, %sp \n");     
67
68        /* Disable all interrupts */
69        REG8(UART_BASE_ADR[core] + UART_IER) = 0x00;
70       
71        /* Set 8 bit char, 1 stop bit, no parity */
72        REG8(UART_BASE_ADR[core] + UART_LCR) = UART_LCR_WLEN8 & ~(UART_LCR_STOP | UART_LCR_PARITY);
73       
74        /* Set baud rate */
75        float_divisor = (float) IN_CLK/(16 * UART_BAUDS[core]);
76        float_divisor += 0.50f; // Ensure round up
77        divisor = (int) float_divisor;
78       
79        REG8(UART_BASE_ADR[core] + UART_LCR) |= UART_LCR_DLAB;
80        REG8(UART_BASE_ADR[core] + UART_DLL) = divisor & 0x000000ff;
81        REG8(UART_BASE_ADR[core] + UART_DLM) = (divisor >> 8) & 0x000000ff;
82        REG8(UART_BASE_ADR[core] + UART_LCR) &= ~(UART_LCR_DLAB);
83       
84        return;
85}
86
87void uart_putc(char core, char c)
88{
89        unsigned char lsr;
90       
91        WAIT_FOR_THRE(core);
92        REG8(UART_BASE_ADR[core] + UART_TX) = c;
93        if(c == '\n') {
94                WAIT_FOR_THRE(core);
95                REG8(UART_BASE_ADR[core] + UART_TX) = '\r';
96        }
97        WAIT_FOR_XMITR(core);
98}
99
100void uart_puts (char core, char *s) { 
101        // loop until *s != NULL
102        while (*s) { 
103                uart_putc(core,*s); 
104                s++; 
105        } 
106}
107
108
109
110// Only used when we know THRE is empty, typically in interrupt
111/*void uart_putc_noblock(char core, char c)
112{
113        REG8(UART_BASE_ADR[core] + UART_TX) = c;
114}
115
116
117char uart_getc(char core)
118{
119        unsigned char lsr;
120        char c;
121       
122        WAIT_FOR_CHAR(core);
123        c = REG8(UART_BASE_ADR[core] + UART_RX);
124        return c;
125}
126
127int uart_check_for_char(char core)
128{
129        return CHECK_FOR_CHAR(core);
130}
131
132void uart_rxint_enable(char core)
133{
134        REG8(UART_BASE_ADR[core] + UART_IER) |= UART_IER_RDI;
135}
136
137void uart_rxint_disable(char core)
138{
139        REG8(UART_BASE_ADR[core] + UART_IER) &= ~(UART_IER_RDI);
140}
141
142void uart_txint_enable(char core)
143{
144        REG8(UART_BASE_ADR[core] + UART_IER) |= UART_IER_THRI;
145}
146
147void uart_txint_disable(char core)
148{
149        REG8(UART_BASE_ADR[core] + UART_IER) &= ~(UART_IER_THRI);
150}
151
152char uart_get_iir(char core)
153{
154        return REG8(UART_BASE_ADR[core] + UART_IIR);
155}
156
157
158char uart_get_lsr(char core)
159{
160        return REG8(UART_BASE_ADR[core] + UART_LSR);
161}
162
163
164char uart_get_msr(char core)
165{
166        return REG8(UART_BASE_ADR[core] + UART_MSR);
167}
168*/
169
170
Note: See TracBrowser for help on using the repository browser.