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