blob: 29b73fe0da0cb0be42ebda5d7cac42877ef97e46 [file] [log] [blame]
/** @file
* @brief SocketCAN utilities.
*
* Utilities for SocketCAN support.
*/
/*
* Copyright (c) 2019 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_NET_SOCKETCAN_UTILS_H_
#define ZEPHYR_INCLUDE_NET_SOCKETCAN_UTILS_H_
#include <zephyr/drivers/can.h>
#include <zephyr/net/socketcan.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief SocketCAN utilities
* @defgroup socket_can Network Core Library
* @ingroup networking
* @{
*/
/**
* @brief Translate a @a socketcan_frame struct to a @a can_frame struct.
*
* @param sframe Pointer to sockecan_frame struct.
* @param zframe Pointer to can_frame struct.
*/
static inline void socketcan_to_can_frame(const struct socketcan_frame *sframe,
struct can_frame *zframe)
{
zframe->id_type = (sframe->can_id & BIT(31)) >> 31;
zframe->rtr = (sframe->can_id & BIT(30)) >> 30;
zframe->id = sframe->can_id & BIT_MASK(29);
zframe->dlc = can_bytes_to_dlc(sframe->len);
zframe->fd = !!(sframe->flags & CANFD_FDF);
memcpy(zframe->data, sframe->data, MIN(sizeof(sframe->data), sizeof(zframe->data)));
}
/**
* @brief Translate a @a can_frame struct to a @a socketcan_frame struct.
*
* @param zframe Pointer to can_frame struct.
* @param sframe Pointer to socketcan_frame struct.
*/
static inline void socketcan_from_can_frame(const struct can_frame *zframe,
struct socketcan_frame *sframe)
{
sframe->can_id = (zframe->id_type << 31) | (zframe->rtr << 30) | zframe->id;
sframe->len = can_dlc_to_bytes(zframe->dlc);
if (zframe->fd) {
sframe->flags = CANFD_FDF;
}
memcpy(sframe->data, zframe->data, MIN(sizeof(zframe->data), sizeof(sframe->data)));
}
/**
* @brief Translate a @a socketcan_filter struct to a @a can_filter struct.
*
* @param sfilter Pointer to socketcan_filter struct.
* @param zfilter Pointer to can_filter struct.
*/
static inline void socketcan_to_can_filter(const struct socketcan_filter *sfilter,
struct can_filter *zfilter)
{
zfilter->id_type = (sfilter->can_id & BIT(31)) >> 31;
zfilter->rtr = (sfilter->can_id & BIT(30)) >> 30;
zfilter->id = sfilter->can_id & BIT_MASK(29);
zfilter->rtr_mask = (sfilter->can_mask & BIT(30)) >> 30;
zfilter->id_mask = sfilter->can_mask & BIT_MASK(29);
}
/**
* @brief Translate a @a can_filter struct to a @a socketcan_filter struct.
*
* @param zfilter Pointer to can_filter struct.
* @param sfilter Pointer to socketcan_filter struct.
*/
static inline void socketcan_from_can_filter(const struct can_filter *zfilter,
struct socketcan_filter *sfilter)
{
sfilter->can_id = (zfilter->id_type << 31) |
(zfilter->rtr << 30) | zfilter->id;
sfilter->can_mask = (zfilter->rtr_mask << 30) |
(zfilter->id_type << 31) | zfilter->id_mask;
}
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif /* ZEPHYR_INCLUDE_NET_SOCKETCAN_H_ */