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:
parent
5d48376a21
commit
f5ee91d357
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
@ -103,7 +103,7 @@ static candev_event_t _can_error_to_can_evt(struct can_frame can_frame_err)
|
|||||||
can_evt = CANDEV_EVENT_TX_ERROR;
|
can_evt = CANDEV_EVENT_TX_ERROR;
|
||||||
}
|
}
|
||||||
else if (can_err_type & CAN_ERR_CRTL) {
|
else if (can_err_type & CAN_ERR_CRTL) {
|
||||||
switch(can_frame_err.data[1]) {
|
switch (can_frame_err.data[1]) {
|
||||||
case CAN_ERR_CRTL_RX_OVERFLOW:
|
case CAN_ERR_CRTL_RX_OVERFLOW:
|
||||||
can_evt = CANDEV_EVENT_RX_ERROR;
|
can_evt = CANDEV_EVENT_RX_ERROR;
|
||||||
break;
|
break;
|
||||||
@ -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;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user