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 #ifndef angsd_devsw_h 16b725ae77Skettenis #define angsd_devsw_h 17b725ae77Skettenis 18b725ae77Skettenis #include "devclnt.h" 19b725ae77Skettenis #include "adperr.h" 20b725ae77Skettenis #include "drivers.h" 21b725ae77Skettenis 22b725ae77Skettenis #ifndef __cplusplus 23b725ae77Skettenis typedef struct Packet Packet; 24b725ae77Skettenis typedef struct DevSWState DevSWState; 25b725ae77Skettenis #endif 26b725ae77Skettenis 27b725ae77Skettenis /* 28b725ae77Skettenis * the basic structure used for passing packets around 29b725ae77Skettenis */ 30b725ae77Skettenis struct Packet 31b725ae77Skettenis { 32b725ae77Skettenis struct Packet *pk_next; /* XXX first field in struct */ 33b725ae77Skettenis unsigned int pk_length; 34b725ae77Skettenis unsigned char *pk_buffer; 35b725ae77Skettenis }; 36b725ae77Skettenis 37b725ae77Skettenis /* 38b725ae77Skettenis * control structure, used for maintaining device switcher state 39b725ae77Skettenis */ 40b725ae77Skettenis struct DevSWState 41b725ae77Skettenis { 42b725ae77Skettenis unsigned int ds_opendevchans; /* bitmap of open device channels */ 43b725ae77Skettenis 44b725ae77Skettenis /* 45b725ae77Skettenis * queue of packets read for the various device channels 46b725ae77Skettenis */ 47b725ae77Skettenis Packet *ds_readqueue[DC_NUM_CHANNELS]; 48b725ae77Skettenis 49b725ae77Skettenis /* 50b725ae77Skettenis * structures for managing active read and write operations 51b725ae77Skettenis */ 52b725ae77Skettenis Packet *ds_nextreadpacket; 53b725ae77Skettenis DriverCall ds_activeread; 54b725ae77Skettenis DriverCall ds_activewrite; 55b725ae77Skettenis }; 56b725ae77Skettenis 57b725ae77Skettenis #ifdef __cplusplus 58b725ae77Skettenis extern "C" { 59b725ae77Skettenis #endif 60b725ae77Skettenis 61b725ae77Skettenis /* 62b725ae77Skettenis * Function: DevSW_AllocatePacket 63b725ae77Skettenis * Purpose: Claim some memory to hold a struct Packet, and the buffer for 64b725ae77Skettenis * that packet. 65b725ae77Skettenis * 66b725ae77Skettenis * Params: 67b725ae77Skettenis * Input: length Size of the buffer in struct Packet. 68b725ae77Skettenis * 69b725ae77Skettenis * Returns: 70b725ae77Skettenis * OK: Pointer to the newly malloc()ed Packet. 71b725ae77Skettenis * Error: NULL 72b725ae77Skettenis */ 73b725ae77Skettenis Packet *DevSW_AllocatePacket(const unsigned int length); 74b725ae77Skettenis 75b725ae77Skettenis /* 76b725ae77Skettenis * Function: DevSW_FreePacket 77b725ae77Skettenis * Purpose: Free the memory associated with a struct Packet. 78b725ae77Skettenis * 79b725ae77Skettenis * Pre-conditions The structure must have been originally claimed 80b725ae77Skettenis * via DevSW_AllocatePacket. 81b725ae77Skettenis * 82b725ae77Skettenis * Params: 83b725ae77Skettenis * Input: pk The packet to be freed. 84b725ae77Skettenis * 85b725ae77Skettenis * Returns: Nothing 86b725ae77Skettenis */ 87b725ae77Skettenis void DevSW_FreePacket(Packet *pk); 88b725ae77Skettenis 89b725ae77Skettenis /* 90b725ae77Skettenis * Function: DevSW_Open 91b725ae77Skettenis * Purpose: Open the specified device driver 92b725ae77Skettenis * 93b725ae77Skettenis * Params: 94b725ae77Skettenis * Input: name Identifies which device to open. This can either be 95b725ae77Skettenis * a host specific identifier (e.g. "/dev/ttya", 96b725ae77Skettenis * "COM1:"), or a number which is used to refer to 97b725ae77Skettenis * `standard' interfaces, so "1" would be the first host 98b725ae77Skettenis * interface, "2" the second, and so on. 99b725ae77Skettenis * 100b725ae77Skettenis * arg Driver specific arguments. For example, some serial 101b725ae77Skettenis * drivers accept speed and control arguments such as 102b725ae77Skettenis * "9600" or "19200/NO_BREAK". These arguments are 103b725ae77Skettenis * completely free-form: it is the individual drivers 104b725ae77Skettenis * which do the necessary interpretation. 105b725ae77Skettenis * 106b725ae77Skettenis * type The type of packet the caller is interested in. Only 107b725ae77Skettenis * one open is allowed for each type of packet. 108b725ae77Skettenis * 109b725ae77Skettenis * In/Out: device The device driver to open 110b725ae77Skettenis * 111b725ae77Skettenis * Returns: 112b725ae77Skettenis * OK: adp_ok 113b725ae77Skettenis * Error: adp_device_open_failed 114b725ae77Skettenis * adp_device_already_open 115b725ae77Skettenis * adp_malloc_failure 116b725ae77Skettenis */ 117b725ae77Skettenis AdpErrs DevSW_Open(DeviceDescr *device, const char *name, const char *arg, 118b725ae77Skettenis const DevChanID type); 119b725ae77Skettenis 120b725ae77Skettenis /* 121b725ae77Skettenis * Function: DevSW_Match 122b725ae77Skettenis * Purpose: Minimal veneer for DeviceMatch 123b725ae77Skettenis * 124b725ae77Skettenis * Params: 125b725ae77Skettenis * Input: device The device driver to match. 126b725ae77Skettenis * 127b725ae77Skettenis * name Identifies which device to open. This can either be 128b725ae77Skettenis * a host specific identifier (e.g. "/dev/ttya", 129b725ae77Skettenis * "COM1:"), or a number which is used to refer to 130b725ae77Skettenis * `standard' interfaces, so "1" would be the first host 131b725ae77Skettenis * interface, "2" the second, and so on. 132b725ae77Skettenis * 133b725ae77Skettenis * arg Driver specific arguments. For example, some serial 134b725ae77Skettenis * drivers accept speed and control arguments such as 135b725ae77Skettenis * "9600" or "19200/NO_BREAK". These arguments are 136b725ae77Skettenis * completely free-form: it is the individual drivers 137b725ae77Skettenis * which do the necessary interpretation. 138b725ae77Skettenis * 139b725ae77Skettenis * Returns: 140b725ae77Skettenis * OK: adp_ok 141b725ae77Skettenis * Error: adp_failed 142b725ae77Skettenis */ 143b725ae77Skettenis AdpErrs DevSW_Match(const DeviceDescr *device, const char *name, 144b725ae77Skettenis const char *arg); 145b725ae77Skettenis 146b725ae77Skettenis /* 147b725ae77Skettenis * Function: DevSW_Close 148b725ae77Skettenis * Purpose: Close the specified device driver. All packets of the type 149b725ae77Skettenis * used by the caller held within the switching layer will 150b725ae77Skettenis * be discarded. 151b725ae77Skettenis * 152b725ae77Skettenis * Pre-conditions: Device must have been previously opened. 153b725ae77Skettenis * 154b725ae77Skettenis * Params: 155b725ae77Skettenis * Input: device The device driver to close 156b725ae77Skettenis * 157b725ae77Skettenis * type The type of packet the caller was interested in. 158b725ae77Skettenis * 159b725ae77Skettenis * Returns: 160b725ae77Skettenis * OK: adp_ok 161b725ae77Skettenis * Error: adp_device_not_open 162b725ae77Skettenis */ 163b725ae77Skettenis AdpErrs DevSW_Close(DeviceDescr *device, const DevChanID type); 164b725ae77Skettenis 165b725ae77Skettenis /* 166b725ae77Skettenis * Function: DevSW_Read 167b725ae77Skettenis * Purpose: Read a packet of appropriate type from the device driver 168b725ae77Skettenis * 169b725ae77Skettenis * Params: 170b725ae77Skettenis * Input: device The device driver to read packet from. 171b725ae77Skettenis * 172b725ae77Skettenis * type The type of packet the caller is interested in. 173b725ae77Skettenis * 174b725ae77Skettenis * Output: packet Pointer to new packet (if one is available) 175b725ae77Skettenis * NULL (if no complete packet is available) 176b725ae77Skettenis * 177b725ae77Skettenis * Input: block If TRUE, read may safely block for a short period 178b725ae77Skettenis * of time (say up to 20ms), to avoid high CPU load 179b725ae77Skettenis * whilst waiting for a reply. 180b725ae77Skettenis * If FALSE, read MUST NOT block. 181b725ae77Skettenis * 182b725ae77Skettenis * Returns: 183b725ae77Skettenis * OK: adp_ok 184b725ae77Skettenis * Error: adp_bad_packet 185b725ae77Skettenis * 186b725ae77Skettenis * Post-conditions: The calling function is responsible for freeing the 187b725ae77Skettenis * resources used by the packet when it is no longer 188b725ae77Skettenis * needed. 189b725ae77Skettenis */ 190b725ae77Skettenis AdpErrs DevSW_Read(const DeviceDescr *device, const DevChanID type, 191b725ae77Skettenis Packet **packet, bool block); 192b725ae77Skettenis 193b725ae77Skettenis /* 194b725ae77Skettenis * Function: DevSW_Write 195b725ae77Skettenis * Purpose: Try to write a packet to the device driver. The write will 196b725ae77Skettenis * be bounced if another write is still in progress. 197b725ae77Skettenis * 198b725ae77Skettenis * Params: 199b725ae77Skettenis * Input: device The device driver to write a packet to. 200b725ae77Skettenis * 201b725ae77Skettenis * packet The packet to be written. 202b725ae77Skettenis * 203b725ae77Skettenis * type The type to be assigned to the packet. 204b725ae77Skettenis * 205b725ae77Skettenis * Returns: 206b725ae77Skettenis * OK: adp_ok 207b725ae77Skettenis * Error: adp_illegal_args 208b725ae77Skettenis * adp_write_busy 209b725ae77Skettenis * 210b725ae77Skettenis * Post-conditions: The calling function retains "ownership" of the packet, 211b725ae77Skettenis * i.e. it is responsible for freeing the resources used 212b725ae77Skettenis * by the packet when it is no longer needed. 213b725ae77Skettenis */ 214b725ae77Skettenis AdpErrs DevSW_Write(const DeviceDescr *device, Packet *packet, DevChanID type); 215b725ae77Skettenis 216b725ae77Skettenis /* 217b725ae77Skettenis * Function: DevSW_FlushPendingWrite 218b725ae77Skettenis * Purpose: If a write is in progress, give it a chance to finish. 219b725ae77Skettenis * 220b725ae77Skettenis * Params: 221b725ae77Skettenis * Input: device The device driver to flush. 222b725ae77Skettenis * 223b725ae77Skettenis * Returns: 224b725ae77Skettenis * adp_ok no pending write, or write flushed completely 225b725ae77Skettenis * adp_write_busy pending write not flushed completely 226b725ae77Skettenis */ 227b725ae77Skettenis AdpErrs DevSW_FlushPendingWrite(const DeviceDescr *device); 228b725ae77Skettenis 229b725ae77Skettenis /* 230b725ae77Skettenis * Function: DevSW_Ioctl 231b725ae77Skettenis * Purpose: Perform miscellaneous control operations. This is a minimal 232b725ae77Skettenis * veneer to DeviceIoctl. 233b725ae77Skettenis * 234b725ae77Skettenis * Params: 235b725ae77Skettenis * Input: device The device driver to control. 236b725ae77Skettenis * 237b725ae77Skettenis * opcode Reason code indicating the operation to perform. 238b725ae77Skettenis * 239b725ae77Skettenis * In/Out: args Pointer to opcode-sensitive arguments/result space. 240b725ae77Skettenis * 241b725ae77Skettenis * Returns: 242b725ae77Skettenis * OK: adp_ok 243b725ae77Skettenis * Error: adp_failed 244b725ae77Skettenis */ 245b725ae77Skettenis AdpErrs DevSW_Ioctl(const DeviceDescr *device, const int opcode, void *args); 246b725ae77Skettenis 247b725ae77Skettenis /* 248b725ae77Skettenis * Function: DevSW_WriteFinished 249b725ae77Skettenis * Purpose: Return TRUE if the active device has finished writing 250b725ae77Skettenis * the last packet to be sent, or FALSE if a packet is still 251b725ae77Skettenis * being transmitted. 252b725ae77Skettenis * 253b725ae77Skettenis * Params: 254b725ae77Skettenis * Input: device The device driver to check. 255b725ae77Skettenis * 256b725ae77Skettenis * Returns: 257b725ae77Skettenis * TRUE: write finished or inactive 258b725ae77Skettenis * FALSE: write in progress 259b725ae77Skettenis */ 260b725ae77Skettenis bool DevSW_WriteFinished(const DeviceDescr *device); 261b725ae77Skettenis 262b725ae77Skettenis 263b725ae77Skettenis /* 264b725ae77Skettenis * set filename and enable/disable logginf of ADP packets 265b725ae77Skettenis */ 266b725ae77Skettenis void DevSW_SetLogfile(const char *filename); 267b725ae77Skettenis void DevSW_SetLogEnable(int logEnableFlag); 268b725ae77Skettenis 269b725ae77Skettenis #ifdef __cplusplus 270b725ae77Skettenis } 271b725ae77Skettenis #endif 272b725ae77Skettenis 273b725ae77Skettenis #endif /* ndef angsd_devsw_h */ 274b725ae77Skettenis 275b725ae77Skettenis /* EOF devsw.h */ 276