Loading...
Searching...
No Matches
candev_samd5x.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2024 ML!PA Consulting GmbH
3 * SPDX-License-Identifier: LGPL-2.1-only
4 */
5
6#pragma once
7
18
19#ifdef __cplusplus
20extern "C" {
21#endif
22
23#if defined(CAN_INST_NUM)
24# include "can/candev.h"
25
26# ifndef CANDEV_SAMD5X_DEFAULT_BITRATE
30# define CANDEV_SAMD5X_DEFAULT_BITRATE 500000U
31# endif
32
33# ifndef CANDEV_SAMD5X_DEFAULT_SPT
35# define CANDEV_SAMD5X_DEFAULT_SPT 875
36# endif
37
38# ifndef CANDEV_SAMD5X_DEFAULT_STD_FILTER_NUM
39# define CANDEV_SAMD5X_DEFAULT_STD_FILTER_NUM 3
40# endif
41
42# ifndef CANDEV_SAMD5X_DEFAULT_EXT_FILTER_NUM
43# define CANDEV_SAMD5X_DEFAULT_EXT_FILTER_NUM 3
44# endif
45
46# ifndef CANDEV_SAMD5X_DEFAULT_RX_FIFO_0_ELTS_NUM
47# define CANDEV_SAMD5X_DEFAULT_RX_FIFO_0_ELTS_NUM 32
48# endif
49
50# ifndef CANDEV_SAMD5X_DEFAULT_RX_FIFO_1_ELTS_NUM
51# define CANDEV_SAMD5X_DEFAULT_RX_FIFO_1_ELTS_NUM 32
52# endif
53
54# ifndef CANDEV_SAMD5X_DEFAULT_TX_EVT_FIFO_ELTS_NUM
55# define CANDEV_SAMD5X_DEFAULT_TX_EVT_FIFO_ELTS_NUM 16
56# endif
57
58# ifndef CANDEV_SAMD5X_DEFAULT_TX_BUFFER_NUM
59# define CANDEV_SAMD5X_DEFAULT_TX_BUFFER_NUM 16
60# endif
61
62# ifndef CANDEV_SAMD5X_DEFAULT_TX_BUFFER_FIFO_QUEUE_NUM
63# define CANDEV_SAMD5X_DEFAULT_TX_BUFFER_FIFO_QUEUE_NUM 16
64# endif
65
66/* unit: elements */
67# define CANDEV_SAMD5X_MAX_STD_FILTER 128
68# define CANDEV_SAMD5X_MAX_EXT_FILTER 64
69# define CANDEV_SAMD5X_MAX_RX_FIFO_0_ELTS 64
70# define CANDEV_SAMD5X_MAX_RX_FIFO_1_ELTS 64
71# define CANDEV_SAMD5X_MAX_RX_BUFFER 64
72# define CANDEV_SAMD5X_MAX_TX_EVT_FIFO_ELTS 32
73# define CANDEV_SAMD5X_MAX_TX_BUFFER 32
74# define CANDEV_SAMD5X_MSG_RAM_MAX_SIZE 448
75
76/* SAMD5x CAN controller error codes (values from datasheet section 39.8.14) */
77# define CANDEV_SAMD5X_NO_ERROR 0
78# define CANDEV_SAMD5X_STUFF_ERROR 1
79# define CANDEV_SAMD5X_FORM_ERROR 2
80# define CANDEV_SAMD5X_ACK_ERROR 3
81# define CANDEV_SAMD5X_BIT1_ERROR 4
82# define CANDEV_SAMD5X_BIT0_ERROR 5
83# define CANDEV_SAMD5X_CRC_ERROR 6
84# define CANDEV_SAMD5X_NO_CHANGE_ERROR 7
85
89typedef struct {
91 Can *can;
92 uint32_t bitrate;
94 gpio_t rx_pin;
96 gpio_t tx_pin;
98 gpio_t enable_pin;
100 gpio_mode_t enable_pin_mode;
102 uint8_t gclk_src;
111 bool enable_pin_active_low : 1;
119 bool disable_automatic_retransmission : 1;
129 bool enable_transmit_pause : 1;
136 bool start_in_monitor_mode : 1;
137} can_conf_t;
138# define HAVE_CAN_CONF_T
139
143typedef struct can_msg_ram {
145 CanMramSidfe std_filter[CANDEV_SAMD5X_DEFAULT_STD_FILTER_NUM];
147 CanMramXifde ext_filter[CANDEV_SAMD5X_DEFAULT_EXT_FILTER_NUM];
149 CanMramRxf0e rx_fifo_0[CANDEV_SAMD5X_DEFAULT_RX_FIFO_0_ELTS_NUM];
151 CanMramRxf1e rx_fifo_1[CANDEV_SAMD5X_DEFAULT_RX_FIFO_1_ELTS_NUM];
153 CanMramRxbe rx_buffer[CANDEV_SAMD5X_MAX_RX_BUFFER];
155 CanMramTxefe tx_event_fifo[CANDEV_SAMD5X_DEFAULT_TX_EVT_FIFO_ELTS_NUM];
157 CanMramTxbe tx_buffer[CANDEV_SAMD5X_DEFAULT_TX_BUFFER_FIFO_QUEUE_NUM];
158} can_msg_ram_t;
159
163typedef struct {
167 const can_conf_t *conf;
169 struct {
170 uint8_t last_error_code;
171 uint8_t d_last_error_code;
172 uint8_t tx_error_count;
173 uint8_t rx_error_count;
174 } state;
176 can_msg_ram_t msg_ram;
178 bool tdc_ctrl;
179} can_t;
180# define HAVE_CAN_T
181
188void candev_samd5x_tdc_control(can_t *dev);
189
196void candev_samd5x_enter_sleep_mode(candev_t *candev);
197
204void candev_samd5x_exit_sleep_mode(candev_t *candev);
205
206#endif /* CAN_INST_NUM */
207
208#ifdef __cplusplus
209}
210#endif
211
Definitions for low-level CAN driver interface.
struct can can_t
Low level device structure for ESP32 CAN (extension of candev_t)
gpio_mode_t
Available pin modes.
Definition periph_cpu.h:88
struct candev candev_t
Forward declaration for candev struct.
Definition candev.h:59
ESP CAN device configuration.
Definition can_esp.h:84
Low level device structure for ESP32 CAN (extension of candev_t)
Definition can_esp.h:60
Structure to hold driver state.
Definition candev.h:76