summaryrefslogblamecommitdiffstats
path: root/cpukit/sapi/src/io.c
blob: 916053da7ed662ae31cbafc516cfbc6fa9e4601c (plain) (tree)

































































































































































































































































                                                                            
                                       

                                   

                                         




















































                                                                      
/*
 *  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 );
}