annotate packages/devs/serial/sparclite/sleb/current/src/sleb_sdtr.c @ 130:eb9fd8c04db3 ecos-sw-2000-10-23

Merge from eCos master repository on 2000-10-23-17:01:37-BST
author jlarmour
date Mon, 23 Oct 2000 17:10:57 +0000
parents 6ed91473a1cd
children e0c0827131d1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
1 //==========================================================================
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
2 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
3 // io/serial/sparclite/sleb_sdtr.c
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
4 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
5 // Serial I/O interface module for SPARClite Eval Board (SLEB)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
6 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
7 //==========================================================================
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
8 //####COPYRIGHTBEGIN####
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
9 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
10 // -------------------------------------------
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
11 // The contents of this file are subject to the Red Hat eCos Public License
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
12 // Version 1.1 (the "License"); you may not use this file except in
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
14 // http://www.redhat.com/
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
15 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
18 // License for the specific language governing rights and limitations under
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
19 // the License.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
20 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
21 // The Original Code is eCos - Embedded Configurable Operating System,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
22 // released September 30, 1998.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
23 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
24 // The Initial Developer of the Original Code is Red Hat.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
25 // Portions created by Red Hat are
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
26 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
27 // All Rights Reserved.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
28 // -------------------------------------------
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
29 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
30 //####COPYRIGHTEND####
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
31 //==========================================================================
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
32 //#####DESCRIPTIONBEGIN####
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
33 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
34 // Author(s): gthomas
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
35 // Contributors: gthomas
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
36 // Date: 1999-02-04
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
37 // Purpose: SLEB serial I/O module
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
38 // Description:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
39 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
40 //####DESCRIPTIONEND####
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
41 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
42 //==========================================================================
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
43
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
44 #include <pkgconf/io.h>
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
45 #include <pkgconf/io_serial.h>
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
46 #include <cyg/io/io.h>
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
47 #include <cyg/hal/hal_intr.h>
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
48 #include <cyg/io/devtab.h>
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
49 #include <cyg/io/serial.h>
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
50
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
51 #ifdef CYGPKG_IO_SERIAL_SPARCLITE_SLEB
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
52
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
53 #include "sleb_sdtr.h"
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
54
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
55 extern void diag_printf(const char *fmt, ...);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
56
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
57 #define BUFSIZE 128
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
58
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
59 typedef struct sleb_sdtr_info {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
60 CYG_ADDRWORD base;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
61 CYG_WORD tx_int_num;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
62 CYG_WORD rx_int_num;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
63 cyg_interrupt tx_serial_interrupt;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
64 cyg_handle_t tx_serial_interrupt_handle;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
65 cyg_interrupt rx_serial_interrupt;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
66 cyg_handle_t rx_serial_interrupt_handle;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
67 cyg_uint8 cmd_reg;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
68 bool xmit_enabled;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
69 } sleb_sdtr_info;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
70
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
71 static bool sleb_sdtr_init(struct cyg_devtab_entry *tab);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
72 static bool sleb_sdtr_putc(serial_channel *chan, unsigned char c);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
73 static Cyg_ErrNo sleb_sdtr_lookup(struct cyg_devtab_entry **tab,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
74 struct cyg_devtab_entry *sub_tab,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
75 const char *name);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
76 static unsigned char sleb_sdtr_getc(serial_channel *chan);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
77 static Cyg_ErrNo sleb_sdtr_set_config(serial_channel *chan, cyg_uint32 key,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
78 const void *xbuf, cyg_uint32 *len);
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
79 static void sleb_sdtr_start_xmit(serial_channel *chan);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
80 static void sleb_sdtr_stop_xmit(serial_channel *chan);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
81
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
82 static cyg_uint32 sleb_sdtr_tx_ISR(cyg_vector_t vector, cyg_addrword_t data);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
83 static void sleb_sdtr_tx_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
84 static cyg_uint32 sleb_sdtr_rx_ISR(cyg_vector_t vector, cyg_addrword_t data);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
85 static void sleb_sdtr_rx_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
86
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
87 static SERIAL_FUNS(sleb_sdtr_funs,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
88 sleb_sdtr_putc,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
89 sleb_sdtr_getc,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
90 sleb_sdtr_set_config,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
91 sleb_sdtr_start_xmit,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
92 sleb_sdtr_stop_xmit
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
93 );
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
94
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
95 #ifdef CYGPKG_IO_SERIAL_SPARCLITE_SLEB_CON1
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
96 static sleb_sdtr_info sleb_sdtr_info0 = {SLEB_SDTR0_BASE, SLEB_SDTR0_TX_INT, SLEB_SDTR0_RX_INT};
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
97 #if CYGNUM_IO_SERIAL_SPARCLITE_SLEB_CON1_BUFSIZE > 0
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
98 static unsigned char sleb_sdtr_out_buf0[CYGNUM_IO_SERIAL_SPARCLITE_SLEB_CON1_BUFSIZE];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
99 static unsigned char sleb_sdtr_in_buf0[CYGNUM_IO_SERIAL_SPARCLITE_SLEB_CON1_BUFSIZE];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
100
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
101 static SERIAL_CHANNEL_USING_INTERRUPTS(sleb_sdtr_channel0,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
102 sleb_sdtr_funs,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
103 sleb_sdtr_info0,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
104 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_SPARCLITE_SLEB_CON1_BAUD),
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
105 CYG_SERIAL_STOP_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
106 CYG_SERIAL_PARITY_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
107 CYG_SERIAL_WORD_LENGTH_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
108 CYG_SERIAL_FLAGS_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
109 &sleb_sdtr_out_buf0[0], sizeof(sleb_sdtr_out_buf0),
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
110 &sleb_sdtr_in_buf0[0], sizeof(sleb_sdtr_in_buf0)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
111 );
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
112 #else
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
113 static SERIAL_CHANNEL(sleb_sdtr_channel0,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
114 sleb_sdtr_funs,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
115 sleb_sdtr_info0,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
116 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_SPARCLITE_SLEB_CON1_BAUD),
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
117 CYG_SERIAL_STOP_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
118 CYG_SERIAL_PARITY_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
119 CYG_SERIAL_WORD_LENGTH_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
120 CYG_SERIAL_FLAGS_DEFAULT
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
121 );
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
122 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
123
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
124 DEVTAB_ENTRY(sleb_sdtr_io0,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
125 CYGDAT_IO_SERIAL_SPARCLITE_SLEB_CON1_NAME,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
126 0, // Does not depend on a lower level interface
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
127 &cyg_io_serial_devio,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
128 sleb_sdtr_init,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
129 sleb_sdtr_lookup, // Serial driver may need initializing
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
130 &sleb_sdtr_channel0
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
131 );
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
132 #endif // CYGPKG_IO_SERIAL_SPARCLITE_SLEB_CON1
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
133
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
134 #ifdef CYGPKG_IO_SERIAL_SPARCLITE_SLEB_CON2
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
135 static sleb_sdtr_info sleb_sdtr_info1 = {SLEB_SDTR1_BASE, SLEB_SDTR1_TX_INT, SLEB_SDTR1_RX_INT};
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
136 #if CYGNUM_IO_SERIAL_SPARCLITE_SLEB_CON2_BUFSIZE > 0
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
137 static unsigned char sleb_sdtr_out_buf1[CYGNUM_IO_SERIAL_SPARCLITE_SLEB_CON2_BUFSIZE];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
138 static unsigned char sleb_sdtr_in_buf1[CYGNUM_IO_SERIAL_SPARCLITE_SLEB_CON2_BUFSIZE];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
139
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
140 static SERIAL_CHANNEL_USING_INTERRUPTS(sleb_sdtr_channel1,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
141 sleb_sdtr_funs,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
142 sleb_sdtr_info1,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
143 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_SPARCLITE_SLEB_CON2_BAUD),
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
144 CYG_SERIAL_STOP_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
145 CYG_SERIAL_PARITY_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
146 CYG_SERIAL_WORD_LENGTH_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
147 CYG_SERIAL_FLAGS_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
148 &sleb_sdtr_out_buf1[0], sizeof(sleb_sdtr_out_buf1),
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
149 &sleb_sdtr_in_buf1[0], sizeof(sleb_sdtr_in_buf1)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
150 );
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
151 #else
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
152 static SERIAL_CHANNEL(sleb_sdtr_channel1,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
153 sleb_sdtr_funs,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
154 sleb_sdtr_info1,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
155 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_SPARCLITE_SLEB_CON2_BAUD),
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
156 CYG_SERIAL_STOP_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
157 CYG_SERIAL_PARITY_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
158 CYG_SERIAL_WORD_LENGTH_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
159 CYG_SERIAL_FLAGS_DEFAULT
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
160 );
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
161 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
162
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
163 DEVTAB_ENTRY(sleb_sdtr_io1,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
164 CYGDAT_IO_SERIAL_SPARCLITE_SLEB_CON2_NAME,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
165 0, // Does not depend on a lower level interface
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
166 &cyg_io_serial_devio,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
167 sleb_sdtr_init,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
168 sleb_sdtr_lookup, // Serial driver may need initializing
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
169 &sleb_sdtr_channel1
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
170 );
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
171 #endif // CYGPKG_IO_SERIAL_SPARCLITE_SLEB_CON2
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
172
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
173 // Internal function to actually configure the hardware to desired baud rate, etc.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
174 static bool
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
175 sleb_sdtr_config_port(serial_channel *chan, cyg_serial_info_t *new_config, bool init)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
176 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
177 sleb_sdtr_info *sdtr_chan = (sleb_sdtr_info *)chan->dev_priv;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
178 CYG_ADDRWORD port = sdtr_chan->base;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
179 cyg_int32 baud_divisor;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
180 cyg_int32 clk, tval;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
181 unsigned char mode;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
182 #if 0
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
183 if ((new_config->baud < CYGNUM_SERIAL_BAUD_MIN) || (new_config->baud > CYGNUM_SERIAL_BAUD_MAX))
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
184 return false; // Invalid baud rate
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
185 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
186 baud_divisor = select_baud[new_config->baud];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
187 if (baud_divisor == 0)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
188 return false; // Unsupported baud rate
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
189 // Reset the port
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
190 HAL_SPARC_86940_WRITE(SDTR_CONTROL(port), SDTR_CMD_RST);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
191 // Write the mode
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
192 mode = SDTR_MODE_MODE_ASYNC16 |
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
193 select_word_length[new_config->word_length - CYGNUM_SERIAL_WORD_LENGTH_5] |
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
194 select_stop_bits[new_config->stop] |
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
195 select_parity[new_config->parity];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
196 HAL_SPARC_86940_WRITE(SDTR_CONTROL(port), mode);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
197 // Set baud rate clock.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
198 // ***** CAUTION! Both ports use the same time, thus they must both run at the same baud rate!
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
199 clk = *SLEB_CLOCK_SWITCH; // Compute board speed
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
200 if (clk & 0x80) clk = 10;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
201 clk = (clk & 0x3F) * 1000000; // in MHz
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
202 tval = (clk / (baud_divisor * 32)) - 1;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
203 HAL_SPARC_86940_WRITE(SLEB_TIMER3_RELOAD, tval);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
204 // Set up control register
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
205 sdtr_chan->cmd_reg = SDTR_CMD_RTS | SDTR_CMD_DTR | SDTR_CMD_TxEN;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
206 #ifdef CYGPKG_IO_SERIAL_SPARCLITE_SLEB_CON1
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
207 // Cygmon needs the receiver
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
208 if ((chan->out_cbuf.len != 0) || (chan == &sleb_sdtr_channel0)) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
209 #else
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
210 if (chan->out_cbuf.len != 0) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
211 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
212 sdtr_chan->cmd_reg |= SDTR_CMD_RxEN;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
213 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
214 if (init) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
215 sdtr_chan->xmit_enabled = false;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
216 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
217 HAL_SPARC_86940_WRITE(SDTR_CONTROL(port), sdtr_chan->cmd_reg);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
218 if (new_config != &chan->config)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
219 chan->config = *new_config;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
220 return true;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
221 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
222
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
223 // Function to initialize the device. Called at bootstrap time.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
224 static bool
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
225 sleb_sdtr_init(struct cyg_devtab_entry *tab)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
226 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
227 serial_channel *chan = (serial_channel *)tab->priv;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
228 sleb_sdtr_info *sdtr_chan = (sleb_sdtr_info *)chan->dev_priv;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
229 #ifdef CYGDBG_IO_INIT
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
230 diag_printf("SLEB SERIAL init - dev: %x.%d.%d\n", sdtr_chan->base, sdtr_chan->tx_int_num, sdtr_chan->rx_int_num);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
231 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
232 (chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
233 if (chan->out_cbuf.len != 0) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
234 cyg_drv_interrupt_create(sdtr_chan->tx_int_num,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
235 99, // Priority - unused
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
236 (cyg_addrword_t)chan, // Data item passed to interrupt handler
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
237 sleb_sdtr_tx_ISR,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
238 sleb_sdtr_tx_DSR,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
239 &sdtr_chan->tx_serial_interrupt_handle,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
240 &sdtr_chan->tx_serial_interrupt);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
241 cyg_drv_interrupt_attach(sdtr_chan->tx_serial_interrupt_handle);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
242 cyg_drv_interrupt_mask(sdtr_chan->tx_int_num);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
243 cyg_drv_interrupt_create(sdtr_chan->rx_int_num,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
244 99, // Priority - unused
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
245 (cyg_addrword_t)chan, // Data item passed to interrupt handler
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
246 sleb_sdtr_rx_ISR,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
247 sleb_sdtr_rx_DSR,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
248 &sdtr_chan->rx_serial_interrupt_handle,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
249 &sdtr_chan->rx_serial_interrupt);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
250 cyg_drv_interrupt_attach(sdtr_chan->rx_serial_interrupt_handle);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
251 cyg_drv_interrupt_unmask(sdtr_chan->rx_int_num);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
252 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
253 sleb_sdtr_config_port(chan, &chan->config, true);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
254 return true;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
255 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
256
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
257 // This routine is called when the device is "looked" up (i.e. attached)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
258 static Cyg_ErrNo
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
259 sleb_sdtr_lookup(struct cyg_devtab_entry **tab,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
260 struct cyg_devtab_entry *sub_tab,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
261 const char *name)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
262 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
263 serial_channel *chan = (serial_channel *)(*tab)->priv;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
264 (chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
265 return ENOERR;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
266 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
267
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
268 // Send a character to the device output buffer.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
269 // Return 'true' if character is sent to device
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
270 static bool
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
271 sleb_sdtr_putc(serial_channel *chan, unsigned char c)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
272 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
273 sleb_sdtr_info *sdtr_chan = (sleb_sdtr_info *)chan->dev_priv;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
274 CYG_ADDRWORD port = sdtr_chan->base;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
275 cyg_uint8 status;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
276 HAL_SPARC_86940_READ(SDTR_STATUS(port), status);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
277 if (status & SDTR_STAT_TxRDY) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
278 // Transmit buffer is empty
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
279 HAL_SPARC_86940_WRITE(SDTR_TXDATA(port), c);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
280 return true;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
281 } else {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
282 // No space
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
283 return false;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
284 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
285 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
286
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
287 // Fetch a character from the device input buffer, waiting if necessary
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
288 static unsigned char
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
289 sleb_sdtr_getc(serial_channel *chan)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
290 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
291 unsigned char c;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
292 sleb_sdtr_info *sdtr_chan = (sleb_sdtr_info *)chan->dev_priv;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
293 CYG_ADDRWORD port = sdtr_chan->base;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
294 cyg_uint8 status;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
295 HAL_SPARC_86940_READ(SDTR_STATUS(port), status);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
296 while ((status & SDTR_STAT_RxRDY) == 0)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
297 HAL_SPARC_86940_READ(SDTR_STATUS(port), status); // Wait for char
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
298 HAL_SPARC_86940_READ(SDTR_RXDATA(port), c);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
299 return c;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
300 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
301
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
302 // Set up the device characteristics; baud rate, etc.
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
303 static Cyg_ErrNo
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
304 sleb_sdtr_set_config(serial_channel *chan, cyg_uint32 key,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
305 const void *xbuf, cyg_uint32 *len)
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
306 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
307 switch (key) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
308 case CYG_IO_SET_CONFIG_SERIAL_INFO:
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
309 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
310 cyg_serial_info_t *config = (cyg_serial_info_t *)xbuf;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
311 if ( *len < sizeof(cyg_serial_info_t) ) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
312 return -EINVAL;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
313 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
314 *len = sizeof(cyg_serial_info_t);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
315 if ( true != sleb_sdtr_config_port(chan, config, false) )
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
316 return -EINVAL;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
317 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
318 break;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
319 default:
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
320 return -EINVAL;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
321 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
322 return ENOERR;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
323 }
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
324
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
325 // Enable the transmitter on the device
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
326 static void
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
327 sleb_sdtr_start_xmit(serial_channel *chan)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
328 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
329 sleb_sdtr_info *sdtr_chan = (sleb_sdtr_info *)chan->dev_priv;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
330 sdtr_chan->xmit_enabled = true;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
331 cyg_drv_interrupt_unmask(sdtr_chan->tx_int_num);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
332 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
333
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
334 // Disable the transmitter on the device
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
335 static void
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
336 sleb_sdtr_stop_xmit(serial_channel *chan)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
337 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
338 sleb_sdtr_info *sdtr_chan = (sleb_sdtr_info *)chan->dev_priv;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
339 cyg_drv_interrupt_mask(sdtr_chan->tx_int_num);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
340 sdtr_chan->xmit_enabled = false;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
341 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
342
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
343 // Serial I/O - low level interrupt handler (ISR)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
344 static cyg_uint32
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
345 sleb_sdtr_tx_ISR(cyg_vector_t vector, cyg_addrword_t data)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
346 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
347 serial_channel *chan = (serial_channel *)data;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
348 sleb_sdtr_info *sdtr_chan = (sleb_sdtr_info *)chan->dev_priv;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
349 cyg_drv_interrupt_mask(sdtr_chan->tx_int_num);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
350 cyg_drv_interrupt_acknowledge(sdtr_chan->tx_int_num);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
351 return CYG_ISR_CALL_DSR; // Cause DSR to be run
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
352 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
353
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
354 // Serial I/O - high level interrupt handler (DSR)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
355 static void
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
356 sleb_sdtr_tx_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
357 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
358 serial_channel *chan = (serial_channel *)data;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
359 sleb_sdtr_info *sdtr_chan = (sleb_sdtr_info *)chan->dev_priv;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
360 (chan->callbacks->xmt_char)(chan);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
361 if (sdtr_chan->xmit_enabled)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
362 cyg_drv_interrupt_unmask(sdtr_chan->tx_int_num);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
363 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
364
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
365 // Serial I/O - low level interrupt handler (ISR)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
366 static cyg_uint32
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
367 sleb_sdtr_rx_ISR(cyg_vector_t vector, cyg_addrword_t data)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
368 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
369 serial_channel *chan = (serial_channel *)data;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
370 sleb_sdtr_info *sdtr_chan = (sleb_sdtr_info *)chan->dev_priv;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
371 cyg_drv_interrupt_mask(sdtr_chan->rx_int_num);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
372 return CYG_ISR_CALL_DSR; // Cause DSR to be run
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
373 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
374
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
375 // Serial I/O - high level interrupt handler (DSR)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
376 static void
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
377 sleb_sdtr_rx_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
378 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
379 serial_channel *chan = (serial_channel *)data;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
380 sleb_sdtr_info *sdtr_chan = (sleb_sdtr_info *)chan->dev_priv;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
381 CYG_ADDRWORD port = sdtr_chan->base;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
382 cyg_uint8 status, c;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
383 HAL_SPARC_86940_READ(SDTR_STATUS(port), status);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
384 if ((status & SDTR_STAT_RxRDY) != 0) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
385 HAL_SPARC_86940_READ(SDTR_RXDATA(port), c);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
386 (chan->callbacks->rcv_char)(chan, c);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
387 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
388 cyg_drv_interrupt_acknowledge(sdtr_chan->rx_int_num);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
389 cyg_drv_interrupt_unmask(sdtr_chan->rx_int_num);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
390 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
391
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
392 #endif // CYGPKG_IO_SERIAL_SPARCLITE_SLEB