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: Public client interface to devices 18b725ae77Skettenis */ 19b725ae77Skettenis 20b725ae77Skettenis #ifndef angel_devclnt_h 21b725ae77Skettenis #define angel_devclnt_h 22b725ae77Skettenis 23b725ae77Skettenis /* 24b725ae77Skettenis * This header exports the public interface to Angel-compliant device 25b725ae77Skettenis * drivers. 26b725ae77Skettenis * 27b725ae77Skettenis * They are intended to be used solely by Angel, not by the User 28b725ae77Skettenis * Application. See devappl.h for the User Application interface to 29b725ae77Skettenis * the device drivers. 30b725ae77Skettenis */ 31b725ae77Skettenis 32b725ae77Skettenis #include "devices.h" 33b725ae77Skettenis 34b725ae77Skettenis /* General purpose constants, macros, enums, typedefs */ 35b725ae77Skettenis 36b725ae77Skettenis /* 37b725ae77Skettenis * possible channels at device level 38b725ae77Skettenis * 39b725ae77Skettenis * XXX 40b725ae77Skettenis * 41b725ae77Skettenis * these are used as array indices, so be specific about their values 42b725ae77Skettenis */ 43b725ae77Skettenis typedef enum DevChanID { 44b725ae77Skettenis DC_DBUG = 0, /* reliable debug packets 45b725ae77Skettenis * containing SDBG, CLIB,UDBG, etc.) */ 46b725ae77Skettenis DC_APPL = 1, /* application packets */ 47b725ae77Skettenis DC_NUM_CHANNELS 48b725ae77Skettenis } DevChanID; 49b725ae77Skettenis 50b725ae77Skettenis /* Publically-accessible globals */ 51b725ae77Skettenis /* none */ 52b725ae77Skettenis 53b725ae77Skettenis /* Public functions */ 54b725ae77Skettenis 55b725ae77Skettenis /* 56b725ae77Skettenis * Function: angel_DeviceWrite 57b725ae77Skettenis * Purpose: The main entry point for asynchronous writes to a device. 58b725ae77Skettenis * 59b725ae77Skettenis * Params: 60b725ae77Skettenis * Input: devID index of the device to write to 61b725ae77Skettenis * buff data to write 62b725ae77Skettenis * length how much data to write 63b725ae77Skettenis * callback callback here when write finished 64b725ae77Skettenis * or error 65b725ae77Skettenis * cb_data data to be passed to callback 66b725ae77Skettenis * chanID device channel to use 67b725ae77Skettenis * Output: - 68b725ae77Skettenis * In/Out: - 69b725ae77Skettenis * 70b725ae77Skettenis * Returns: DE_OKAY write request is underway 71b725ae77Skettenis * DE_NO_DEV no such device 72b725ae77Skettenis * DE_BAD_DEV device does not support angel writes 73b725ae77Skettenis * DE_BAD_CHAN no such device channel 74b725ae77Skettenis * DE_BUSY device busy with another write 75b725ae77Skettenis * DE_INVAL silly length 76b725ae77Skettenis * 77b725ae77Skettenis * Reads globals: - 78b725ae77Skettenis * Modifies globals: - 79b725ae77Skettenis * 80b725ae77Skettenis * Other side effects: - 81b725ae77Skettenis * 82b725ae77Skettenis * Commence asynchronous transmission of a buffer on a device. The 83b725ae77Skettenis * callback will occur when the write completes or if there is an 84b725ae77Skettenis * error. 85b725ae77Skettenis * 86b725ae77Skettenis * This must be called for each packet to be sent. 87b725ae77Skettenis */ 88b725ae77Skettenis 89b725ae77Skettenis DevError angel_DeviceWrite(DeviceID devID, p_Buffer buff, 90b725ae77Skettenis unsigned length, DevWrite_CB_Fn callback, 91b725ae77Skettenis void *cb_data, DevChanID chanID); 92b725ae77Skettenis 93b725ae77Skettenis 94b725ae77Skettenis /* 95b725ae77Skettenis * Function: angel_DeviceRegisterRead 96b725ae77Skettenis * Purpose: The main entry point for asynchronous reads from a device. 97b725ae77Skettenis * 98b725ae77Skettenis * Params: 99b725ae77Skettenis * Input: devID index of the device to read from 100b725ae77Skettenis * callback callback here when read finished 101b725ae77Skettenis * or error 102b725ae77Skettenis * cb_data data to be passed to callback 103b725ae77Skettenis * get_buff callback to be used to acquire buffer 104b725ae77Skettenis * for incoming packets 105b725ae77Skettenis * getb_data data to be passed to get_buff 106b725ae77Skettenis * chanID device channel to use 107b725ae77Skettenis * Output: - 108b725ae77Skettenis * In/Out: - 109b725ae77Skettenis * 110b725ae77Skettenis * Returns: DE_OKAY read request is underway 111b725ae77Skettenis * DE_NO_DEV no such device 112b725ae77Skettenis * DE_BAD_DEV device does not support angel reads 113b725ae77Skettenis * DE_BAD_CHAN no such device channel 114b725ae77Skettenis * DE_BUSY device busy with another read 115b725ae77Skettenis * DE_INVAL silly length 116b725ae77Skettenis * 117b725ae77Skettenis * Reads globals: - 118b725ae77Skettenis * Modifies globals: - 119b725ae77Skettenis * 120b725ae77Skettenis * Other side effects: - 121b725ae77Skettenis * 122b725ae77Skettenis * Register asynchronous packet read from a device. The callback will 123b725ae77Skettenis * occur when the read completes or if there is an error. 124b725ae77Skettenis * 125b725ae77Skettenis * This is persistent: the read remains registered for all incoming 126b725ae77Skettenis * packets on the device channel. 127b725ae77Skettenis */ 128b725ae77Skettenis 129b725ae77Skettenis DevError angel_DeviceRegisterRead(DeviceID devID, 130b725ae77Skettenis DevRead_CB_Fn callback, void *cb_data, 131b725ae77Skettenis DevGetBuff_Fn get_buff, void *getb_data, 132b725ae77Skettenis DevChanID chanID); 133b725ae77Skettenis 134b725ae77Skettenis 135b725ae77Skettenis /* 136b725ae77Skettenis * Function: angel_DeviceControl 137b725ae77Skettenis * Purpose: Call a control function for a device 138b725ae77Skettenis * 139b725ae77Skettenis * Params: 140b725ae77Skettenis * Input: devID index of the device to control to 141b725ae77Skettenis * op operation to perform 142b725ae77Skettenis * arg parameter depending on op 143b725ae77Skettenis * 144b725ae77Skettenis * Returns: DE_OKAY control request is underway 145b725ae77Skettenis * DE_NO_DEV no such device 146b725ae77Skettenis * DE_BAD_OP device does not support operation 147b725ae77Skettenis * 148b725ae77Skettenis * Reads globals: - 149b725ae77Skettenis * Modifies globals: - 150b725ae77Skettenis * 151b725ae77Skettenis * Other side effects: - 152b725ae77Skettenis * 153b725ae77Skettenis * Have a device perform a control operation. Extra parameters vary 154b725ae77Skettenis * according to the operation requested. 155b725ae77Skettenis */ 156b725ae77Skettenis 157b725ae77Skettenis DevError angel_DeviceControl(DeviceID devID, DeviceControl op, void *arg); 158b725ae77Skettenis 159b725ae77Skettenis 160b725ae77Skettenis /* 161b725ae77Skettenis * Function: angel_ReceiveMode 162b725ae77Skettenis * Purpose: enable or disable reception across all devices 163b725ae77Skettenis * 164b725ae77Skettenis * Params: 165b725ae77Skettenis * Input: mode choose enable or disable 166b725ae77Skettenis * 167b725ae77Skettenis * Pass the mode parameter to the receive_mode control method of each device 168b725ae77Skettenis */ 169b725ae77Skettenis 170b725ae77Skettenis void angel_ReceiveMode(DevRecvMode mode); 171b725ae77Skettenis 172b725ae77Skettenis 173b725ae77Skettenis /* 174b725ae77Skettenis * Function: angel_ResetDevices 175b725ae77Skettenis * Purpose: reset all devices 176b725ae77Skettenis * 177b725ae77Skettenis * Params: none 178b725ae77Skettenis * 179b725ae77Skettenis * Call the reset control method for each device 180b725ae77Skettenis */ 181b725ae77Skettenis 182b725ae77Skettenis void angel_ResetDevices(void); 183b725ae77Skettenis 184b725ae77Skettenis 185b725ae77Skettenis /* 186b725ae77Skettenis * Function: angel_InitialiseDevices 187b725ae77Skettenis * Purpose: initialise the device driver layer 188b725ae77Skettenis * 189b725ae77Skettenis * Params: none 190b725ae77Skettenis * 191b725ae77Skettenis * Set up the device driver layer and call the init method for each device 192b725ae77Skettenis */ 193b725ae77Skettenis 194b725ae77Skettenis void angel_InitialiseDevices(void); 195b725ae77Skettenis 196b725ae77Skettenis 197b725ae77Skettenis /* 198b725ae77Skettenis * Function: angel_IsAngelDevice 199b725ae77Skettenis * Purpose: Find out if a device supports Angel packets 200b725ae77Skettenis * 201b725ae77Skettenis * Params: 202b725ae77Skettenis * Input: devID index of the device to control to 203b725ae77Skettenis * 204b725ae77Skettenis * Returns: TRUE supports Angel packets 205b725ae77Skettenis * FALSE raw device 206b725ae77Skettenis * 207b725ae77Skettenis * Reads globals: - 208b725ae77Skettenis * Modifies globals: - 209b725ae77Skettenis * 210b725ae77Skettenis * Other side effects: - 211b725ae77Skettenis */ 212b725ae77Skettenis 213b725ae77Skettenis bool angel_IsAngelDevice(DeviceID devID); 214b725ae77Skettenis 215b725ae77Skettenis 216b725ae77Skettenis #if !defined(MINIMAL_ANGEL) || MINIMAL_ANGEL == 0 217b725ae77Skettenis 218b725ae77Skettenis /* 219b725ae77Skettenis * Function: angel_ApplDeviceHandler 220b725ae77Skettenis * Purpose: The entry point for User Application Device Driver requests 221b725ae77Skettenis * in a full functiionality version of Angel. 222b725ae77Skettenis * It will never be called directly by the User Application, 223b725ae77Skettenis * but gets called indirectly, via the SWI handler. 224b725ae77Skettenis * 225b725ae77Skettenis * Params: 226b725ae77Skettenis * Input: swi_r0 Argument to SWI indicating that 227b725ae77Skettenis * angel_ApplDeviceHandler was to be called. This 228b725ae77Skettenis * will not be used in this function, but is needed 229b725ae77Skettenis * by the SWI handler. 230b725ae77Skettenis * arg_blk pointer to block of arguments 231b725ae77Skettenis * arg_blk[0] is one of 232b725ae77Skettenis * angel_SWIreason_ApplDevice_{Read,Write,Yield} 233b725ae77Skettenis * which indicates which angel_Device* fn is to 234b725ae77Skettenis * be called. arg_blk[1] - arg_blk[n] are the 235b725ae77Skettenis * arguments to the corresponding 236b725ae77Skettenis * angel_ApplDevice* function. 237b725ae77Skettenis * Output: - 238b725ae77Skettenis * In/Out: - 239b725ae77Skettenis * 240b725ae77Skettenis * Returns: whatever the specified angel_Device* function 241b725ae77Skettenis * returns. 242b725ae77Skettenis * 243b725ae77Skettenis * Reads globals: - 244b725ae77Skettenis * Modifies globals: - 245b725ae77Skettenis * 246b725ae77Skettenis * Other side effects: - 247b725ae77Skettenis * 248b725ae77Skettenis * This has the side effects of angel_Device{Read,Write,Yield} 249b725ae77Skettenis * depending upon which is operation is specified as described above. 250b725ae77Skettenis */ 251b725ae77Skettenis 252b725ae77Skettenis DevError angel_ApplDeviceHandler( 253b725ae77Skettenis unsigned swi_r0, unsigned *arg_blk 254b725ae77Skettenis ); 255b725ae77Skettenis 256b725ae77Skettenis #endif /* ndef MINIMAL_ANGEL */ 257b725ae77Skettenis 258b725ae77Skettenis #endif /* ndef angel_devclnt_h */ 259b725ae77Skettenis 260b725ae77Skettenis /* EOF devclnt.h */ 261