candev_samd5x.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2024 ML!PA Consulting GmbH
3  *
4  * This file is subject to the terms and conditions of the GNU Lesser
5  * General Public License v2.1. See the file LICENSE in the top level
6  * directory for more details.
7  */
8 
20 #ifndef CANDEV_SAMD5X_H
21 #define CANDEV_SAMD5X_H
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 #if defined(CAN_INST_NUM)
28 #include "can/candev.h"
29 
30 #ifndef CANDEV_SAMD5X_DEFAULT_BITRATE
34 #define CANDEV_SAMD5X_DEFAULT_BITRATE 500000U
35 #endif
36 
37 #ifndef CANDEV_SAMD5X_DEFAULT_SPT
39 #define CANDEV_SAMD5X_DEFAULT_SPT 875
40 #endif
41 
42 #ifndef CANDEV_SAMD5X_DEFAULT_STD_FILTER_NUM
43 #define CANDEV_SAMD5X_DEFAULT_STD_FILTER_NUM 3
44 #endif
45 
46 #ifndef CANDEV_SAMD5X_DEFAULT_EXT_FILTER_NUM
47 #define CANDEV_SAMD5X_DEFAULT_EXT_FILTER_NUM 3
48 #endif
49 
50 #ifndef CANDEV_SAMD5X_DEFAULT_RX_FIFO_0_ELTS_NUM
51 #define CANDEV_SAMD5X_DEFAULT_RX_FIFO_0_ELTS_NUM 32
52 #endif
53 
54 #ifndef CANDEV_SAMD5X_DEFAULT_RX_FIFO_1_ELTS_NUM
55 #define CANDEV_SAMD5X_DEFAULT_RX_FIFO_1_ELTS_NUM 32
56 #endif
57 
58 #ifndef CANDEV_SAMD5X_DEFAULT_TX_EVT_FIFO_ELTS_NUM
59 #define CANDEV_SAMD5X_DEFAULT_TX_EVT_FIFO_ELTS_NUM 16
60 #endif
61 
62 #ifndef CANDEV_SAMD5X_DEFAULT_TX_BUFFER_NUM
63 #define CANDEV_SAMD5X_DEFAULT_TX_BUFFER_NUM 16
64 #endif
65 
66 #ifndef CANDEV_SAMD5X_DEFAULT_TX_BUFFER_FIFO_QUEUE_NUM
67 #define CANDEV_SAMD5X_DEFAULT_TX_BUFFER_FIFO_QUEUE_NUM 16
68 #endif
69 
70 /* unit: elements */
71 #define CANDEV_SAMD5X_MAX_STD_FILTER 128
72 #define CANDEV_SAMD5X_MAX_EXT_FILTER 64
73 #define CANDEV_SAMD5X_MAX_RX_FIFO_0_ELTS 64
74 #define CANDEV_SAMD5X_MAX_RX_FIFO_1_ELTS 64
75 #define CANDEV_SAMD5X_MAX_RX_BUFFER 64
76 #define CANDEV_SAMD5X_MAX_TX_EVT_FIFO_ELTS 32
77 #define CANDEV_SAMD5X_MAX_TX_BUFFER 32
78 #define CANDEV_SAMD5X_MSG_RAM_MAX_SIZE 448
79 
80 /* SAMD5x CAN controller error codes (values from datasheet section 39.8.14) */
81 #define CANDEV_SAMD5X_NO_ERROR 0
82 #define CANDEV_SAMD5X_STUFF_ERROR 1
83 #define CANDEV_SAMD5X_FORM_ERROR 2
84 #define CANDEV_SAMD5X_ACK_ERROR 3
85 #define CANDEV_SAMD5X_BIT1_ERROR 4
86 #define CANDEV_SAMD5X_BIT0_ERROR 5
87 #define CANDEV_SAMD5X_CRC_ERROR 6
88 #define CANDEV_SAMD5X_NO_CHANGE_ERROR 7
89 
93 typedef struct {
95  Can *can;
96  uint32_t bitrate;
98  gpio_t rx_pin;
100  gpio_t tx_pin;
102  gpio_t enable_pin;
104  gpio_mode_t enable_pin_mode;
106  uint8_t gclk_src;
115  bool enable_pin_active_low : 1;
123  bool disable_automatic_retransmission : 1;
133  bool enable_transmit_pause : 1;
140  bool start_in_monitor_mode : 1;
141 } can_conf_t;
142 #define HAVE_CAN_CONF_T
143 
147 typedef struct {
149  CanMramSidfe std_filter[CANDEV_SAMD5X_DEFAULT_STD_FILTER_NUM];
151  CanMramXifde ext_filter[CANDEV_SAMD5X_DEFAULT_EXT_FILTER_NUM];
153  CanMramRxf0e rx_fifo_0[CANDEV_SAMD5X_DEFAULT_RX_FIFO_0_ELTS_NUM];
155  CanMramRxf1e rx_fifo_1[CANDEV_SAMD5X_DEFAULT_RX_FIFO_1_ELTS_NUM];
157  CanMramRxbe rx_buffer[CANDEV_SAMD5X_MAX_RX_BUFFER];
159  CanMramTxefe tx_event_fifo[CANDEV_SAMD5X_DEFAULT_TX_EVT_FIFO_ELTS_NUM];
161  CanMramTxbe tx_fifo_queue[CANDEV_SAMD5X_DEFAULT_TX_BUFFER_FIFO_QUEUE_NUM];
162 } msg_ram_conf_t;
163 
167 typedef struct {
171  const can_conf_t *conf;
173  msg_ram_conf_t msg_ram_conf;
175  bool tdc_ctrl;
177  bool tx_fifo_queue_ctrl;
178 } can_t;
179 #define HAVE_CAN_T
180 
187 void candev_samd5x_tdc_control(can_t *dev);
188 
195 void candev_samd5x_enter_sleep_mode(candev_t *candev);
196 
203 void candev_samd5x_exit_sleep_mode(candev_t *candev);
204 
205 #endif /* CAN_INST_NUM */
206 
207 #ifdef __cplusplus
208 }
209 #endif
210 
211 #endif /* CANDEV_SAMD5X_H */
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:91
struct candev_conf can_conf_t
Linux candev configuration.
ESP CAN device configuration.
Definition: can_esp.h:88
Low level device structure for ESP32 CAN (extension of candev_t)
Definition: can_esp.h:64
Structure to hold driver state.
Definition: candev.h:77