1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
/*
* This file contains the hardware specific portions of the TTY driver
* for the serial ports on the jmr3904.
*
* Logic based on the jmr3904-io.c file in newlib 1.8.2
*
* COPYRIGHT (c) 1989-2000.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
#include <bsp.h>
#include <rtems/libio.h>
#include <stdlib.h>
#include <assert.h>
/* external prototypes for monitor interface routines */
void outbyte( char );
char inbyte( void );
#define READ_UINT8( _register_, _value_ ) \
((_value_) = *((volatile unsigned char *)(_register_)))
#define WRITE_UINT8( _register_, _value_ ) \
(*((volatile unsigned char *)(_register_)) = (_value_))
#define READ_UINT16( _register_, _value_ ) \
((_value_) = *((volatile unsigned short *)(_register_)))
#define WRITE_UINT16( _register_, _value_ ) \
(*((volatile unsigned short *)(_register_)) = (_value_))
/* - Board specific addresses for serial chip */
#define DIAG_BASE 0xfffff300
#define DIAG_SLCR (DIAG_BASE+0x00)
#define DIAG_SLSR (DIAG_BASE+0x04)
#define DIAG_SLDICR (DIAG_BASE+0x08)
#define DIAG_SLDISR (DIAG_BASE+0x0C)
#define DIAG_SFCR (DIAG_BASE+0x10)
#define DIAG_SBRG (DIAG_BASE+0x14)
#define DIAG_TFIFO (DIAG_BASE+0x20)
#define DIAG_RFIFO (DIAG_BASE+0x30)
#define BRG_T0 0x0000
#define BRG_T2 0x0100
#define BRG_T4 0x0200
#define BRG_T5 0x0300
/*
* Eventually console-polled.c should hook to this better.
*/
static char initialized = 0;
void board_serial_init (void)
{
initialized = 1;
WRITE_UINT16 (DIAG_SLCR, 0x0020);
WRITE_UINT16 (DIAG_SLDICR, 0x0000);
WRITE_UINT16 (DIAG_SFCR, 0x0000);
WRITE_UINT16 (DIAG_SBRG, BRG_T2 | 5);
}
/*
* console_outbyte_polled
*
* This routine transmits a character using polling.
*/
void console_outbyte_polled(
int port,
char ch
)
{
unsigned short disr;
if ( !initialized )
board_serial_init();
for (;;)
{
READ_UINT16 (DIAG_SLDISR, disr);
if (disr & 0x0002)
break;
}
disr = disr & ~0x0002;
WRITE_UINT8 (DIAG_TFIFO, (unsigned char) ch);
WRITE_UINT16 (DIAG_SLDISR, disr);
}
/*
* console_inbyte_nonblocking
*
* This routine polls for a character.
*/
int console_inbyte_nonblocking(
int port
)
{
unsigned char c;
unsigned short disr;
if ( !initialized )
board_serial_init();
READ_UINT16 (DIAG_SLDISR, disr);
if (disr & 0x0001) {
disr = disr & ~0x0001;
READ_UINT8 (DIAG_RFIFO, c);
WRITE_UINT16 (DIAG_SLDISR, disr);
return (char) c;
}
return -1;
}
#include <bspIo.h>
void JMR3904_output_char(char c) { console_outbyte_polled( 0, c ); }
BSP_output_char_function_type BSP_output_char = JMR3904_output_char;
BSP_polling_getchar_function_type BSP_poll_char = NULL;
|