123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 |
- /*
- 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_serial.h
- * @brief Serial Driver macros and structures.
- *
- * @addtogroup SERIAL
- * @{
- */
- #ifndef HAL_SERIAL_H
- #define HAL_SERIAL_H
- #if (HAL_USE_SERIAL == TRUE) || defined(__DOXYGEN__)
- /*===========================================================================*/
- /* Driver constants. */
- /*===========================================================================*/
- /**
- * @name Serial status flags
- * @{
- */
- #define SD_PARITY_ERROR (eventflags_t)32 /**< @brief Parity. */
- #define SD_FRAMING_ERROR (eventflags_t)64 /**< @brief Framing. */
- #define SD_OVERRUN_ERROR (eventflags_t)128 /**< @brief Overflow. */
- #define SD_NOISE_ERROR (eventflags_t)256 /**< @brief Line noise. */
- #define SD_BREAK_DETECTED (eventflags_t)512 /**< @brief LIN Break. */
- #define SD_QUEUE_FULL_ERROR (eventflags_t)1024 /**< @brief Queue full. */
- /** @} */
- /*===========================================================================*/
- /* Driver pre-compile time settings. */
- /*===========================================================================*/
- /**
- * @name Serial configuration options
- * @{
- */
- /**
- * @brief Default bit rate.
- * @details Configuration parameter, this is the baud rate selected for the
- * default configuration.
- */
- #if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__)
- #define SERIAL_DEFAULT_BITRATE 38400
- #endif
- /**
- * @brief Serial buffers size.
- * @details Configuration parameter, you can change the depth of the queue
- * buffers depending on the requirements of your application.
- * @note The default is 16 bytes for both the transmission and receive
- * buffers.
- * @note This is a global setting and it can be overridden by low level
- * driver specific settings.
- */
- #if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__)
- #define SERIAL_BUFFERS_SIZE 16
- #endif
- /** @} */
- /*===========================================================================*/
- /* Derived constants and error checks. */
- /*===========================================================================*/
- /*===========================================================================*/
- /* Driver data structures and types. */
- /*===========================================================================*/
- /**
- * @brief Driver state machine possible states.
- */
- typedef enum {
- SD_UNINIT = 0, /**< Not initialized. */
- SD_STOP = 1, /**< Stopped. */
- SD_READY = 2 /**< Ready. */
- } sdstate_t;
- /**
- * @brief Structure representing a serial driver.
- */
- typedef struct SerialDriver SerialDriver;
- #include "hal_serial_lld.h"
- /**
- * @brief @p SerialDriver specific methods.
- */
- #define _serial_driver_methods \
- _base_asynchronous_channel_methods
- /**
- * @extends BaseAsynchronousChannelVMT
- *
- * @brief @p SerialDriver virtual methods table.
- */
- struct SerialDriverVMT {
- _serial_driver_methods
- };
- /**
- * @extends BaseAsynchronousChannel
- *
- * @brief Full duplex serial driver class.
- * @details This class extends @p BaseAsynchronousChannel by adding physical
- * I/O queues.
- */
- struct SerialDriver {
- /** @brief Virtual Methods Table.*/
- const struct SerialDriverVMT *vmt;
- _serial_driver_data
- };
- /*===========================================================================*/
- /* Driver macros. */
- /*===========================================================================*/
- /**
- * @name Macro Functions
- * @{
- */
- /**
- * @brief Direct write to a @p SerialDriver.
- * @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 sdPutI(sdp, b) oqPutI(&(sdp)->oqueue, b)
- /**
- * @brief Direct write to a @p SerialDriver.
- * @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 sdPut(sdp, b) oqPut(&(sdp)->oqueue, b)
- /**
- * @brief Direct write to a @p SerialDriver 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 sdPutTimeout(sdp, b, t) oqPutTimeout(&(sdp)->oqueue, b, t)
- /**
- * @brief Direct read from a @p SerialDriver.
- * @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 sdGetI(sdp) iqGetI(&(sdp)->iqueue)
- /**
- * @brief Direct read from a @p SerialDriver.
- * @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 sdGet(sdp) iqGet(&(sdp)->iqueue)
- /**
- * @brief Direct read from a @p SerialDriver 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 sdGetTimeout(sdp, t) iqGetTimeout(&(sdp)->iqueue, t)
- /**
- * @brief Direct blocking write to a @p SerialDriver.
- * @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 sdWriteI(sdp, b, n) oqWriteI(&(sdp)->oqueue, b, n)
- /**
- * @brief Direct blocking write to a @p SerialDriver.
- * @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 sdWrite(sdp, b, n) oqWriteTimeout(&(sdp)->oqueue, b, n, TIME_INFINITE)
- /**
- * @brief Direct blocking write to a @p SerialDriver 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 sdWriteTimeout(sdp, b, n, t) \
- oqWriteTimeout(&(sdp)->oqueue, b, n, t)
- /**
- * @brief Direct non-blocking write to a @p SerialDriver.
- * @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 sdAsynchronousWrite(sdp, b, n) \
- oqWriteTimeout(&(sdp)->oqueue, b, n, TIME_IMMEDIATE)
- /**
- * @brief Direct blocking read from a @p SerialDriver.
- * @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 sdReadI(sdp, b, n) iqReadI(&(sdp)->iqueue, b, n, TIME_INFINITE)
- /**
- * @brief Direct blocking read from a @p SerialDriver.
- * @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 sdRead(sdp, b, n) iqReadTimeout(&(sdp)->iqueue, b, n, TIME_INFINITE)
- /**
- * @brief Direct blocking read from a @p SerialDriver 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 sdReadTimeout(sdp, b, n, t) iqReadTimeout(&(sdp)->iqueue, b, n, t)
- /**
- * @brief Direct non-blocking read from a @p SerialDriver.
- * @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 sdAsynchronousRead(sdp, b, n) \
- iqReadTimeout(&(sdp)->iqueue, b, n, TIME_IMMEDIATE)
- /** @} */
- /*===========================================================================*/
- /* External declarations. */
- /*===========================================================================*/
- #ifdef __cplusplus
- extern "C" {
- #endif
- void sdInit(void);
- #if !defined(SERIAL_ADVANCED_BUFFERING_SUPPORT) || \
- (SERIAL_ADVANCED_BUFFERING_SUPPORT == FALSE)
- void sdObjectInit(SerialDriver *sdp, qnotify_t inotify, qnotify_t onotify);
- #else
- void sdObjectInit(SerialDriver *sdp);
- #endif
- void sdStart(SerialDriver *sdp, const SerialConfig *config);
- void sdStop(SerialDriver *sdp);
- void sdIncomingDataI(SerialDriver *sdp, uint8_t b);
- msg_t sdRequestDataI(SerialDriver *sdp);
- bool sdPutWouldBlock(SerialDriver *sdp);
- bool sdGetWouldBlock(SerialDriver *sdp);
- msg_t sdControl(SerialDriver *sdp, unsigned int operation, void *arg);
- #ifdef __cplusplus
- }
- #endif
- #endif /* HAL_USE_SERIAL == TRUE */
- #endif /* HAL_SERIAL_H */
- /** @} */
|