123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- /*
- 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_can_lld.h
- * @brief PLATFORM CAN subsystem low level driver header.
- *
- * @addtogroup CAN
- * @{
- */
- #ifndef HAL_CAN_LLD_H
- #define HAL_CAN_LLD_H
- #if (HAL_USE_CAN == TRUE) || defined(__DOXYGEN__)
- /*===========================================================================*/
- /* Driver constants. */
- /*===========================================================================*/
- /**
- * @brief Number of transmit mailboxes.
- */
- #define CAN_TX_MAILBOXES 1
- /**
- * @brief Number of receive mailboxes.
- */
- #define CAN_RX_MAILBOXES 1
- /*===========================================================================*/
- /* Driver pre-compile time settings. */
- /*===========================================================================*/
- /**
- * @name PLATFORM configuration options
- * @{
- */
- /**
- * @brief CAN1 driver enable switch.
- * @details If set to @p TRUE the support for CAN1 is included.
- * @note The default is @p FALSE.
- */
- #if !defined(PLATFORM_CAN_USE_CAN1) || defined(__DOXYGEN__)
- #define PLATFORM_CAN_USE_CAN1 FALSE
- #endif
- /** @} */
- /*===========================================================================*/
- /* Derived constants and error checks. */
- /*===========================================================================*/
- /*===========================================================================*/
- /* Driver data structures and types. */
- /*===========================================================================*/
- /**
- * @brief Type of a structure representing an CAN driver.
- */
- typedef struct CANDriver CANDriver;
- /**
- * @brief Type of a transmission mailbox index.
- */
- typedef uint32_t canmbx_t;
- #if defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__)
- /**
- * @brief Type of a CAN notification callback.
- *
- * @param[in] canp pointer to the @p CANDriver object triggering the
- * callback
- * @param[in] flags flags associated to the mailbox callback
- */
- typedef void (*can_callback_t)(CANDriver *canp, uint32_t flags);
- #endif
- /**
- * @brief CAN transmission frame.
- * @note Accessing the frame data as word16 or word32 is not portable because
- * machine data endianness, it can be still useful for a quick filling.
- */
- typedef struct {
- /*lint -save -e46 [6.1] Standard types are fine too.*/
- uint8_t DLC:4; /**< @brief Data length. */
- uint8_t RTR:1; /**< @brief Frame type. */
- uint8_t IDE:1; /**< @brief Identifier type. */
- union {
- uint32_t SID:11; /**< @brief Standard identifier.*/
- uint32_t EID:29; /**< @brief Extended identifier.*/
- uint32_t _align1;
- };
- /*lint -restore*/
- union {
- uint8_t data8[8]; /**< @brief Frame data. */
- uint16_t data16[4]; /**< @brief Frame data. */
- uint32_t data32[2]; /**< @brief Frame data. */
- };
- } CANTxFrame;
- /**
- * @brief CAN received frame.
- * @note Accessing the frame data as word16 or word32 is not portable because
- * machine data endianness, it can be still useful for a quick filling.
- */
- typedef struct {
- /*lint -save -e46 [6.1] Standard types are fine too.*/
- uint8_t FMI; /**< @brief Filter id. */
- uint16_t TIME; /**< @brief Time stamp. */
- uint8_t DLC:4; /**< @brief Data length. */
- uint8_t RTR:1; /**< @brief Frame type. */
- uint8_t IDE:1; /**< @brief Identifier type. */
- union {
- uint32_t SID:11; /**< @brief Standard identifier.*/
- uint32_t EID:29; /**< @brief Extended identifier.*/
- uint32_t _align1;
- };
- /*lint -restore*/
- union {
- uint8_t data8[8]; /**< @brief Frame data. */
- uint16_t data16[4]; /**< @brief Frame data. */
- uint32_t data32[2]; /**< @brief Frame data. */
- };
- } CANRxFrame;
- /**
- * @brief Driver configuration structure.
- */
- typedef struct {
- /* End of the mandatory fields.*/
- uint32_t dummy;
- } CANConfig;
- /**
- * @brief Structure representing an CAN driver.
- */
- struct CANDriver {
- /**
- * @brief Driver state.
- */
- canstate_t state;
- /**
- * @brief Current configuration data.
- */
- const CANConfig *config;
- /**
- * @brief Transmission threads queue.
- */
- threads_queue_t txqueue;
- /**
- * @brief Receive threads queue.
- */
- threads_queue_t rxqueue;
- #if (CAN_ENFORCE_USE_CALLBACKS == FALSE) || defined (__DOXYGEN__)
- /**
- * @brief One or more frames become available.
- * @note After broadcasting this event it will not be broadcasted again
- * until the received frames queue has been completely emptied. It
- * is <b>not</b> broadcasted for each received frame. It is
- * responsibility of the application to empty the queue by
- * repeatedly invoking @p chReceive() when listening to this event.
- * This behavior minimizes the interrupt served by the system
- * because CAN traffic.
- * @note The flags associated to the listeners will indicate which
- * receive mailboxes become non-empty.
- */
- event_source_t rxfull_event;
- /**
- * @brief One or more transmission mailbox become available.
- * @note The flags associated to the listeners will indicate which
- * transmit mailboxes become empty.
- */
- event_source_t txempty_event;
- /**
- * @brief A CAN bus error happened.
- * @note The flags associated to the listeners will indicate the
- * error(s) that have occurred.
- */
- event_source_t error_event;
- #if (CAN_USE_SLEEP_MODE == TRUE) || defined (__DOXYGEN__)
- /**
- * @brief Entering sleep state event.
- */
- event_source_t sleep_event;
- /**
- * @brief Exiting sleep state event.
- */
- event_source_t wakeup_event;
- #endif
- #else /* CAN_ENFORCE_USE_CALLBACKS == TRUE */
- /**
- * @brief One or more frames become available.
- * @note After calling this function it will not be called again
- * until the received frames queue has been completely emptied. It
- * is <b>not</b> called for each received frame. It is
- * responsibility of the application to empty the queue by
- * repeatedly invoking @p chTryReceiveI().
- * This behavior minimizes the interrupt served by the system
- * because CAN traffic.
- */
- can_callback_t rxfull_cb;
- /**
- * @brief One or more transmission mailbox become available.
- * @note The flags associated to the callback will indicate which
- * transmit mailboxes become empty.
- */
- can_callback_t txempty_cb;
- /**
- * @brief A CAN bus error happened.
- */
- can_callback_t error_cb;
- #if (CAN_USE_SLEEP_MODE == TRUE) || defined (__DOXYGEN__)
- /**
- * @brief Exiting sleep state.
- */
- can_callback_t wakeup_cb;
- #endif
- #endif
- /* End of the mandatory fields.*/
- };
- /*===========================================================================*/
- /* Driver macros. */
- /*===========================================================================*/
- /*===========================================================================*/
- /* External declarations. */
- /*===========================================================================*/
- #if (PLATFORM_CAN_USE_CAN1 == TRUE) && !defined(__DOXYGEN__)
- extern CANDriver CAND1;
- #endif
- #ifdef __cplusplus
- extern "C" {
- #endif
- void can_lld_init(void);
- void can_lld_start(CANDriver *canp);
- void can_lld_stop(CANDriver *canp);
- bool can_lld_is_tx_empty(CANDriver *canp, canmbx_t mailbox);
- void can_lld_transmit(CANDriver *canp,
- canmbx_t mailbox,
- const CANTxFrame *ctfp);
- bool can_lld_is_rx_nonempty(CANDriver *canp, canmbx_t mailbox);
- void can_lld_receive(CANDriver *canp,
- canmbx_t mailbox,
- CANRxFrame *crfp);
- #if CAN_USE_SLEEP_MODE == TRUE
- void can_lld_sleep(CANDriver *canp);
- void can_lld_wakeup(CANDriver *canp);
- #endif
- #ifdef __cplusplus
- }
- #endif
- #endif /* HAL_USE_CAN == TRUE */
- #endif /* HAL_CAN_LLD_H */
- /** @} */
|