annotate packages/io/serial/current/src/arm/edb7xxx_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 f10165814f1e
children c38311975d4f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
54
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
1 //==========================================================================
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
2 //
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
3 // io/serial/arm/edb7xxx_serial.c
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
4 //
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
5 // Cirrus Logic EDB7XXX Serial I/O Interface Module (interrupt driven)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
6 //
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
7 //==========================================================================
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
8 //####COPYRIGHTBEGIN####
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
9 //
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
10 // -------------------------------------------
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
11 // The contents of this file are subject to the Cygnus eCos Public License
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
12 // Version 1.0 (the "License"); you may not use this file except in
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
14 // http://sourceware.cygnus.com/ecos
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
15 //
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
18 // License for the specific language governing rights and limitations under
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
19 // the License.
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
20 //
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
21 // The Original Code is eCos - Embedded Cygnus Operating System, released
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
22 // September 30, 1998.
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
23 //
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
24 // The Initial Developer of the Original Code is Cygnus. Portions created
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
25 // by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions. All Rights Reserved.
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
26 // -------------------------------------------
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
27 //
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
28 //####COPYRIGHTEND####
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
29 //==========================================================================
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
30 //#####DESCRIPTIONBEGIN####
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
31 //
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
32 // Author(s): gthomas
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
33 // Contributors: gthomas
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
34 // Date: 1999-02-04
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
35 // Purpose: EDB7XXX Serial I/O module (interrupt driven version)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
36 // Description:
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
37 //
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
38 //####DESCRIPTIONEND####
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
39 //
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
40 //==========================================================================
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
41
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
42 #include <pkgconf/system.h>
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
43 #include <pkgconf/io_serial.h>
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
44 #include <pkgconf/io.h>
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
45 #include <cyg/io/io.h>
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
46 #include <cyg/hal/hal_intr.h>
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
47 #include <cyg/io/devtab.h>
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
48 #include <cyg/io/serial.h>
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
49 #include <cyg/infra/diag.h>
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
50
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
51 #ifdef CYGPKG_IO_SERIAL_ARM_EDB7XXX
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
52
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
53 #include "edb7xxx_serial.h"
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
54
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
55 typedef struct edb7xxx_serial_info {
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
56 CYG_ADDRWORD data, // Pointer to data register
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
57 control, // Pointer to baud rate/line control register
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
58 stat, // Pointer to system flags for this port
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
59 syscon; // Pointer to system control for this port
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
60 CYG_WORD tx_int_num, // Transmit interrupt number
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
61 rx_int_num, // Receive interrupt number
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
62 ms_int_num; // Modem Status Change interrupt number
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
63 cyg_interrupt serial_tx_interrupt,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
64 serial_rx_interrupt,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
65 serial_ms_interrupt;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
66 cyg_handle_t serial_tx_interrupt_handle,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
67 serial_rx_interrupt_handle,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
68 serial_ms_interrupt_handle;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
69 bool tx_enabled;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
70 } edb7xxx_serial_info;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
71
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
72 static bool edb7xxx_serial_init(struct cyg_devtab_entry *tab);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
73 static bool edb7xxx_serial_putc(serial_channel *chan, unsigned char c);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
74 static Cyg_ErrNo edb7xxx_serial_lookup(struct cyg_devtab_entry **tab,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
75 struct cyg_devtab_entry *sub_tab,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
76 const char *name);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
77 static unsigned char edb7xxx_serial_getc(serial_channel *chan);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
78 static bool edb7xxx_serial_set_config(serial_channel *chan, cyg_serial_info_t *config);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
79 static void edb7xxx_serial_start_xmit(serial_channel *chan);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
80 static void edb7xxx_serial_stop_xmit(serial_channel *chan);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
81
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
82 static cyg_uint32 edb7xxx_serial_tx_ISR(cyg_vector_t vector, cyg_addrword_t data);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
83 static void edb7xxx_serial_tx_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
84 static cyg_uint32 edb7xxx_serial_rx_ISR(cyg_vector_t vector, cyg_addrword_t data);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
85 static void edb7xxx_serial_rx_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
86 static cyg_uint32 edb7xxx_serial_ms_ISR(cyg_vector_t vector, cyg_addrword_t data);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
87 static void edb7xxx_serial_ms_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
88
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
89 static SERIAL_FUNS(edb7xxx_serial_funs,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
90 edb7xxx_serial_putc,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
91 edb7xxx_serial_getc,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
92 edb7xxx_serial_set_config,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
93 edb7xxx_serial_start_xmit,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
94 edb7xxx_serial_stop_xmit
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
95 );
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
96
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
97 #ifdef CYGPKG_IO_SERIAL_ARM_EDB7XXX_SERIAL1
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
98 static edb7xxx_serial_info edb7xxx_serial_info1 = {UARTDR1, // Data register
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
99 UBLCR1, // Port control
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
100 SYSFLG1, // Status
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
101 SYSCON1, // System config
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
102 CYGNUM_HAL_INTERRUPT_UTXINT1, // Tx interrupt
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
103 CYGNUM_HAL_INTERRUPT_URXINT1, // Rx interrupt
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
104 0 /*CYGNUM_HAL_INTERRUPT_UMSINT*/}; // Modem control
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
105 #if CYGNUM_IO_SERIAL_ARM_EDB7XXX_SERIAL1_BUFSIZE > 0
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
106 static unsigned char edb7xxx_serial_out_buf1[CYGNUM_IO_SERIAL_ARM_EDB7XXX_SERIAL1_BUFSIZE];
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
107 static unsigned char edb7xxx_serial_in_buf1[CYGNUM_IO_SERIAL_ARM_EDB7XXX_SERIAL1_BUFSIZE];
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
108
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
109 static SERIAL_CHANNEL_USING_INTERRUPTS(edb7xxx_serial_channel1,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
110 edb7xxx_serial_funs,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
111 edb7xxx_serial_info1,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
112 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_EDB7XXX_SERIAL1_BAUD),
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
113 CYG_SERIAL_STOP_DEFAULT,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
114 CYG_SERIAL_PARITY_DEFAULT,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
115 CYG_SERIAL_WORD_LENGTH_DEFAULT,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
116 CYG_SERIAL_FLAGS_DEFAULT,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
117 &edb7xxx_serial_out_buf1[0], sizeof(edb7xxx_serial_out_buf1),
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
118 &edb7xxx_serial_in_buf1[0], sizeof(edb7xxx_serial_in_buf1)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
119 );
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
120 #else
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
121 static SERIAL_CHANNEL(edb7xxx_serial_channel1,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
122 edb7xxx_serial_funs,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
123 edb7xxx_serial_info1,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
124 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_EDB7XXX_SERIAL1_BAUD),
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
125 CYG_SERIAL_STOP_DEFAULT,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
126 CYG_SERIAL_PARITY_DEFAULT,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
127 CYG_SERIAL_WORD_LENGTH_DEFAULT,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
128 CYG_SERIAL_FLAGS_DEFAULT
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
129 );
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
130 #endif
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
131
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
132 DEVTAB_ENTRY(edb7xxx_serial_io1,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
133 CYGDAT_IO_SERIAL_ARM_EDB7XXX_SERIAL1_NAME,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
134 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: 54
diff changeset
135 &cyg_io_serial_devio,
54
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
136 edb7xxx_serial_init,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
137 edb7xxx_serial_lookup, // Serial driver may need initializing
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
138 &edb7xxx_serial_channel1
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
139 );
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
140 #endif // CYGPKG_IO_SERIAL_ARM_EDB7XXX_SERIAL2
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
141
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
142 #ifdef CYGPKG_IO_SERIAL_ARM_EDB7XXX_SERIAL2
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
143 static edb7xxx_serial_info edb7xxx_serial_info2 = {UARTDR2, // Data register
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
144 UBLCR2, // Port control
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
145 SYSFLG2, // Status
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
146 SYSCON2, // System config
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
147 CYGNUM_HAL_INTERRUPT_UTXINT2, // Tx interrupt
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
148 CYGNUM_HAL_INTERRUPT_URXINT2, // Rx interrupt
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
149 0}; // No modem control
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
150 #if CYGNUM_IO_SERIAL_ARM_EDB7XXX_SERIAL2_BUFSIZE > 0
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
151 static unsigned char edb7xxx_serial_out_buf2[CYGNUM_IO_SERIAL_ARM_EDB7XXX_SERIAL2_BUFSIZE];
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
152 static unsigned char edb7xxx_serial_in_buf2[CYGNUM_IO_SERIAL_ARM_EDB7XXX_SERIAL2_BUFSIZE];
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
153
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
154 static SERIAL_CHANNEL_USING_INTERRUPTS(edb7xxx_serial_channel2,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
155 edb7xxx_serial_funs,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
156 edb7xxx_serial_info2,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
157 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_EDB7XXX_SERIAL2_BAUD),
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
158 CYG_SERIAL_STOP_DEFAULT,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
159 CYG_SERIAL_PARITY_DEFAULT,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
160 CYG_SERIAL_WORD_LENGTH_DEFAULT,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
161 CYG_SERIAL_FLAGS_DEFAULT,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
162 &edb7xxx_serial_out_buf2[0], sizeof(edb7xxx_serial_out_buf2),
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
163 &edb7xxx_serial_in_buf2[0], sizeof(edb7xxx_serial_in_buf2)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
164 );
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
165 #else
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
166 static SERIAL_CHANNEL(edb7xxx_serial_channel2,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
167 edb7xxx_serial_funs,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
168 edb7xxx_serial_info2,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
169 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_EDB7XXX_SERIAL2_BAUD),
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
170 CYG_SERIAL_STOP_DEFAULT,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
171 CYG_SERIAL_PARITY_DEFAULT,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
172 CYG_SERIAL_WORD_LENGTH_DEFAULT,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
173 CYG_SERIAL_FLAGS_DEFAULT
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
174 );
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
175 #endif
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
176
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
177 DEVTAB_ENTRY(edb7xxx_serial_io2,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
178 CYGDAT_IO_SERIAL_ARM_EDB7XXX_SERIAL2_NAME,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
179 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: 54
diff changeset
180 &cyg_io_serial_devio,
54
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
181 edb7xxx_serial_init,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
182 edb7xxx_serial_lookup, // Serial driver may need initializing
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
183 &edb7xxx_serial_channel2
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
184 );
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
185 #endif // CYGPKG_IO_SERIAL_ARM_EDB7XXX_SERIAL2
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
186
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
187 // Internal function to actually configure the hardware to desired baud rate, etc.
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
188 static bool
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
189 edb7xxx_serial_config_port(serial_channel *chan, cyg_serial_info_t *new_config, bool init)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
190 {
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
191 edb7xxx_serial_info *edb7xxx_chan = (edb7xxx_serial_info *)chan->dev_priv;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
192 volatile cyg_uint32 *syscon = (volatile cyg_uint32 *)edb7xxx_chan->syscon;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
193 volatile cyg_uint32 *blcfg = (volatile cyg_uint32 *)edb7xxx_chan->control;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
194 unsigned int baud_divisor = select_baud[new_config->baud];
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
195 cyg_uint32 _lcr;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
196 if (baud_divisor == 0) return false;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
197 // Disable port interrupts while changing hardware
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
198 _lcr = select_word_length[new_config->word_length - CYGNUM_SERIAL_WORD_LENGTH_5] |
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
199 select_stop_bits[new_config->stop] |
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
200 select_parity[new_config->parity] |
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
201 UBLCR_FIFOEN | UART_BITRATE(baud_divisor);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
202 #ifdef CYGDBG_IO_INIT
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
203 diag_printf("Set CTL: %x = %x\n", blcfg, _lcr);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
204 #endif
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
205 *blcfg = _lcr;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
206 *syscon |= SYSCON1_UART1EN;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
207 if (new_config != &chan->config) {
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
208 chan->config = *new_config;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
209 }
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
210 return true;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
211 }
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
212
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
213 // Function to initialize the device. Called at bootstrap time.
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
214 static bool
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
215 edb7xxx_serial_init(struct cyg_devtab_entry *tab)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
216 {
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
217 serial_channel *chan = (serial_channel *)tab->priv;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
218 edb7xxx_serial_info *edb7xxx_chan = (edb7xxx_serial_info *)chan->dev_priv;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
219 #ifdef CYGDBG_IO_INIT
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
220 diag_printf("EDB7XXX SERIAL init - dev: %x.%d\n", edb7xxx_chan->control, edb7xxx_chan->tx_int_num);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
221 #endif
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
222 (chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
223 if (chan->out_cbuf.len != 0) {
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
224 cyg_drv_interrupt_create(edb7xxx_chan->tx_int_num,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
225 99, // Priority - unused
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
226 (cyg_addrword_t)chan, // Data item passed to interrupt handler
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
227 edb7xxx_serial_tx_ISR,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
228 edb7xxx_serial_tx_DSR,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
229 &edb7xxx_chan->serial_tx_interrupt_handle,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
230 &edb7xxx_chan->serial_tx_interrupt);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
231 cyg_drv_interrupt_attach(edb7xxx_chan->serial_tx_interrupt_handle);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
232 cyg_drv_interrupt_mask(edb7xxx_chan->tx_int_num);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
233 edb7xxx_chan->tx_enabled = false;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
234 }
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
235 if (chan->in_cbuf.len != 0) {
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
236 cyg_drv_interrupt_create(edb7xxx_chan->rx_int_num,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
237 99, // Priority - unused
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
238 (cyg_addrword_t)chan, // Data item passed to interrupt handler
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
239 edb7xxx_serial_rx_ISR,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
240 edb7xxx_serial_rx_DSR,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
241 &edb7xxx_chan->serial_rx_interrupt_handle,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
242 &edb7xxx_chan->serial_rx_interrupt);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
243 cyg_drv_interrupt_attach(edb7xxx_chan->serial_rx_interrupt_handle);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
244 cyg_drv_interrupt_unmask(edb7xxx_chan->rx_int_num);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
245 }
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
246 edb7xxx_serial_config_port(chan, &chan->config, true);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
247 return true;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
248 }
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
249
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
250 // This routine is called when the device is "looked" up (i.e. attached)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
251 static Cyg_ErrNo
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
252 edb7xxx_serial_lookup(struct cyg_devtab_entry **tab,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
253 struct cyg_devtab_entry *sub_tab,
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
254 const char *name)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
255 {
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
256 serial_channel *chan = (serial_channel *)(*tab)->priv;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
257 (chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
258 return ENOERR;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
259 }
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
260
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
261 // Send a character to the device output buffer.
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
262 // Return 'true' if character is sent to device
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
263 static bool
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
264 edb7xxx_serial_putc(serial_channel *chan, unsigned char c)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
265 {
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
266 edb7xxx_serial_info *edb7xxx_chan = (edb7xxx_serial_info *)chan->dev_priv;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
267 volatile cyg_uint8 *data = (volatile cyg_uint8 *)edb7xxx_chan->data;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
268 volatile cyg_uint32 *stat = (volatile cyg_uint32 *)edb7xxx_chan->stat;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
269 if ((*stat & SYSFLG1_UTXFF1) == 0) {
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
270 // Transmit buffer/FIFO is not full
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
271 *data = c;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
272 return true;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
273 } else {
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
274 // No space
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
275 return false;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
276 }
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
277 }
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
278
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
279 // Fetch a character from the device input buffer, waiting if necessary
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
280 static unsigned char
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
281 edb7xxx_serial_getc(serial_channel *chan)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
282 {
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
283 unsigned char c;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
284 edb7xxx_serial_info *edb7xxx_chan = (edb7xxx_serial_info *)chan->dev_priv;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
285 volatile cyg_uint32 *data = (volatile cyg_uint32 *)edb7xxx_chan->data;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
286 volatile cyg_uint32 *stat = (volatile cyg_uint32 *)edb7xxx_chan->stat;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
287 while (*stat & SYSFLG1_URXFE1) ; // Wait for char
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
288 c = *data;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
289 return c;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
290 }
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
291
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
292 // Set up the device characteristics; baud rate, etc.
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
293 static bool
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
294 edb7xxx_serial_set_config(serial_channel *chan, cyg_serial_info_t *config)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
295 {
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
296 return edb7xxx_serial_config_port(chan, config, false);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
297 }
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
298
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
299 // Enable the transmitter (interrupt) on the device
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
300 static void
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
301 edb7xxx_serial_start_xmit(serial_channel *chan)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
302 {
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
303 edb7xxx_serial_info *edb7xxx_chan = (edb7xxx_serial_info *)chan->dev_priv;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
304 edb7xxx_chan->tx_enabled = true;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
305 cyg_drv_interrupt_unmask(edb7xxx_chan->tx_int_num);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
306 }
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
307
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
308 // Disable the transmitter on the device
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
309 static void
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
310 edb7xxx_serial_stop_xmit(serial_channel *chan)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
311 {
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
312 edb7xxx_serial_info *edb7xxx_chan = (edb7xxx_serial_info *)chan->dev_priv;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
313 cyg_drv_interrupt_mask(edb7xxx_chan->tx_int_num);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
314 edb7xxx_chan->tx_enabled = false;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
315 }
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
316
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
317 // Serial I/O - low level Tx interrupt handler (ISR)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
318 static cyg_uint32
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
319 edb7xxx_serial_tx_ISR(cyg_vector_t vector, cyg_addrword_t data)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
320 {
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
321 serial_channel *chan = (serial_channel *)data;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
322 edb7xxx_serial_info *edb7xxx_chan = (edb7xxx_serial_info *)chan->dev_priv;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
323 cyg_drv_interrupt_mask(edb7xxx_chan->tx_int_num);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
324 cyg_drv_interrupt_acknowledge(edb7xxx_chan->tx_int_num);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
325 return CYG_ISR_CALL_DSR; // Cause DSR to be run
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
326 }
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
327
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
328 // Serial I/O - high level Tx interrupt handler (DSR)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
329 static void
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
330 edb7xxx_serial_tx_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
331 {
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
332 serial_channel *chan = (serial_channel *)data;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
333 edb7xxx_serial_info *edb7xxx_chan = (edb7xxx_serial_info *)chan->dev_priv;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
334 (chan->callbacks->xmt_char)(chan);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
335 if (edb7xxx_chan->tx_enabled) {
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
336 cyg_drv_interrupt_unmask(edb7xxx_chan->tx_int_num);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
337 }
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
338 }
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
339
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
340 // Serial I/O - low level Rx interrupt handler (ISR)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
341 static cyg_uint32
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
342 edb7xxx_serial_rx_ISR(cyg_vector_t vector, cyg_addrword_t data)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
343 {
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
344 serial_channel *chan = (serial_channel *)data;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
345 edb7xxx_serial_info *edb7xxx_chan = (edb7xxx_serial_info *)chan->dev_priv;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
346 cyg_drv_interrupt_mask(edb7xxx_chan->rx_int_num);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
347 cyg_drv_interrupt_acknowledge(edb7xxx_chan->rx_int_num);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
348 return CYG_ISR_CALL_DSR; // Cause DSR to be run
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
349 }
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
350
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
351 // Serial I/O - high level Rx interrupt handler (DSR)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
352 static void
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
353 edb7xxx_serial_rx_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
354 {
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
355 serial_channel *chan = (serial_channel *)data;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
356 edb7xxx_serial_info *edb7xxx_chan = (edb7xxx_serial_info *)chan->dev_priv;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
357 volatile cyg_uint32 *datreg = (volatile cyg_uint32 *)edb7xxx_chan->data;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
358 volatile cyg_uint32 *stat = (volatile cyg_uint32 *)edb7xxx_chan->stat;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
359 while (!(*stat & SYSFLG1_URXFE1))
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
360 (chan->callbacks->rcv_char)(chan, *datreg);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
361 cyg_drv_interrupt_unmask(edb7xxx_chan->rx_int_num);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
362 }
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
363
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
364 // Serial I/O - low level Ms interrupt handler (ISR)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
365 static cyg_uint32
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
366 edb7xxx_serial_ms_ISR(cyg_vector_t vector, cyg_addrword_t data)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
367 {
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
368 serial_channel *chan = (serial_channel *)data;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
369 edb7xxx_serial_info *edb7xxx_chan = (edb7xxx_serial_info *)chan->dev_priv;
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
370 cyg_drv_interrupt_mask(edb7xxx_chan->ms_int_num);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
371 cyg_drv_interrupt_acknowledge(edb7xxx_chan->ms_int_num);
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
372 return CYG_ISR_CALL_DSR; // Cause DSR to be run
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
373 }
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
374
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
375 // Serial I/O - high level Ms interrupt handler (DSR)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
376 static void
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
377 edb7xxx_serial_ms_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data)
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
378 {
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
379 }
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
380 #endif // CYGPKG_IO_SERIAL_ARM_EDB7XXX
f10165814f1e Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
diff changeset
381