You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
2.8 KiB
123 lines
2.8 KiB
/* |
|
* Copyright (c) 2019 Vestas Wind Systems A/S |
|
* |
|
* SPDX-License-Identifier: Apache-2.0 |
|
*/ |
|
|
|
#ifndef ZEPHYR_MODULES_CANOPENNODE_CO_DRIVER_H |
|
#define ZEPHYR_MODULES_CANOPENNODE_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 <zephyr.h> |
|
#include <zephyr/types.h> |
|
#include <device.h> |
|
#include <toolchain.h> |
|
|
|
/* 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_CANOPENNODE_SDO_BUFFER_SIZE |
|
|
|
/* Use trace buffer size from Kconfig */ |
|
#define CO_TRACE_BUFFER_SIZE_FIXED CONFIG_CANOPENNODE_TRACE_BUFFER_SIZE |
|
|
|
#ifdef CONFIG_CANOPENNODE_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_MODULES_CANOPENNODE_CO_DRIVER_H */
|
|
|