/* * Copyright (c) 2019 Vestas Wind Systems A/S * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_SUBSYS_CANBUS_CANOPEN_CO_DRIVER_H #define ZEPHYR_SUBSYS_CANBUS_CANOPEN_CO_DRIVER_H /* * Zephyr RTOS CAN driver interface and configuration for CANopenNode * CANopen protocol stack. * * See CANopenNode/stack/drvTemplate/CO_driver.h for API description. */ #ifdef __cplusplus extern "C" { #endif #include #include #include #include /* Use static variables instead of calloc() */ #define CO_USE_GLOBALS /* Use Zephyr provided crc16 implementation */ #define CO_USE_OWN_CRC16 /* Use SDO buffer size from Kconfig */ #define CO_SDO_BUFFER_SIZE CONFIG_CANOPEN_SDO_BUFFER_SIZE /* Use trace buffer size from Kconfig */ #define CO_TRACE_BUFFER_SIZE_FIXED CONFIG_CANOPEN_TRACE_BUFFER_SIZE #ifdef CONFIG_CANOPEN_LEDS #define CO_USE_LEDS 1 #endif #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ #define CO_LITTLE_ENDIAN #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ #define CO_BIG_ENDIAN #else #error "Unsupported endianness" #endif typedef bool bool_t; typedef float float32_t; typedef long double float64_t; typedef char char_t; typedef unsigned char oChar_t; typedef unsigned char domain_t; typedef struct canopen_rx_msg { uint8_t data[8]; uint16_t ident; uint8_t DLC; } CO_CANrxMsg_t; typedef void (*CO_CANrxBufferCallback_t)(void *object, const CO_CANrxMsg_t *message); typedef struct canopen_rx { int filter_id; void *object; CO_CANrxBufferCallback_t pFunct; uint16_t ident; } CO_CANrx_t; typedef struct canopen_tx { uint8_t data[8]; uint16_t ident; uint8_t DLC; bool_t rtr : 1; bool_t bufferFull : 1; bool_t syncFlag : 1; } CO_CANtx_t; typedef struct canopen_module { const struct device *dev; CO_CANrx_t *rx_array; CO_CANtx_t *tx_array; uint16_t rx_size; uint16_t tx_size; uint32_t errors; void *em; bool_t configured : 1; bool_t CANnormal : 1; bool_t first_tx_msg : 1; } CO_CANmodule_t; void canopen_send_lock(void); void canopen_send_unlock(void); #define CO_LOCK_CAN_SEND() canopen_send_lock() #define CO_UNLOCK_CAN_SEND() canopen_send_unlock() void canopen_emcy_lock(void); void canopen_emcy_unlock(void); #define CO_LOCK_EMCY() canopen_emcy_lock() #define CO_UNLOCK_EMCY() canopen_emcy_unlock() void canopen_od_lock(void); void canopen_od_unlock(void); #define CO_LOCK_OD() canopen_od_lock() #define CO_UNLOCK_OD() canopen_od_unlock() /* * CANopenNode RX callbacks run in interrupt context, no memory * barrier needed. */ #define CANrxMemoryBarrier() #define IS_CANrxNew(rxNew) ((uintptr_t)rxNew) #define SET_CANrxNew(rxNew) { CANrxMemoryBarrier(); rxNew = (void *)1L; } #define CLEAR_CANrxNew(rxNew) { CANrxMemoryBarrier(); rxNew = (void *)0L; } #ifdef __cplusplus } #endif #endif /* ZEPHYR_SUBSYS_CANBUS_CANOPEN_CO_DRIVER_H */