annotate packages/io/serial/current/src/arm/pid_serial_with_ints.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 // io/serial/arm/pid_serial_with_ints.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 // ARM PID Serial I/O Interface Module (interrupt driven)
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 //
18
7253dcc42a09 Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents: 6
diff changeset
34 // Author(s): gthomas
7253dcc42a09 Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents: 6
diff changeset
35 // Contributors: gthomas
7253dcc42a09 Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents: 6
diff changeset
36 // Date: 1999-02-04
7253dcc42a09 Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents: 6
diff changeset
37 // Purpose: PID Serial I/O module (interrupt driven version)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
38 // Description:
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/system.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 <pkgconf/io.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
47 #include <cyg/io/io.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
48 #include <cyg/hal/hal_intr.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
49 #include <cyg/io/devtab.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
50 #include <cyg/io/serial.h>
18
7253dcc42a09 Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents: 6
diff changeset
51 #include <cyg/infra/diag.h>
2
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_ARM_PID
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
54 #include "pid_serial.h"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
55
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
56 typedef struct pid_serial_info {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
57 CYG_ADDRWORD base;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
58 CYG_WORD int_num;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
59 cyg_interrupt serial_interrupt;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
60 cyg_handle_t serial_interrupt_handle;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
61 } pid_serial_info;
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 static bool pid_serial_init(struct cyg_devtab_entry *tab);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
64 static bool pid_serial_putc(serial_channel *chan, unsigned char c);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
65 static Cyg_ErrNo pid_serial_lookup(struct cyg_devtab_entry **tab,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
66 struct cyg_devtab_entry *sub_tab,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
67 const char *name);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
68 static unsigned char pid_serial_getc(serial_channel *chan);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
69 static bool pid_serial_set_config(serial_channel *chan, cyg_serial_info_t *config);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
70 static void pid_serial_start_xmit(serial_channel *chan);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
71 static void pid_serial_stop_xmit(serial_channel *chan);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
72
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
73 static cyg_uint32 pid_serial_ISR(cyg_vector_t vector, cyg_addrword_t data);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
74 static void pid_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
75
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
76 static SERIAL_FUNS(pid_serial_funs,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
77 pid_serial_putc,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
78 pid_serial_getc,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
79 pid_serial_set_config,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
80 pid_serial_start_xmit,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
81 pid_serial_stop_xmit
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
82 );
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 #ifdef CYGPKG_IO_SERIAL_ARM_PID_SERIAL0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
85 static pid_serial_info pid_serial_info0 = {0x0D800000, CYGNUM_HAL_INTERRUPT_SERIALA};
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
86 #if CYGNUM_IO_SERIAL_ARM_PID_SERIAL0_BUFSIZE > 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
87 static unsigned char pid_serial_out_buf0[CYGNUM_IO_SERIAL_ARM_PID_SERIAL0_BUFSIZE];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
88 static unsigned char pid_serial_in_buf0[CYGNUM_IO_SERIAL_ARM_PID_SERIAL0_BUFSIZE];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
89
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
90 static SERIAL_CHANNEL_USING_INTERRUPTS(pid_serial_channel0,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
91 pid_serial_funs,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
92 pid_serial_info0,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
93 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_PID_SERIAL0_BAUD),
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
94 CYG_SERIAL_STOP_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
95 CYG_SERIAL_PARITY_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
96 CYG_SERIAL_WORD_LENGTH_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
97 CYG_SERIAL_FLAGS_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
98 &pid_serial_out_buf0[0], sizeof(pid_serial_out_buf0),
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
99 &pid_serial_in_buf0[0], sizeof(pid_serial_in_buf0)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
100 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
101 #else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
102 static SERIAL_CHANNEL(pid_serial_channel0,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
103 pid_serial_funs,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
104 pid_serial_info0,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
105 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_PID_SERIAL0_BAUD),
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
106 CYG_SERIAL_STOP_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
107 CYG_SERIAL_PARITY_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
108 CYG_SERIAL_WORD_LENGTH_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
109 CYG_SERIAL_FLAGS_DEFAULT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
110 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
111 #endif
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 DEVTAB_ENTRY(pid_serial_io0,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
114 CYGDAT_IO_SERIAL_ARM_PID_SERIAL0_NAME,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
115 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: 58
diff changeset
116 &cyg_io_serial_devio,
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
117 pid_serial_init,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
118 pid_serial_lookup, // Serial driver may need initializing
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
119 &pid_serial_channel0
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 #endif // CYGPKG_IO_SERIAL_ARM_PID_SERIAL0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
122
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
123 #ifdef CYGPKG_IO_SERIAL_ARM_PID_SERIAL1
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
124 static pid_serial_info pid_serial_info1 = {0x0D800020, CYGNUM_HAL_INTERRUPT_SERIALB};
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
125 #if CYGNUM_IO_SERIAL_ARM_PID_SERIAL1_BUFSIZE > 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
126 static unsigned char pid_serial_out_buf1[CYGNUM_IO_SERIAL_ARM_PID_SERIAL1_BUFSIZE];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
127 static unsigned char pid_serial_in_buf1[CYGNUM_IO_SERIAL_ARM_PID_SERIAL1_BUFSIZE];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
128
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
129 static SERIAL_CHANNEL_USING_INTERRUPTS(pid_serial_channel1,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
130 pid_serial_funs,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
131 pid_serial_info1,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
132 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_PID_SERIAL1_BAUD),
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
133 CYG_SERIAL_STOP_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
134 CYG_SERIAL_PARITY_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
135 CYG_SERIAL_WORD_LENGTH_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
136 CYG_SERIAL_FLAGS_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
137 &pid_serial_out_buf1[0], sizeof(pid_serial_out_buf1),
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
138 &pid_serial_in_buf1[0], sizeof(pid_serial_in_buf1)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
139 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
140 #else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
141 static SERIAL_CHANNEL(pid_serial_channel1,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
142 pid_serial_funs,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
143 pid_serial_info1,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
144 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_PID_SERIAL1_BAUD),
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
145 CYG_SERIAL_STOP_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
146 CYG_SERIAL_PARITY_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
147 CYG_SERIAL_WORD_LENGTH_DEFAULT,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
148 CYG_SERIAL_FLAGS_DEFAULT
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 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
151
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
152 DEVTAB_ENTRY(pid_serial_io1,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
153 CYGDAT_IO_SERIAL_ARM_PID_SERIAL1_NAME,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
154 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: 58
diff changeset
155 &cyg_io_serial_devio,
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
156 pid_serial_init,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
157 pid_serial_lookup, // Serial driver may need initializing
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
158 &pid_serial_channel1
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
159 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
160 #endif // CYGPKG_IO_SERIAL_ARM_PID_SERIAL1
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
161
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
162 // Internal function to actually configure the hardware to desired baud rate, etc.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
163 static bool
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
164 pid_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
165 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
166 pid_serial_info *pid_chan = (pid_serial_info *)chan->dev_priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
167 volatile struct serial_port *port = (volatile struct serial_port *)pid_chan->base;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
168 unsigned short baud_divisor = select_baud[new_config->baud];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
169 unsigned char _lcr, _ier;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
170 if (baud_divisor == 0) return false; // Invalid configuration
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
171 _ier = port->ier;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
172 port->ier = 0; // Disable port interrupts while changing hardware
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
173 _lcr = 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
174 select_stop_bits[new_config->stop] |
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
175 select_parity[new_config->parity];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
176 port->lcr = _lcr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
177 port->lcr |= LCR_DL;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
178 port->mdl = baud_divisor >> 8;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
179 port->ldl = baud_divisor & 0xFF;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
180 port->lcr &= ~LCR_DL;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
181 if (init) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
182 port->fcr = 0x07; // Enable and clear FIFO
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
183 if (chan->out_cbuf.len != 0) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
184 port->ier = IER_RCV;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
185 } else {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
186 port->ier = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
187 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
188 port->mcr = MCR_INT|MCR_DTR|MCR_RTS; // Master interrupt enable
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
189 } else {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
190 port->ier = _ier;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
191 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
192 if (new_config != &chan->config) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
193 chan->config = *new_config;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
194 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
195 return true;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
196 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
197
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
198 // Function to initialize the device. Called at bootstrap time.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
199 static bool
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
200 pid_serial_init(struct cyg_devtab_entry *tab)
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 serial_channel *chan = (serial_channel *)tab->priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
203 pid_serial_info *pid_chan = (pid_serial_info *)chan->dev_priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
204 #ifdef CYGDBG_IO_INIT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
205 diag_printf("PID SERIAL init - dev: %x.%d\n", pid_chan->base, pid_chan->int_num);
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 (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
208 if (chan->out_cbuf.len != 0) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
209 cyg_drv_interrupt_create(pid_chan->int_num,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
210 99, // Priority - what goes here?
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
211 (cyg_addrword_t)chan, // Data item passed to interrupt handler
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
212 pid_serial_ISR,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
213 pid_serial_DSR,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
214 &pid_chan->serial_interrupt_handle,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
215 &pid_chan->serial_interrupt);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
216 cyg_drv_interrupt_attach(pid_chan->serial_interrupt_handle);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
217 cyg_drv_interrupt_unmask(pid_chan->int_num);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
218 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
219 pid_serial_config_port(chan, &chan->config, true);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
220 return true;
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 // 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
224 static Cyg_ErrNo
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
225 pid_serial_lookup(struct cyg_devtab_entry **tab,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
226 struct cyg_devtab_entry *sub_tab,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
227 const char *name)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
228 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
229 serial_channel *chan = (serial_channel *)(*tab)->priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
230 (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
231 return ENOERR;
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 // Send a character to the device output buffer.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
235 // Return 'true' if character is sent to device
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
236 static bool
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
237 pid_serial_putc(serial_channel *chan, unsigned char c)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
238 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
239 pid_serial_info *pid_chan = (pid_serial_info *)chan->dev_priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
240 volatile struct serial_port *port = (volatile struct serial_port *)pid_chan->base;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
241 if (port->lsr & LSR_THE) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
242 // Transmit buffer is empty
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
243 port->thr = c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
244 return true;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
245 } else {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
246 // No space
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
247 return false;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
248 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
249 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
250
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
251 // Fetch a character from the device input buffer, waiting if necessary
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
252 static unsigned char
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
253 pid_serial_getc(serial_channel *chan)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
254 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
255 unsigned char c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
256 pid_serial_info *pid_chan = (pid_serial_info *)chan->dev_priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
257 volatile struct serial_port *port = (volatile struct serial_port *)pid_chan->base;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
258 while ((port->lsr & LSR_RSR) == 0) ; // Wait for char
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
259 c = port->rhr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
260 return c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
261 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
262
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
263 // Set up the device characteristics; baud rate, etc.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
264 static bool
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
265 pid_serial_set_config(serial_channel *chan, cyg_serial_info_t *config)
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 return pid_serial_config_port(chan, config, false);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
268 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
269
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
270 // Enable the transmitter on the device
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
271 static void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
272 pid_serial_start_xmit(serial_channel *chan)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
273 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
274 pid_serial_info *pid_chan = (pid_serial_info *)chan->dev_priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
275 volatile struct serial_port *port = (volatile struct serial_port *)pid_chan->base;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
276 port->ier |= IER_XMT; // Enable xmit interrupt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
277 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
278
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
279 // Disable the transmitter on the device
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
280 static void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
281 pid_serial_stop_xmit(serial_channel *chan)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
282 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
283 pid_serial_info *pid_chan = (pid_serial_info *)chan->dev_priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
284 volatile struct serial_port *port = (volatile struct serial_port *)pid_chan->base;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
285 port->ier &= ~IER_XMT; // Disable xmit interrupt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
286 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
287
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
288 // Serial I/O - low level interrupt handler (ISR)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
289 static cyg_uint32
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
290 pid_serial_ISR(cyg_vector_t vector, cyg_addrword_t data)
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 serial_channel *chan = (serial_channel *)data;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
293 pid_serial_info *pid_chan = (pid_serial_info *)chan->dev_priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
294 cyg_drv_interrupt_mask(pid_chan->int_num);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
295 cyg_drv_interrupt_acknowledge(pid_chan->int_num);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
296 return CYG_ISR_CALL_DSR; // Cause DSR to be run
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
297 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
298
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
299 // Serial I/O - high level interrupt handler (DSR)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
300 static void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
301 pid_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
302 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
303 serial_channel *chan = (serial_channel *)data;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
304 pid_serial_info *pid_chan = (pid_serial_info *)chan->dev_priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
305 volatile struct serial_port *port = (volatile struct serial_port *)pid_chan->base;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
306 unsigned char isr;
58
6e51d764f8f1 Merge from eCos master repository on 1999-12-10-07:47:04-GMT
jlarmour
parents: 48
diff changeset
307 while ((isr = port->isr & 0x0E) != 0) {
6e51d764f8f1 Merge from eCos master repository on 1999-12-10-07:47:04-GMT
jlarmour
parents: 48
diff changeset
308 if (isr == ISR_Tx) {
6e51d764f8f1 Merge from eCos master repository on 1999-12-10-07:47:04-GMT
jlarmour
parents: 48
diff changeset
309 (chan->callbacks->xmt_char)(chan);
6e51d764f8f1 Merge from eCos master repository on 1999-12-10-07:47:04-GMT
jlarmour
parents: 48
diff changeset
310 } else if (isr == ISR_RxTO) {
6e51d764f8f1 Merge from eCos master repository on 1999-12-10-07:47:04-GMT
jlarmour
parents: 48
diff changeset
311 (chan->callbacks->rcv_char)(chan, port->rhr);
6e51d764f8f1 Merge from eCos master repository on 1999-12-10-07:47:04-GMT
jlarmour
parents: 48
diff changeset
312 } else if (isr == ISR_Rx) {
6e51d764f8f1 Merge from eCos master repository on 1999-12-10-07:47:04-GMT
jlarmour
parents: 48
diff changeset
313 (chan->callbacks->rcv_char)(chan, port->rhr);
6e51d764f8f1 Merge from eCos master repository on 1999-12-10-07:47:04-GMT
jlarmour
parents: 48
diff changeset
314 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
315 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
316 cyg_drv_interrupt_unmask(pid_chan->int_num);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
317 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
318 #endif