source: rtems/cpukit/sapi/src/io.c @ 66d9e3ad

4.104.114.84.95
Last change on this file since 66d9e3ad was 66d9e3ad, checked in by Joel Sherrill <joel.sherrill@…>, on 02/21/96 at 22:37:55

Changed io manager initialization routine to not be static and added it here.

  • Property mode set to 100644
File size: 7.8 KB
Line 
1/*
2 *  Input/Output Manager
3 *
4 *
5 *  COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
6 *  On-Line Applications Research Corporation (OAR).
7 *  All rights assigned to U.S. Government, 1994.
8 *
9 *  This material may be reproduced by or for the U.S. Government pursuant
10 *  to the copyright license under the clause at DFARS 252.227-7013.  This
11 *  notice must appear in all copies of this file and its derivatives.
12 *
13 *  $Id$
14 */
15
16#include <rtems/system.h>
17#include <rtems/io.h>
18#include <rtems/score/isr.h>
19#include <rtems/score/thread.h>
20#include <rtems/score/wkspace.h>
21
22#include <string.h>
23
24/*PAGE
25 *
26 *  _IO_Manager_initialization
27 *
28 */
29 
30void _IO_Manager_initialization(
31  rtems_driver_address_table *driver_table,
32  unsigned32                  number_of_drivers,
33  unsigned32                  number_of_devices
34)
35{
36  void                *tmp;
37  unsigned32           index;
38  rtems_driver_name_t *np;
39 
40  _IO_Driver_address_table = driver_table;
41  _IO_Number_of_drivers    = number_of_drivers;
42  _IO_Number_of_devices    = number_of_devices;
43 
44  tmp = _Workspace_Allocate_or_fatal_error(
45    sizeof( rtems_driver_name_t ) * ( number_of_devices + 1 )
46  );
47 
48  _IO_Driver_name_table = (rtems_driver_name_t *) tmp;
49 
50  for( index=0, np = _IO_Driver_name_table ;
51       index < _IO_Number_of_devices ;
52       index++, np++ ) {
53    np->device_name = 0;
54    np->device_name_length = 0;
55    np->major = 0;
56    np->minor = 0;
57  }
58}
59
60/*PAGE
61 *
62 *  _IO_Initialize_all_drivers
63 *
64 *  This routine initializes all device drivers
65 *
66 *  Input Paramters:   NONE
67 *
68 *  Output Parameters: NONE
69 */
70
71void _IO_Initialize_all_drivers( void )
72{
73   rtems_device_major_number major;
74
75   for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
76     (void) rtems_io_initialize( major, 0, NULL);
77}
78
79/*PAGE
80 *
81 *  rtems_io_register_name
82 *
83 *  Associate a name with a driver
84 *
85 *  Input Paramters:
86 *    device_name - pointer to name string to associate with device
87 *    major       - device major number to receive name
88 *    minor       - device minor number to receive name
89 *
90 *  Output Parameters:
91 *    RTEMS_SUCCESSFUL - if successful
92 *    error code       - if unsuccessful
93 */
94
95rtems_status_code rtems_io_register_name(
96    char *device_name,
97    rtems_device_major_number major,
98    rtems_device_minor_number minor
99  )
100{
101    rtems_driver_name_t *np;
102    unsigned32 level;
103    unsigned32 index;
104
105    /* find an empty slot */
106    for( index=0, np = _IO_Driver_name_table ;
107         index < _IO_Number_of_devices ;
108         index++, np++ )
109    {
110
111        _ISR_Disable(level);
112        if (np->device_name == 0)
113        {
114            np->device_name = device_name;
115            np->device_name_length = strlen(device_name);
116            np->major = major;
117            np->minor = minor;
118            _ISR_Enable(level);
119
120            return RTEMS_SUCCESSFUL;
121        }
122        _ISR_Enable(level);
123    }
124
125    return RTEMS_TOO_MANY;
126}
127
128/*PAGE
129 *
130 *  rtems_io_lookup_name
131 *
132 *  Find what driver "owns" this name
133 *
134 *  Input Paramters:
135 *    name - name to lookup the associated device
136 *
137 *  Output Parameters:
138 *    device_info      - device associate with name
139 *    RTEMS_SUCCESSFUL - if successful
140 *    error code       - if unsuccessful
141 */
142
143rtems_status_code rtems_io_lookup_name(
144    const char           *name,
145    rtems_driver_name_t **device_info
146)
147{
148    rtems_driver_name_t *np;
149    unsigned32 index;
150
151    for( index=0, np = _IO_Driver_name_table ;
152         index < _IO_Number_of_devices ;
153         index++, np++ )
154        if (np->device_name)
155            if (strncmp(np->device_name, name, np->device_name_length) == 0)
156            {               
157                *device_info = np;
158                return RTEMS_SUCCESSFUL;
159            }
160   
161    *device_info = 0;
162    return RTEMS_UNSATISFIED;
163}
164
165
166/*PAGE
167 *
168 *  rtems_io_initialize
169 *
170 *  This routine is the initialization directive of the IO manager.
171 *
172 *  Input Paramters:
173 *    major        - device driver number
174 *    minor        - device number
175 *    argument     - pointer to argument(s)
176 *
177 *  Output Parameters:
178 *    returns       - return code
179 */
180
181rtems_status_code rtems_io_initialize(
182  rtems_device_major_number  major,
183  rtems_device_minor_number  minor,
184  void             *argument
185)
186{
187    rtems_device_driver_entry callout;
188   
189    if ( major >= _IO_Number_of_drivers )
190        return RTEMS_INVALID_NUMBER;
191
192    callout = _IO_Driver_address_table[major].initialization;
193    return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
194}
195
196/*PAGE
197 *
198 *  rtems_io_open
199 *
200 *  This routine is the open directive of the IO manager.
201 *
202 *  Input Paramters:
203 *    major        - device driver number
204 *    minor        - device number
205 *    argument     - pointer to argument(s)
206 *
207 *  Output Parameters:
208 *    returns       - return code
209 */
210
211rtems_status_code rtems_io_open(
212  rtems_device_major_number  major,
213  rtems_device_minor_number  minor,
214  void                      *argument
215)
216{
217    rtems_device_driver_entry callout;
218   
219    if ( major >= _IO_Number_of_drivers )
220        return RTEMS_INVALID_NUMBER;
221
222    callout = _IO_Driver_address_table[major].open;
223    return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
224}
225
226/*PAGE
227 *
228 *  rtems_io_close
229 *
230 *  This routine is the close directive of the IO manager.
231 *
232 *  Input Paramters:
233 *    major        - device driver number
234 *    minor        - device number
235 *    argument     - pointer to argument(s)
236 *
237 *  Output Parameters:
238 *    returns       - return code
239 */
240
241rtems_status_code rtems_io_close(
242  rtems_device_major_number  major,
243  rtems_device_minor_number  minor,
244  void                      *argument
245)
246{
247    rtems_device_driver_entry callout;
248   
249    if ( major >= _IO_Number_of_drivers )
250        return RTEMS_INVALID_NUMBER;
251
252    callout = _IO_Driver_address_table[major].close;
253    return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
254}
255
256/*PAGE
257 *
258 *  rtems_io_read
259 *
260 *  This routine is the read directive of the IO manager.
261 *
262 *  Input Paramters:
263 *    major        - device driver number
264 *    minor        - device number
265 *    argument     - pointer to argument(s)
266 *
267 *  Output Parameters:
268 *    returns       - return code
269 */
270
271rtems_status_code rtems_io_read(
272  rtems_device_major_number  major,
273  rtems_device_minor_number  minor,
274  void                      *argument
275)
276{
277    rtems_device_driver_entry callout;
278   
279    if ( major >= _IO_Number_of_drivers )
280        return RTEMS_INVALID_NUMBER;
281
282    callout = _IO_Driver_address_table[major].read;
283    return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
284}
285
286/*PAGE
287 *
288 *  rtems_io_write
289 *
290 *  This routine is the write directive of the IO manager.
291 *
292 *  Input Paramters:
293 *    major        - device driver number
294 *    minor        - device number
295 *    argument     - pointer to argument(s)
296 *
297 *  Output Parameters:
298 *    returns       - return code
299 */
300
301rtems_status_code rtems_io_write(
302  rtems_device_major_number  major,
303  rtems_device_minor_number  minor,
304  void                      *argument
305)
306{
307    rtems_device_driver_entry callout;
308   
309    if ( major >= _IO_Number_of_drivers )
310        return RTEMS_INVALID_NUMBER;
311
312    callout = _IO_Driver_address_table[major].write;
313    return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
314}
315
316/*PAGE
317 *
318 *  rtems_io_control
319 *
320 *  This routine is the control directive of the IO manager.
321 *
322 *  Input Paramters:
323 *    major        - device driver number
324 *    minor        - device number
325 *    argument     - pointer to argument(s)
326 *
327 *  Output Parameters:
328 *    returns       - return code
329 */
330
331rtems_status_code rtems_io_control(
332  rtems_device_major_number  major,
333  rtems_device_minor_number  minor,
334  void                      *argument
335)
336{
337    rtems_device_driver_entry callout;
338   
339    if ( major >= _IO_Number_of_drivers )
340        return RTEMS_INVALID_NUMBER;
341
342    callout = _IO_Driver_address_table[major].control;
343    return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
344}
345
Note: See TracBrowser for help on using the repository browser.