OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [gdb/] [rdi-share/] [rxtx.h] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 578 markom
/*
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: 1.1.1.1 $
12
 *     $Date: 2002-01-16 10:24:34 $
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 */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.