]> Git Repo - binutils.git/blob - gdb/rdi-share/rxtx.h
Update/correct copyright notices.
[binutils.git] / gdb / rdi-share / rxtx.h
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 */
This page took 0.038781 seconds and 4 git commands to generate.