annotate packages/io/serial/current/src/common/tty.c @ 66:bf00f99aec69 ecos-sw-2000-02-02

Merge from eCos master repository on 2000-02-02-19:16:44-GMT
author jlarmour
date Wed, 02 Feb 2000 19:57:02 +0000
parents c38311975d4f
children 2085233a121a
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);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
58 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
59 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
60
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
61 struct tty_private_info {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
62 cyg_tty_info_t dev_info;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
63 cyg_io_handle_t dev_handle;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
64 };
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 static DEVIO_TABLE(tty_devio,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
67 tty_write,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
68 tty_read,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
69 tty_get_config,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
70 tty_set_config
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
71 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
72
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
73 #ifdef CYGPKG_IO_SERIAL_TTY_TTYDIAG
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
74 static struct tty_private_info tty_private_info_diag;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
75 DEVTAB_ENTRY(tty_io_diag,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
76 // "/dev/console",
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
77 // CYGDAT_IO_SERIAL_TTY_CONSOLE, // Based on driver for this device
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
78 "/dev/ttydiag",
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
79 "/dev/haldiag",
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
80 &tty_devio,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
81 tty_init,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
82 tty_lookup, // Execute this when device is being looked up
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
83 &tty_private_info_diag);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
84 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
85
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
86 #ifdef CYGPKG_IO_SERIAL_TTY_TTY0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
87 static struct tty_private_info tty_private_info0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
88 DEVTAB_ENTRY(tty_io0,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
89 "/dev/tty0",
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
90 CYGDAT_IO_SERIAL_TTY_TTY0_DEV,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
91 &tty_devio,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
92 tty_init,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
93 tty_lookup, // Execute this when device is being looked up
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
94 &tty_private_info0);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
95 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
96
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
97 #ifdef CYGPKG_IO_SERIAL_TTY_TTY1
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
98 static struct tty_private_info tty_private_info1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
99 DEVTAB_ENTRY(tty_io1,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
100 "/dev/tty1",
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
101 CYGDAT_IO_SERIAL_TTY_TTY1_DEV,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
102 &tty_devio,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
103 tty_init,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
104 tty_lookup, // Execute this when device is being looked up
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
105 &tty_private_info1);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
106 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
107
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
108 #ifdef CYGPKG_IO_SERIAL_TTY_TTY2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
109 static struct tty_private_info tty_private_info2;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
110 DEVTAB_ENTRY(tty_io2,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
111 "/dev/tty2",
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
112 CYGDAT_IO_SERIAL_TTY_TTY2_DEV,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
113 &tty_devio,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
114 tty_init,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
115 tty_lookup, // Execute this when device is being looked up
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
116 &tty_private_info2);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
117 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
118
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
119 static bool
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
120 tty_init(struct cyg_devtab_entry *tab)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
121 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
122 struct tty_private_info *priv = (struct tty_private_info *)tab->priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
123 #ifdef CYGDBG_IO_INIT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
124 diag_printf("Init tty channel: %x\n", tab);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
125 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
126 priv->dev_info.tty_out_flags = CYG_TTY_OUT_FLAGS_DEFAULT;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
127 priv->dev_info.tty_in_flags = CYG_TTY_IN_FLAGS_DEFAULT;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
128 return true;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
129 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
130
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
131 static Cyg_ErrNo
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
132 tty_lookup(struct cyg_devtab_entry **tab,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
133 struct cyg_devtab_entry *sub_tab,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
134 const char *name)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
135 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
136 cyg_io_handle_t chan = (cyg_io_handle_t)sub_tab;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
137 struct tty_private_info *priv = (struct tty_private_info *)(*tab)->priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
138 #if 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
139 cyg_int32 len;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
140 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
141 priv->dev_handle = chan;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
142 #if 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
143 len = sizeof(cyg_serial_info_t);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
144 // Initialize configuration
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
145 cyg_io_get_config(chan, CYG_SERIAL_GET_CONFIG,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
146 (void *)&priv->dev_info.serial_config, &len);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
147 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
148 return ENOERR;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
149 }
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 #define BUFSIZE 64
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 static Cyg_ErrNo
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
154 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
155 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
156 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
157 struct tty_private_info *priv = (struct tty_private_info *)t->priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
158 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
159 cyg_int32 size, bytes_successful, actually_written;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
160 cyg_uint8 xbuf[BUFSIZE];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
161 cyg_uint8 c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
162 cyg_uint8 *buf = (cyg_uint8 *)_buf;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
163 Cyg_ErrNo res = -EBADF;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
164 // assert(chan)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
165 size = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
166 bytes_successful = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
167 actually_written = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
168 while (bytes_successful++ < *len) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
169 xbuf[size++] = (c = *buf++);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
170 if ((c == '\n') &&
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
171 (priv->dev_info.tty_out_flags & CYG_TTY_OUT_FLAGS_CRLF)) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
172 xbuf[size++] = '\r';
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
173 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
174 // Always leave room for possible CR/LF expansion
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
175 if ((size == (BUFSIZE-1)) ||
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
176 (bytes_successful == *len)) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
177 res = cyg_io_write(chan, xbuf, &size);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
178 if (res != ENOERR) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
179 *len = actually_written;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
180 return res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
181 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
182 actually_written += size;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
183 size = 0;
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 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
186 *len = actually_written;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
187 return res;
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
190 static Cyg_ErrNo
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
191 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
192 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
193 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
194 struct tty_private_info *priv = (struct tty_private_info *)t->priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
195 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
196 cyg_uint32 clen;
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
197 cyg_int32 size;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
198 Cyg_ErrNo res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
199 cyg_uint8 c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
200 cyg_uint8 *buf = (cyg_uint8 *)_buf;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
201 // assert(chan)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
202 size = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
203 while (size < *len) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
204 clen = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
205 res = cyg_io_read(chan, &c, &clen);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
206 if (res != ENOERR) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
207 *len = size;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
208 return res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
209 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
210 buf[size++] = c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
211 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
212 if ((c == '\b') || (c == 0x7F)) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
213 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
214 if (size < 0) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
215 size = 0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
216 } 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
217 clen = 3;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
218 cyg_io_write(chan, "\b \b", &clen);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
219 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
220 } else if ((c == '\n') || (c == '\r')) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
221 clen = 2;
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_ECHO) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
223 cyg_io_write(chan, "\n\r", &clen);
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 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
226 c = '\n'; // Map CR -> LF
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
227 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
228 buf[size-1] = c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
229 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
230 } else {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
231 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
232 clen = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
233 cyg_io_write(chan, &c, &clen);
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 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
236 }
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 *len = size;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
239 return ENOERR;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
240 }
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 static Cyg_ErrNo
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
243 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
244 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
245 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
246 struct tty_private_info *priv = (struct tty_private_info *)t->priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
247 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
248 Cyg_ErrNo res = ENOERR;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
249 #if 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
250 cyg_int32 current_len;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
251 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
252 // assert(chan)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
253 switch (key) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
254 case CYG_IO_GET_CONFIG_TTY_INFO:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
255 if (*len < sizeof(cyg_tty_info_t)) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
256 return -EINVAL;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
257 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
258 #if 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
259 current_len = sizeof(cyg_serial_info_t);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
260 res = cyg_io_get_config(chan, CYG_SERIAL_GET_CONFIG,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
261 (void *)&priv->dev_info.serial_config, &current_len);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
262 if (res != ENOERR) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
263 return res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
264 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
265 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
266 *(cyg_tty_info_t *)buf = priv->dev_info;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
267 *len = sizeof(cyg_tty_info_t);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
268 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
269 default: // Assume this is a 'serial' driver control
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
270 res = cyg_io_get_config(chan, key, buf, len);
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 return res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
273 }
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 static Cyg_ErrNo
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
276 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
277 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
278 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
279 struct tty_private_info *priv = (struct tty_private_info *)t->priv;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
280 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
281 #if 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
282 cyg_int32 current_len;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
283 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
284 Cyg_ErrNo res = ENOERR;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
285 // assert(chan)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
286 switch (key) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
287 case CYG_IO_SET_CONFIG_TTY_INFO:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
288 if (*len != sizeof(cyg_tty_info_t)) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
289 return -EINVAL;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
290 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
291 priv->dev_info = *(cyg_tty_info_t *)buf;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
292 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
293 default: // Pass on to serial driver
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
294 res = cyg_io_set_config(chan, key, buf, len);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
295 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
296 return res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
297 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
298 #endif // CYGPKG_IO_SERIAL_TTY