annotate packages/io/serial/current/src/arm/cma230_serial.c @ 62:7a6ac9edc838 ecos-sw-2000-01-24

Merge from eCos master repository on 2000-01-24-19:43:49-GMT
author jlarmour
date Mon, 24 Jan 2000 21:43:17 +0000
parents 797268ecc331
children c38311975d4f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
1 //==========================================================================
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
2 //
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
3 // io/serial/arm/cma230_serial.c
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
4 //
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
5 // Cogent CMA230 Serial I/O Interface Module (interrupt driven)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
6 //
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
7 //==========================================================================
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
8 //####COPYRIGHTBEGIN####
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
9 //
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
10 // -------------------------------------------
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
11 // The contents of this file are subject to the Cygnus eCos Public License
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
12 // Version 1.0 (the "License"); you may not use this file except in
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
14 // http://sourceware.cygnus.com/ecos
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
15 //
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
18 // License for the specific language governing rights and limitations under
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
19 // the License.
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
20 //
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
21 // The Original Code is eCos - Embedded Cygnus Operating System, released
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
22 // September 30, 1998.
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
23 //
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
24 // The Initial Developer of the Original Code is Cygnus. Portions created
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
25 // by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions. All Rights Reserved.
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
26 // -------------------------------------------
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
27 //
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
28 //####COPYRIGHTEND####
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
29 //==========================================================================
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
30 //#####DESCRIPTIONBEGIN####
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
31 //
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
32 // Author(s): gthomas
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
33 // Contributors: gthomas
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
34 // Date: 1999-02-04
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
35 // Purpose: CMA230 Serial I/O module (interrupt driven version)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
36 // Description:
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
37 //
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
38 //####DESCRIPTIONEND####
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
39 //
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
40 //==========================================================================
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
41
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
42 #include <pkgconf/system.h>
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
43 #include <pkgconf/io_serial.h>
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
44 #include <pkgconf/io.h>
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
45 #include <cyg/io/io.h>
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
46 #include <cyg/hal/hal_intr.h>
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
47 #include <cyg/io/devtab.h>
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
48 #include <cyg/io/serial.h>
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
49 #include <cyg/hal/hal_cma230.h>
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
50 #include <cyg/infra/diag.h>
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
51
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
52 #ifdef CYGPKG_IO_SERIAL_ARM_CMA230
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
53
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
54 #include "cma230_serial.h"
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
55
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
56 typedef struct cma230_serial_info {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
57 CYG_ADDRWORD base;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
58 CYG_WORD int_num;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
59 cyg_interrupt serial_interrupt;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
60 cyg_handle_t serial_interrupt_handle;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
61 } cma230_serial_info;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
62
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
63 static bool cma230_serial_init(struct cyg_devtab_entry *tab);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
64 static bool cma230_serial_putc(serial_channel *chan, unsigned char c);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
65 static Cyg_ErrNo cma230_serial_lookup(struct cyg_devtab_entry **tab,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
66 struct cyg_devtab_entry *sub_tab,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
67 const char *name);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
68 static unsigned char cma230_serial_getc(serial_channel *chan);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
69 static bool cma230_serial_set_config(serial_channel *chan, cyg_serial_info_t *config);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
70 static void cma230_serial_start_xmit(serial_channel *chan);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
71 static void cma230_serial_stop_xmit(serial_channel *chan);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
72
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
73 static cyg_uint32 cma230_serial_ISR(cyg_vector_t vector, cyg_addrword_t data);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
74 static void cma230_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
75
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
76 static SERIAL_FUNS(cma230_serial_funs,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
77 cma230_serial_putc,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
78 cma230_serial_getc,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
79 cma230_serial_set_config,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
80 cma230_serial_start_xmit,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
81 cma230_serial_stop_xmit
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
82 );
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
83
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
84 #ifdef CYGPKG_IO_SERIAL_ARM_CMA230_SERIAL_A
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
85 static cma230_serial_info cma230_serial_info0 = {CMA101_DUARTA,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
86 CYGNUM_HAL_INTERRUPT_SERIAL_A};
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
87 #if CYGNUM_IO_SERIAL_ARM_CMA230_SERIAL_A_BUFSIZE > 0
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
88 static unsigned char cma230_serial_out_buf0[CYGNUM_IO_SERIAL_ARM_CMA230_SERIAL_A_BUFSIZE];
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
89 static unsigned char cma230_serial_in_buf0[CYGNUM_IO_SERIAL_ARM_CMA230_SERIAL_A_BUFSIZE];
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
90
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
91 static SERIAL_CHANNEL_USING_INTERRUPTS(cma230_serial_channel0,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
92 cma230_serial_funs,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
93 cma230_serial_info0,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
94 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_CMA230_SERIAL_A_BAUD),
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
95 CYG_SERIAL_STOP_DEFAULT,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
96 CYG_SERIAL_PARITY_DEFAULT,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
97 CYG_SERIAL_WORD_LENGTH_DEFAULT,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
98 CYG_SERIAL_FLAGS_DEFAULT,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
99 &cma230_serial_out_buf0[0], sizeof(cma230_serial_out_buf0),
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
100 &cma230_serial_in_buf0[0], sizeof(cma230_serial_in_buf0)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
101 );
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
102 #else
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
103 static SERIAL_CHANNEL(cma230_serial_channel0,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
104 cma230_serial_funs,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
105 cma230_serial_info0,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
106 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_CMA230_SERIAL_A_BAUD),
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
107 CYG_SERIAL_STOP_DEFAULT,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
108 CYG_SERIAL_PARITY_DEFAULT,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
109 CYG_SERIAL_WORD_LENGTH_DEFAULT,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
110 CYG_SERIAL_FLAGS_DEFAULT
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
111 );
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
112 #endif
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
113
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
114 DEVTAB_ENTRY(cma230_serial_io0,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
115 CYGDAT_IO_SERIAL_ARM_CMA230_SERIAL_A_NAME,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
116 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: 46
diff changeset
117 &cyg_io_serial_devio,
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
118 cma230_serial_init,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
119 cma230_serial_lookup, // Serial driver may need initializing
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
120 &cma230_serial_channel0
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
121 );
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
122 #endif // CYGPKG_IO_SERIAL_ARM_CMA230_SERIAL_A
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
123
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
124 #ifdef CYGPKG_IO_SERIAL_ARM_CMA230_SERIAL_B
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
125 static cma230_serial_info cma230_serial_info1 = {CMA101_DUARTB,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
126 CYGNUM_HAL_INTERRUPT_SERIAL_B};
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
127 #if CYGNUM_IO_SERIAL_ARM_CMA230_SERIAL_B_BUFSIZE > 0
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
128 static unsigned char cma230_serial_out_buf1[CYGNUM_IO_SERIAL_ARM_CMA230_SERIAL_B_BUFSIZE];
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
129 static unsigned char cma230_serial_in_buf1[CYGNUM_IO_SERIAL_ARM_CMA230_SERIAL_B_BUFSIZE];
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
130
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
131 static SERIAL_CHANNEL_USING_INTERRUPTS(cma230_serial_channel1,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
132 cma230_serial_funs,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
133 cma230_serial_info1,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
134 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_CMA230_SERIAL_B_BAUD),
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
135 CYG_SERIAL_STOP_DEFAULT,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
136 CYG_SERIAL_PARITY_DEFAULT,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
137 CYG_SERIAL_WORD_LENGTH_DEFAULT,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
138 CYG_SERIAL_FLAGS_DEFAULT,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
139 &cma230_serial_out_buf1[0], sizeof(cma230_serial_out_buf1),
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
140 &cma230_serial_in_buf1[0], sizeof(cma230_serial_in_buf1)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
141 );
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
142 #else
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
143 static SERIAL_CHANNEL(cma230_serial_channel1,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
144 cma230_serial_funs,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
145 cma230_serial_info1,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
146 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_CMA230_SERIAL_B_BAUD),
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
147 CYG_SERIAL_STOP_DEFAULT,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
148 CYG_SERIAL_PARITY_DEFAULT,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
149 CYG_SERIAL_WORD_LENGTH_DEFAULT,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
150 CYG_SERIAL_FLAGS_DEFAULT
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
151 );
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
152 #endif
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
153
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
154 DEVTAB_ENTRY(cma230_serial_io1,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
155 CYGDAT_IO_SERIAL_ARM_CMA230_SERIAL_B_NAME,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
156 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: 46
diff changeset
157 &cyg_io_serial_devio,
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
158 cma230_serial_init,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
159 cma230_serial_lookup, // Serial driver may need initializing
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
160 &cma230_serial_channel1
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
161 );
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
162 #endif // CYGPKG_IO_SERIAL_ARM_CMA230_SERIAL_B
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
163
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
164 // Internal function to actually configure the hardware to desired baud rate, etc.
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
165 static bool
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
166 cma230_serial_config_port(serial_channel *chan, cyg_serial_info_t *new_config, bool init)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
167 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
168 cma230_serial_info *cma230_chan = (cma230_serial_info *)chan->dev_priv;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
169 volatile struct serial_port *port = (volatile struct serial_port *)cma230_chan->base;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
170 unsigned short baud_divisor = select_baud[new_config->baud];
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
171 unsigned char _lcr, _ier;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
172 if (baud_divisor == 0) return false; // Invalid configuration
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
173 _ier = port->ier;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
174 port->ier = 0; // Disable port interrupts while changing hardware
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
175 _lcr = select_word_length[new_config->word_length - CYGNUM_SERIAL_WORD_LENGTH_5] |
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
176 select_stop_bits[new_config->stop] |
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
177 select_parity[new_config->parity];
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
178 port->lcr = _lcr;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
179 port->lcr |= LCR_DL;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
180 port->mdl = baud_divisor >> 8;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
181 port->ldl = baud_divisor & 0xFF;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
182 port->lcr &= ~LCR_DL;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
183 if (init) {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
184 port->fcr = 0x07; // Enable and clear FIFO
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
185 if (chan->out_cbuf.len != 0) {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
186 port->ier = IER_RCV;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
187 } else {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
188 port->ier = 0;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
189 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
190 port->mcr = MCR_INT|MCR_DTR|MCR_RTS; // Master interrupt enable
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
191 } else {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
192 port->ier = _ier;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
193 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
194 if (new_config != &chan->config) {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
195 chan->config = *new_config;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
196 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
197 return true;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
198 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
199
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
200 // Function to initialize the device. Called at bootstrap time.
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
201 static bool
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
202 cma230_serial_init(struct cyg_devtab_entry *tab)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
203 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
204 serial_channel *chan = (serial_channel *)tab->priv;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
205 cma230_serial_info *cma230_chan = (cma230_serial_info *)chan->dev_priv;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
206 #ifdef CYGDBG_IO_INIT
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
207 diag_printf("CMA230 SERIAL init - dev: %x.%d\n", cma230_chan->base, cma230_chan->int_num);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
208 #endif
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
209 (chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
210 if (chan->out_cbuf.len != 0) {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
211 cyg_drv_interrupt_create(cma230_chan->int_num,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
212 99, // Priority - what goes here?
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
213 (cyg_addrword_t)chan, // Data item passed to interrupt handler
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
214 cma230_serial_ISR,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
215 cma230_serial_DSR,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
216 &cma230_chan->serial_interrupt_handle,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
217 &cma230_chan->serial_interrupt);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
218 cyg_drv_interrupt_attach(cma230_chan->serial_interrupt_handle);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
219 cyg_drv_interrupt_unmask(cma230_chan->int_num);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
220 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
221 cma230_serial_config_port(chan, &chan->config, true);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
222 return true;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
223 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
224
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
225 // This routine is called when the device is "looked" up (i.e. attached)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
226 static Cyg_ErrNo
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
227 cma230_serial_lookup(struct cyg_devtab_entry **tab,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
228 struct cyg_devtab_entry *sub_tab,
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
229 const char *name)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
230 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
231 serial_channel *chan = (serial_channel *)(*tab)->priv;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
232 (chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
233 return ENOERR;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
234 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
235
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
236 // Send a character to the device output buffer.
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
237 // Return 'true' if character is sent to device
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
238 static bool
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
239 cma230_serial_putc(serial_channel *chan, unsigned char c)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
240 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
241 cma230_serial_info *cma230_chan = (cma230_serial_info *)chan->dev_priv;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
242 volatile struct serial_port *port = (volatile struct serial_port *)cma230_chan->base;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
243 if (port->lsr & LSR_THE) {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
244 // Transmit buffer is empty
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
245 port->thr = c;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
246 return true;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
247 } else {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
248 // No space
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
249 return false;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
250 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
251 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
252
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
253 // Fetch a character from the device input buffer, waiting if necessary
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
254 static unsigned char
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
255 cma230_serial_getc(serial_channel *chan)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
256 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
257 unsigned char c;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
258 cma230_serial_info *cma230_chan = (cma230_serial_info *)chan->dev_priv;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
259 volatile struct serial_port *port = (volatile struct serial_port *)cma230_chan->base;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
260 while ((port->lsr & LSR_RSR) == 0) ; // Wait for char
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
261 c = port->rhr;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
262 return c;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
263 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
264
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
265 // Set up the device characteristics; baud rate, etc.
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
266 static bool
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
267 cma230_serial_set_config(serial_channel *chan, cyg_serial_info_t *config)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
268 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
269 return cma230_serial_config_port(chan, config, false);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
270 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
271
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
272 // Enable the transmitter on the device
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
273 static void
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
274 cma230_serial_start_xmit(serial_channel *chan)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
275 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
276 cma230_serial_info *cma230_chan = (cma230_serial_info *)chan->dev_priv;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
277 volatile struct serial_port *port = (volatile struct serial_port *)cma230_chan->base;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
278 port->ier |= IER_XMT; // Enable xmit interrupt
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
279 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
280
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
281 // Disable the transmitter on the device
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
282 static void
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
283 cma230_serial_stop_xmit(serial_channel *chan)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
284 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
285 cma230_serial_info *cma230_chan = (cma230_serial_info *)chan->dev_priv;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
286 volatile struct serial_port *port = (volatile struct serial_port *)cma230_chan->base;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
287 port->ier &= ~IER_XMT; // Disable xmit interrupt
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
288 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
289
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
290 // Serial I/O - low level interrupt handler (ISR)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
291 static cyg_uint32
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
292 cma230_serial_ISR(cyg_vector_t vector, cyg_addrword_t data)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
293 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
294 serial_channel *chan = (serial_channel *)data;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
295 cma230_serial_info *cma230_chan = (cma230_serial_info *)chan->dev_priv;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
296 cyg_drv_interrupt_mask(cma230_chan->int_num);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
297 cyg_drv_interrupt_acknowledge(cma230_chan->int_num);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
298 return CYG_ISR_CALL_DSR; // Cause DSR to be run
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
299 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
300
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
301 // Serial I/O - high level interrupt handler (DSR)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
302 static void
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
303 cma230_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
304 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
305 serial_channel *chan = (serial_channel *)data;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
306 cma230_serial_info *cma230_chan = (cma230_serial_info *)chan->dev_priv;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
307 volatile struct serial_port *port = (volatile struct serial_port *)cma230_chan->base;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
308 unsigned char isr;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
309 isr = port->isr & 0x0E;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
310 if (isr == ISR_Tx) {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
311 (chan->callbacks->xmt_char)(chan);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
312 } else if (isr == ISR_Rx) {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
313 (chan->callbacks->rcv_char)(chan, port->rhr);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
314 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
315 cyg_drv_interrupt_unmask(cma230_chan->int_num);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
316 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
317 #endif