Linux Audio

Check our new training course

Embedded Linux Audio

Check our new training course
with Creative Commons CC-BY-SA
lecture materials

Bootlin logo

Elixir Cross Referencer

Loading...
/* microkernel/pipe.h */

/*
 * Copyright (c) 1997-2014 Wind River Systems, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef PIPE_H
#define PIPE_H

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief Microkernel Pipes
 * @defgroup microkernel_pipe Microkernel Pipes
 * @ingroup microkernel_services
 * @{
 */

#include <sections.h>

/**
 * @cond internal
 */

/**
 * @internal
 * @brief Initialize a pipe struct.
 *
 * @param size Size of pipe buffer.
 * @param buffer Pointer to the buffer.
 * @endinternal
 */
#define __K_PIPE_INITIALIZER(size, buffer) \
	{ \
	  .buffer_size = size, \
	  .Buffer = buffer, \
	}

/**
 * @endcond
 */

/**
 * @brief Pipe write request.
 *
 * Attempt to write data from a memory-buffer area to the
 * specified pipe with a timeout option.
 *
 * @param id Pipe ID.
 * @param buffer Buffer.
 * @param bytes_to_write Number of bytes to write.
 * @param bytes_written Pointer to number of bytes written.
 * @param options Pipe options.
 * @param timeout Determines the action to take when the pipe is already full.
 *  For TICKS_NONE, return immediately.
 *  For TICKS_UNLIMITED, wait as long as necessary.
 *  Otherwise, wait up to the specified number of ticks before timing out.
 *
 * @retval RC_OK Successfully wrote data to pipe.
 * @retval RC_ALIGNMENT Data is improperly aligned.
 * @retval RC_INCOMPLETE Only some of the data was written to the pipe when
 * @a options = _ALL_N.
 * @retval RC_TIME Timed out while waiting to write to pipe.
 * @retval RC_FAIL Failed to immediately write to pipe when
 * @a timeout = TICKS_NONE
 * @sa TICKS_NONE, TICKS_UNLIMITED
 */
extern int task_pipe_put(kpipe_t id, void *buffer, int bytes_to_write,
			int *bytes_written, K_PIPE_OPTION options, int32_t timeout);

/**
 * @brief Pipe read request.
 *
 * Attempt to read data into a memory buffer area from the
 * specified pipe with a timeout option.
 *
 * @param id Pipe ID.
 * @param buffer Buffer.
 * @param bytes_to_read Number of bytes to read.
 * @param bytes_read Pointer to number of bytes read.
 * @param options Pipe options.
 * @param timeout Determines the action to take when the pipe is already full.
 *  For TICKS_NONE, return immediately.
 *  For TICKS_UNLIMITED, wait as long as necessary.
 *  Otherwise, wait up to the specified number of ticks before timing out.
 *
 * @retval RC_OK Successfully read data from pipe.
 * @retval RC_ALIGNMENT Data is improperly aligned.
 * @retval RC_INCOMPLETE Only some of the data was read from the pipe when
 * @a options = _ALL_N.
 * @retval RC_TIME Timed out waiting to read from pipe.
 * @retval RC_FAIL Failed to immediately read from pipe when
 * @a timeout = TICKS_NONE.
 * @sa TICKS_NONE, TICKS_UNLIMITED
 */
extern int task_pipe_get(kpipe_t id, void *buffer, int bytes_to_read,
			int *bytes_read, K_PIPE_OPTION options, int32_t timeout);

extern int _task_pipe_block_put(kpipe_t id,
				struct k_block block,
				int size,
				ksem_t sema);

/**
 * @brief Asynchronous pipe write request.
 *
 * This routine attempts to write data from a memory pool block to the
 * specified pipe. (Note that partial transfers and timeouts are not
 * supported, unlike the case for synchronous write requests.)
 *
 * @param id Pipe ID.
 * @param block Block.
 * @param size Size of data to be transferred.
 * @param sema Semphore ID.
 *
 * @return RC_OK, RC_FAIL, or RC_ALIGNMENT
 */
#define task_pipe_block_put(id, block, size, sema) \
			_task_pipe_block_put(id, block, size, sema)


/**
 * @brief Define a private microkernel pipe.
 *
 * @param name Name of the pipe.
 * @param size Size of the pipe buffer, in bytes.
 */
#define DEFINE_PIPE(name, size) \
	char __noinit __pipe_buffer_##name[size]; \
	struct _k_pipe_struct _k_pipe_obj_##name = \
		__K_PIPE_INITIALIZER(size, __pipe_buffer_##name); \
	const kpipe_t name \
		__in_section(_k_pipe_ptr, private, pipe) = \
		(kpipe_t)&_k_pipe_obj_##name;

/**
 * @}
 */

#ifdef __cplusplus
}
#endif

#endif /* PIPE_H */