blob: cb920f66baf29d55f146d8a75117410ad056f7cc [file] [log] [blame]
/*
* Copyright (C) 1995 Advanced RISC Machines Limited. All rights reserved.
*
* This software may be freely used, copied, modified, and distributed
* provided that the above copyright notice is preserved in all copies of the
* software.
*/
/* -*-C-*-
*
* $Revision$
* $Date$
*
*
* Project: ANGEL
*
* Title: Public client interface to devices
*/
#ifndef angel_devclnt_h
#define angel_devclnt_h
/*
* This header exports the public interface to Angel-compliant device
* drivers.
*
* They are intended to be used solely by Angel, not by the User
* Application. See devappl.h for the User Application interface to
* the device drivers.
*/
#include "devices.h"
/* General purpose constants, macros, enums, typedefs */
/*
* possible channels at device level
*
* XXX
*
* these are used as array indices, so be specific about their values
*/
typedef enum DevChanID {
DC_DBUG = 0, /* reliable debug packets
* containing SDBG, CLIB,UDBG, etc.) */
DC_APPL = 1, /* application packets */
DC_NUM_CHANNELS
} DevChanID;
/* Publically-accessible globals */
/* none */
/* Public functions */
/*
* Function: angel_DeviceWrite
* Purpose: The main entry point for asynchronous writes to a device.
*
* Params:
* Input: devID index of the device to write to
* buff data to write
* length how much data to write
* callback callback here when write finished
* or error
* cb_data data to be passed to callback
* chanID device channel to use
* Output: -
* In/Out: -
*
* Returns: DE_OKAY write request is underway
* DE_NO_DEV no such device
* DE_BAD_DEV device does not support angel writes
* DE_BAD_CHAN no such device channel
* DE_BUSY device busy with another write
* DE_INVAL silly length
*
* Reads globals: -
* Modifies globals: -
*
* Other side effects: -
*
* Commence asynchronous transmission of a buffer on a device. The
* callback will occur when the write completes or if there is an
* error.
*
* This must be called for each packet to be sent.
*/
DevError angel_DeviceWrite(DeviceID devID, p_Buffer buff,
unsigned length, DevWrite_CB_Fn callback,
void *cb_data, DevChanID chanID);
/*
* Function: angel_DeviceRegisterRead
* Purpose: The main entry point for asynchronous reads from a device.
*
* Params:
* Input: devID index of the device to read from
* callback callback here when read finished
* or error
* cb_data data to be passed to callback
* get_buff callback to be used to acquire buffer
* for incoming packets
* getb_data data to be passed to get_buff
* chanID device channel to use
* Output: -
* In/Out: -
*
* Returns: DE_OKAY read request is underway
* DE_NO_DEV no such device
* DE_BAD_DEV device does not support angel reads
* DE_BAD_CHAN no such device channel
* DE_BUSY device busy with another read
* DE_INVAL silly length
*
* Reads globals: -
* Modifies globals: -
*
* Other side effects: -
*
* Register asynchronous packet read from a device. The callback will
* occur when the read completes or if there is an error.
*
* This is persistent: the read remains registered for all incoming
* packets on the device channel.
*/
DevError angel_DeviceRegisterRead(DeviceID devID,
DevRead_CB_Fn callback, void *cb_data,
DevGetBuff_Fn get_buff, void *getb_data,
DevChanID chanID);
/*
* Function: angel_DeviceControl
* Purpose: Call a control function for a device
*
* Params:
* Input: devID index of the device to control to
* op operation to perform
* arg parameter depending on op
*
* Returns: DE_OKAY control request is underway
* DE_NO_DEV no such device
* DE_BAD_OP device does not support operation
*
* Reads globals: -
* Modifies globals: -
*
* Other side effects: -
*
* Have a device perform a control operation. Extra parameters vary
* according to the operation requested.
*/
DevError angel_DeviceControl(DeviceID devID, DeviceControl op, void *arg);
/*
* Function: angel_ReceiveMode
* Purpose: enable or disable reception across all devices
*
* Params:
* Input: mode choose enable or disable
*
* Pass the mode parameter to the receive_mode control method of each device
*/
void angel_ReceiveMode(DevRecvMode mode);
/*
* Function: angel_ResetDevices
* Purpose: reset all devices
*
* Params: none
*
* Call the reset control method for each device
*/
void angel_ResetDevices(void);
/*
* Function: angel_InitialiseDevices
* Purpose: initialise the device driver layer
*
* Params: none
*
* Set up the device driver layer and call the init method for each device
*/
void angel_InitialiseDevices(void);
/*
* Function: angel_IsAngelDevice
* Purpose: Find out if a device supports Angel packets
*
* Params:
* Input: devID index of the device to control to
*
* Returns: TRUE supports Angel packets
* FALSE raw device
*
* Reads globals: -
* Modifies globals: -
*
* Other side effects: -
*/
bool angel_IsAngelDevice(DeviceID devID);
#if !defined(MINIMAL_ANGEL) || MINIMAL_ANGEL == 0
/*
* Function: angel_ApplDeviceHandler
* Purpose: The entry point for User Application Device Driver requests
* in a full functiionality version of Angel.
* It will never be called directly by the User Application,
* but gets called indirectly, via the SWI handler.
*
* Params:
* Input: swi_r0 Argument to SWI indicating that
* angel_ApplDeviceHandler was to be called. This
* will not be used in this function, but is needed
* by the SWI handler.
* arg_blk pointer to block of arguments
* arg_blk[0] is one of
* angel_SWIreason_ApplDevice_{Read,Write,Yield}
* which indicates which angel_Device* fn is to
* be called. arg_blk[1] - arg_blk[n] are the
* arguments to the corresponding
* angel_ApplDevice* function.
* Output: -
* In/Out: -
*
* Returns: whatever the specified angel_Device* function
* returns.
*
* Reads globals: -
* Modifies globals: -
*
* Other side effects: -
*
* This has the side effects of angel_Device{Read,Write,Yield}
* depending upon which is operation is specified as described above.
*/
DevError angel_ApplDeviceHandler(
unsigned swi_r0, unsigned *arg_blk
);
#endif /* ndef MINIMAL_ANGEL */
#endif /* ndef angel_devclnt_h */
/* EOF devclnt.h */