/* SPDX-License-Identifier: BSD-2-Clause */ /** * @file * * @ingroup RTEMSAPIClassicIO * * @brief This header file defines the IO Manager API. */ /* * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de) * Copyright (C) 1988, 2008 On-Line Applications Research Corporation (OAR) * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * This file is part of the RTEMS quality process and was automatically * generated. If you find something that needs to be fixed or * worded better please post a report or patch to an RTEMS mailing list * or raise a bug report: * * https://www.rtems.org/bugs.html * * For information on updating and regenerating please refer to the How-To * section in the Software Requirements Engineering chapter of the * RTEMS Software Engineering manual. The manual is provided as a part of * a release. For development sources please refer to the online * documentation at: * * https://docs.rtems.org */ /* Generated from spec:/rtems/io/if/header */ #ifndef _RTEMS_IO_H #define _RTEMS_IO_H #include #include #ifdef __cplusplus extern "C" { #endif /* Generated from spec:/rtems/io/if/group */ /** * @defgroup RTEMSAPIClassicIO I/O Manager * * @ingroup RTEMSAPIClassic * * @brief The Input/Output (I/O) Manager provides a well-defined mechanism for * accessing device drivers and a structured methodology for organizing * device drivers. */ /* Generated from spec:/rtems/io/if/device-driver */ /** * @ingroup RTEMSAPIClassicIO * * @brief This type shall be used in device driver entry declarations and * definitions. * * @par Notes * Device driver entries return an #rtems_status_code status code. This type * definition helps to document device driver entries in the source code. */ typedef rtems_status_code rtems_device_driver; /* Generated from spec:/rtems/io/if/device-major-number */ /** * @ingroup RTEMSAPIClassicIO * * @brief This integer type represents the major number of devices. * * @par Notes * The major number of a device is determined by rtems_io_register_driver() and * the application configuration (see #CONFIGURE_MAXIMUM_DRIVERS) . */ typedef uint32_t rtems_device_major_number; /* Generated from spec:/rtems/io/if/device-minor-number */ /** * @ingroup RTEMSAPIClassicIO * * @brief This integer type represents the minor number of devices. * * @par Notes * The minor number of devices is managed by the device driver. */ typedef uint32_t rtems_device_minor_number; /* Generated from spec:/rtems/io/if/device-driver-entry */ /** * @ingroup RTEMSAPIClassicIO * * @brief Device driver entries shall have this type. */ typedef rtems_device_driver ( *rtems_device_driver_entry )( rtems_device_major_number, rtems_device_minor_number, void * ); /* Generated from spec:/rtems/io/if/driver-address-table */ /** * @ingroup RTEMSAPIClassicIO * * @brief This structure contains the device driver entries. * * This structure is used to register a device driver via * rtems_io_register_driver(). */ typedef struct { /** * @brief This member is the device driver initialization entry. * * This entry is called by rtems_io_initialize(). */ rtems_device_driver_entry initialization_entry; /** * @brief This member is the device driver open entry. * * This entry is called by rtems_io_open(). */ rtems_device_driver_entry open_entry; /** * @brief This member is the device driver close entry. * * This entry is called by rtems_io_close(). */ rtems_device_driver_entry close_entry; /** * @brief This member is the device driver read entry. * * This entry is called by rtems_io_read(). */ rtems_device_driver_entry read_entry; /** * @brief This member is the device driver write entry. * * This entry is called by rtems_io_write(). */ rtems_device_driver_entry write_entry; /** * @brief This member is the device driver control entry. * * This entry is called by rtems_io_control(). */ rtems_device_driver_entry control_entry; } rtems_driver_address_table; /* Generated from spec:/rtems/io/if/register-driver */ /** * @ingroup RTEMSAPIClassicIO * * @brief Registers and initializes the device with the specified device driver * address table and device major number in the Device Driver Table. * * @param major is the device major number. Use a value of zero to let the * system obtain a device major number automatically. * * @param driver_table is the device driver address table. * * @param[out] registered_major is the pointer to a device major number * variable. When the directive call is successful, the device major number * of the registered device will be stored in this variable. * * @retval ::RTEMS_SUCCESSFUL The requested operation was successful. * * @retval ::RTEMS_INVALID_ADDRESS The device major number of the device was * NULL. * * @retval ::RTEMS_INVALID_ADDRESS The device driver address table was empty. * * @retval ::RTEMS_INVALID_NUMBER The device major number of the device was out * of range, see #CONFIGURE_MAXIMUM_DRIVERS. * * @retval ::RTEMS_TOO_MANY The system was unable to obtain a device major * number. * * @retval ::RTEMS_RESOURCE_IN_USE The device major number was already in use. * * @retval ::RTEMS_CALLED_FROM_ISR The directive was called from interrupt * context. * * @return Other status codes may be returned by rtems_io_initialize(). * * @par Notes * @parblock * If the device major number equals zero a device major number will be * obtained. The device major number of the registered driver will be * returned. * * After a successful registration, the rtems_io_initialize() directive will be * called to initialize the device. * @endparblock */ rtems_status_code rtems_io_register_driver( rtems_device_major_number major, const rtems_driver_address_table *driver_table, rtems_device_major_number *registered_major ); /* Generated from spec:/rtems/io/if/unregister-driver */ /** * @ingroup RTEMSAPIClassicIO * * @brief Removes a device driver specified by the device major number from the * Device Driver Table. * * @param major is the major number of the device. * * @retval ::RTEMS_SUCCESSFUL The requested operation was successful. * * @retval ::RTEMS_UNSATISFIED The device major number was invalid. * * @retval ::RTEMS_CALLED_FROM_ISR The directive was called from interrupt * context. * * @par Notes * Currently no specific checks are made and the driver is not closed. */ rtems_status_code rtems_io_unregister_driver( rtems_device_major_number major ); /* Generated from spec:/rtems/io/if/initialize */ /** * @ingroup RTEMSAPIClassicIO * * @brief Initializes the device specified by the device major and minor * numbers. * * @param major is the major number of the device. * * @param minor is the minor number of the device. * * @param argument is the argument passed to the device driver initialization * entry. * * This directive calls the device driver initialization entry registered in * the Device Driver Table for the specified device major number. * * @retval ::RTEMS_SUCCESSFUL The requested operation was successful. * * @retval ::RTEMS_INVALID_NUMBER The device major number was invalid. * * @return Other status codes may be returned by the device driver * initialization entry. * * @par Notes * @parblock * This directive is automatically invoked for each device driver defined by * the application configuration during the system initialization and via the * rtems_io_register_driver() directive. * * A device driver initialization entry is responsible for initializing all * hardware and data structures associated with a device. If necessary, it can * allocate memory to be used during other operations. * @endparblock */ rtems_status_code rtems_io_initialize( rtems_device_major_number major, rtems_device_minor_number minor, void *argument ); /* Generated from spec:/rtems/io/if/register-name */ /** * @ingroup RTEMSAPIClassicIO * * @brief Registers the device specified by the device major and minor numbers * in the file system under the specified name. * * @param device_name is the device name in the file system. * * @param major is the device major number. * * @param minor is the device minor number. * * @retval ::RTEMS_SUCCESSFUL The requested operation was successful. * * @retval ::RTEMS_TOO_MANY The name was already in use or other errors * occurred. * * @par Notes * The device is registered as a character device. */ rtems_status_code rtems_io_register_name( const char *device_name, rtems_device_major_number major, rtems_device_minor_number minor ); /* Generated from spec:/rtems/io/if/open */ /** * @ingroup RTEMSAPIClassicIO * * @brief Opens the device specified by the device major and minor numbers. * * @param major is the major number of the device. * * @param minor is the minor number of the device. * * @param argument is the argument passed to the device driver close entry. * * This directive calls the device driver open entry registered in the Device * Driver Table for the specified device major number. * * @retval ::RTEMS_SUCCESSFUL The requested operation was successful. * * @retval ::RTEMS_INVALID_NUMBER The device major number was invalid. * * @return Other status codes may be returned by the device driver open entry. * * @par Notes * The open entry point is commonly used by device drivers to provide exclusive * access to a device. */ rtems_status_code rtems_io_open( rtems_device_major_number major, rtems_device_minor_number minor, void *argument ); /* Generated from spec:/rtems/io/if/close */ /** * @ingroup RTEMSAPIClassicIO * * @brief Closes the device specified by the device major and minor numbers. * * @param major is the major number of the device. * * @param minor is the minor number of the device. * * @param argument is the argument passed to the device driver close entry. * * This directive calls the device driver close entry registered in the Device * Driver Table for the specified device major number. * * @retval ::RTEMS_SUCCESSFUL The requested operation was successful. * * @retval ::RTEMS_INVALID_NUMBER The device major number was invalid. * * @return Other status codes may be returned by the device driver close entry. * * @par Notes * The close entry point is commonly used by device drivers to relinquish * exclusive access to a device. */ rtems_status_code rtems_io_close( rtems_device_major_number major, rtems_device_minor_number minor, void *argument ); /* Generated from spec:/rtems/io/if/read */ /** * @ingroup RTEMSAPIClassicIO * * @brief Reads from the device specified by the device major and minor * numbers. * * @param major is the major number of the device. * * @param minor is the minor number of the device. * * @param argument is the argument passed to the device driver read entry. * * This directive calls the device driver read entry registered in the Device * Driver Table for the specified device major number. * * @retval ::RTEMS_SUCCESSFUL The requested operation was successful. * * @retval ::RTEMS_INVALID_NUMBER The device major number was invalid. * * @return Other status codes may be returned by the device driver read entry. * * @par Notes * Read operations typically require a buffer address as part of the argument * parameter block. The contents of this buffer will be replaced with data * from the device. */ rtems_status_code rtems_io_read( rtems_device_major_number major, rtems_device_minor_number minor, void *argument ); /* Generated from spec:/rtems/io/if/write */ /** * @ingroup RTEMSAPIClassicIO * * @brief Writes to the device specified by the device major and minor numbers. * * @param major is the major number of the device. * * @param minor is the minor number of the device. * * @param argument is the argument passed to the device driver write entry. * * This directive calls the device driver write entry registered in the Device * Driver Table for the specified device major number. * * @retval ::RTEMS_SUCCESSFUL The requested operation was successful. * * @retval ::RTEMS_INVALID_NUMBER The device major number was invalid. * * @return Other status codes may be returned by the device driver write entry. * * @par Notes * Write operations typically require a buffer address as part of the argument * parameter block. The contents of this buffer will be sent to the device. */ rtems_status_code rtems_io_write( rtems_device_major_number major, rtems_device_minor_number minor, void *argument ); /* Generated from spec:/rtems/io/if/control */ /** * @ingroup RTEMSAPIClassicIO * * @brief Controls the device specified by the device major and minor numbers. * * @param major is the major number of the device. * * @param minor is the minor number of the device. * * @param argument is the argument passed to the device driver I/O control * entry. * * This directive calls the device driver I/O control entry registered in the * Device Driver Table for the specified device major number. * * @retval ::RTEMS_SUCCESSFUL The requested operation was successful. * * @retval ::RTEMS_INVALID_NUMBER The device major number was invalid. * * @return Other status codes may be returned by the device driver I/O control * entry. * * @par Notes * The exact functionality of the driver entry called by this directive is * driver dependent. It should not be assumed that the control entries of two * device drivers are compatible. For example, an RS-232 driver I/O control * operation may change the baud of a serial line, while an I/O control * operation for a floppy disk driver may cause a seek operation. */ rtems_status_code rtems_io_control( rtems_device_major_number major, rtems_device_minor_number minor, void *argument ); #ifdef __cplusplus } #endif #endif /* _RTEMS_IO_H */