Mercurial > ecos-v2_0-branch
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 |
| 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 |
