1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-12-17 10:33:49 +01:00

cpu/native: enable CAN FD support

As CAN FD is already supported by SocketCAN on Linux, just enable the
fdcan pseudomodule and allow CAN FD frames.

Signed-off-by: Gilles DOFFE <gilles.doffe@rtone.fr>
This commit is contained in:
Gilles DOFFE 2024-01-23 02:24:08 +01:00
parent 5d48376a21
commit f5ee91d357
2 changed files with 18 additions and 12 deletions

View File

@ -52,3 +52,5 @@ USEMODULE += periph
# UART is needed by startup.c # UART is needed by startup.c
USEMODULE += periph_uart USEMODULE += periph_uart
USEMODULE += fdcan

View File

@ -44,11 +44,11 @@
#include "debug.h" #include "debug.h"
static int _init(candev_t *candev); static int _init(candev_t *candev);
static int _send(candev_t *candev, const struct can_frame *frame); static int _send(candev_t *candev, const can_frame_t *frame);
static void _isr(candev_t *candev); static void _isr(candev_t *candev);
static int _set(candev_t *candev, canopt_t opt, void *value, size_t value_len); static int _set(candev_t *candev, canopt_t opt, void *value, size_t value_len);
static int _get(candev_t *candev, canopt_t opt, void *value, size_t max_len); static int _get(candev_t *candev, canopt_t opt, void *value, size_t max_len);
static int _abort(candev_t *candev, const struct can_frame *frame); static int _abort(candev_t *candev, const can_frame_t *frame);
static int _set_filter(candev_t *candev, const struct can_filter *filter); static int _set_filter(candev_t *candev, const struct can_filter *filter);
static int _remove_filter(candev_t *candev, const struct can_filter *filter); static int _remove_filter(candev_t *candev, const struct can_filter *filter);
static int _power_up(candev_t *candev); static int _power_up(candev_t *candev);
@ -67,7 +67,7 @@ static const candev_driver_t candev_linux_driver = {
.remove_filter = _remove_filter, .remove_filter = _remove_filter,
}; };
static candev_event_t _can_error_to_can_evt(struct can_frame can_frame_err); static candev_event_t _can_error_to_can_evt(can_frame_t can_frame_err);
static void _callback_can_sigio(int sock, void *arg); static void _callback_can_sigio(int sock, void *arg);
can_conf_t candev_conf[CAN_DLL_NUMOF] = { can_conf_t candev_conf[CAN_DLL_NUMOF] = {
@ -94,7 +94,7 @@ int can_init(can_t *dev, const can_conf_t *conf)
return 0; return 0;
} }
static candev_event_t _can_error_to_can_evt(struct can_frame can_frame_err) static candev_event_t _can_error_to_can_evt(can_frame_t can_frame_err)
{ {
candev_event_t can_evt = CANDEV_EVENT_NOEVENT; candev_event_t can_evt = CANDEV_EVENT_NOEVENT;
can_err_mask_t can_err_type = can_frame_err.can_id & CAN_ERR_MASK; can_err_mask_t can_err_type = can_frame_err.can_id & CAN_ERR_MASK;
@ -168,7 +168,11 @@ static int _init(candev_t *candev)
can_err_mask_t err_mask = CAN_ERR_TX_TIMEOUT | can_err_mask_t err_mask = CAN_ERR_TX_TIMEOUT |
CAN_ERR_BUSOFF | CAN_ERR_BUSOFF |
CAN_ERR_CRTL; CAN_ERR_CRTL;
ret = real_setsockopt(dev->sock, SOL_CAN_RAW, CAN_RAW_ERR_FILTER, ret = real_setsockopt(dev->sock, SOL_CAN_RAW,
#ifdef MODULE_FDCAN
CAN_RAW_FD_FRAMES |
#endif
CAN_RAW_ERR_FILTER,
&err_mask, sizeof(err_mask)); &err_mask, sizeof(err_mask));
if (ret < 0) { if (ret < 0) {
@ -210,12 +214,12 @@ static int _init(candev_t *candev)
return 0; return 0;
} }
static int _send(candev_t *candev, const struct can_frame *frame) static int _send(candev_t *candev, const can_frame_t *frame)
{ {
int nbytes; int nbytes;
can_t *dev = (can_t *)candev; can_t *dev = (can_t *)candev;
nbytes = real_write(dev->sock, frame, sizeof(struct can_frame)); nbytes = real_write(dev->sock, frame, sizeof(can_frame_t));
if (nbytes < frame->len) { if (nbytes < frame->len) {
real_printf("CAN write op failed, nbytes=%i\n", nbytes); real_printf("CAN write op failed, nbytes=%i\n", nbytes);
@ -232,7 +236,7 @@ static int _send(candev_t *candev, const struct can_frame *frame)
static void _isr(candev_t *candev) static void _isr(candev_t *candev)
{ {
int nbytes; int nbytes;
struct can_frame rcv_frame; can_frame_t rcv_frame;
can_t *dev = (can_t *)candev; can_t *dev = (can_t *)candev;
if (dev == NULL) { if (dev == NULL) {
@ -240,14 +244,14 @@ static void _isr(candev_t *candev)
} }
DEBUG("candev_native _isr: CAN SIGIO interrupt received, sock = %i\n", dev->sock); DEBUG("candev_native _isr: CAN SIGIO interrupt received, sock = %i\n", dev->sock);
nbytes = real_read(dev->sock, &rcv_frame, sizeof(struct can_frame)); nbytes = real_read(dev->sock, &rcv_frame, sizeof(can_frame_t));
if (nbytes < 0) { /* SIGIO signal was probably due to an error with the socket */ if (nbytes < 0) { /* SIGIO signal was probably due to an error with the socket */
DEBUG("candev_native _isr: read: error during read\n"); DEBUG("candev_native _isr: read: error during read\n");
return; return;
} }
if (nbytes < (int)sizeof(struct can_frame)) { if (nbytes < (int)sizeof(can_frame_t)) {
DEBUG("candev_native _isr: read: incomplete CAN frame\n"); DEBUG("candev_native _isr: read: incomplete CAN frame\n");
return; return;
} }
@ -544,7 +548,7 @@ static int _remove_filter(candev_t *candev, const struct can_filter *filter)
return 0; return 0;
} }
static int _abort(candev_t *candev, const struct can_frame *frame) static int _abort(candev_t *candev, const can_frame_t *frame)
{ {
(void)frame; (void)frame;
(void)candev; (void)candev;