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

4.104.114.84.95
Last change on this file since 3239698 was 3239698, checked in by Ralf Corsepius <ralf.corsepius@…>, on 04/15/04 at 13:26:21

Remove stray white spaces.

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