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

Revision 36, 3.9 KB checked in by pntsvt00, 13 years ago (diff)

modificati i file per la compilazione. boot.s linkato a 0xFFF0000020

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