annotate packages/devs/serial/arm/sa11x0/current/src/sa11x0_serial.c @ 2729:74dbf4c3f2e1 after-copyright-change-20090129

Update all copyright banners to reflect FSF ownership; fix and improve licence text.
author jlarmour
date Thu, 29 Jan 2009 17:47:46 +0000
parents d2c90368aeef
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
1 //==========================================================================
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
2 //
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
3 // io/serial/arm/sa11x0/sa11x0_serial.c
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
4 //
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
5 // StrongARM SA11x0 Serial I/O Interface Module (interrupt driven)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
6 //
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
7 //==========================================================================
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
8 // ####ECOSGPLCOPYRIGHTBEGIN####
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
9 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 191
diff changeset
12 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
14 // the terms of the GNU General Public License as published by the Free
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
16 // version.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 191
diff changeset
17 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
19 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
21 // for more details.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 191
diff changeset
22 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
23 // You should have received a copy of the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
24 // along with eCos; if not, write to the Free Software Foundation, Inc.,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
25 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 191
diff changeset
26 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
27 // As a special exception, if other files instantiate templates or use
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
28 // macros or inline functions from this file, or you compile this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
29 // and link it with other works to produce a work based on this file,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
30 // this file does not by itself cause the resulting work to be covered by
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
31 // the GNU General Public License. However the source code for this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
32 // must still be made available in accordance with section (3) of the GNU
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
33 // General Public License v2.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 191
diff changeset
34 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
35 // This exception does not invalidate any other reasons why a work based
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
36 // on this file might be covered by the GNU General Public License.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
37 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
38 // ####ECOSGPLCOPYRIGHTEND####
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
39 //==========================================================================
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
40 //#####DESCRIPTIONBEGIN####
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
41 //
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
42 // Author(s): gthomas
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
43 // Contributors: gthomas
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
44 // Date: 2000-05-08
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
45 // Purpose: StrongARM SA11x0 Serial I/O module (interrupt driven version)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
46 // Description:
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
47 //
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
48 //####DESCRIPTIONEND####
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
49 //
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
50 //==========================================================================
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
51
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
52 #include <pkgconf/system.h>
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
53 #include <pkgconf/io_serial.h>
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
54 #include <pkgconf/io.h>
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
55 #include <pkgconf/kernel.h>
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
56
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
57 #include <cyg/io/io.h>
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
58 #include <cyg/hal/hal_intr.h>
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
59 #include <cyg/io/devtab.h>
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
60 #include <cyg/io/serial.h>
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
61 #include <cyg/infra/diag.h>
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
62
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
63 #ifdef CYGPKG_IO_SERIAL_ARM_SA11X0
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
64
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
65 #include "sa11x0_serial.h"
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
66
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
67 typedef struct sa11x0_serial_info {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
68 CYG_ADDRWORD base;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
69 CYG_WORD int_num;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
70 cyg_interrupt serial_interrupt;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
71 cyg_handle_t serial_interrupt_handle;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
72 } sa11x0_serial_info;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
73
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
74 static bool sa11x0_serial_init(struct cyg_devtab_entry *tab);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
75 static bool sa11x0_serial_putc(serial_channel *chan, unsigned char c);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
76 static Cyg_ErrNo sa11x0_serial_lookup(struct cyg_devtab_entry **tab,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
77 struct cyg_devtab_entry *sub_tab,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
78 const char *name);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
79 static unsigned char sa11x0_serial_getc(serial_channel *chan);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 108
diff changeset
80 static Cyg_ErrNo sa11x0_serial_set_config(serial_channel *chan, cyg_uint32 key,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 108
diff changeset
81 const void *xbuf, cyg_uint32 *len);
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
82 static void sa11x0_serial_start_xmit(serial_channel *chan);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
83 static void sa11x0_serial_stop_xmit(serial_channel *chan);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
84
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
85 static cyg_uint32 sa11x0_serial_ISR(cyg_vector_t vector, cyg_addrword_t data);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
86 static void sa11x0_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
87
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
88 static SERIAL_FUNS(sa11x0_serial_funs,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
89 sa11x0_serial_putc,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
90 sa11x0_serial_getc,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
91 sa11x0_serial_set_config,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
92 sa11x0_serial_start_xmit,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
93 sa11x0_serial_stop_xmit
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
94 );
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
95
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
96 #ifdef CYGPKG_IO_SERIAL_ARM_SA11X0_SERIAL0
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
97 static sa11x0_serial_info sa11x0_serial_info0 = {(CYG_ADDRWORD)SA11X0_UART3_CONTROL0,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
98 CYGNUM_HAL_INTERRUPT_UART3};
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
99 #if CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL0_BUFSIZE > 0
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
100 static unsigned char sa11x0_serial_out_buf0[CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL0_BUFSIZE];
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
101 static unsigned char sa11x0_serial_in_buf0[CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL0_BUFSIZE];
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
102
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
103 static SERIAL_CHANNEL_USING_INTERRUPTS(sa11x0_serial_channel0,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
104 sa11x0_serial_funs,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
105 sa11x0_serial_info0,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
106 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL0_BAUD),
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
107 CYG_SERIAL_STOP_DEFAULT,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
108 CYG_SERIAL_PARITY_DEFAULT,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
109 CYG_SERIAL_WORD_LENGTH_DEFAULT,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
110 CYG_SERIAL_FLAGS_DEFAULT,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
111 &sa11x0_serial_out_buf0[0], sizeof(sa11x0_serial_out_buf0),
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
112 &sa11x0_serial_in_buf0[0], sizeof(sa11x0_serial_in_buf0)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
113 );
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
114 #else
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
115 static SERIAL_CHANNEL(sa11x0_serial_channel0,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
116 sa11x0_serial_funs,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
117 sa11x0_serial_info0,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
118 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL0_BAUD),
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
119 CYG_SERIAL_STOP_DEFAULT,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
120 CYG_SERIAL_PARITY_DEFAULT,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
121 CYG_SERIAL_WORD_LENGTH_DEFAULT,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
122 CYG_SERIAL_FLAGS_DEFAULT
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
123 );
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
124 #endif
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
125
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
126 DEVTAB_ENTRY(sa11x0_serial_io0,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
127 CYGDAT_IO_SERIAL_ARM_SA11X0_SERIAL0_NAME,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
128 0, // Does not depend on a lower level interface
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
129 &cyg_io_serial_devio,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
130 sa11x0_serial_init,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
131 sa11x0_serial_lookup, // Serial driver may need initializing
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
132 &sa11x0_serial_channel0
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
133 );
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
134 #endif // CYGPKG_IO_SERIAL_ARM_SA11X0_SERIAL1
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
135
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
136 #ifdef CYGPKG_IO_SERIAL_ARM_SA11X0_SERIAL1
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
137 static sa11x0_serial_info sa11x0_serial_info1 = {(CYG_ADDRWORD)SA11X0_UART1_CONTROL0,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
138 CYGNUM_HAL_INTERRUPT_UART1};
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
139 #if CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL1_BUFSIZE > 0
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
140 static unsigned char sa11x0_serial_out_buf1[CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL1_BUFSIZE];
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
141 static unsigned char sa11x0_serial_in_buf1[CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL1_BUFSIZE];
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
142
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
143 static SERIAL_CHANNEL_USING_INTERRUPTS(sa11x0_serial_channel1,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
144 sa11x0_serial_funs,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
145 sa11x0_serial_info1,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
146 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL1_BAUD),
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
147 CYG_SERIAL_STOP_DEFAULT,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
148 CYG_SERIAL_PARITY_DEFAULT,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
149 CYG_SERIAL_WORD_LENGTH_DEFAULT,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
150 CYG_SERIAL_FLAGS_DEFAULT,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
151 &sa11x0_serial_out_buf1[0], sizeof(sa11x0_serial_out_buf1),
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
152 &sa11x0_serial_in_buf1[0], sizeof(sa11x0_serial_in_buf1)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
153 );
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
154 #else
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
155 static SERIAL_CHANNEL(sa11x0_serial_channel1,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
156 sa11x0_serial_funs,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
157 sa11x0_serial_info1,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
158 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL1_BAUD),
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
159 CYG_SERIAL_STOP_DEFAULT,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
160 CYG_SERIAL_PARITY_DEFAULT,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
161 CYG_SERIAL_WORD_LENGTH_DEFAULT,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
162 CYG_SERIAL_FLAGS_DEFAULT
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
163 );
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
164 #endif
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
165
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
166 DEVTAB_ENTRY(sa11x0_serial_io1,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
167 CYGDAT_IO_SERIAL_ARM_SA11X0_SERIAL1_NAME,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
168 0, // Does not depend on a lower level interface
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
169 &cyg_io_serial_devio,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
170 sa11x0_serial_init,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
171 sa11x0_serial_lookup, // Serial driver may need initializing
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
172 &sa11x0_serial_channel1
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
173 );
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
174 #endif // CYGPKG_IO_SERIAL_ARM_SA11X0_SERIAL1
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
175
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
176 // Internal function to actually configure the hardware to desired baud rate, etc.
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
177 static bool
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
178 sa11x0_serial_config_port(serial_channel *chan, cyg_serial_info_t *new_config, bool init)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
179 {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
180 sa11x0_serial_info *sa11x0_chan = (sa11x0_serial_info *)chan->dev_priv;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
181 volatile struct serial_port *port = (volatile struct serial_port *)sa11x0_chan->base;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
182 unsigned char parity = select_parity[new_config->parity];
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
183 unsigned char word_length = select_word_length[new_config->word_length-CYGNUM_SERIAL_WORD_LENGTH_5];
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
184 unsigned char stop_bits = select_stop_bits[new_config->stop];
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
185 int baud = SA11X0_UART_BAUD_RATE_DIVISOR(select_baud[new_config->baud]);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
186 if ((word_length == 0xFF) ||
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
187 (parity == 0xFF) ||
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
188 (stop_bits == 0xFF)) {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
189 return false; // Unsupported configuration
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
190 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
191 // Disable Receiver and Transmitter (clears FIFOs)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
192 port->ctl3 = SA11X0_UART_RX_DISABLED |
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
193 SA11X0_UART_TX_DISABLED;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
194
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
195 // Clear sticky (writable) status bits.
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
196 port->stat0 = SA11X0_UART_RX_IDLE |
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
197 SA11X0_UART_RX_BEGIN_OF_BREAK |
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
198 SA11X0_UART_RX_END_OF_BREAK;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
199
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
200 // Set parity, word length, stop bits
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
201 port->ctl0 = parity |
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
202 word_length |
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
203 stop_bits;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
204
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
205 // Set the desired baud rate.
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
206 port->ctl1 = (baud >> 8) & SA11X0_UART_H_BAUD_RATE_DIVISOR_MASK;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
207 port->ctl2 = baud & SA11X0_UART_L_BAUD_RATE_DIVISOR_MASK;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
208
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
209 // Enable the receiver (with interrupts) and the transmitter.
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
210 port->ctl3 = SA11X0_UART_RX_ENABLED |
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
211 SA11X0_UART_TX_ENABLED |
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
212 SA11X0_UART_RX_FIFO_INT_ENABLED;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
213 return true;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
214 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
215
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
216 // Function to initialize the device. Called at bootstrap time.
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
217 static bool
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
218 sa11x0_serial_init(struct cyg_devtab_entry *tab)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
219 {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
220 serial_channel *chan = (serial_channel *)tab->priv;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
221 sa11x0_serial_info *sa11x0_chan = (sa11x0_serial_info *)chan->dev_priv;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
222 int res;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
223 #ifdef CYGDBG_IO_INIT
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
224 diag_printf("SA11X0 SERIAL init - dev: %x.%d\n", sa11x0_chan->base, sa11x0_chan->int_num);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
225 #endif
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
226 (chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
227 if (chan->out_cbuf.len != 0) {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
228 cyg_drv_interrupt_create(sa11x0_chan->int_num,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
229 99, // Priority - unused
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
230 (cyg_addrword_t)chan, // Data item passed to interrupt handler
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
231 sa11x0_serial_ISR,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
232 sa11x0_serial_DSR,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
233 &sa11x0_chan->serial_interrupt_handle,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
234 &sa11x0_chan->serial_interrupt);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
235 cyg_drv_interrupt_attach(sa11x0_chan->serial_interrupt_handle);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
236 cyg_drv_interrupt_unmask(sa11x0_chan->int_num);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
237 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
238 res = sa11x0_serial_config_port(chan, &chan->config, true);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
239 return res;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
240 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
241
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
242 // This routine is called when the device is "looked" up (i.e. attached)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
243 static Cyg_ErrNo
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
244 sa11x0_serial_lookup(struct cyg_devtab_entry **tab,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
245 struct cyg_devtab_entry *sub_tab,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
246 const char *name)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
247 {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
248 serial_channel *chan = (serial_channel *)(*tab)->priv;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
249 (chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
250 return ENOERR;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
251 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
252
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
253 // Send a character to the device output buffer.
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
254 // Return 'true' if character is sent to device
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
255 static bool
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
256 sa11x0_serial_putc(serial_channel *chan, unsigned char c)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
257 {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
258 sa11x0_serial_info *sa11x0_chan = (sa11x0_serial_info *)chan->dev_priv;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
259 volatile struct serial_port *port = (volatile struct serial_port *)sa11x0_chan->base;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
260 if (port->stat1 & SA11X0_UART_TX_FIFO_NOT_FULL) {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
261 port->data = c;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
262 return true;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
263 } else {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
264 return false; // Couldn't send, tx was busy
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
265 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
266 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
267
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
268 // Fetch a character from the device input buffer, waiting if necessary
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
269 static unsigned char
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
270 sa11x0_serial_getc(serial_channel *chan)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
271 {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
272 sa11x0_serial_info *sa11x0_chan = (sa11x0_serial_info *)chan->dev_priv;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
273 volatile struct serial_port *port = (volatile struct serial_port *)sa11x0_chan->base;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
274 return port->data;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
275 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
276
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
277 // Set up the device characteristics; baud rate, etc.
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 108
diff changeset
278 static Cyg_ErrNo
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 108
diff changeset
279 sa11x0_serial_set_config(serial_channel *chan, cyg_uint32 key,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 108
diff changeset
280 const void *xbuf, cyg_uint32 *len)
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
281 {
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 108
diff changeset
282 switch (key) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 108
diff changeset
283 case CYG_IO_SET_CONFIG_SERIAL_INFO:
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 108
diff changeset
284 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 108
diff changeset
285 cyg_serial_info_t *config = (cyg_serial_info_t *)xbuf;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 108
diff changeset
286 if ( *len < sizeof(cyg_serial_info_t) ) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 108
diff changeset
287 return -EINVAL;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 108
diff changeset
288 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 108
diff changeset
289 *len = sizeof(cyg_serial_info_t);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 108
diff changeset
290 if ( true != sa11x0_serial_config_port(chan, config, false) )
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 108
diff changeset
291 return -EINVAL;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 108
diff changeset
292 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 108
diff changeset
293 break;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 108
diff changeset
294 default:
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 108
diff changeset
295 return -EINVAL;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 108
diff changeset
296 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 108
diff changeset
297 return ENOERR;
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
298 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
299
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
300 // Enable the transmitter on the device
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
301 static void
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
302 sa11x0_serial_start_xmit(serial_channel *chan)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
303 {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
304 sa11x0_serial_info *sa11x0_chan = (sa11x0_serial_info *)chan->dev_priv;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
305 volatile struct serial_port *port = (volatile struct serial_port *)sa11x0_chan->base;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
306 (chan->callbacks->xmt_char)(chan); // Kick transmitter (if necessary)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
307 port->ctl3 |= SA11X0_UART_TX_FIFO_INT_ENABLED;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
308 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
309
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
310 // Disable the transmitter on the device
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
311 static void
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
312 sa11x0_serial_stop_xmit(serial_channel *chan)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
313 {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
314 sa11x0_serial_info *sa11x0_chan = (sa11x0_serial_info *)chan->dev_priv;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
315 volatile struct serial_port *port = (volatile struct serial_port *)sa11x0_chan->base;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
316 port->ctl3 &= ~SA11X0_UART_TX_FIFO_INT_ENABLED;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
317 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
318
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
319 // Serial I/O - low level interrupt handler (ISR)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
320 static cyg_uint32
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
321 sa11x0_serial_ISR(cyg_vector_t vector, cyg_addrword_t data)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
322 {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
323 cyg_drv_interrupt_mask(vector);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
324 cyg_drv_interrupt_acknowledge(vector);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
325 return CYG_ISR_CALL_DSR; // Cause DSR to be run
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
326 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
327
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
328 // Serial I/O - high level interrupt handler (DSR)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
329 static void
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
330 sa11x0_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
331 {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
332 serial_channel *chan = (serial_channel *)data;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
333 sa11x0_serial_info *sa11x0_chan = (sa11x0_serial_info *)chan->dev_priv;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
334 volatile struct serial_port *port = (volatile struct serial_port *)sa11x0_chan->base;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
335 unsigned int stat0 = port->stat0;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
336 if (stat0 & SA11X0_UART_TX_SERVICE_REQUEST) {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
337 (chan->callbacks->xmt_char)(chan);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
338 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
339 if (stat0 & SA11X0_UART_RX_INTS) {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
340 while (port->stat1 & SA11X0_UART_RX_FIFO_NOT_EMPTY) {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
341 (chan->callbacks->rcv_char)(chan, port->data);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
342 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
343 port->stat0 = SA11X0_UART_RX_IDLE; // Need to clear this manually
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
344 }
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 115
diff changeset
345 if (stat0 & (SA11X0_UART_RX_BEGIN_OF_BREAK |
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 115
diff changeset
346 SA11X0_UART_RX_END_OF_BREAK ) ) {
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 115
diff changeset
347 // Need to clear any of these manually also or noise
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 115
diff changeset
348 // from plugging in can cause an interrupt loop!
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 115
diff changeset
349 port->stat0 = stat0 & (SA11X0_UART_RX_BEGIN_OF_BREAK |
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 115
diff changeset
350 SA11X0_UART_RX_END_OF_BREAK );
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 115
diff changeset
351 }
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
352 cyg_drv_interrupt_unmask(vector);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
353 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
354 #endif