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 
19 #ifdef __cplusplus
20 extern "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 
89 typedef 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 
143 typedef 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 
163 typedef 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 
188 void candev_samd5x_tdc_control(can_t *dev);
189 
196 void candev_samd5x_enter_sleep_mode(candev_t *candev);
197 
204 void 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_conf can_conf_t
Linux candev configuration.
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