annotate packages/io/serial/current/src/common/tty.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 443894e2e912
children c38311975d4f
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####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
9 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
10 // -------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
11 // The contents of this file are subject to the Cygnus eCos Public License
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
12 // Version 1.0 (the "License"); you may not use this file except in
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
14 // http://sourceware.cygnus.com/ecos
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
15 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
18 // License for the specific language governing rights and limitations under
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
19 // the License.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
20 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
21 // The Original Code is eCos - Embedded Cygnus Operating System, released
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
22 // September 30, 1998.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
23 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
24 // The Initial Developer of the Original Code is Cygnus. Portions created
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
25 // by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions. All Rights Reserved.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
26 // -------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
27 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
28 //####COPYRIGHTEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
29 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
30 //#####DESCRIPTIONBEGIN####
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 // Author(s): gthomas
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
33 // Contributors: gthomas
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
34 // Date: 1999-02-04
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
35 // 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
36 // Description:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
37 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
38 //####DESCRIPTIONEND####
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 //==========================================================================
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 #include <pkgconf/io.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
43 #include <pkgconf/io_serial.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
44 #ifdef CYGPKG_IO_SERIAL_TTY
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
45 #include <cyg/io/io.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
46 #include <cyg/io/devtab.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
47 #include <cyg/io/ttyio.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
48 #include <cyg/infra/diag.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
49
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
50 static bool tty_init(struct cyg_devtab_entry *tab);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
51 static Cyg_ErrNo tty_lookup(struct cyg_devtab_entry **tab,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
52 struct cyg_devtab_entry *sub_tab,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
53 const char *name);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
54 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
55 static Cyg_ErrNo 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
56 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
57 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
58
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
59 struct tty_private_info {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
60 cyg_tty_info_t dev_info;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
61 cyg_io_handle_t dev_handle;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
62 };
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
63
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
64 static DEVIO_TABLE(tty_devio,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
65 tty_write,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
66 tty_read,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
67 tty_get_config,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
68 tty_set_config
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
69 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
70
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
71 #ifdef CYGPKG_IO_SERIAL_TTY_TTYDIAG
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
72 static struct tty_private_info tty_private_info_diag;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
73 DEVTAB_ENTRY(tty_io_diag,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
74 // "/dev/console",
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
75 // CYGDAT_IO_SERIAL_TTY_CONSOLE, // Based on driver for this device
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
76 "/dev/ttydiag",
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
77 "/dev/haldiag",
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
78 &tty_devio,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
79 tty_init,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
80 tty_lookup, // Execute this when device is being looked up
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
81 &tty_private_info_diag);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
82 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
83
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
84 #ifdef CYGPKG_IO_SERIAL_TTY_TTY0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
85 static struct tty_private_info tty_private_info0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
86 DEVTAB_ENTRY(tty_io0,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
87 "/dev/tty0",
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
88 CYGDAT_IO_SERIAL_TTY_TTY0_DEV,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
89 &tty_devio,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
90 tty_init,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
91 tty_lookup, // Execute this when device is being looked up
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
92 &tty_private_info0);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
93 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
94
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
95 #ifdef CYGPKG_IO_SERIAL_TTY_TTY1
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
96 static struct tty_private_info tty_private_info1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
97 DEVTAB_ENTRY(tty_io1,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
98 "/dev/tty1",
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
99 CYGDAT_IO_SERIAL_TTY_TTY1_DEV,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
100 &tty_devio,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
101 tty_init,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
102 tty_lookup, // Execute this when device is being looked up
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
103 &tty_private_info1);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
104 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
105
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
106 #ifdef CYGPKG_IO_SERIAL_TTY_TTY2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
107 static struct tty_private_info tty_private_info2;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
108 DEVTAB_ENTRY(tty_io2,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
109 "/dev/tty2",
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
110 CYGDAT_IO_SERIAL_TTY_TTY2_DEV,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
111 &tty_devio,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
112 tty_init,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
113 tty_lookup, // Execute this when device is being looked up
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
114 &tty_private_info2);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
115 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
116
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
117 static bool
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
118 tty_init(struct cyg_devtab_entry *tab)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
119 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
120 struct tty_private_info *priv = (struct tty_private_info *)tab->priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
121 #ifdef CYGDBG_IO_INIT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
122 diag_printf("Init tty channel: %x\n", tab);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
123 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
124 priv->dev_info.tty_out_flags = CYG_TTY_OUT_FLAGS_DEFAULT;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
125 priv->dev_info.tty_in_flags = CYG_TTY_IN_FLAGS_DEFAULT;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
126 return true;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
127 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
128
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
129 static Cyg_ErrNo
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
130 tty_lookup(struct cyg_devtab_entry **tab,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
131 struct cyg_devtab_entry *sub_tab,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
132 const char *name)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
133 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
134 cyg_io_handle_t chan = (cyg_io_handle_t)sub_tab;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
135 struct tty_private_info *priv = (struct tty_private_info *)(*tab)->priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
136 #if 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
137 cyg_int32 len;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
138 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
139 priv->dev_handle = chan;
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 len = sizeof(cyg_serial_info_t);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
142 // Initialize configuration
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
143 cyg_io_get_config(chan, CYG_SERIAL_GET_CONFIG,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
144 (void *)&priv->dev_info.serial_config, &len);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
145 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
146 return ENOERR;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
147 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
148
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
149 #define BUFSIZE 64
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
150
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
151 static Cyg_ErrNo
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
152 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
153 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
154 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
155 struct tty_private_info *priv = (struct tty_private_info *)t->priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
156 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
157 cyg_int32 size, bytes_successful, actually_written;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
158 cyg_uint8 xbuf[BUFSIZE];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
159 cyg_uint8 c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
160 cyg_uint8 *buf = (cyg_uint8 *)_buf;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
161 Cyg_ErrNo res = -EBADF;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
162 // assert(chan)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
163 size = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
164 bytes_successful = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
165 actually_written = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
166 while (bytes_successful++ < *len) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
167 xbuf[size++] = (c = *buf++);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
168 if ((c == '\n') &&
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
169 (priv->dev_info.tty_out_flags & CYG_TTY_OUT_FLAGS_CRLF)) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
170 xbuf[size++] = '\r';
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
171 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
172 // Always leave room for possible CR/LF expansion
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
173 if ((size == (BUFSIZE-1)) ||
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
174 (bytes_successful == *len)) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
175 res = cyg_io_write(chan, xbuf, &size);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
176 if (res != ENOERR) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
177 *len = actually_written;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
178 return res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
179 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
180 actually_written += size;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
181 size = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
182 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
183 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
184 *len = actually_written;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
185 return res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
186 }
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 static Cyg_ErrNo
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
189 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
190 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
191 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
192 struct tty_private_info *priv = (struct tty_private_info *)t->priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
193 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
194 cyg_uint32 size, clen;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
195 Cyg_ErrNo res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
196 cyg_uint8 c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
197 cyg_uint8 *buf = (cyg_uint8 *)_buf;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
198 // assert(chan)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
199 size = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
200 while (size < *len) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
201 clen = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
202 res = cyg_io_read(chan, &c, &clen);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
203 if (res != ENOERR) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
204 *len = size;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
205 return res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
206 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
207 buf[size++] = c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
208 if ((priv->dev_info.tty_in_flags & CYG_TTY_IN_FLAGS_BINARY) == 0) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
209 if ((c == '\b') || (c == 0x7F)) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
210 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
211 if (size < 0) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
212 size = 0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
213 } 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
214 clen = 3;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
215 cyg_io_write(chan, "\b \b", &clen);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
216 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
217 } else if ((c == '\n') || (c == '\r')) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
218 clen = 2;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
219 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
220 cyg_io_write(chan, "\n\r", &clen);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
221 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
222 if (priv->dev_info.tty_in_flags & CYG_TTY_IN_FLAGS_CRLF) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
223 c = '\n'; // Map CR -> LF
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
224 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
225 buf[size-1] = c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
226 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
227 } else {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
228 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
229 clen = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
230 cyg_io_write(chan, &c, &clen);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
231 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
232 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
233 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
234 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
235 *len = size;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
236 return ENOERR;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
237 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
238
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
239 static Cyg_ErrNo
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
240 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
241 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
242 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
243 struct tty_private_info *priv = (struct tty_private_info *)t->priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
244 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
245 Cyg_ErrNo res = ENOERR;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
246 #if 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
247 cyg_int32 current_len;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
248 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
249 // assert(chan)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
250 switch (key) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
251 case CYG_IO_GET_CONFIG_TTY_INFO:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
252 if (*len < sizeof(cyg_tty_info_t)) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
253 return -EINVAL;
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 #if 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
256 current_len = sizeof(cyg_serial_info_t);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
257 res = cyg_io_get_config(chan, CYG_SERIAL_GET_CONFIG,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
258 (void *)&priv->dev_info.serial_config, &current_len);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
259 if (res != ENOERR) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
260 return res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
261 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
262 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
263 *(cyg_tty_info_t *)buf = priv->dev_info;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
264 *len = sizeof(cyg_tty_info_t);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
265 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
266 default: // Assume this is a 'serial' driver control
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
267 res = cyg_io_get_config(chan, key, buf, len);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
268 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
269 return res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
270 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
271
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_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
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 #if 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
279 cyg_int32 current_len;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
280 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
281 Cyg_ErrNo res = ENOERR;
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_SET_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 priv->dev_info = *(cyg_tty_info_t *)buf;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
289 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
290 default: // Pass on to serial driver
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
291 res = cyg_io_set_config(chan, key, buf, len);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
292 }
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 // CYGPKG_IO_SERIAL_TTY