source: rtems/cpukit/sapi/src/io.c @ f26145b

4.104.114.84.95
Last change on this file since f26145b was 16351f7a, checked in by Ralf Corsepius <ralf.corsepius@…>, on 01/28/05 at 02:04:21

2005-01-28 Ralf Corsepius <ralf.corsepius@…>

  • sapi/src/debug.c, sapi/src/exinit.c, sapi/src/extension.c, sapi/src/extensioncreate.c, sapi/src/extensiondelete.c, sapi/src/extensionident.c, sapi/src/fatal.c, sapi/src/io.c, sapi/src/itronapi.c, sapi/src/posixapi.c, sapi/src/rtemsapi.c: Include config.h.
  • Property mode set to 100644
File size: 9.8 KB
RevLine 
[ac7d5ef0]1/*
2 *  Input/Output Manager
3 *
4 *
[08311cc3]5 *  COPYRIGHT (c) 1989-1999.
[ac7d5ef0]6 *  On-Line Applications Research Corporation (OAR).
7 *
[98e4ebf5]8 *  The license and distribution terms for this file may be
9 *  found in the file LICENSE in this distribution or at
[2ba508b]10 *  http://www.rtems.com/license/LICENSE.
[ac7d5ef0]11 *
12 *  $Id$
13 */
14
[16351f7a]15#if HAVE_CONFIG_H
16#include "config.h"
17#endif
18
[ac7d5ef0]19#include <rtems/system.h>
20#include <rtems/io.h>
[5e9b32b]21#include <rtems/score/isr.h>
22#include <rtems/score/thread.h>
[66d9e3ad]23#include <rtems/score/wkspace.h>
[b06e68ef]24
25#include <string.h>
[ac7d5ef0]26
[66d9e3ad]27/*PAGE
28 *
29 *  _IO_Manager_initialization
30 *
[059a3714]31 *  The IO manager has been extended to support runtime driver
32 *  registration. The driver table is now allocated in the
33 *  workspace.
34 *
[66d9e3ad]35 */
[8486081]36
[66d9e3ad]37void _IO_Manager_initialization(
[059a3714]38    rtems_driver_address_table *driver_table,
[8bd41178]39    uint32_t                    drivers_in_table,
40    uint32_t                    number_of_drivers,
41    uint32_t                    number_of_devices
[66d9e3ad]42)
43{
44  void                *tmp;
[8bd41178]45  uint32_t             index;
[66d9e3ad]46  rtems_driver_name_t *np;
[059a3714]47
48  if ( number_of_drivers < drivers_in_table )
49      number_of_drivers = drivers_in_table;
[8486081]50
[059a3714]51  tmp = _Workspace_Allocate_or_fatal_error(
52    sizeof( rtems_driver_address_table ) * ( number_of_drivers )
53  );
[8486081]54
[059a3714]55  _IO_Driver_address_table = (rtems_driver_address_table *) tmp;
56
57  memset(
58    _IO_Driver_address_table, 0,
59    sizeof( rtems_driver_address_table ) * ( number_of_drivers )
60  );
61
62  if ( drivers_in_table )
63      for ( index = 0 ; index < drivers_in_table ; index++ )
64        _IO_Driver_address_table[index] = driver_table[index];
[8486081]65
[059a3714]66  _IO_Number_of_drivers = number_of_drivers;
67  _IO_Number_of_devices = number_of_devices;
[8486081]68
[66d9e3ad]69  tmp = _Workspace_Allocate_or_fatal_error(
70    sizeof( rtems_driver_name_t ) * ( number_of_devices + 1 )
71  );
[8486081]72
[66d9e3ad]73  _IO_Driver_name_table = (rtems_driver_name_t *) tmp;
[8486081]74
[66d9e3ad]75  for( index=0, np = _IO_Driver_name_table ;
76       index < _IO_Number_of_devices ;
77       index++, np++ ) {
78    np->device_name = 0;
79    np->device_name_length = 0;
80    np->major = 0;
81    np->minor = 0;
82  }
83}
84
[ac7d5ef0]85/*PAGE
86 *
87 *  _IO_Initialize_all_drivers
88 *
89 *  This routine initializes all device drivers
90 *
91 *  Input Paramters:   NONE
92 *
93 *  Output Parameters: NONE
94 */
95
96void _IO_Initialize_all_drivers( void )
97{
98   rtems_device_major_number major;
99
100   for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
[3a4ae6c]101     (void) rtems_io_initialize( major, 0, NULL);
[b06e68ef]102}
103
[059a3714]104/*PAGE
105 *
106 *  rtems_io_register_driver
107 *
108 *  Register a driver into the device driver table.
109 *
110 *  Input Paramters:
111 *    major            - device major number (0 means allocate
112 *                       a number)
113 *    driver_table     - driver callout function table
114 *    registered_major - the major number which is registered
115 *
[8486081]116 *  Output Parameters:
[059a3714]117 *    RTEMS_SUCCESSFUL - if successful
118 *    error code       - if unsuccessful
119 */
120
121rtems_status_code rtems_io_register_driver(
122    rtems_device_major_number   major,
123    rtems_driver_address_table *driver_table,
124    rtems_device_major_number  *registered_major
125)
126{
127    *registered_major = 0;
128
129    /*
130     * Test for initialise/open being present to indicate the driver slot is
131     * in use.
132     */
133
134    if ( major >= _IO_Number_of_drivers )
135      return RTEMS_INVALID_NUMBER;
136
137    if ( major == 0 )
138    {
139        for ( major = _IO_Number_of_drivers - 1 ; major ; major-- )
140            if ( _IO_Driver_address_table[major].initialization_entry == 0 &&
141                 _IO_Driver_address_table[major].open_entry == 0 )
142                break;
143
144        if (( major == 0 ) &&
145            ( _IO_Driver_address_table[major].initialization_entry == 0 &&
146              _IO_Driver_address_table[major].open_entry == 0 ))
147            return RTEMS_TOO_MANY;
148    }
[8486081]149
[059a3714]150    if ( _IO_Driver_address_table[major].initialization_entry == 0 &&
151         _IO_Driver_address_table[major].open_entry == 0 )
152    {
153        _IO_Driver_address_table[major] = *driver_table;
154        *registered_major               = major;
155
[af16d17d]156        rtems_io_initialize( major, 0, NULL );
[059a3714]157
158        return RTEMS_SUCCESSFUL;
159    }
160
161    return RTEMS_RESOURCE_IN_USE;
162}
163
164/*PAGE
165 *
166 *  rtems_io_unregister_driver
167 *
168 *  Unregister a driver from the device driver table.
169 *
170 *  Input Paramters:
171 *    major            - device major number
172 *
[8486081]173 *  Output Parameters:
[059a3714]174 *    RTEMS_SUCCESSFUL - if successful
175 *    error code       - if unsuccessful
176 */
177
178rtems_status_code rtems_io_unregister_driver(
179    rtems_device_major_number major
180)
181{
182    if ( major < _IO_Number_of_drivers )
183    {
184        memset(
185            &_IO_Driver_address_table[major],
186            0,
187            sizeof( rtems_driver_address_table )
188        );
189        return RTEMS_SUCCESSFUL;
190    }
191    return RTEMS_UNSATISFIED;
192}
193
[b06e68ef]194/*PAGE
195 *
196 *  rtems_io_register_name
197 *
198 *  Associate a name with a driver
199 *
200 *  Input Paramters:
[c4808ca]201 *    device_name - pointer to name string to associate with device
202 *    major       - device major number to receive name
203 *    minor       - device minor number to receive name
[b06e68ef]204 *
[8486081]205 *  Output Parameters:
[c4808ca]206 *    RTEMS_SUCCESSFUL - if successful
207 *    error code       - if unsuccessful
[b06e68ef]208 */
209
[07a3253d]210#if 0
[b06e68ef]211rtems_status_code rtems_io_register_name(
212    char *device_name,
213    rtems_device_major_number major,
214    rtems_device_minor_number minor
215  )
216{
217    rtems_driver_name_t *np;
[8bd41178]218    uint32_t   level;
219    uint32_t   index;
[b06e68ef]220
221    /* find an empty slot */
[3a4ae6c]222    for( index=0, np = _IO_Driver_name_table ;
[8486081]223         index < _IO_Number_of_devices ;
[3a4ae6c]224         index++, np++ )
[b06e68ef]225    {
[3a4ae6c]226
227        _ISR_Disable(level);
[b06e68ef]228        if (np->device_name == 0)
229        {
230            np->device_name = device_name;
231            np->device_name_length = strlen(device_name);
232            np->major = major;
233            np->minor = minor;
[3a4ae6c]234            _ISR_Enable(level);
[b06e68ef]235
236            return RTEMS_SUCCESSFUL;
237        }
[3a4ae6c]238        _ISR_Enable(level);
[b06e68ef]239    }
240
241    return RTEMS_TOO_MANY;
242}
[07a3253d]243#endif
[b06e68ef]244
[ac7d5ef0]245/*PAGE
246 *
247 *  rtems_io_initialize
248 *
249 *  This routine is the initialization directive of the IO manager.
250 *
251 *  Input Paramters:
252 *    major        - device driver number
253 *    minor        - device number
254 *    argument     - pointer to argument(s)
255 *
256 *  Output Parameters:
257 *    returns       - return code
258 */
259
260rtems_status_code rtems_io_initialize(
261  rtems_device_major_number  major,
262  rtems_device_minor_number  minor,
[059a3714]263  void                      *argument
[ac7d5ef0]264)
265{
[b06e68ef]266    rtems_device_driver_entry callout;
[8486081]267
[b06e68ef]268    if ( major >= _IO_Number_of_drivers )
269        return RTEMS_INVALID_NUMBER;
270
[2e61938]271    callout = _IO_Driver_address_table[major].initialization_entry;
[b06e68ef]272    return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
[ac7d5ef0]273}
274
275/*PAGE
276 *
277 *  rtems_io_open
278 *
279 *  This routine is the open directive of the IO manager.
280 *
281 *  Input Paramters:
282 *    major        - device driver number
283 *    minor        - device number
284 *    argument     - pointer to argument(s)
285 *
286 *  Output Parameters:
287 *    returns       - return code
288 */
289
290rtems_status_code rtems_io_open(
291  rtems_device_major_number  major,
292  rtems_device_minor_number  minor,
[c4808ca]293  void                      *argument
[ac7d5ef0]294)
295{
[b06e68ef]296    rtems_device_driver_entry callout;
[8486081]297
[b06e68ef]298    if ( major >= _IO_Number_of_drivers )
299        return RTEMS_INVALID_NUMBER;
300
[2e61938]301    callout = _IO_Driver_address_table[major].open_entry;
[b06e68ef]302    return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
[ac7d5ef0]303}
304
305/*PAGE
306 *
307 *  rtems_io_close
308 *
309 *  This routine is the close directive of the IO manager.
310 *
311 *  Input Paramters:
312 *    major        - device driver number
313 *    minor        - device number
314 *    argument     - pointer to argument(s)
315 *
316 *  Output Parameters:
317 *    returns       - return code
318 */
319
320rtems_status_code rtems_io_close(
321  rtems_device_major_number  major,
322  rtems_device_minor_number  minor,
[c4808ca]323  void                      *argument
[ac7d5ef0]324)
325{
[b06e68ef]326    rtems_device_driver_entry callout;
[8486081]327
[b06e68ef]328    if ( major >= _IO_Number_of_drivers )
329        return RTEMS_INVALID_NUMBER;
330
[2e61938]331    callout = _IO_Driver_address_table[major].close_entry;
[b06e68ef]332    return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
[ac7d5ef0]333}
334
335/*PAGE
336 *
337 *  rtems_io_read
338 *
339 *  This routine is the read directive of the IO manager.
340 *
341 *  Input Paramters:
342 *    major        - device driver number
343 *    minor        - device number
344 *    argument     - pointer to argument(s)
345 *
346 *  Output Parameters:
347 *    returns       - return code
348 */
349
350rtems_status_code rtems_io_read(
351  rtems_device_major_number  major,
352  rtems_device_minor_number  minor,
[c4808ca]353  void                      *argument
[ac7d5ef0]354)
355{
[b06e68ef]356    rtems_device_driver_entry callout;
[8486081]357
[b06e68ef]358    if ( major >= _IO_Number_of_drivers )
359        return RTEMS_INVALID_NUMBER;
360
[2e61938]361    callout = _IO_Driver_address_table[major].read_entry;
[b06e68ef]362    return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
[ac7d5ef0]363}
364
365/*PAGE
366 *
367 *  rtems_io_write
368 *
369 *  This routine is the write directive of the IO manager.
370 *
371 *  Input Paramters:
372 *    major        - device driver number
373 *    minor        - device number
374 *    argument     - pointer to argument(s)
375 *
376 *  Output Parameters:
377 *    returns       - return code
378 */
379
380rtems_status_code rtems_io_write(
381  rtems_device_major_number  major,
382  rtems_device_minor_number  minor,
[c4808ca]383  void                      *argument
[ac7d5ef0]384)
385{
[b06e68ef]386    rtems_device_driver_entry callout;
[8486081]387
[b06e68ef]388    if ( major >= _IO_Number_of_drivers )
389        return RTEMS_INVALID_NUMBER;
390
[2e61938]391    callout = _IO_Driver_address_table[major].write_entry;
[b06e68ef]392    return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
[ac7d5ef0]393}
394
395/*PAGE
396 *
397 *  rtems_io_control
398 *
399 *  This routine is the control directive of the IO manager.
400 *
401 *  Input Paramters:
402 *    major        - device driver number
403 *    minor        - device number
404 *    argument     - pointer to argument(s)
405 *
406 *  Output Parameters:
407 *    returns       - return code
408 */
409
410rtems_status_code rtems_io_control(
411  rtems_device_major_number  major,
412  rtems_device_minor_number  minor,
[c4808ca]413  void                      *argument
[ac7d5ef0]414)
415{
[b06e68ef]416    rtems_device_driver_entry callout;
[8486081]417
[b06e68ef]418    if ( major >= _IO_Number_of_drivers )
419        return RTEMS_INVALID_NUMBER;
[ac7d5ef0]420
[2e61938]421    callout = _IO_Driver_address_table[major].control_entry;
[b06e68ef]422    return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
[ac7d5ef0]423}
Note: See TracBrowser for help on using the repository browser.