annotate packages/io/serial/current/src/mips/tx3904_serial.c @ 66:bf00f99aec69 ecos-sw-2000-02-02

Merge from eCos master repository on 2000-02-02-19:16:44-GMT
author jlarmour
date Wed, 02 Feb 2000 19:57:02 +0000
parents c38311975d4f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
1 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
2 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
3 // tx3904_serial.c
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
4 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
5 // Serial device driver for TX3904 on-chip serial devices
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
6 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
7 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
8 //####COPYRIGHTBEGIN####
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
9 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
10 // -------------------------------------------
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
11 // The contents of this file are subject to the Red Hat eCos Public License
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
12 // Version 1.1 (the "License"); you may not use this file except in
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
14 // http://www.redhat.com/
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
15 //
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
18 // License for the specific language governing rights and limitations under
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
19 // the License.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
20 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
21 // The Original Code is eCos - Embedded Configurable Operating System,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
22 // released September 30, 1998.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
23 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
24 // The Initial Developer of the Original Code is Red Hat.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
25 // Portions created by Red Hat are
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
26 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
27 // All Rights Reserved.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
28 // -------------------------------------------
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
29 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
30 //####COPYRIGHTEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
31 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
32 //#####DESCRIPTIONBEGIN####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
33 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
34 // Author(s): nickg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
35 // Contributors: nickg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
36 // Date: 1999-03-3
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
37 // Purpose: TX3904 serial device driver
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
38 // Description: TX3904 serial device driver
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
39 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
40 //####DESCRIPTIONEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
41 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
42 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
43
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
44 #include <pkgconf/hal.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
45 #include <pkgconf/io_serial.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
46 #include <cyg/hal/hal_io.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
47 #include <cyg/hal/hal_intr.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
48
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
49 #include <cyg/io/io.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
50 #include <cyg/io/devtab.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
51 #include <cyg/io/serial.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
52
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
53 #ifdef CYGPKG_IO_SERIAL_TX39_JMR3904
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
54
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
55 cyg_bool cyg_hal_is_break(char *buf, int size);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
56 void cyg_hal_user_break( CYG_ADDRWORD *regs );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
57
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
58 //-------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
59
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
60 extern void diag_printf(const char *fmt, ...);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
61
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
62 //-------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
63 // Forward definitions
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
64
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
65 static bool tx3904_serial_init(struct cyg_devtab_entry *tab);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
66 static bool tx3904_serial_putc(serial_channel *chan, unsigned char c);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
67 static Cyg_ErrNo tx3904_serial_lookup(struct cyg_devtab_entry **tab,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
68 struct cyg_devtab_entry *sub_tab,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
69 const char *name);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
70 static unsigned char tx3904_serial_getc(serial_channel *chan);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
71 static bool tx3904_serial_set_config(serial_channel *chan, cyg_serial_info_t *config);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
72 static void tx3904_serial_start_xmit(serial_channel *chan);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
73 static void tx3904_serial_stop_xmit(serial_channel *chan);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
74
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
75 #ifndef CYGPKG_IO_SERIAL_TX39_JMR3904_POLLED_MODE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
76 static cyg_uint32 tx3904_serial_ISR(cyg_vector_t vector, cyg_addrword_t data, cyg_addrword_t *regs);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
77 static void tx3904_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
78 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
79
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
80
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
81 //-------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
82 // TX3904 serial line control register values:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
83
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
84 // Offsets to serial control registers from base
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
85 #define SERIAL_CR 0x00
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
86 #define SERIAL_SR 0x04
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
87 #define SERIAL_ICR 0x08
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
88 #define SERIAL_ISR 0x0C
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
89 #define SERIAL_FCR 0x10
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
90 #define SERIAL_BRG 0x14
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
91 #define SERIAL_TXB 0x20
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
92 #define SERIAL_RXB 0x30
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
93
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
94 // Status register bits
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
95 #define ISR_RXRDY 0x01
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
96 #define ISR_TXRDY 0x02
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
97 #define ISR_ERROR 0x04
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
98
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
99 // Control register bits
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
100 #define LCR_SB1 0x0000
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
101 #define LCR_SB1_5 0x0000
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
102 #define LCR_SB2 0x0004
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
103 #define LCR_PN 0x0000 // Parity mode - none
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
104 #define LCR_PS 0x0000 // Forced "space" parity
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
105 #define LCR_PM 0x0000 // Forced "mark" parity
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
106 #define LCR_PE 0x0018 // Parity mode - even
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
107 #define LCR_PO 0x0010 // Parity mode - odd
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
108 #define LCR_WL5 0x0001 // not supported - use 7bit
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
109 #define LCR_WL6 0x0001 // not supported - use 7bit
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
110 #define LCR_WL7 0x0001 // 7 bit chars
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
111 #define LCR_WL8 0x0000 // 8 bit chars
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
112
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
113 #define LCR_BRG 0x0020 // Select baud rate generator
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
114
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
115 #define ICR_RXE 0x0001 // receive enable
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
116 #define ICR_TXE 0x0002 // transmit enable
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
117
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
118 //-------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
119 // Tables to map input values to hardware settings
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
120
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
121 static unsigned char select_word_length[] = {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
122 LCR_WL5, // 5 bits / word (char)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
123 LCR_WL6,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
124 LCR_WL7,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
125 LCR_WL8
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
126 };
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
127
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
128 static unsigned char select_stop_bits[] = {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
129 0,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
130 LCR_SB1, // 1 stop bit
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
131 LCR_SB1_5, // 1.5 stop bit
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
132 LCR_SB2 // 2 stop bits
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
133 };
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
134
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
135 static unsigned char select_parity[] = {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
136 LCR_PN, // No parity
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
137 LCR_PE, // Even parity
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
138 LCR_PO, // Odd parity
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
139 LCR_PM, // Mark parity
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
140 LCR_PS, // Space parity
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
141 };
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
142
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
143 // The values in this table plug straight into the BRG register
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
144 // in the serial driver hardware. They comprise a baud rate divisor
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
145 // in the bottom 8 bits and a clock selector in the top 8 bits.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
146 // These figures all come from Toshiba.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
147
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
148 #if (CYGHWR_HAL_MIPS_CPU_FREQ == 50)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
149
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
150 static unsigned short select_baud[] = {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
151 0, // Unused
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
152 0, // 50
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
153 0, // 75
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
154 0, // 110
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
155 0, // 134.5
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
156 0, // 150
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
157 0, // 200
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
158 0, // 300
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
159 0x0300|20, // 600
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
160 0x0300|10, // 1200
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
161 0, // 1800
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
162 0x0300|05, // 2400
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
163 0, // 3600
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
164 0x0300|10, // 4800
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
165 0, // 7200
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
166 0x0200|05, // 9600
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
167 0, // 14400
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
168 0x0100|10, // 19200
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
169 0x0100|05, // 38400
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
170 0, // 57600
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
171 0, // 115200
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
172 0, // 230400
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
173 };
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
174
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
175 #elif (CYGHWR_HAL_MIPS_CPU_FREQ == 66)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
176
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
177 static unsigned short select_baud[] = {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
178 0, // Unused
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
179 0, // 50
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
180 0, // 75
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
181 0, // 110
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
182 0, // 134.5
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
183 0, // 150
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
184 0, // 200
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
185 0, // 300
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
186 0x0300|27, // 600
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
187 0x0200|54, // 1200
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
188 0, // 1800
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
189 0x0200|27, // 2400
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
190 0, // 3600
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
191 0x0100|54, // 4800
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
192 0, // 7200
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
193 0x0100|27, // 9600
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
194 0, // 14400
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
195 0x0000|54, // 19200
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
196 0x0000|27, // 38400
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
197 0, // 57600
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
198 0, // 115200
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
199 0, // 230400
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
200 };
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
201
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
202 #else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
203
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
204 #error Unsupported CPU frequency
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
205
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
206 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
207
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
208 //-------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
209 // Info for each serial device controlled
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
210
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
211 typedef struct tx3904_serial_info {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
212 CYG_ADDRWORD base;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
213 CYG_WORD int_num;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
214 cyg_interrupt interrupt;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
215 cyg_handle_t interrupt_handle;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
216 cyg_uint8 input_char;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
217 cyg_bool input_char_valid;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
218 cyg_bool output_ready;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
219 cyg_uint16 cur_baud;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
220 } tx3904_serial_info;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
221
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
222 //-------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
223 // Callback functions exported by this driver
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
224
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
225 static SERIAL_FUNS(tx3904_serial_funs,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
226 tx3904_serial_putc,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
227 tx3904_serial_getc,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
228 tx3904_serial_set_config,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
229 tx3904_serial_start_xmit,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
230 tx3904_serial_stop_xmit
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
231 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
232
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
233 //-------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
234 // Hardware info for each serial line
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
235
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
236 #ifdef CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
237 static tx3904_serial_info tx3904_serial_info0 = {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
238 0xFFFFF300,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
239 CYGNUM_HAL_INTERRUPT_SIO_0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
240 };
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
241 #if CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL0_BUFSIZE > 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
242 static unsigned char tx3904_serial_out_buf0[CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL0_BUFSIZE];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
243 static unsigned char tx3904_serial_in_buf0[CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL0_BUFSIZE];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
244 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
245 #endif // CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
246
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
247 #ifdef CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL1
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
248 static tx3904_serial_info tx3904_serial_info1 = {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
249 0xFFFFF400,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
250 CYGNUM_HAL_INTERRUPT_SIO_1
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
251 };
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
252 #if CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL1_BUFSIZE > 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
253 static unsigned char tx3904_serial_out_buf1[CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL1_BUFSIZE];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
254 static unsigned char tx3904_serial_in_buf1[CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL1_BUFSIZE];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
255 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
256 #endif // CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL1
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
257
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
258 //-------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
259 // Channel descriptions:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
260
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
261 #ifdef CYGPKG_IO_SERIAL_TX39_JMR3904_POLLED_MODE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
262 #define SIZEOF_BUF(_x_) 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
263 #else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
264 #define SIZEOF_BUF(_x_) sizeof(_x_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
265 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
266
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
267 #ifdef CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
268 #if CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL0_BUFSIZE > 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
269 static SERIAL_CHANNEL_USING_INTERRUPTS(tx3904_serial_channel0,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
270 tx3904_serial_funs,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
271 tx3904_serial_info0,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
272 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL0_BAUD),
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
273 CYG_SERIAL_STOP_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
274 CYG_SERIAL_PARITY_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
275 CYG_SERIAL_WORD_LENGTH_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
276 CYG_SERIAL_FLAGS_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
277 &tx3904_serial_out_buf0[0],
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
278 SIZEOF_BUF(tx3904_serial_out_buf0),
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
279 &tx3904_serial_in_buf0[0],
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
280 SIZEOF_BUF(tx3904_serial_in_buf0)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
281 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
282 #else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
283 static SERIAL_CHANNEL(tx3904_serial_channel0,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
284 tx3904_serial_funs,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
285 tx3904_serial_info0,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
286 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL0_BAUD),
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
287 CYG_SERIAL_STOP_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
288 CYG_SERIAL_PARITY_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
289 CYG_SERIAL_WORD_LENGTH_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
290 CYG_SERIAL_FLAGS_DEFAULT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
291 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
292 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
293 #endif // CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
294
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
295 #ifdef CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL1
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
296 #if CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL1_BUFSIZE > 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
297 static SERIAL_CHANNEL_USING_INTERRUPTS(tx3904_serial_channel1,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
298 tx3904_serial_funs,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
299 tx3904_serial_info1,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
300 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL1_BAUD),
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
301 CYG_SERIAL_STOP_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
302 CYG_SERIAL_PARITY_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
303 CYG_SERIAL_WORD_LENGTH_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
304 CYG_SERIAL_FLAGS_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
305 &tx3904_serial_out_buf1[0],
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
306 SIZEOF_BUF(tx3904_serial_out_buf1),
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
307 &tx3904_serial_in_buf1[0],
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
308 SIZEOF_BUF(tx3904_serial_in_buf1)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
309 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
310 #else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
311 static SERIAL_CHANNEL(tx3904_serial_channel1,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
312 tx3904_serial_funs,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
313 tx3904_serial_info1,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
314 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL1_BAUD),
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
315 CYG_SERIAL_STOP_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
316 CYG_SERIAL_PARITY_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
317 CYG_SERIAL_WORD_LENGTH_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
318 CYG_SERIAL_FLAGS_DEFAULT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
319 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
320 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
321 #endif // CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL1
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
322
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
323 //-------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
324 // And finally, the device table entries:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
325
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
326 #ifdef CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
327 DEVTAB_ENTRY(tx3904_serial_io0,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
328 CYGDAT_IO_SERIAL_TX39_JMR3904_SERIAL0_NAME,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
329 0, // Does not depend on a lower level interface
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
330 &cyg_io_serial_devio,
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
331 tx3904_serial_init,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
332 tx3904_serial_lookup, // Serial driver may need initializing
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
333 &tx3904_serial_channel0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
334 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
335 #endif // CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
336
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
337 #ifdef CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL1
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
338 DEVTAB_ENTRY(tx3904_serial_io1,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
339 CYGDAT_IO_SERIAL_TX39_JMR3904_SERIAL1_NAME,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
340 0, // Does not depend on a lower level interface
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
341 &cyg_io_serial_devio,
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
342 tx3904_serial_init,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
343 tx3904_serial_lookup, // Serial driver may need initializing
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
344 &tx3904_serial_channel1
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
345 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
346 #endif // CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL1
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
347
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
348 // ------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
349 // Delay for some number of character times. This is based on the baud
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
350 // rate currently set. We use the numbers that plug in to the BRG
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
351 // clock select and divider to control two loops. The innermost delay
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
352 // loop uses a count that is derived from dividing the CPU frequency
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
353 // by the BRG granularity (and we then add 1 to compensate for any
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
354 // rounding). This gives the number of cycles that the innermost loop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
355 // must consume. For the sake of simplicity we assume that this loop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
356 // will take 1 cycle per loop, which is roughly true in optimized
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
357 // code.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
358
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
359 void delay_char_time(tx3904_serial_info *tx3904_chan, int n)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
360 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
361 static cyg_uint16 clock_val[4] = { 4, 16, 64, 256 };
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
362 cyg_uint16 baud_val = select_baud[tx3904_chan->cur_baud];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
363 cyg_count32 clock_loop = clock_val[baud_val>>8];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
364 cyg_count32 div_loop = baud_val & 0xFF;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
365 cyg_count32 bit_time = ((CYGHWR_HAL_MIPS_CPU_FREQ_ACTUAL)/(2457600)) + 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
366
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
367 n *= 11; // allow for start and stop bits and 8 data bits
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
368
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
369 while( n-- )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
370 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
371 cyg_count32 i,j,k;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
372
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
373 for( i = 0; i < clock_loop; i++ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
374 for( j = 0; j < div_loop; j++ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
375 for( k = 0; k < bit_time; k++ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
376 continue;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
377 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
378 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
379
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
380 //-------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
381
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
382 static bool
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
383 tx3904_serial_config_port(serial_channel *chan, cyg_serial_info_t *new_config, bool init)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
384 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
385 tx3904_serial_info *tx3904_chan = (tx3904_serial_info *)chan->dev_priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
386 cyg_uint16 cr = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
387 cyg_uint16 icr = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
388 cyg_uint16 baud_divisor = select_baud[new_config->baud];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
389
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
390 if (baud_divisor == 0)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
391 return false; // Invalid baud rate selected
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
392
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
393 // set up other config values:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
394
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
395 cr |= select_word_length[new_config->word_length - CYGNUM_SERIAL_WORD_LENGTH_5];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
396 cr |= select_stop_bits[new_config->stop];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
397 cr |= select_parity[new_config->parity];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
398
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
399 // Source transfer clock from BRG
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
400 cr |= LCR_BRG;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
401
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
402 #ifndef CYGPKG_IO_SERIAL_TX39_JMR3904_POLLED_MODE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
403 // Enable RX interrupts only at present
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
404 #ifdef CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
405 if ((chan->out_cbuf.len != 0) || (chan == &tx3904_serial_channel0)) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
406 #else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
407 if (chan->out_cbuf.len != 0) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
408 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
409 icr |= ICR_RXE;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
410 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
411 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
412
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
413 // Avoid any interrupts while we are fiddling with the line parameters.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
414 cyg_drv_interrupt_mask(tx3904_chan->int_num);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
415
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
416
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
417 // In theory we should wait here for the transmitter to drain the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
418 // FIFO so we dont change the line parameters with characters
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
419 // unsent. Unfortunately the TX39 serial devices do not allow us
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
420 // to discover when the FIFO is empty.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
421
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
422 delay_char_time(tx3904_chan, 8);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
423
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
424 // Disable device entirely.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
425 // HAL_WRITE_UINT16(tx3904_chan->base+SERIAL_CR, 0);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
426 // HAL_WRITE_UINT8(tx3904_chan->base+SERIAL_ICR, 0);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
427
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
428 // Reset the FIFOs
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
429
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
430 HAL_WRITE_UINT16(tx3904_chan->base+SERIAL_FCR, 7);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
431 HAL_WRITE_UINT16(tx3904_chan->base+SERIAL_FCR, 0);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
432
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
433 // Set up baud rate
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
434
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
435 HAL_WRITE_UINT16( tx3904_chan->base+SERIAL_BRG, baud_divisor );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
436
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
437 // Write CR into hardware
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
438 HAL_WRITE_UINT16(tx3904_chan->base+SERIAL_CR, cr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
439
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
440 // Write ICR into hardware
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
441 HAL_WRITE_UINT16(tx3904_chan->base+SERIAL_ICR, icr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
442
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
443 // Re-enable interrupts.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
444 cyg_drv_interrupt_unmask(tx3904_chan->int_num);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
445
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
446 // Save current baud rate
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
447 tx3904_chan->cur_baud = new_config->baud;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
448
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
449 if (new_config != &chan->config) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
450 chan->config = *new_config;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
451 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
452 return true;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
453 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
454
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
455 //-------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
456 // Function to initialize the device. Called at bootstrap time.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
457
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
458 bool tx3904_serial_init(struct cyg_devtab_entry *tab)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
459 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
460 serial_channel *chan = (serial_channel *)tab->priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
461 tx3904_serial_info *tx3904_chan = (tx3904_serial_info *)chan->dev_priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
462
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
463 (chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
464
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
465 tx3904_chan->cur_baud = CYGNUM_SERIAL_BAUD_38400;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
466
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
467 #ifndef CYGPKG_IO_SERIAL_TX39_JMR3904_POLLED_MODE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
468 if (chan->out_cbuf.len != 0) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
469 // Install and enable the interrupt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
470 cyg_drv_interrupt_create(tx3904_chan->int_num,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
471 4, // Priority
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
472 (cyg_addrword_t)chan, // Data item passed to interrupt handler
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
473 (cyg_ISR_t *)tx3904_serial_ISR,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
474 tx3904_serial_DSR,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
475 &tx3904_chan->interrupt_handle,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
476 &tx3904_chan->interrupt);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
477 cyg_drv_interrupt_attach(tx3904_chan->interrupt_handle);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
478 cyg_drv_interrupt_unmask(tx3904_chan->int_num);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
479 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
480 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
481
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
482 tx3904_serial_config_port(chan, &chan->config, true);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
483
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
484 return true;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
485 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
486
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
487 //-------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
488 // This routine is called when the device is "looked" up (i.e. attached)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
489
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
490 static Cyg_ErrNo
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
491 tx3904_serial_lookup(struct cyg_devtab_entry **tab,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
492 struct cyg_devtab_entry *sub_tab,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
493 const char *name)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
494 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
495 serial_channel *chan = (serial_channel *)(*tab)->priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
496 (chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
497 return ENOERR;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
498 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
499
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
500 //-------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
501 // Return 'true' if character is sent to device
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
502
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
503 bool
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
504 tx3904_serial_putc(serial_channel *chan, unsigned char c)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
505 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
506 tx3904_serial_info *tx3904_chan = (tx3904_serial_info *)chan->dev_priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
507 cyg_uint16 isr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
508
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
509 HAL_READ_UINT16( tx3904_chan->base+SERIAL_ISR, isr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
510
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
511 if( isr & ISR_TXRDY )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
512 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
513 HAL_WRITE_UINT8( tx3904_chan->base+SERIAL_TXB, c );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
514
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
515 isr &= ~ISR_TXRDY;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
516
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
517 HAL_WRITE_UINT16( tx3904_chan->base+SERIAL_ISR, isr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
518
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
519 return true;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
520 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
521 else return false;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
522 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
523
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
524 //-------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
525
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
526 unsigned char
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
527 tx3904_serial_getc(serial_channel *chan)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
528 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
529 unsigned char c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
530 tx3904_serial_info *tx3904_chan = (tx3904_serial_info *)chan->dev_priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
531 cyg_uint16 isr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
532
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
533 do
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
534 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
535 HAL_READ_UINT16( tx3904_chan->base+SERIAL_ISR, isr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
536
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
537 // Eliminate any RX errors
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
538 if( isr & ISR_ERROR )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
539 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
540 cyg_uint16 sr = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
541
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
542 isr &= ISR_ERROR;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
543
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
544 // HAL_READ_UINT16( tx3904_chan->base+SERIAL_SR, sr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
545
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
546 HAL_WRITE_UINT16( tx3904_chan->base+SERIAL_SR, sr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
547 HAL_WRITE_UINT16( tx3904_chan->base+SERIAL_ISR, isr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
548 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
549
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
550 } while( (isr & ISR_RXRDY) != ISR_RXRDY );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
551
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
552 HAL_READ_UINT8( tx3904_chan->base+SERIAL_RXB, c );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
553
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
554 isr &= ~ISR_RXRDY;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
555
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
556 HAL_WRITE_UINT16( tx3904_chan->base+SERIAL_ISR, isr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
557
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
558 return c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
559 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
560
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
561 //-------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
562
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
563 bool
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
564 tx3904_serial_set_config(serial_channel *chan, cyg_serial_info_t *config)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
565 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
566 return tx3904_serial_config_port(chan, config, false);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
567 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
568
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
569 //-------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
570 // Enable the transmitter on the device
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
571
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
572 static void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
573 tx3904_serial_start_xmit(serial_channel *chan)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
574 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
575 #ifndef CYGPKG_IO_SERIAL_TX39_JMR3904_POLLED_MODE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
576 tx3904_serial_info *tx3904_chan = (tx3904_serial_info *)chan->dev_priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
577 cyg_uint16 icr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
578
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
579 HAL_READ_UINT16( tx3904_chan->base+SERIAL_ICR, icr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
580
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
581 icr |= ICR_TXE;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
582
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
583 HAL_WRITE_UINT16( tx3904_chan->base+SERIAL_ICR, icr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
584 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
585 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
586
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
587 //-------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
588 // Disable the transmitter on the device
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
589
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
590 static void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
591 tx3904_serial_stop_xmit(serial_channel *chan)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
592 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
593 #ifndef CYGPKG_IO_SERIAL_TX39_JMR3904_POLLED_MODE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
594 tx3904_serial_info *tx3904_chan = (tx3904_serial_info *)chan->dev_priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
595 cyg_uint16 icr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
596
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
597 HAL_READ_UINT16( tx3904_chan->base+SERIAL_ICR, icr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
598
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
599 icr &= ~ICR_TXE;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
600
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
601 HAL_WRITE_UINT16( tx3904_chan->base+SERIAL_ICR, icr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
602 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
603 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
604
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
605 //-------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
606 // Serial I/O - low level interrupt handlers (ISR)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
607
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
608 #ifndef CYGPKG_IO_SERIAL_TX39_JMR3904_POLLED_MODE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
609
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
610 static cyg_uint32
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
611 tx3904_serial_ISR(cyg_vector_t vector, cyg_addrword_t data, cyg_addrword_t *regs)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
612 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
613 serial_channel *chan = (serial_channel *)data;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
614 tx3904_serial_info *tx3904_chan = (tx3904_serial_info *)chan->dev_priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
615 cyg_uint8 isr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
616 cyg_uint32 result = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
617
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
618 cyg_drv_interrupt_mask(tx3904_chan->int_num);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
619 cyg_drv_interrupt_acknowledge(tx3904_chan->int_num);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
620
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
621 HAL_READ_UINT16( tx3904_chan->base+SERIAL_ISR, isr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
622
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
623 // Eliminate any RX errors
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
624 if( isr & ISR_ERROR )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
625 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
626 cyg_uint16 sr = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
627
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
628 isr &= ~ISR_ERROR;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
629
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
630 HAL_READ_UINT16( tx3904_chan->base+SERIAL_SR, sr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
631
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
632 HAL_WRITE_UINT16( tx3904_chan->base+SERIAL_SR, 0 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
633 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
634
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
635 // Check for a TX interrupt and set the flag if so.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
636 if( isr & ISR_TXRDY )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
637 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
638 isr &= ~ISR_TXRDY;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
639
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
640 tx3904_chan->output_ready = true;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
641
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
642 result |= CYG_ISR_CALL_DSR; // Cause DSR to be run
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
643 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
644
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
645
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
646 // Check here for an RX interrupt and fetch the character. If it
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
647 // is a ^C then call into GDB stub to handle it.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
648
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
649 if( isr & ISR_RXRDY )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
650 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
651 cyg_uint8 rxb;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
652 HAL_READ_UINT8( tx3904_chan->base+SERIAL_RXB, rxb );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
653
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
654 isr &= ~ISR_RXRDY;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
655
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
656 if( cyg_hal_is_break( &rxb , 1 ) )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
657 cyg_hal_user_break( regs );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
658 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
659 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
660 tx3904_chan->input_char = rxb;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
661 tx3904_chan->input_char_valid = true;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
662 result |= CYG_ISR_CALL_DSR; // Cause DSR to be run
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
663 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
664
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
665 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
666
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
667 HAL_WRITE_UINT16( tx3904_chan->base+SERIAL_ISR, isr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
668
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
669 return result;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
670 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
671
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
672
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
673 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
674
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
675 //-------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
676 // Serial I/O - high level interrupt handler (DSR)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
677
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
678 #ifndef CYGPKG_IO_SERIAL_TX39_JMR3904_POLLED_MODE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
679
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
680 static void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
681 tx3904_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
682 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
683 serial_channel *chan = (serial_channel *)data;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
684 tx3904_serial_info *tx3904_chan = (tx3904_serial_info *)chan->dev_priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
685 cyg_uint8 isr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
686
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
687 HAL_READ_UINT16( tx3904_chan->base+SERIAL_ISR, isr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
688
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
689 if( tx3904_chan->input_char_valid )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
690 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
691 (chan->callbacks->rcv_char)(chan, tx3904_chan->input_char);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
692
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
693 tx3904_chan->input_char_valid = false;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
694
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
695 #if 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
696 // And while we are here, pull any further characters out of the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
697 // FIFO. This should help to reduce the interrupt rate.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
698
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
699 HAL_READ_UINT16( tx3904_chan->base+SERIAL_ISR, isr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
700
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
701 while( isr & ISR_RXRDY )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
702 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
703 cyg_uint8 rxb;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
704 HAL_READ_UINT8( tx3904_chan->base+SERIAL_RXB, rxb );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
705
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
706 (chan->callbacks->rcv_char)(chan, rxb);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
707
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
708 isr &= ~ISR_RXRDY;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
709
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
710 HAL_WRITE_UINT16( tx3904_chan->base+SERIAL_ISR, isr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
711 HAL_READ_UINT16( tx3904_chan->base+SERIAL_ISR, isr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
712 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
713 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
714
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
715 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
716
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
717 if( tx3904_chan->output_ready )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
718 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
719 (chan->callbacks->xmt_char)(chan);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
720
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
721 tx3904_chan->output_ready = false;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
722 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
723
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
724 cyg_drv_interrupt_unmask(tx3904_chan->int_num);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
725 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
726
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
727 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
728 #endif // CYGPKG_IO_SERIAL_TX39_JMR3904
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
729
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
730 //-------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
731 // EOF tx3904_serial.c