net: socketcan: decouple SocketCAN and CAN controller headers

Decouple the zephyr/net/socketcan.h and zephyr/drivers/can.h header files
by moving the SocketCAN utilities to their own header.

This is preparation for including the SocketCAN types defined in
socketcan.h in a native posix (Linux) SocketCAN driver context without name
clashes.

Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
This commit is contained in:
Henrik Brix Andersen 2022-08-15 13:56:31 +02:00 committed by Carles Cufí
parent 626c117cd9
commit 27eb12ed48
5 changed files with 102 additions and 62 deletions

View file

@ -13,7 +13,6 @@
#ifndef ZEPHYR_INCLUDE_NET_SOCKETCAN_H_
#define ZEPHYR_INCLUDE_NET_SOCKETCAN_H_
#include <zephyr/drivers/can.h>
#include <zephyr/types.h>
#include <zephyr/net/net_ip.h>
#include <zephyr/net/net_if.h>
@ -119,67 +118,6 @@ struct socketcan_filter {
socketcan_id_t can_mask;
};
/**
* @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 = sframe->can_dlc;
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->can_dlc = zframe->dlc;
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;
}
/** @} */
/**

View file

@ -0,0 +1,99 @@
/** @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 = sframe->can_dlc;
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->can_dlc = zframe->dlc;
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_ */

View file

@ -11,6 +11,7 @@ LOG_MODULE_REGISTER(net_socket_can_sample, LOG_LEVEL_DBG);
#include <zephyr/net/socket.h>
#include <zephyr/net/socketcan.h>
#include <zephyr/net/socketcan_utils.h>
#ifdef CONFIG_SAMPLE_SOCKETCAN_LOOPBACK_MODE
#include <zephyr/drivers/can.h>

View file

@ -21,6 +21,7 @@ LOG_MODULE_REGISTER(net_sock_can, CONFIG_NET_SOCKETS_LOG_LEVEL);
#include <zephyr/sys/fdtable.h>
#include <zephyr/net/canbus.h>
#include <zephyr/net/socketcan.h>
#include <zephyr/net/socketcan_utils.h>
#include <zephyr/drivers/can.h>
#include "sockets_internal.h"

View file

@ -7,6 +7,7 @@
#include <zephyr/logging/log.h>
#include <zephyr/net/socketcan.h>
#include <zephyr/net/socketcan_utils.h>
#include <zephyr/ztest.h>
LOG_MODULE_REGISTER(socket_can, LOG_LEVEL_ERR);