Mercurial > flash_v2
annotate packages/io/serial/current/include/serial.h @ 86:6512add4f5d6 ecos-sw-2000-05-05
Merge from eCos master repository on 2000-05-05-07:47:05-BST
| author | jlarmour |
|---|---|
| date | Fri, 05 May 2000 17:31:08 +0000 |
| parents | bf00f99aec69 |
| children | 6ed91473a1cd |
| rev | line source |
|---|---|
| 2 | 1 #ifndef CYGONCE_SERIAL_H |
| 2 #define CYGONCE_SERIAL_H | |
| 3 // ==================================================================== | |
| 4 // | |
| 5 // serial.h | |
| 6 // | |
| 7 // Device I/O | |
| 8 // | |
| 9 // ==================================================================== | |
| 10 //####COPYRIGHTBEGIN#### | |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
62
diff
changeset
|
11 // |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
62
diff
changeset
|
12 // ------------------------------------------- |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
62
diff
changeset
|
13 // 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
|
14 // 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
|
15 // 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
|
16 // http://www.redhat.com/ |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
62
diff
changeset
|
17 // |
|
66
bf00f99aec69
Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents:
64
diff
changeset
|
18 // 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
|
19 // 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
|
20 // 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
|
21 // the License. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
62
diff
changeset
|
22 // |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
62
diff
changeset
|
23 // 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
|
24 // released September 30, 1998. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
62
diff
changeset
|
25 // |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
62
diff
changeset
|
26 // 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
|
27 // 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
|
28 // 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
|
29 // All Rights Reserved. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
62
diff
changeset
|
30 // ------------------------------------------- |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
62
diff
changeset
|
31 // |
| 2 | 32 //####COPYRIGHTEND#### |
| 33 // ==================================================================== | |
| 34 //#####DESCRIPTIONBEGIN#### | |
| 35 // | |
| 36 // Author(s): gthomas | |
| 37 // Contributors: gthomas | |
| 38 // Date: 1999-02-04 | |
| 39 // Purpose: Internal interfaces for serial I/O drivers | |
| 40 // Description: | |
| 41 // | |
| 42 //####DESCRIPTIONEND#### | |
| 43 // | |
| 44 // ==================================================================== | |
| 45 | |
| 46 // Serial I/O interfaces | |
| 47 | |
| 48 #include <pkgconf/system.h> | |
|
86
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
49 #include <pkgconf/io_serial.h> |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
50 |
| 2 | 51 #include <cyg/infra/cyg_type.h> |
| 52 #include <cyg/io/io.h> | |
| 53 #include <cyg/io/serialio.h> | |
| 54 #include <cyg/hal/drv_api.h> | |
| 55 | |
| 56 typedef struct serial_channel serial_channel; | |
| 57 typedef struct serial_funs serial_funs; | |
| 58 | |
| 59 // Pointers into upper-level driver which interrupt handlers need | |
| 60 typedef struct { | |
| 61 // Initialize the channel | |
| 62 void (*serial_init)(serial_channel *chan); | |
| 63 // Cause an additional character to be output if one is available | |
| 64 void (*xmt_char)(serial_channel *chan); | |
| 65 // Consume an input character | |
| 66 void (*rcv_char)(serial_channel *chan, unsigned char c); | |
|
86
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
67 |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
68 #ifdef CYGINT_IO_SERIAL_BLOCK_TRANSFER |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
69 // Request space for input characters |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
70 bool (*data_rcv_req)(serial_channel *chan, int avail, |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
71 int* space_avail, unsigned char** space); |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
72 // Receive operation completed |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
73 void (*data_rcv_done)(serial_channel *chan); |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
74 // Request characters for transmission |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
75 bool (*data_xmt_req)(serial_channel *chan, int space, |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
76 int* chars_avail, unsigned char** chars); |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
77 // Transmit operation completed |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
78 void (*data_xmt_done)(serial_channel *chan); |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
79 #endif // CYGINT_IO_SERIAL_BLOCK_TRANSFER |
| 2 | 80 } serial_callbacks_t; |
| 81 | |
|
86
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
82 #ifdef CYGINT_IO_SERIAL_BLOCK_TRANSFER |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
83 #define SERIAL_CALLBACKS(_l,_init,_xmt_char,_rcv_char, _data_rcv_req, _data_rcv_done, _data_xmt_req, _data_xmt_done) \ |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
84 serial_callbacks_t _l = { \ |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
85 _init, \ |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
86 _xmt_char, \ |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
87 _rcv_char, \ |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
88 _data_rcv_req, \ |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
89 _data_rcv_done, \ |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
90 _data_xmt_req, \ |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
91 _data_xmt_done \ |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
92 }; |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
93 #else |
| 2 | 94 #define SERIAL_CALLBACKS(_l,_init,_xmt_char,_rcv_char) \ |
| 95 serial_callbacks_t _l = { \ | |
| 96 _init, \ | |
| 97 _xmt_char, \ | |
| 98 _rcv_char \ | |
| 99 }; | |
|
86
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
100 #endif |
| 2 | 101 |
|
62
7a6ac9edc838
Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents:
6
diff
changeset
|
102 extern serial_callbacks_t cyg_io_serial_callbacks; |
| 2 | 103 |
| 104 typedef struct { | |
| 105 unsigned char *data; | |
| 106 volatile int put; | |
| 107 volatile int get; | |
| 108 int len; | |
| 109 int low_water; // Min space in buffer before restart | |
| 110 cyg_drv_cond_t wait; | |
| 111 cyg_drv_mutex_t lock; | |
| 112 bool waiting; | |
|
86
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
113 #ifdef CYGOPT_IO_SERIAL_SUPPORT_NONBLOCKING |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
114 bool blocking; |
|
6512add4f5d6
Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents:
66
diff
changeset
|
115 #endif |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
116 volatile bool abort; // Set by an outsider to kill processing |
| 2 | 117 volatile cyg_int32 pending; // This many bytes waiting to be sent |
| 118 } cbuf_t; | |
| 119 | |
| 120 #define CBUF_INIT(_data, _len) \ | |
| 121 {_data, 0, 0, _len} | |
| 122 | |
| 123 // Private data which describes this channel | |
| 124 struct serial_channel { | |
| 125 serial_funs *funs; | |
| 126 serial_callbacks_t *callbacks; | |
| 127 void *dev_priv; // Whatever is needed by actual device routines | |
| 128 cyg_serial_info_t config; // Current configuration | |
| 129 bool init; | |
| 130 cbuf_t out_cbuf; | |
| 131 cbuf_t in_cbuf; | |
| 132 }; | |
| 133 | |
| 134 // Initialization macro for serial channel | |
| 135 #define SERIAL_CHANNEL(_l, \ | |
| 136 _funs, \ | |
| 137 _dev_priv, \ | |
| 138 _baud, _stop, _parity, _word_length, _flags) \ | |
| 139 serial_channel _l = { \ | |
| 140 &_funs, \ | |
|
62
7a6ac9edc838
Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents:
6
diff
changeset
|
141 &cyg_io_serial_callbacks, \ |
| 2 | 142 &(_dev_priv), \ |
| 143 CYG_SERIAL_INFO_INIT(_baud, _stop, _parity, _word_length, _flags), \ | |
| 144 }; | |
| 145 | |
| 146 #define SERIAL_CHANNEL_USING_INTERRUPTS(_l, \ | |
| 147 _funs, \ | |
| 148 _dev_priv, \ | |
| 149 _baud, _stop, _parity, _word_length, _flags, \ | |
| 150 _out_buf, _out_buflen, \ | |
| 151 _in_buf, _in_buflen) \ | |
| 152 serial_channel _l = { \ | |
| 153 &_funs, \ | |
|
62
7a6ac9edc838
Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents:
6
diff
changeset
|
154 &cyg_io_serial_callbacks, \ |
| 2 | 155 &(_dev_priv), \ |
| 156 CYG_SERIAL_INFO_INIT(_baud, _stop, _parity, _word_length, _flags), \ | |
| 157 false, \ | |
| 158 CBUF_INIT(_out_buf, _out_buflen), \ | |
| 159 CBUF_INIT(_in_buf, _in_buflen) \ | |
| 160 }; | |
| 161 | |
| 162 // Low level interface functions | |
| 163 struct serial_funs { | |
| 164 // Send one character to the output device, return true if consumed | |
| 165 bool (*putc)(serial_channel *priv, unsigned char c); | |
| 166 // Fetch one character from the device | |
| 167 unsigned char (*getc)(serial_channel *priv); | |
| 168 // Change hardware configuration (baud rate, etc) | |
| 169 bool (*set_config)(serial_channel *priv, cyg_serial_info_t *config); | |
| 170 // Enable the transmit channel and turn on transmit interrupts | |
| 171 void (*start_xmit)(serial_channel *priv); | |
| 172 // Disable the transmit channel and turn transmit interrupts off | |
| 173 void (*stop_xmit)(serial_channel *priv); | |
| 174 }; | |
| 175 | |
| 176 #define SERIAL_FUNS(_l,_putc,_getc,_set_config,_start_xmit,_stop_xmit) \ | |
| 177 serial_funs _l = { \ | |
| 178 _putc, \ | |
| 179 _getc, \ | |
| 180 _set_config, \ | |
| 181 _start_xmit, \ | |
| 182 _stop_xmit \ | |
| 183 }; | |
| 184 | |
|
62
7a6ac9edc838
Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents:
6
diff
changeset
|
185 extern cyg_devio_table_t cyg_io_serial_devio; |
| 2 | 186 |
| 187 #endif // CYGONCE_SERIAL_H |
