summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/include/rtems/rtems/dpmem.h
blob: e582d2d3596f161fb59b114f0bc23a9b1ef591a6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
/**
 * @file rtems/rtems/dpmem.h
 *
 * @defgroup ClassicDPMEM Dual Ported Memory
 *
 * @ingroup ClassicRTEMS
 * @brief Dual Ported Memory Manager
 *
 * This include file contains all the constants and structures associated
 * with the Dual Ported Memory Manager. This manager provides a mechanism
 * for converting addresses between internal and external representations
 * for multiple dual-ported memory areas.
 *
 * Directives provided are:
 *
 * - create a port
 * - get ID of a port
 * - delete a port
 * - convert external to internal address
 * - convert internal to external address
 *
 */

/* COPYRIGHT (c) 1989-2008.
 * On-Line Applications Research Corporation (OAR).
 *
 * The license and distribution terms for this file may be
 * found in the file LICENSE in this distribution or at
 * http://www.rtems.org/license/LICENSE.
 */

#ifndef _RTEMS_RTEMS_DPMEM_H
#define _RTEMS_RTEMS_DPMEM_H

#include <rtems/rtems/types.h>
#include <rtems/rtems/status.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 *  @defgroup ClassicDPMEM Dual Ported Memory
 *
 *  @ingroup ClassicRTEMS
 *
 *  This encapsulates functionality related to the
 *  Classic API Dual Ported Memory Manager.
 */
/**@{*/

/**
 *  The following structure defines the port control block.  Each port
 *  has a control block associated with it.  This control block contains
 *  all information required to support the port related operations.
 */
typedef struct {
  /** This field is the object management portion of a Port instance. */
  Objects_Control  Object;
  /** This field is the base internal address of the port. */
  void            *internal_base;
  /** This field is the base external address of the port. */
  void            *external_base;
  /** This field is the length of dual-ported area of the port. */
  uint32_t         length;
}   Dual_ported_memory_Control;

/**
 * @brief Creates a port into a dual-ported memory area.
 *
 * This routine implements the rtems_port_create directive. The port
 * will have the name @a name. The port maps onto an area of dual ported
 * memory of length bytes which has internal_start and external_start
 * as the internal and external starting addresses, respectively.
 * It returns the id of the created port in ID.
 *
 * @param[in] name is the user defined port name
 * @param[in] internal_start is the internal start address of port
 * @param[in] external_start is the external start address of port
 * @param[in] length is the physical length in bytes
 * @param[out] id is the address of port id to set
 *
 * @retval This method returns RTEMS_SUCCESSFUL if there was not an
 *         error. Otherwise, a status code is returned indicating the
 *         source of the error. If successful, the id will
 *         be filled in with the port id.
 */
rtems_status_code rtems_port_create(
  rtems_name    name,
  void         *internal_start,
  void         *external_start,
  uint32_t      length,
  rtems_id     *id
);

/**
 * @brief RTEMS Port Name to Id
 *
 * This routine implements the rtems_port_ident directive. This directive
 * returns the port ID associated with name. If more than one port is
 * named name, then the port to which the ID belongs is arbitrary.
 *
 * @param[in] name is the user defined port name
 * @param[out] id is the pointer to port id
 *
 * @retval RTEMS_SUCCESSFUL if successful or error code if unsuccessful
 */
rtems_status_code rtems_port_ident(
  rtems_name    name,
  rtems_id     *id
);

/**
 * @brief RTEMS Delete Port
 *
 * This routine implements the rtems_port_delete directive. It deletes
 * the port associated with ID.
 *
 * @param[in] id is the dual-ported memory area id
 *
 * @retval This method returns RTEMS_SUCCESSFUL if there was not an
 *         error. Otherwise, a status code is returned indicating the
 *         source of the error.
 */
rtems_status_code rtems_port_delete(
  rtems_id   id
);

/**
 * @brief RTEMS Port External to Internal
 *
 * This routine implements the rtems_port_external_to_internal directive.
 * It returns the internal port address which maps to the provided
 * external port address for the specified port ID. If the given external
 * address is an invalid dual-ported address, then the internal address is
 * set to the given external address.
 *
 * @param[in] id is the id of dp memory object
 * @param[in] external is the external address
 * @param[out] internal is the pointer of internal address to set
 *
 * @retval RTEMS_SUCCESSFUL
 */
rtems_status_code rtems_port_external_to_internal(
  rtems_id     id,
  void        *external,
  void       **internal
);

/**
 * @brief RTEMS Port Internal to External
 *
 * This routine implements the Port_internal_to_external directive.
 * It returns the external port address which maps to the provided
 * internal port address for the specified port ID. If the given
 * internal address is an invalid dual-ported address, then the
 * external address is set to the given internal address.
 *
 * @param[in] id is the id of dual-ported memory object
 * @param[in] internal is the internal address to set
 * @param[in] external is the pointer to external address
 *
 * @retval RTEMS_SUCCESSFUL and the external will be filled in
 * with the external addresses
 */
rtems_status_code rtems_port_internal_to_external(
  rtems_id     id,
  void        *internal,
  void       **external
);

/**@}*/

#ifdef __cplusplus
}
#endif

#endif
/* end of include file */