diff options
Diffstat (limited to 'cpukit/sapi/src/io.c')
-rw-r--r-- | cpukit/sapi/src/io.c | 316 |
1 files changed, 316 insertions, 0 deletions
diff --git a/cpukit/sapi/src/io.c b/cpukit/sapi/src/io.c new file mode 100644 index 0000000000..cf78bb9f71 --- /dev/null +++ b/cpukit/sapi/src/io.c @@ -0,0 +1,316 @@ +/* + * Input/Output Manager + * + * + * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994. + * On-Line Applications Research Corporation (OAR). + * All rights assigned to U.S. Government, 1994. + * + * This material may be reproduced by or for the U.S. Government pursuant + * to the copyright license under the clause at DFARS 252.227-7013. This + * notice must appear in all copies of this file and its derivatives. + * + * $Id$ + */ + +#include <rtems/system.h> +#include <rtems/config.h> +#include <rtems/io.h> +#include <rtems/isr.h> +#include <rtems/thread.h> + +/*PAGE + * + * _IO_Initialize_all_drivers + * + * This routine initializes all device drivers + * + * Input Paramters: NONE + * + * Output Parameters: NONE + */ + +void _IO_Initialize_all_drivers( void ) +{ + rtems_device_major_number major; + unsigned32 ignored; + + for ( major=0 ; major < _IO_Number_of_drivers ; major ++ ) + (void) rtems_io_initialize( major, 0, _Configuration_Table, &ignored ); +} + +/*PAGE + * + * rtems_io_initialize + * + * This routine is the initialization directive of the IO manager. + * + * Input Paramters: + * major - device driver number + * minor - device number + * argument - pointer to argument(s) + * return_value - pointer to driver's return value + * + * Output Parameters: + * returns - return code + * *return_value - driver's return code + */ + +rtems_status_code rtems_io_initialize( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *argument, + unsigned32 *return_value +) +{ + return _IO_Handler_routine( + IO_INITIALIZE_OPERATION, + major, + minor, + argument, + return_value + ); +} + +/*PAGE + * + * rtems_io_open + * + * This routine is the open directive of the IO manager. + * + * Input Paramters: + * major - device driver number + * minor - device number + * argument - pointer to argument(s) + * return_value - pointer to driver's return value + * + * Output Parameters: + * returns - return code + * *return_value - driver's return code + */ + +rtems_status_code rtems_io_open( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *argument, + unsigned32 *return_value +) +{ + return _IO_Handler_routine( + IO_OPEN_OPERATION, + major, + minor, + argument, + return_value + ); +} + +/*PAGE + * + * rtems_io_close + * + * This routine is the close directive of the IO manager. + * + * Input Paramters: + * major - device driver number + * minor - device number + * argument - pointer to argument(s) + * return_value - pointer to driver's return value + * + * Output Parameters: + * returns - return code + * *return_value - driver's return code + */ + +rtems_status_code rtems_io_close( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *argument, + unsigned32 *return_value +) +{ + return _IO_Handler_routine( + IO_CLOSE_OPERATION, + major, + minor, + argument, + return_value + ); +} + +/*PAGE + * + * rtems_io_read + * + * This routine is the read directive of the IO manager. + * + * Input Paramters: + * major - device driver number + * minor - device number + * argument - pointer to argument(s) + * return_value - pointer to driver's return value + * + * Output Parameters: + * returns - return code + * *return_value - driver's return code + */ + +rtems_status_code rtems_io_read( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *argument, + unsigned32 *return_value +) +{ + return _IO_Handler_routine( + IO_READ_OPERATION, + major, + minor, + argument, + return_value + ); +} + +/*PAGE + * + * rtems_io_write + * + * This routine is the write directive of the IO manager. + * + * Input Paramters: + * major - device driver number + * minor - device number + * argument - pointer to argument(s) + * return_value - pointer to driver's return value + * + * Output Parameters: + * returns - return code + * *return_value - driver's return code + */ + +rtems_status_code rtems_io_write( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *argument, + unsigned32 *return_value +) +{ + return _IO_Handler_routine( + IO_WRITE_OPERATION, + major, + minor, + argument, + return_value + ); +} + +/*PAGE + * + * rtems_io_control + * + * This routine is the control directive of the IO manager. + * + * Input Paramters: + * major - device driver number + * minor - device number + * argument - pointer to argument(s) + * return_value - pointer to driver's return value + * + * Output Parameters: + * returns - return code + * *return_value - driver's return code + */ + +rtems_status_code rtems_io_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *argument, + unsigned32 *return_value +) +{ + return _IO_Handler_routine( + IO_CONTROL_OPERATION, + major, + minor, + argument, + return_value + ); +} + +/*PAGE + * + * _IO_Handler_routine + * + * This routine implements all IO manager directives. + * + * Input Paramters: + * operation - I/O operation to be performed + * major - device driver number + * minor - device number + * argument - pointer to argument(s) + * return_value - pointer to driver's return value + * + * Output Parameters: + * returns - return code + * *return_value - driver's return code + */ + +rtems_status_code _IO_Handler_routine( + IO_operations operation, + rtems_device_major_number major, + rtems_device_minor_number minor, + void *argument, + unsigned32 *return_value +) +{ + rtems_device_driver_entry io_callout; + + /* + * NOTE: There is no range checking as in Ada because: + * + arrays in Ada are not always zero based. + * + with zero based arrays, a comparison of an unsigned + * number being less than zero would be necessary to + * check it as a range. This would cause a warning for + * checking an unsigned number for being negative. + */ + + if ( major >= _IO_Number_of_drivers ) + return ( RTEMS_INVALID_NUMBER ); + + switch ( operation ) { + case IO_INITIALIZE_OPERATION: + io_callout = _IO_Driver_address_table[ major ].initialization; + break; + case IO_OPEN_OPERATION: + io_callout = _IO_Driver_address_table[ major ].open; + break; + case IO_CLOSE_OPERATION: + io_callout = _IO_Driver_address_table[ major ].close; + break; + case IO_READ_OPERATION: + io_callout = _IO_Driver_address_table[ major ].read; + break; + case IO_WRITE_OPERATION: + io_callout = _IO_Driver_address_table[ major ].write; + break; + case IO_CONTROL_OPERATION: + io_callout = _IO_Driver_address_table[ major ].control; + break; + default: /* unreached -- only to remove warnings */ + io_callout = NULL; + break; + } + + if ( io_callout != NULL ) + (*io_callout)( + major, + minor, + argument, + _Thread_Executing->Object.id, + return_value + ); + else + *return_value = 0; + + return( RTEMS_SUCCESSFUL ); +} |