annotate packages/io/serial/current/src/common/tty.c @ 136:a9ac27ec7abc ecos-sw-2000-11-17

Merge from eCos master repository on 2000-11-17-18:24:25-GMT
author jlarmour
date Fri, 17 Nov 2000 23:16:43 +0000
parents 6ed91473a1cd
children e0c0827131d1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
1 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
2 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
3 // io/serial/common/tty.c
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
4 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
5 // TTY (terminal-like interface) I/O driver
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
6 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
7 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
8 //####COPYRIGHTBEGIN####
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
9 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
10 // -------------------------------------------
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
11 // The contents of this file are subject to the Red Hat eCos Public License
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
12 // Version 1.1 (the "License"); you may not use this file except in
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
14 // http://www.redhat.com/
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
15 //
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
18 // License for the specific language governing rights and limitations under
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
19 // the License.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
20 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
21 // The Original Code is eCos - Embedded Configurable Operating System,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
22 // released September 30, 1998.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
23 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
24 // The Initial Developer of the Original Code is Red Hat.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
25 // Portions created by Red Hat are
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
26 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
27 // All Rights Reserved.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
28 // -------------------------------------------
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
29 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
30 //####COPYRIGHTEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
31 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
32 //#####DESCRIPTIONBEGIN####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
33 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
34 // Author(s): gthomas
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
35 // Contributors: gthomas
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
36 // Date: 1999-02-04
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
37 // Purpose: Device driver for tty I/O, layered on top of serial I/O
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
38 // Description:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
39 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
40 //####DESCRIPTIONEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
41 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
42 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
43
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
44 #include <pkgconf/io.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
45 #include <pkgconf/io_serial.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
46 #ifdef CYGPKG_IO_SERIAL_TTY
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
47 #include <cyg/io/io.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
48 #include <cyg/io/devtab.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
49 #include <cyg/io/ttyio.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
50 #include <cyg/infra/diag.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
51
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
52 static bool tty_init(struct cyg_devtab_entry *tab);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
53 static Cyg_ErrNo tty_lookup(struct cyg_devtab_entry **tab,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
54 struct cyg_devtab_entry *sub_tab,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
55 const char *name);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
56 static Cyg_ErrNo tty_write(cyg_io_handle_t handle, const void *buf, cyg_uint32 *len);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
57 static Cyg_ErrNo tty_read(cyg_io_handle_t handle, void *buf, cyg_uint32 *len);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 80
diff changeset
58 static Cyg_ErrNo tty_select(cyg_io_handle_t handle, cyg_uint32 which, CYG_ADDRWORD info);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
59 static Cyg_ErrNo tty_get_config(cyg_io_handle_t handle, cyg_uint32 key, void *buf, cyg_uint32 *len);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
60 static Cyg_ErrNo tty_set_config(cyg_io_handle_t handle, cyg_uint32 key, const void *buf, cyg_uint32 *len);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
61
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
62 struct tty_private_info {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
63 cyg_tty_info_t dev_info;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
64 cyg_io_handle_t dev_handle;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
65 };
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
66
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
67 static DEVIO_TABLE(tty_devio,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
68 tty_write,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
69 tty_read,
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 80
diff changeset
70 tty_select,
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
71 tty_get_config,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
72 tty_set_config
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
73 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
74
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
75 #ifdef CYGPKG_IO_SERIAL_TTY_TTYDIAG
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
76 static struct tty_private_info tty_private_info_diag;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
77 DEVTAB_ENTRY(tty_io_diag,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
78 // "/dev/console",
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
79 // CYGDAT_IO_SERIAL_TTY_CONSOLE, // Based on driver for this device
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
80 "/dev/ttydiag",
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
81 "/dev/haldiag",
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
82 &tty_devio,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
83 tty_init,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
84 tty_lookup, // Execute this when device is being looked up
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
85 &tty_private_info_diag);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
86 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
87
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
88 #ifdef CYGPKG_IO_SERIAL_TTY_TTY0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
89 static struct tty_private_info tty_private_info0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
90 DEVTAB_ENTRY(tty_io0,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
91 "/dev/tty0",
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
92 CYGDAT_IO_SERIAL_TTY_TTY0_DEV,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
93 &tty_devio,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
94 tty_init,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
95 tty_lookup, // Execute this when device is being looked up
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
96 &tty_private_info0);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
97 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
98
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
99 #ifdef CYGPKG_IO_SERIAL_TTY_TTY1
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
100 static struct tty_private_info tty_private_info1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
101 DEVTAB_ENTRY(tty_io1,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
102 "/dev/tty1",
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
103 CYGDAT_IO_SERIAL_TTY_TTY1_DEV,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
104 &tty_devio,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
105 tty_init,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
106 tty_lookup, // Execute this when device is being looked up
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
107 &tty_private_info1);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
108 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
109
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
110 #ifdef CYGPKG_IO_SERIAL_TTY_TTY2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
111 static struct tty_private_info tty_private_info2;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
112 DEVTAB_ENTRY(tty_io2,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
113 "/dev/tty2",
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
114 CYGDAT_IO_SERIAL_TTY_TTY2_DEV,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
115 &tty_devio,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
116 tty_init,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
117 tty_lookup, // Execute this when device is being looked up
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
118 &tty_private_info2);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
119 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
120
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
121 static bool
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
122 tty_init(struct cyg_devtab_entry *tab)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
123 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
124 struct tty_private_info *priv = (struct tty_private_info *)tab->priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
125 #ifdef CYGDBG_IO_INIT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
126 diag_printf("Init tty channel: %x\n", tab);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
127 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
128 priv->dev_info.tty_out_flags = CYG_TTY_OUT_FLAGS_DEFAULT;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
129 priv->dev_info.tty_in_flags = CYG_TTY_IN_FLAGS_DEFAULT;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
130 return true;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
131 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
132
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
133 static Cyg_ErrNo
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
134 tty_lookup(struct cyg_devtab_entry **tab,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
135 struct cyg_devtab_entry *sub_tab,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
136 const char *name)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
137 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
138 cyg_io_handle_t chan = (cyg_io_handle_t)sub_tab;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
139 struct tty_private_info *priv = (struct tty_private_info *)(*tab)->priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
140 #if 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
141 cyg_int32 len;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
142 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
143 priv->dev_handle = chan;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
144 #if 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
145 len = sizeof(cyg_serial_info_t);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
146 // Initialize configuration
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
147 cyg_io_get_config(chan, CYG_SERIAL_GET_CONFIG,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
148 (void *)&priv->dev_info.serial_config, &len);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
149 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
150 return ENOERR;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
151 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
152
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
153 #define BUFSIZE 64
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
154
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
155 static Cyg_ErrNo
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
156 tty_write(cyg_io_handle_t handle, const void *_buf, cyg_uint32 *len)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
157 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
158 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
159 struct tty_private_info *priv = (struct tty_private_info *)t->priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
160 cyg_io_handle_t chan = (cyg_io_handle_t)priv->dev_handle;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
161 cyg_int32 size, bytes_successful, actually_written;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
162 cyg_uint8 xbuf[BUFSIZE];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
163 cyg_uint8 c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
164 cyg_uint8 *buf = (cyg_uint8 *)_buf;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
165 Cyg_ErrNo res = -EBADF;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
166 // assert(chan)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
167 size = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
168 bytes_successful = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
169 actually_written = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
170 while (bytes_successful++ < *len) {
80
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
171 c = *buf++;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
172 if ((c == '\n') &&
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
173 (priv->dev_info.tty_out_flags & CYG_TTY_OUT_FLAGS_CRLF)) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
174 xbuf[size++] = '\r';
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
175 }
80
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
176 xbuf[size++] = c;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
177 // Always leave room for possible CR/LF expansion
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 115
diff changeset
178 if ((size >= (BUFSIZE-1)) ||
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
179 (bytes_successful == *len)) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
180 res = cyg_io_write(chan, xbuf, &size);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
181 if (res != ENOERR) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
182 *len = actually_written;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
183 return res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
184 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
185 actually_written += size;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
186 size = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
187 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
188 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
189 *len = actually_written;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
190 return res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
191 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
192
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
193 static Cyg_ErrNo
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
194 tty_read(cyg_io_handle_t handle, void *_buf, cyg_uint32 *len)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
195 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
196 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
197 struct tty_private_info *priv = (struct tty_private_info *)t->priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
198 cyg_io_handle_t chan = (cyg_io_handle_t)priv->dev_handle;
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
199 cyg_uint32 clen;
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
200 cyg_int32 size;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
201 Cyg_ErrNo res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
202 cyg_uint8 c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
203 cyg_uint8 *buf = (cyg_uint8 *)_buf;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
204 // assert(chan)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
205 size = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
206 while (size < *len) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
207 clen = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
208 res = cyg_io_read(chan, &c, &clen);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
209 if (res != ENOERR) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
210 *len = size;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
211 return res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
212 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
213 buf[size++] = c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
214 if ((priv->dev_info.tty_in_flags & CYG_TTY_IN_FLAGS_BINARY) == 0) {
80
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
215 switch (c) {
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
216 case '\b': /* drop through */
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
217 case 0x7f:
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
218 size -= 2; // erase one character + 'backspace' char
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
219 if (size < 0) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
220 size = 0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
221 } else if (priv->dev_info.tty_in_flags & CYG_TTY_IN_FLAGS_ECHO) {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
222 clen = 3;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
223 cyg_io_write(chan, "\b \b", &clen);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
224 }
80
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
225 break;
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
226 case '\r':
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
227 if (priv->dev_info.tty_in_flags & CYG_TTY_IN_FLAGS_CRLF) {
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
228 /* Don't do anything because a '\n' will come next */
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
229 break;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
230 }
80
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
231 if (priv->dev_info.tty_in_flags & CYG_TTY_IN_FLAGS_CR) {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
232 c = '\n'; // Map CR -> LF
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
233 }
80
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
234 /* drop through */
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
235 case '\n':
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
236 if (priv->dev_info.tty_in_flags & CYG_TTY_IN_FLAGS_ECHO) {
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
237 if (priv->dev_info.tty_out_flags & CYG_TTY_OUT_FLAGS_CRLF) {
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
238 clen = 2;
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
239 cyg_io_write(chan, "\r\n", &clen);
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
240 } else {
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
241 clen = 1;
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
242 cyg_io_write(chan, &c, &clen);
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
243 }
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
244 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
245 buf[size-1] = c;
80
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
246 *len = size;
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
247 return ENOERR;
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
248 default:
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
249 if (priv->dev_info.tty_in_flags & CYG_TTY_IN_FLAGS_ECHO) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
250 clen = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
251 cyg_io_write(chan, &c, &clen);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
252 }
80
2085233a121a Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents: 66
diff changeset
253 break;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
254 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
255 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
256 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
257 *len = size;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
258 return ENOERR;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
259 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
260
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 80
diff changeset
261 static cyg_bool
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 80
diff changeset
262 tty_select(cyg_io_handle_t handle, cyg_uint32 which, CYG_ADDRWORD info)
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 80
diff changeset
263 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 80
diff changeset
264 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 80
diff changeset
265 struct tty_private_info *priv = (struct tty_private_info *)t->priv;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 80
diff changeset
266 cyg_io_handle_t chan = (cyg_io_handle_t)priv->dev_handle;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 80
diff changeset
267
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 80
diff changeset
268 // Just pass it on to next driver level
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 80
diff changeset
269 return cyg_io_select( chan, which, info );
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 80
diff changeset
270 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 80
diff changeset
271
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
272 static Cyg_ErrNo
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
273 tty_get_config(cyg_io_handle_t handle, cyg_uint32 key, void *buf, cyg_uint32 *len)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
274 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
275 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
276 struct tty_private_info *priv = (struct tty_private_info *)t->priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
277 cyg_io_handle_t chan = (cyg_io_handle_t)priv->dev_handle;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
278 Cyg_ErrNo res = ENOERR;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
279 #if 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
280 cyg_int32 current_len;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
281 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
282 // assert(chan)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
283 switch (key) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
284 case CYG_IO_GET_CONFIG_TTY_INFO:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
285 if (*len < sizeof(cyg_tty_info_t)) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
286 return -EINVAL;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
287 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
288 #if 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
289 current_len = sizeof(cyg_serial_info_t);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
290 res = cyg_io_get_config(chan, CYG_SERIAL_GET_CONFIG,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
291 (void *)&priv->dev_info.serial_config, &current_len);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
292 if (res != ENOERR) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
293 return res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
294 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
295 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
296 *(cyg_tty_info_t *)buf = priv->dev_info;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
297 *len = sizeof(cyg_tty_info_t);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
298 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
299 default: // Assume this is a 'serial' driver control
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
300 res = cyg_io_get_config(chan, key, buf, len);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
301 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
302 return res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
303 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
304
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
305 static Cyg_ErrNo
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
306 tty_set_config(cyg_io_handle_t handle, cyg_uint32 key, const void *buf, cyg_uint32 *len)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
307 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
308 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
309 struct tty_private_info *priv = (struct tty_private_info *)t->priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
310 cyg_io_handle_t chan = (cyg_io_handle_t)priv->dev_handle;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
311 #if 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
312 cyg_int32 current_len;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
313 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
314 Cyg_ErrNo res = ENOERR;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
315 // assert(chan)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
316 switch (key) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
317 case CYG_IO_SET_CONFIG_TTY_INFO:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
318 if (*len != sizeof(cyg_tty_info_t)) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
319 return -EINVAL;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
320 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
321 priv->dev_info = *(cyg_tty_info_t *)buf;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
322 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
323 default: // Pass on to serial driver
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
324 res = cyg_io_set_config(chan, key, buf, len);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
325 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
326 return res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
327 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
328 #endif // CYGPKG_IO_SERIAL_TTY