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