261 lines
9.2 KiB
C
261 lines
9.2 KiB
C
/*
|
|
ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
|
|
|
|
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.
|
|
*/
|
|
|
|
/**
|
|
* @file hal_buffered_sio.h
|
|
* @brief Buffered SIO Driver macros and structures.
|
|
*
|
|
* @addtogroup HAL_BUFFERED_SIO
|
|
* @{
|
|
*/
|
|
|
|
#ifndef HAL_BUFFERED_SIO_H
|
|
#define HAL_BUFFERED_SIO_H
|
|
|
|
#include "hal.h"
|
|
|
|
#if (HAL_USE_SIO == TRUE) || defined(__DOXYGEN__)
|
|
|
|
/*===========================================================================*/
|
|
/* Driver constants. */
|
|
/*===========================================================================*/
|
|
|
|
/*===========================================================================*/
|
|
/* Driver pre-compile time settings. */
|
|
/*===========================================================================*/
|
|
|
|
/*===========================================================================*/
|
|
/* Derived constants and error checks. */
|
|
/*===========================================================================*/
|
|
|
|
/*===========================================================================*/
|
|
/* Driver data structures and types. */
|
|
/*===========================================================================*/
|
|
|
|
/**
|
|
* @brief @p BufferedSIODriver specific methods.
|
|
*/
|
|
#define __buffered_sio_driver_methods \
|
|
__buffered_serial_methods
|
|
|
|
/**
|
|
* @extends BufferedSerialVMT
|
|
*
|
|
* @brief @p BufferedSIODriver virtual methods table.
|
|
*/
|
|
struct BufferedSIODriverVMT {
|
|
__buffered_sio_driver_methods
|
|
};
|
|
|
|
/**
|
|
* @brief @p SerialDriver specific data.
|
|
*/
|
|
#define __buffered_sio_driver_data \
|
|
__buffered_serial_data \
|
|
SIODriver *siop;
|
|
|
|
/**
|
|
* @extends BufferedSerial
|
|
*
|
|
* @brief Buffered SIO driver class.
|
|
*/
|
|
typedef struct hal_buffered_siol_driver {
|
|
/** @brief Virtual Methods Table.*/
|
|
const struct BufferedSIODriverVMT *vmt;
|
|
__buffered_sio_driver_data
|
|
} BufferedSIODriver;
|
|
|
|
/**
|
|
* @brief Type of a buffered SIO configuration.
|
|
*/
|
|
typedef SIOConfig BufferedSIOConfig;
|
|
|
|
/*===========================================================================*/
|
|
/* Driver macros. */
|
|
/*===========================================================================*/
|
|
|
|
/**
|
|
* @name Macro Functions
|
|
* @{
|
|
*/
|
|
/**
|
|
* @brief Direct write to a @p BufferedSIODriver.
|
|
* @note This function bypasses the indirect access to the channel and
|
|
* writes directly on the output queue. This is faster but cannot
|
|
* be used to write to different channels implementations.
|
|
*
|
|
* @iclass
|
|
*/
|
|
#define bsioPutI(bsiop, b) oqPutI(&(bsiop)->oqueue, b)
|
|
|
|
/**
|
|
* @brief Direct write to a @p BufferedSIODriver.
|
|
* @note This function bypasses the indirect access to the channel and
|
|
* writes directly on the output queue. This is faster but cannot
|
|
* be used to write to different channels implementations.
|
|
*
|
|
* @api
|
|
*/
|
|
#define bsioPut(bsiop, b) oqPut(&(bsiop)->oqueue, b)
|
|
|
|
/**
|
|
* @brief Direct write to a @p BufferedSIODriver with timeout specification.
|
|
* @note This function bypasses the indirect access to the channel and
|
|
* writes directly on the output queue. This is faster but cannot
|
|
* be used to write to different channels implementations.
|
|
*
|
|
* @api
|
|
*/
|
|
#define bsioPutTimeout(bsiop, b, t) oqPutTimeout(&(bsiop)->oqueue, b, t)
|
|
|
|
/**
|
|
* @brief Direct read from a @p BufferedSIODriver.
|
|
* @note This function bypasses the indirect access to the channel and
|
|
* reads directly from the input queue. This is faster but cannot
|
|
* be used to read from different channels implementations.
|
|
*
|
|
* @iclass
|
|
*/
|
|
#define bsioGetI(bsiop) iqGetI(&(bsiop)->iqueue)
|
|
|
|
/**
|
|
* @brief Direct read from a @p BufferedSIODriver.
|
|
* @note This function bypasses the indirect access to the channel and
|
|
* reads directly from the input queue. This is faster but cannot
|
|
* be used to read from different channels implementations.
|
|
*
|
|
* @api
|
|
*/
|
|
#define bsioGet(bsiop) iqGet(&(bsiop)->iqueue)
|
|
|
|
/**
|
|
* @brief Direct read from a @p BufferedSIODriver with timeout specification.
|
|
* @note This function bypasses the indirect access to the channel and
|
|
* reads directly from the input queue. This is faster but cannot
|
|
* be used to read from different channels implementations.
|
|
*
|
|
* @api
|
|
*/
|
|
#define bsioGetTimeout(bsiop, t) iqGetTimeout(&(bsiop)->iqueue, t)
|
|
|
|
/**
|
|
* @brief Direct blocking write to a @p BufferedSIODriver.
|
|
* @note This function bypasses the indirect access to the channel and
|
|
* writes directly to the output queue. This is faster but cannot
|
|
* be used to write from different channels implementations.
|
|
*
|
|
* @iclass
|
|
*/
|
|
#define bsioWriteI(bsiop, b, n) oqWriteI(&(bsiop)->oqueue, b, n)
|
|
|
|
/**
|
|
* @brief Direct blocking write to a @p BufferedSIODriver.
|
|
* @note This function bypasses the indirect access to the channel and
|
|
* writes directly to the output queue. This is faster but cannot
|
|
* be used to write from different channels implementations.
|
|
*
|
|
* @api
|
|
*/
|
|
#define bsioWrite(bsiop, b, n) oqWriteTimeout(&(bsiop)->oqueue, b, n, TIME_INFINITE)
|
|
|
|
/**
|
|
* @brief Direct blocking write to a @p BufferedSIODriver with timeout
|
|
* specification.
|
|
* @note This function bypasses the indirect access to the channel and
|
|
* writes directly to the output queue. This is faster but cannot
|
|
* be used to write to different channels implementations.
|
|
*
|
|
* @api
|
|
*/
|
|
#define bsioWriteTimeout(bsiop, b, n, t) \
|
|
oqWriteTimeout(&(bsiop)->oqueue, b, n, t)
|
|
|
|
/**
|
|
* @brief Direct non-blocking write to a @p BufferedSIODriver.
|
|
* @note This function bypasses the indirect access to the channel and
|
|
* writes directly to the output queue. This is faster but cannot
|
|
* be used to write to different channels implementations.
|
|
*
|
|
* @api
|
|
*/
|
|
#define bsioAsynchronousWrite(bsiop, b, n) \
|
|
oqWriteTimeout(&(bsiop)->oqueue, b, n, TIME_IMMEDIATE)
|
|
|
|
/**
|
|
* @brief Direct blocking read from a @p BufferedSIODriver.
|
|
* @note This function bypasses the indirect access to the channel and
|
|
* reads directly from the input queue. This is faster but cannot
|
|
* be used to read from different channels implementations.
|
|
*
|
|
* @iclass
|
|
*/
|
|
#define bsioReadI(bsiop, b, n) iqReadI(&(bsiop)->iqueue, b, n, TIME_INFINITE)
|
|
|
|
/**
|
|
* @brief Direct blocking read from a @p BufferedSIODriver.
|
|
* @note This function bypasses the indirect access to the channel and
|
|
* reads directly from the input queue. This is faster but cannot
|
|
* be used to read from different channels implementations.
|
|
*
|
|
* @api
|
|
*/
|
|
#define bsioRead(bsiop, b, n) iqReadTimeout(&(bsiop)->iqueue, b, n, TIME_INFINITE)
|
|
|
|
/**
|
|
* @brief Direct blocking read from a @p BufferedSIODriver with timeout
|
|
* specification.
|
|
* @note This function bypasses the indirect access to the channel and
|
|
* reads directly from the input queue. This is faster but cannot
|
|
* be used to read from different channels implementations.
|
|
*
|
|
* @api
|
|
*/
|
|
#define bsioReadTimeout(bsiop, b, n, t) iqReadTimeout(&(bsiop)->iqueue, b, n, t)
|
|
|
|
/**
|
|
* @brief Direct non-blocking read from a @p BufferedSIODriver.
|
|
* @note This function bypasses the indirect access to the channel and
|
|
* reads directly from the input queue. This is faster but cannot
|
|
* be used to read from different channels implementations.
|
|
*
|
|
* @api
|
|
*/
|
|
#define bsioAsynchronousRead(bsiop, b, n) \
|
|
iqReadTimeout(&(bsiop)->iqueue, b, n, TIME_IMMEDIATE)
|
|
/** @} */
|
|
|
|
/*===========================================================================*/
|
|
/* External declarations. */
|
|
/*===========================================================================*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
void bsioObjectInit(BufferedSIODriver *bsiop, SIODriver *siop,
|
|
uint8_t *ib, size_t ibsize,
|
|
uint8_t *ob, size_t obsize);
|
|
msg_t bsioStart(BufferedSIODriver *bsiop, const BufferedSIOConfig *config);
|
|
void bsioStop(BufferedSIODriver *bsiop);
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* HAL_USE_SIO == TRUE */
|
|
|
|
#endif /* HAL_BUFFERED_SIO */
|
|
|
|
/** @} */
|