Mercurial > flash_v2
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 |
| rev | line source |
|---|---|
| 2 | 1 //========================================================================== |
| 2 // | |
| 3 // io/serial/common/tty.c | |
| 4 // | |
| 5 // TTY (terminal-like interface) I/O driver | |
| 6 // | |
| 7 //========================================================================== | |
| 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 | 30 //####COPYRIGHTEND#### |
| 31 //========================================================================== | |
| 32 //#####DESCRIPTIONBEGIN#### | |
| 33 // | |
| 34 // Author(s): gthomas | |
| 35 // Contributors: gthomas | |
| 36 // Date: 1999-02-04 | |
| 37 // Purpose: Device driver for tty I/O, layered on top of serial I/O | |
| 38 // Description: | |
| 39 // | |
| 40 //####DESCRIPTIONEND#### | |
| 41 // | |
| 42 //========================================================================== | |
| 43 | |
| 44 #include <pkgconf/io.h> | |
| 45 #include <pkgconf/io_serial.h> | |
| 46 #ifdef CYGPKG_IO_SERIAL_TTY | |
| 47 #include <cyg/io/io.h> | |
| 48 #include <cyg/io/devtab.h> | |
| 49 #include <cyg/io/ttyio.h> | |
| 50 #include <cyg/infra/diag.h> | |
| 51 | |
| 52 static bool tty_init(struct cyg_devtab_entry *tab); | |
| 53 static Cyg_ErrNo tty_lookup(struct cyg_devtab_entry **tab, | |
| 54 struct cyg_devtab_entry *sub_tab, | |
| 55 const char *name); | |
| 56 static Cyg_ErrNo tty_write(cyg_io_handle_t handle, const void *buf, cyg_uint32 *len); | |
| 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 | 59 static Cyg_ErrNo tty_get_config(cyg_io_handle_t handle, cyg_uint32 key, void *buf, cyg_uint32 *len); |
| 60 static Cyg_ErrNo tty_set_config(cyg_io_handle_t handle, cyg_uint32 key, const void *buf, cyg_uint32 *len); | |
| 61 | |
| 62 struct tty_private_info { | |
| 63 cyg_tty_info_t dev_info; | |
| 64 cyg_io_handle_t dev_handle; | |
| 65 }; | |
| 66 | |
| 67 static DEVIO_TABLE(tty_devio, | |
| 68 tty_write, | |
| 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 | 71 tty_get_config, |
| 72 tty_set_config | |
| 73 ); | |
| 74 | |
| 75 #ifdef CYGPKG_IO_SERIAL_TTY_TTYDIAG | |
| 76 static struct tty_private_info tty_private_info_diag; | |
| 77 DEVTAB_ENTRY(tty_io_diag, | |
| 78 // "/dev/console", | |
| 79 // CYGDAT_IO_SERIAL_TTY_CONSOLE, // Based on driver for this device | |
| 80 "/dev/ttydiag", | |
| 81 "/dev/haldiag", | |
| 82 &tty_devio, | |
| 83 tty_init, | |
| 84 tty_lookup, // Execute this when device is being looked up | |
| 85 &tty_private_info_diag); | |
| 86 #endif | |
| 87 | |
| 88 #ifdef CYGPKG_IO_SERIAL_TTY_TTY0 | |
| 89 static struct tty_private_info tty_private_info0; | |
| 90 DEVTAB_ENTRY(tty_io0, | |
| 91 "/dev/tty0", | |
| 92 CYGDAT_IO_SERIAL_TTY_TTY0_DEV, | |
| 93 &tty_devio, | |
| 94 tty_init, | |
| 95 tty_lookup, // Execute this when device is being looked up | |
| 96 &tty_private_info0); | |
| 97 #endif | |
| 98 | |
| 99 #ifdef CYGPKG_IO_SERIAL_TTY_TTY1 | |
| 100 static struct tty_private_info tty_private_info1; | |
| 101 DEVTAB_ENTRY(tty_io1, | |
| 102 "/dev/tty1", | |
| 103 CYGDAT_IO_SERIAL_TTY_TTY1_DEV, | |
| 104 &tty_devio, | |
| 105 tty_init, | |
| 106 tty_lookup, // Execute this when device is being looked up | |
| 107 &tty_private_info1); | |
| 108 #endif | |
| 109 | |
| 110 #ifdef CYGPKG_IO_SERIAL_TTY_TTY2 | |
| 111 static struct tty_private_info tty_private_info2; | |
| 112 DEVTAB_ENTRY(tty_io2, | |
| 113 "/dev/tty2", | |
| 114 CYGDAT_IO_SERIAL_TTY_TTY2_DEV, | |
| 115 &tty_devio, | |
| 116 tty_init, | |
| 117 tty_lookup, // Execute this when device is being looked up | |
| 118 &tty_private_info2); | |
| 119 #endif | |
| 120 | |
| 121 static bool | |
| 122 tty_init(struct cyg_devtab_entry *tab) | |
| 123 { | |
| 124 struct tty_private_info *priv = (struct tty_private_info *)tab->priv; | |
| 125 #ifdef CYGDBG_IO_INIT | |
| 126 diag_printf("Init tty channel: %x\n", tab); | |
| 127 #endif | |
| 128 priv->dev_info.tty_out_flags = CYG_TTY_OUT_FLAGS_DEFAULT; | |
| 129 priv->dev_info.tty_in_flags = CYG_TTY_IN_FLAGS_DEFAULT; | |
| 130 return true; | |
| 131 } | |
| 132 | |
| 133 static Cyg_ErrNo | |
| 134 tty_lookup(struct cyg_devtab_entry **tab, | |
| 135 struct cyg_devtab_entry *sub_tab, | |
| 136 const char *name) | |
| 137 { | |
| 138 cyg_io_handle_t chan = (cyg_io_handle_t)sub_tab; | |
| 139 struct tty_private_info *priv = (struct tty_private_info *)(*tab)->priv; | |
| 140 #if 0 | |
| 141 cyg_int32 len; | |
| 142 #endif | |
| 143 priv->dev_handle = chan; | |
| 144 #if 0 | |
| 145 len = sizeof(cyg_serial_info_t); | |
| 146 // Initialize configuration | |
| 147 cyg_io_get_config(chan, CYG_SERIAL_GET_CONFIG, | |
| 148 (void *)&priv->dev_info.serial_config, &len); | |
| 149 #endif | |
| 150 return ENOERR; | |
| 151 } | |
| 152 | |
| 153 #define BUFSIZE 64 | |
| 154 | |
| 155 static Cyg_ErrNo | |
| 156 tty_write(cyg_io_handle_t handle, const void *_buf, cyg_uint32 *len) | |
| 157 { | |
| 158 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle; | |
| 159 struct tty_private_info *priv = (struct tty_private_info *)t->priv; | |
| 160 cyg_io_handle_t chan = (cyg_io_handle_t)priv->dev_handle; | |
| 161 cyg_int32 size, bytes_successful, actually_written; | |
| 162 cyg_uint8 xbuf[BUFSIZE]; | |
| 163 cyg_uint8 c; | |
| 164 cyg_uint8 *buf = (cyg_uint8 *)_buf; | |
| 165 Cyg_ErrNo res = -EBADF; | |
| 166 // assert(chan) | |
| 167 size = 0; | |
| 168 bytes_successful = 0; | |
| 169 actually_written = 0; | |
| 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 | 172 if ((c == '\n') && |
| 173 (priv->dev_info.tty_out_flags & CYG_TTY_OUT_FLAGS_CRLF)) { | |
| 174 xbuf[size++] = '\r'; | |
| 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 | 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 | 179 (bytes_successful == *len)) { |
| 180 res = cyg_io_write(chan, xbuf, &size); | |
| 181 if (res != ENOERR) { | |
| 182 *len = actually_written; | |
| 183 return res; | |
| 184 } | |
| 185 actually_written += size; | |
| 186 size = 0; | |
| 187 } | |
| 188 } | |
| 189 *len = actually_written; | |
| 190 return res; | |
| 191 } | |
| 192 | |
| 193 static Cyg_ErrNo | |
| 194 tty_read(cyg_io_handle_t handle, void *_buf, cyg_uint32 *len) | |
| 195 { | |
| 196 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle; | |
| 197 struct tty_private_info *priv = (struct tty_private_info *)t->priv; | |
| 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 | 201 Cyg_ErrNo res; |
| 202 cyg_uint8 c; | |
| 203 cyg_uint8 *buf = (cyg_uint8 *)_buf; | |
| 204 // assert(chan) | |
| 205 size = 0; | |
| 206 while (size < *len) { | |
| 207 clen = 1; | |
| 208 res = cyg_io_read(chan, &c, &clen); | |
| 209 if (res != ENOERR) { | |
| 210 *len = size; | |
| 211 return res; | |
| 212 } | |
| 213 buf[size++] = c; | |
| 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 | 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 | 222 clen = 3; |
| 223 cyg_io_write(chan, "\b \b", &clen); | |
| 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 | 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 | 232 c = '\n'; // Map CR -> LF |
| 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 | 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 | 249 if (priv->dev_info.tty_in_flags & CYG_TTY_IN_FLAGS_ECHO) { |
| 250 clen = 1; | |
| 251 cyg_io_write(chan, &c, &clen); | |
| 252 } | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
66
diff
changeset
|
253 break; |
| 2 | 254 } |
| 255 } | |
| 256 } | |
| 257 *len = size; | |
| 258 return ENOERR; | |
| 259 } | |
| 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 | 272 static Cyg_ErrNo |
| 273 tty_get_config(cyg_io_handle_t handle, cyg_uint32 key, void *buf, cyg_uint32 *len) | |
| 274 { | |
| 275 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle; | |
| 276 struct tty_private_info *priv = (struct tty_private_info *)t->priv; | |
| 277 cyg_io_handle_t chan = (cyg_io_handle_t)priv->dev_handle; | |
| 278 Cyg_ErrNo res = ENOERR; | |
| 279 #if 0 | |
| 280 cyg_int32 current_len; | |
| 281 #endif | |
| 282 // assert(chan) | |
| 283 switch (key) { | |
| 284 case CYG_IO_GET_CONFIG_TTY_INFO: | |
| 285 if (*len < sizeof(cyg_tty_info_t)) { | |
| 286 return -EINVAL; | |
| 287 } | |
| 288 #if 0 | |
| 289 current_len = sizeof(cyg_serial_info_t); | |
| 290 res = cyg_io_get_config(chan, CYG_SERIAL_GET_CONFIG, | |
| 291 (void *)&priv->dev_info.serial_config, ¤t_len); | |
| 292 if (res != ENOERR) { | |
| 293 return res; | |
| 294 } | |
| 295 #endif | |
| 296 *(cyg_tty_info_t *)buf = priv->dev_info; | |
| 297 *len = sizeof(cyg_tty_info_t); | |
| 298 break; | |
| 299 default: // Assume this is a 'serial' driver control | |
| 300 res = cyg_io_get_config(chan, key, buf, len); | |
| 301 } | |
| 302 return res; | |
| 303 } | |
| 304 | |
| 305 static Cyg_ErrNo | |
| 306 tty_set_config(cyg_io_handle_t handle, cyg_uint32 key, const void *buf, cyg_uint32 *len) | |
| 307 { | |
| 308 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle; | |
| 309 struct tty_private_info *priv = (struct tty_private_info *)t->priv; | |
| 310 cyg_io_handle_t chan = (cyg_io_handle_t)priv->dev_handle; | |
| 311 #if 0 | |
| 312 cyg_int32 current_len; | |
| 313 #endif | |
| 314 Cyg_ErrNo res = ENOERR; | |
| 315 // assert(chan) | |
| 316 switch (key) { | |
| 317 case CYG_IO_SET_CONFIG_TTY_INFO: | |
| 318 if (*len != sizeof(cyg_tty_info_t)) { | |
| 319 return -EINVAL; | |
| 320 } | |
| 321 priv->dev_info = *(cyg_tty_info_t *)buf; | |
| 322 break; | |
| 323 default: // Pass on to serial driver | |
| 324 res = cyg_io_set_config(chan, key, buf, len); | |
| 325 } | |
| 326 return res; | |
| 327 } | |
| 328 #endif // CYGPKG_IO_SERIAL_TTY |
