summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/mips/jmr3904/console/console-io.c
blob: 1ad3d9af291880c77de74bebb53105811c84384d (plain) (blame)
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;