124 lines
2.8 KiB
C
124 lines
2.8 KiB
C
/*
|
|
* 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 <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_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 */
|