]>
Commit | Line | Data |
---|---|---|
3a9c3d12 NC |
1 | /* |
2 | * Copyright (C) 1995 Advanced RISC Machines Limited. All rights reserved. | |
3 | * | |
4 | * This software may be freely used, copied, modified, and distributed | |
5 | * provided that the above copyright notice is preserved in all copies of the | |
6 | * software. | |
7 | */ | |
8 | ||
9 | /*-*-C-*- | |
10 | * | |
11 | * $Revision$ | |
12 | * $Date$ | |
13 | * | |
14 | * | |
15 | * Project: ANGEL | |
16 | * | |
17 | * Title: Definitions required for the rx and tx engines | |
18 | */ | |
19 | ||
20 | #ifndef angel_rxtx_h | |
21 | #define angel_rxtx_h | |
22 | ||
23 | ||
24 | /* | |
25 | * we need a definition for bool, which is "system" dependent | |
26 | */ | |
27 | #ifdef TARGET | |
28 | # include "angel.h" | |
29 | #else | |
30 | # include "host.h" | |
31 | #endif | |
32 | ||
33 | #include "devclnt.h" | |
34 | ||
35 | /* return status codes for the rx engine */ | |
36 | typedef enum re_status { | |
37 | RS_WAIT_PKT, | |
38 | RS_IN_PKT, | |
39 | RS_BAD_PKT, | |
40 | RS_GOOD_PKT | |
41 | } re_status; | |
42 | ||
43 | /* return status codes for the tx engine */ | |
44 | typedef enum te_status { | |
45 | TS_IDLE, | |
46 | TS_IN_PKT, | |
47 | TS_DONE_PKT | |
48 | } te_status; | |
49 | ||
50 | ||
51 | /* | |
52 | * required serial definitions, they should all be <32, refer to the | |
53 | * re_config struct comments for more details | |
54 | */ | |
55 | #define serial_STX (0x1c) /* data packet start */ | |
56 | #define serial_ETX (0x1d) /* packet end */ | |
57 | #define serial_ESC (0x1b) /* standard escape character */ | |
58 | #define serial_XON (0x11) /* software flow control - enable transmission */ | |
59 | #define serial_XOFF (0x13) /* software flow control - disable transmission */ | |
60 | ||
61 | /* | |
62 | * All other characters are transmitted clean. If any of the above | |
63 | * characters need to be transmitted as part of the serial data stream | |
64 | * then the character will be preceded by the "serial_ESC" character, | |
65 | * and then the required character transmitted (OR-ed with the | |
66 | * "serial_ESCAPE" value, to ensure that the serial stream never has | |
67 | * any of the exceptional characters generated by data transfers). | |
68 | */ | |
69 | ||
70 | #define serial_ESCAPE (0x40) /* OR-ed with escaped characters */ | |
71 | ||
72 | /* bad packet error codes */ | |
73 | typedef enum re_error { | |
74 | RE_OKAY, | |
75 | RE_U_STX, | |
76 | RE_U_ETX, | |
77 | RE_LEN, | |
78 | RE_CRC, | |
79 | RE_NETX, | |
80 | RE_INTERNAL | |
81 | } re_error; | |
82 | ||
83 | /* a decoded packet */ | |
84 | struct data_packet { | |
85 | unsigned short buf_len; /* should be set by caller */ | |
86 | DevChanID type; /* valid when status is RS_GOOD_PKT */ | |
87 | unsigned short len; /* --"-- */ | |
88 | unsigned int crc; /* crc for the unescaped pkt */ | |
89 | unsigned char *data; /* should be set by caller */ | |
90 | }; | |
91 | ||
92 | /* | |
93 | * Purpose: typedef for flow control function | |
94 | * | |
95 | * Params: | |
96 | * Input: fc_char the flow control character in question | |
97 | * In/Out: cb_data callback data as set in the fc_data | |
98 | * field of re_config, typically device id | |
99 | * | |
100 | * This callback would tpyically respond to received XON and XOFF | |
101 | * characters by controlling the transmit side of the device. | |
102 | */ | |
103 | typedef void (*fc_cb_func)(char fc_char, void *cb_data); | |
104 | ||
105 | ||
106 | /* | |
107 | * Purpose: typedef for the function to alloc the data buffer | |
108 | * | |
109 | * Params: | |
110 | * In/Out: packet the data packet: len and type will be set on | |
111 | * entry, and buf_len and data should | |
112 | * be set by this routine if successful. | |
113 | * cb_data callback data as set in the ba_data | |
114 | * field of re_config, typically device id | |
115 | * | |
116 | * Returns: TRUE buffer allocated okay | |
117 | * FALSE couldn't allocate buffer of required size | |
118 | * for given type | |
119 | * | |
120 | * This callback should attempt to acquire a buffer for the data portion | |
121 | * of the packet which is currently being received, based on the len and | |
122 | * type fields supplied in packet. | |
123 | * | |
124 | * angel_DD_RxEng_BufferAlloc() is supplied for use as this callback, | |
125 | * and will be sufficient for most devices. | |
126 | */ | |
127 | typedef bool (*BufferAlloc_CB_Fn)(struct data_packet *packet, void *cb_data); | |
128 | ||
129 | ||
130 | /* | |
131 | * The static info needed by the engine, may vary per device. | |
132 | * | |
133 | * fc_set and esc_set are bitmaps, e.g. bit 3 == charcode 3 == ASCII ETX. | |
134 | * Thus any of the first 32 charcodes can be set for flow control or to | |
135 | * be escaped. | |
136 | * | |
137 | * Note that esc_set should include all of fc_set, and should have bits | |
138 | * set for stx, etx and esc, as a minimum. | |
139 | * | |
140 | * If character codes > 31 need to be used then fc_set and esc_set | |
141 | * and their handling can be extended to use arrays and bit manipulation | |
142 | * macros, potentially up to the full 256 possible chars. | |
143 | * | |
144 | * Note too that this could/should be shared with the tx engine. | |
145 | */ | |
146 | ||
147 | struct re_config { | |
148 | unsigned char stx; /* the STX char for this device */ | |
149 | unsigned char etx; /* the ETX --"-- */ | |
150 | unsigned char esc; /* the ESC --"-- */ | |
151 | unsigned int fc_set; /* bitmap of flow control chars */ | |
152 | unsigned int esc_set; /* bitmap of special chars */ | |
153 | fc_cb_func fc_callback; /* flow control callback func */ | |
154 | void *fc_data; /* data to pass to fc_callback */ | |
155 | BufferAlloc_CB_Fn ba_callback; /* buffer alloc callback */ | |
156 | void *ba_data; /* data to pass to ba_calback */ | |
157 | }; | |
158 | ||
159 | /* the dynamic info needed by the rx engine */ | |
160 | struct re_state { | |
161 | unsigned char rx_state; /* 3 bits pkt state, 1 prepro state */ | |
162 | unsigned short field_c; /* chars left in current field */ | |
163 | unsigned short index; /* index into buffer */ | |
164 | unsigned int crc; /* crc accumulator */ | |
165 | re_error error; /* valid only if status is RS_BAD_PKT */ | |
166 | const struct re_config *config; /* pointer to static config */ | |
167 | }; | |
168 | ||
169 | /* dynamic state info needed by the tx engine */ | |
170 | struct te_state { | |
171 | unsigned short field_c; /* position in current field */ | |
172 | unsigned char tx_state; /* encodes n,e, and f (2+1+2=5 bits) */ | |
173 | unsigned char encoded; /* escape-encoded char for transmission */ | |
174 | const struct re_config *config; /* pointer to static config */ | |
175 | unsigned int crc; /* space for CRC (before escaping) */ | |
176 | }; | |
177 | ||
178 | /* | |
179 | * Function: Angel_RxEngineInit | |
180 | * Purpose: Initialise state (during device init) for engine. | |
181 | * | |
182 | * Params: | |
183 | * Input: config static config info | |
184 | * In/Out: state internal state | |
185 | */ | |
186 | ||
187 | void Angel_RxEngineInit(const struct re_config *config, | |
188 | struct re_state *state); | |
189 | ||
190 | /* | |
191 | * Function: Angel_RxEngine | |
192 | * Purpose: Rx Engine for character-based devices | |
193 | * | |
194 | * Params: | |
195 | * Input: new_ch the latest character | |
196 | * | |
197 | * In/Out: packet details of packet | |
198 | * packet.buf_len and packet.data must | |
199 | * be set on entry! | |
200 | * state internal state, intially set by | |
201 | * angel_RxEngineInit() | |
202 | * | |
203 | * Returns: re_status (see above) | |
204 | * | |
205 | */ | |
206 | ||
207 | re_status Angel_RxEngine(unsigned char new_ch, struct data_packet *packet, | |
208 | struct re_state *state); | |
209 | ||
210 | /* | |
211 | * This can be used as the buffer allocation callback for the rx engine, | |
212 | * and will make use of angel_DD_GetBuffer() [in devdrv.h]. | |
213 | * | |
214 | * Saves duplicating this callback function in every device driver that | |
215 | * uses the rx engine. | |
216 | * | |
217 | * Note that this REQUIRES that the device id is installed as ba_data | |
218 | * in the rx engine config structure for the driver. | |
219 | */ | |
220 | bool angel_DD_RxEng_BufferAlloc( struct data_packet *packet, void *cb_data ); | |
221 | ||
222 | /* | |
223 | * Function: Angel_TxEngineInit | |
224 | * Purpose: Set up tx engine at start of new packet, calculate CRC etc. | |
225 | * (This should perform the actions described under | |
226 | * "Initialisation" above) | |
227 | * | |
228 | * Params: | |
229 | * Input: config static config info | |
230 | * packet the packet to transmit | |
231 | * In/Out: state internal state | |
232 | */ | |
233 | ||
234 | void Angel_TxEngineInit(const struct re_config *config, | |
235 | const struct data_packet *packet, | |
236 | struct te_state *state); | |
237 | ||
238 | /* | |
239 | * Function: Angel_TxEngine | |
240 | * Purpose: Tx Engine for character-based devices | |
241 | * | |
242 | * Params: | |
243 | * Input: packet details of packet | |
244 | * packet.len, packet.data and | |
245 | * packet.type must | |
246 | * be set on entry! | |
247 | * In/Out: state internal state, intially set by | |
248 | * angel_TxEngineStart() | |
249 | * Output: tx_ch the character to be transmitted | |
250 | * (NOT SET if return code is TS_IDLE) | |
251 | * | |
252 | * Returns: te_status (see above) | |
253 | */ | |
254 | ||
255 | te_status Angel_TxEngine(const struct data_packet *packet, | |
256 | struct te_state *state, | |
257 | unsigned char *tx_ch); | |
258 | ||
259 | ||
260 | ||
261 | #endif /* !defined(angel_rxtx_h) */ | |
262 | ||
263 | /* EOF rxtx.h */ |