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

4.104.114.84.95
Last change on this file since ff3f8c85 was ff3f8c85, checked in by Joel Sherrill <joel.sherrill@…>, on 05/28/07 at 15:51:01

2007-05-28 Joel Sherrill <joel.sherrill@…>

  • libmisc/Makefile.am, libmisc/monitor/mon-object.c, libmisc/monitor/monitor.h, sapi/include/confdefs.h, sapi/include/rtems/config.h, sapi/include/rtems/io.h, sapi/src/exinit.c, sapi/src/io.c: Eliminate maximum_drivers configuration parameter since it was used to configure a no longer used feature. Device names are now part of the filesystem not in a table. This also eliminated the variables _IO_Number_of_devices and _IO_Driver_name_table from RTEMS as well as the memory allocation used to populate _IO_Driver_name_table.
  • libmisc/monitor/mon-dname.c: Removed.
  • Property mode set to 100644
File size: 7.6 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#if HAVE_CONFIG_H
16#include "config.h"
17#endif
18
19#include <rtems/system.h>
20#include <rtems/io.h>
21#include <rtems/score/isr.h>
22#include <rtems/score/thread.h>
23#include <rtems/score/wkspace.h>
24
25#include <string.h>
26
27/*PAGE
28 *
29 *  _IO_Manager_initialization
30 *
31 *  The IO manager has been extended to support runtime driver
32 *  registration. The driver table is now allocated in the
33 *  workspace.
34 *
35 */
36
37void _IO_Manager_initialization(
38  rtems_driver_address_table *driver_table,
39  uint32_t                    drivers_in_table,
40  uint32_t                    number_of_drivers
41)
42{
43  if ( number_of_drivers < drivers_in_table )
44    number_of_drivers = drivers_in_table;
45
46  _IO_Driver_address_table = driver_table;
47  _IO_Number_of_drivers = number_of_drivers;
48}
49
50/*PAGE
51 *
52 *  _IO_Initialize_all_drivers
53 *
54 *  This routine initializes all device drivers
55 *
56 *  Input Paramters:   NONE
57 *
58 *  Output Parameters: NONE
59 */
60
61void _IO_Initialize_all_drivers( void )
62{
63   rtems_device_major_number major;
64
65   for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
66     (void) rtems_io_initialize( major, 0, NULL );
67}
68
69/*PAGE
70 *
71 *  rtems_io_register_driver
72 *
73 *  Register a driver into the device driver table.
74 *
75 *  Input Paramters:
76 *    major            - device major number (0 means allocate
77 *                       a number)
78 *    driver_table     - driver callout function table
79 *    registered_major - the major number which is registered
80 *
81 *  Output Parameters:
82 *    RTEMS_SUCCESSFUL - if successful
83 *    error code       - if unsuccessful
84 */
85
86rtems_status_code rtems_io_register_driver(
87    rtems_device_major_number   major,
88    rtems_driver_address_table *driver_table,
89    rtems_device_major_number  *registered_major
90)
91{
92  *registered_major = 0;
93
94  /*
95   * Test for initialise/open being present to indicate the driver slot is
96   * in use.
97   */
98
99  if ( major >= _IO_Number_of_drivers )
100    return RTEMS_INVALID_NUMBER;
101
102  if ( major == 0 ) {
103    for ( major = _IO_Number_of_drivers - 1 ; major ; major-- )
104      if ( _IO_Driver_address_table[major].initialization_entry == 0 &&
105           _IO_Driver_address_table[major].open_entry == 0 )
106        break;
107
108      if (( major == 0 ) &&
109          ( _IO_Driver_address_table[major].initialization_entry == 0 &&
110            _IO_Driver_address_table[major].open_entry == 0 ))
111        return RTEMS_TOO_MANY;
112  }
113
114  if ( _IO_Driver_address_table[major].initialization_entry == 0 &&
115       _IO_Driver_address_table[major].open_entry == 0 ) {
116    _IO_Driver_address_table[major] = *driver_table;
117    *registered_major               = major;
118
119    rtems_io_initialize( major, 0, NULL );
120
121    return RTEMS_SUCCESSFUL;
122  }
123
124  return RTEMS_RESOURCE_IN_USE;
125}
126
127/*PAGE
128 *
129 *  rtems_io_unregister_driver
130 *
131 *  Unregister a driver from the device driver table.
132 *
133 *  Input Paramters:
134 *    major            - device major number
135 *
136 *  Output Parameters:
137 *    RTEMS_SUCCESSFUL - if successful
138 *    error code       - if unsuccessful
139 */
140
141rtems_status_code rtems_io_unregister_driver(
142  rtems_device_major_number major
143)
144{
145  if ( major < _IO_Number_of_drivers ) {
146    memset(
147      &_IO_Driver_address_table[major],
148      0,
149      sizeof( rtems_driver_address_table )
150    );
151    return RTEMS_SUCCESSFUL;
152  }
153  return RTEMS_UNSATISFIED;
154}
155
156/*PAGE
157 *
158 *  rtems_io_initialize
159 *
160 *  This routine is the initialization directive of the IO manager.
161 *
162 *  Input Paramters:
163 *    major        - device driver number
164 *    minor        - device number
165 *    argument     - pointer to argument(s)
166 *
167 *  Output Parameters:
168 *    returns       - return code
169 */
170
171rtems_status_code rtems_io_initialize(
172  rtems_device_major_number  major,
173  rtems_device_minor_number  minor,
174  void                      *argument
175)
176{
177  rtems_device_driver_entry callout;
178
179  if ( major >= _IO_Number_of_drivers )
180    return RTEMS_INVALID_NUMBER;
181
182  callout = _IO_Driver_address_table[major].initialization_entry;
183  return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
184}
185
186/*PAGE
187 *
188 *  rtems_io_open
189 *
190 *  This routine is the open directive of the IO manager.
191 *
192 *  Input Paramters:
193 *    major        - device driver number
194 *    minor        - device number
195 *    argument     - pointer to argument(s)
196 *
197 *  Output Parameters:
198 *    returns       - return code
199 */
200
201rtems_status_code rtems_io_open(
202  rtems_device_major_number  major,
203  rtems_device_minor_number  minor,
204  void                      *argument
205)
206{
207  rtems_device_driver_entry callout;
208
209  if ( major >= _IO_Number_of_drivers )
210    return RTEMS_INVALID_NUMBER;
211
212  callout = _IO_Driver_address_table[major].open_entry;
213  return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
214}
215
216/*PAGE
217 *
218 *  rtems_io_close
219 *
220 *  This routine is the close directive of the IO manager.
221 *
222 *  Input Paramters:
223 *    major        - device driver number
224 *    minor        - device number
225 *    argument     - pointer to argument(s)
226 *
227 *  Output Parameters:
228 *    returns       - return code
229 */
230
231rtems_status_code rtems_io_close(
232  rtems_device_major_number  major,
233  rtems_device_minor_number  minor,
234  void                      *argument
235)
236{
237  rtems_device_driver_entry callout;
238
239  if ( major >= _IO_Number_of_drivers )
240    return RTEMS_INVALID_NUMBER;
241
242  callout = _IO_Driver_address_table[major].close_entry;
243  return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
244}
245
246/*PAGE
247 *
248 *  rtems_io_read
249 *
250 *  This routine is the read directive of the IO manager.
251 *
252 *  Input Paramters:
253 *    major        - device driver number
254 *    minor        - device number
255 *    argument     - pointer to argument(s)
256 *
257 *  Output Parameters:
258 *    returns       - return code
259 */
260
261rtems_status_code rtems_io_read(
262  rtems_device_major_number  major,
263  rtems_device_minor_number  minor,
264  void                      *argument
265)
266{
267  rtems_device_driver_entry callout;
268
269  if ( major >= _IO_Number_of_drivers )
270    return RTEMS_INVALID_NUMBER;
271
272  callout = _IO_Driver_address_table[major].read_entry;
273  return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
274}
275
276/*PAGE
277 *
278 *  rtems_io_write
279 *
280 *  This routine is the write directive of the IO manager.
281 *
282 *  Input Paramters:
283 *    major        - device driver number
284 *    minor        - device number
285 *    argument     - pointer to argument(s)
286 *
287 *  Output Parameters:
288 *    returns       - return code
289 */
290
291rtems_status_code rtems_io_write(
292  rtems_device_major_number  major,
293  rtems_device_minor_number  minor,
294  void                      *argument
295)
296{
297  rtems_device_driver_entry callout;
298
299  if ( major >= _IO_Number_of_drivers )
300    return RTEMS_INVALID_NUMBER;
301
302  callout = _IO_Driver_address_table[major].write_entry;
303  return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
304}
305
306/*PAGE
307 *
308 *  rtems_io_control
309 *
310 *  This routine is the control directive of the IO manager.
311 *
312 *  Input Paramters:
313 *    major        - device driver number
314 *    minor        - device number
315 *    argument     - pointer to argument(s)
316 *
317 *  Output Parameters:
318 *    returns       - return code
319 */
320
321rtems_status_code rtems_io_control(
322  rtems_device_major_number  major,
323  rtems_device_minor_number  minor,
324  void                      *argument
325)
326{
327  rtems_device_driver_entry callout;
328
329  if ( major >= _IO_Number_of_drivers )
330    return RTEMS_INVALID_NUMBER;
331
332  callout = _IO_Driver_address_table[major].control_entry;
333  return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
334}
Note: See TracBrowser for help on using the repository browser.