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