source: rtems/c/src/lib/libbsp/m68k/ods68302/startup/m68302scc.c @ 3b89891

4.104.114.84.95
Last change on this file since 3b89891 was 0074691a, checked in by Joel Sherrill <joel.sherrill@…>, on 07/31/97 at 22:13:29

Merged very large and much appreciated patch from Chris Johns
<cjohns@…>. This patch includes the ods68302 bsp,
the RTEMS++ class library, and the rtems++ test.

  • Property mode set to 100644
File size: 3.4 KB
Line 
1/*****************************************************************************/
2/*
3  $Id$
4 
5  M68302 SCC Polled Driver
6
7 */
8/*****************************************************************************/
9
10
11#include <bsp.h>
12#include <m68302.h>
13#include <m68302scc.h>
14
15#define M68302_SCC_COUNT (3)
16
17static volatile m302_SCC_t *scc[M68302_SCC_COUNT] = { 0, 0, 0 };
18static volatile m302_SCC_Registers_t *scc_reg[M68302_SCC_COUNT] = { 0, 0, 0 };
19static int scc_translate[M68302_SCC_COUNT] = { 0, 0, 0 };
20
21static const rtems_unsigned16 baud_clocks[] =
22{
23  (SYSTEM_CLOCK / (  4800 * 16)),
24  (SYSTEM_CLOCK / (  9600 * 16)),
25  (SYSTEM_CLOCK / ( 19200 * 16)),
26  (SYSTEM_CLOCK / ( 38400 * 16)),
27  (SYSTEM_CLOCK / ( 57600 * 16)),
28  (SYSTEM_CLOCK / (115700 * 16))
29};
30 
31void scc_initialise(int channel, int baud, int translate)
32{
33  rtems_unsigned16 scon;
34 
35  if (channel < M68302_SCC_COUNT)
36  {
37    scc[channel] = &m302.scc1 + channel;
38    scc_reg[channel] = &m302.reg.scc[channel];
39    scc_translate[channel] = translate;
40   
41    scon  = (baud_clocks[baud] & 0xF800) == 0 ? 0 : 1;
42    scon |= (((baud_clocks[baud] / (1 + scon * 3)) - 1) << 1) & 0x0FFE;
43   
44    scc_reg[channel]->scon = scon;
45    scc_reg[channel]->scm = 0x0171;
46
47    scc[channel]->bd.tx[0].status = 0x2000;
48    scc[channel]->bd.tx[0].length = 0;
49    scc[channel]->bd.tx[0].buffer =
50      (rtems_unsigned8*) &(scc[channel]->bd.tx[1].buffer);
51
52    scc[channel]->bd.rx[0].status = 0x2000;
53    scc[channel]->bd.rx[0].length = 0;
54    scc[channel]->bd.rx[0].buffer =
55      (rtems_unsigned8*) &(scc[channel]->bd.rx[1].buffer);
56
57    scc[channel]->parm.rfcr = 0x50;
58    scc[channel]->parm.tfcr = 0x50;
59
60    scc[channel]->parm.mrblr = 0x0001;
61    scc[channel]->prot.uart.max_idl = 0x0004;
62    scc[channel]->prot.uart.brkcr = 1;
63    scc[channel]->prot.uart.parec = 0;
64    scc[channel]->prot.uart.frmec = 0;
65    scc[channel]->prot.uart.nosec = 0;
66    scc[channel]->prot.uart.brkec = 0;
67    scc[channel]->prot.uart.uaddr1 = 0;
68    scc[channel]->prot.uart.uaddr2 = 0;
69    scc[channel]->prot.uart.character[0] = 0x0003;
70    scc[channel]->prot.uart.character[1] = 0x8000;
71
72    scc_reg[channel]->scce = 0xFF;
73    scc_reg[channel]->sccm = 0x15;
74
75    scc_reg[channel]->scm = 0x17d;
76  } 
77}
78
79unsigned char scc_status(int channel, unsigned char status)
80{
81  rtems_unsigned16 rx_status;
82
83  m302.reg.wcn = 0;
84
85  if ((channel < M68302_SCC_COUNT) && scc[channel])
86  {
87    rx_status = scc[channel]->bd.rx[0].status;
88
89    if ((rx_status & 0x8000) == 0)
90    {
91      if (rx_status & 0x003B)
92      {
93        return 2;
94      }
95      if (status == 0)
96      {
97        return 1;
98      }
99    }
100  }
101 
102  return 0;
103}
104
105unsigned char scc_in(int channel)
106{
107  m302.reg.wcn = 0;
108
109  if ((channel < M68302_SCC_COUNT) && scc[channel])
110  {
111    if ((scc[channel]->bd.rx[0].status & 0x8000) == 0)
112    {
113      unsigned char c;
114
115      c = *(scc[channel]->bd.rx[0].buffer);
116
117      scc[channel]->bd.rx[0].status = 0xa000;
118   
119      return c;
120    }
121  }
122 
123  return 0;
124}
125
126void scc_out(int channel, unsigned char character)
127{
128  if ((channel < M68302_SCC_COUNT) && scc[channel])
129  {
130    do
131    {
132      m302.reg.wcn = 0;
133    }
134    while (scc[channel]->bd.tx[0].status & 0x8000);
135
136    *(scc[channel]->bd.tx[0].buffer) = character;
137
138    scc[channel]->bd.tx[0].length = 1;
139    scc[channel]->bd.tx[0].status = 0xa000;
140
141    if (scc_translate[channel])
142    {   
143      if (character == '\n')
144      {   
145        scc_out(channel, '\r');
146      }
147    }
148  } 
149}
150
151
152
153
154
155
156
157
158
159
Note: See TracBrowser for help on using the repository browser.