summaryrefslogtreecommitdiffstats
path: root/cpukit/sapi/src/io.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/sapi/src/io.c')
-rw-r--r--cpukit/sapi/src/io.c345
1 files changed, 345 insertions, 0 deletions
diff --git a/cpukit/sapi/src/io.c b/cpukit/sapi/src/io.c
new file mode 100644
index 0000000000..f4f1b83c64
--- /dev/null
+++ b/cpukit/sapi/src/io.c
@@ -0,0 +1,345 @@
+/*
+ * Input/Output Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/io.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/wkspace.h>
+
+#include <string.h>
+
+/*PAGE
+ *
+ * _IO_Manager_initialization
+ *
+ */
+
+void _IO_Manager_initialization(
+ rtems_driver_address_table *driver_table,
+ unsigned32 number_of_drivers,
+ unsigned32 number_of_devices
+)
+{
+ void *tmp;
+ unsigned32 index;
+ rtems_driver_name_t *np;
+
+ _IO_Driver_address_table = driver_table;
+ _IO_Number_of_drivers = number_of_drivers;
+ _IO_Number_of_devices = number_of_devices;
+
+ tmp = _Workspace_Allocate_or_fatal_error(
+ sizeof( rtems_driver_name_t ) * ( number_of_devices + 1 )
+ );
+
+ _IO_Driver_name_table = (rtems_driver_name_t *) tmp;
+
+ for( index=0, np = _IO_Driver_name_table ;
+ index < _IO_Number_of_devices ;
+ index++, np++ ) {
+ np->device_name = 0;
+ np->device_name_length = 0;
+ np->major = 0;
+ np->minor = 0;
+ }
+}
+
+/*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;
+
+ for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
+ (void) rtems_io_initialize( major, 0, NULL);
+}
+
+/*PAGE
+ *
+ * rtems_io_register_name
+ *
+ * Associate a name with a driver
+ *
+ * Input Paramters:
+ * device_name - pointer to name string to associate with device
+ * major - device major number to receive name
+ * minor - device minor number to receive name
+ *
+ * Output Parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_io_register_name(
+ char *device_name,
+ rtems_device_major_number major,
+ rtems_device_minor_number minor
+ )
+{
+ rtems_driver_name_t *np;
+ unsigned32 level;
+ unsigned32 index;
+
+ /* find an empty slot */
+ for( index=0, np = _IO_Driver_name_table ;
+ index < _IO_Number_of_devices ;
+ index++, np++ )
+ {
+
+ _ISR_Disable(level);
+ if (np->device_name == 0)
+ {
+ np->device_name = device_name;
+ np->device_name_length = strlen(device_name);
+ np->major = major;
+ np->minor = minor;
+ _ISR_Enable(level);
+
+ return RTEMS_SUCCESSFUL;
+ }
+ _ISR_Enable(level);
+ }
+
+ return RTEMS_TOO_MANY;
+}
+
+/*PAGE
+ *
+ * rtems_io_lookup_name
+ *
+ * Find what driver "owns" this name
+ *
+ * Input Paramters:
+ * name - name to lookup the associated device
+ *
+ * Output Parameters:
+ * device_info - device associate with name
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_io_lookup_name(
+ const char *name,
+ rtems_driver_name_t **device_info
+)
+{
+ rtems_driver_name_t *np;
+ unsigned32 index;
+
+ for( index=0, np = _IO_Driver_name_table ;
+ index < _IO_Number_of_devices ;
+ index++, np++ )
+ if (np->device_name)
+ if (strncmp(np->device_name, name, np->device_name_length) == 0)
+ {
+ *device_info = np;
+ return RTEMS_SUCCESSFUL;
+ }
+
+ *device_info = 0;
+ return RTEMS_UNSATISFIED;
+}
+
+
+/*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)
+ *
+ * Output Parameters:
+ * returns - return code
+ */
+
+rtems_status_code rtems_io_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ rtems_device_driver_entry callout;
+
+ if ( major >= _IO_Number_of_drivers )
+ return RTEMS_INVALID_NUMBER;
+
+ callout = _IO_Driver_address_table[major].initialization;
+ return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
+}
+
+/*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)
+ *
+ * Output Parameters:
+ * returns - return code
+ */
+
+rtems_status_code rtems_io_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ rtems_device_driver_entry callout;
+
+ if ( major >= _IO_Number_of_drivers )
+ return RTEMS_INVALID_NUMBER;
+
+ callout = _IO_Driver_address_table[major].open;
+ return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
+}
+
+/*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)
+ *
+ * Output Parameters:
+ * returns - return code
+ */
+
+rtems_status_code rtems_io_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ rtems_device_driver_entry callout;
+
+ if ( major >= _IO_Number_of_drivers )
+ return RTEMS_INVALID_NUMBER;
+
+ callout = _IO_Driver_address_table[major].close;
+ return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
+}
+
+/*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)
+ *
+ * Output Parameters:
+ * returns - return code
+ */
+
+rtems_status_code rtems_io_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ rtems_device_driver_entry callout;
+
+ if ( major >= _IO_Number_of_drivers )
+ return RTEMS_INVALID_NUMBER;
+
+ callout = _IO_Driver_address_table[major].read;
+ return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
+}
+
+/*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)
+ *
+ * Output Parameters:
+ * returns - return code
+ */
+
+rtems_status_code rtems_io_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ rtems_device_driver_entry callout;
+
+ if ( major >= _IO_Number_of_drivers )
+ return RTEMS_INVALID_NUMBER;
+
+ callout = _IO_Driver_address_table[major].write;
+ return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
+}
+
+/*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)
+ *
+ * Output Parameters:
+ * returns - return code
+ */
+
+rtems_status_code rtems_io_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ rtems_device_driver_entry callout;
+
+ if ( major >= _IO_Number_of_drivers )
+ return RTEMS_INVALID_NUMBER;
+
+ callout = _IO_Driver_address_table[major].control;
+ return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
+}
+