48 # define CAN_MAX_LENGTH 64
53 # define CAN_MAX_LENGTH 8
82 #define CAN_EFF_FLAG BIT(31)
83 #define CAN_RTR_FLAG BIT(30)
86 #define CAN_SFF_MASK 0x000007FFUL
87 #define CAN_EFF_MASK 0x1FFFFFFFUL
95 #define CAN_ERR_CRTL BIT64(0)
96 #define CAN_ERR_CTRL_OFFSET 0
100 #define CAN_ERR_CRTL_UNSPEC BIT64(CAN_ERR_CTRL_OFFSET + 0)
104 #define CAN_ERR_CRTL_RX_OVERFLOW BIT64(CAN_ERR_CTRL_OFFSET + 1)
108 #define CAN_ERR_CRTL_TX_OVERFLOW BIT64(CAN_ERR_CTRL_OFFSET + 2)
112 #define CAN_ERR_CRTL_RX_WARNING BIT64(CAN_ERR_CTRL_OFFSET + 3)
116 #define CAN_ERR_CRTL_TX_WARNING BIT64(CAN_ERR_CTRL_OFFSET + 4)
120 #define CAN_ERR_CRTL_RX_PASSIVE BIT64(CAN_ERR_CTRL_OFFSET + 5)
126 #define CAN_ERR_CRTL_TX_PASSIVE BIT64(CAN_ERR_CTRL_OFFSET + 6)
132 #define CAN_ERR_CRTL_ACTIVE BIT64(CAN_ERR_CTRL_OFFSET + 7)
136 #define CAN_ERR_PROT BIT64(1)
137 #define CAN_ERR_PROT_OFFSET 8
141 #define CAN_ERR_PROT_UNSPEC BIT64(CAN_ERR_PROT_OFFSET + 0)
145 #define CAN_ERR_PROT_BIT BIT64(CAN_ERR_PROT_OFFSET + 1)
149 #define CAN_ERR_PROT_FORM BIT64(CAN_ERR_PROT_OFFSET + 2)
153 #define CAN_ERR_PROT_STUFF BIT64(CAN_ERR_PROT_OFFSET + 3)
157 #define CAN_ERR_PROT_BIT0 BIT64(CAN_ERR_PROT_OFFSET + 4)
161 #define CAN_ERR_PROT_BIT1 BIT64(CAN_ERR_PROT_OFFSET + 5)
165 #define CAN_ERR_PROT_OVERLOAD BIT64(CAN_ERR_PROT_OFFSET + 6)
169 #define CAN_ERR_PROT_ACTIVE BIT64(CAN_ERR_PROT_OFFSET + 7)
173 #define CAN_ERR_PROT_TX BIT64(CAN_ERR_PROT_OFFSET + 8)
175 #define CAN_ERR_PROT_LOC_OFFSET 24
179 #define CAN_ERR_PROT_LOC_UNSPEC BIT64(CAN_ERR_PROT_LOC_OFFSET + 0)
184 #define CAN_ERR_PROT_LOC_SOF BIT64(CAN_ERR_PROT_LOC_OFFSET + 1)
189 #define CAN_ERR_PROT_LOC_ID28_21 BIT64(CAN_ERR_PROT_LOC_OFFSET + 2)
194 #define CAN_ERR_PROT_LOC_ID20_18 BIT64(CAN_ERR_PROT_LOC_OFFSET + 3)
199 #define CAN_ERR_PROT_LOC_SRTR BIT64(CAN_ERR_PROT_LOC_OFFSET + 4)
204 #define CAN_ERR_PROT_LOC_IDE BIT64(CAN_ERR_PROT_LOC_OFFSET + 5)
209 #define CAN_ERR_PROT_LOC_ID17_13 BIT64(CAN_ERR_PROT_LOC_OFFSET + 6)
214 #define CAN_ERR_PROT_LOC_ID12_05 BIT64(CAN_ERR_PROT_LOC_OFFSET + 7)
219 #define CAN_ERR_PROT_LOC_ID04_00 BIT64(CAN_ERR_PROT_LOC_OFFSET + 8)
224 #define CAN_ERR_PROT_LOC_RTR BIT64(CAN_ERR_PROT_LOC_OFFSET + 9)
229 #define CAN_ERR_PROT_LOC_RES1 BIT64(CAN_ERR_PROT_LOC_OFFSET + 10)
234 #define CAN_ERR_PROT_LOC_RES0 BIT64(CAN_ERR_PROT_LOC_OFFSET + 11)
239 #define CAN_ERR_PROT_LOC_DLC BIT64(CAN_ERR_PROT_LOC_OFFSET + 12)
244 #define CAN_ERR_PROT_LOC_DATA BIT64(CAN_ERR_PROT_LOC_OFFSET + 13)
249 #define CAN_ERR_PROT_LOC_CRC_SEQ BIT64(CAN_ERR_PROT_LOC_OFFSET + 14)
254 #define CAN_ERR_PROT_LOC_CRC_DEL BIT64(CAN_ERR_PROT_LOC_OFFSET + 15)
259 #define CAN_ERR_PROT_LOC_ACK BIT64(CAN_ERR_PROT_LOC_OFFSET + 16)
264 #define CAN_ERR_PROT_LOC_ACK_DEL BIT64(CAN_ERR_PROT_LOC_OFFSET + 17)
269 #define CAN_ERR_PROT_LOC_EOF BIT64(CAN_ERR_PROT_LOC_OFFSET + 18)
274 #define CAN_ERR_PROT_LOC_INTERM BIT64(CAN_ERR_PROT_LOC_OFFSET + 19)
279 #define CAN_ERR_TRX BIT64(2)
280 #define CAN_ERR_TRX_OFFSET 48
284 #define CAN_ERR_TRX_UNSPEC BIT64(CAN_ERR_TRX_OFFSET + 0)
288 #define CAN_ERR_TRX_CANH_NO_WIRE BIT64(CAN_ERR_TRX_OFFSET + 1)
292 #define CAN_ERR_TRX_CANH_SHORT_TO_BAT BIT64(CAN_ERR_TRX_OFFSET + 2)
296 #define CAN_ERR_TRX_CANH_SHORT_TO_VCC BIT64(CAN_ERR_TRX_OFFSET + 3)
301 #define CAN_ERR_TRX_CANH_SHORT_TO_GND BIT64(CAN_ERR_TRX_OFFSET + 4)
305 #define CAN_ERR_TRX_CANL_NO_WIRE BIT64(CAN_ERR_TRX_OFFSET + 5)
309 #define CAN_ERR_TRX_CANL_SHORT_TO_BAT BIT64(CAN_ERR_TRX_OFFSET + 6)
313 #define CAN_ERR_TRX_CANL_SHORT_TO_VCC BIT64(CAN_ERR_TRX_OFFSET + 7)
317 #define CAN_ERR_TRX_CANL_SHORT_TO_GND BIT64(CAN_ERR_TRX_OFFSET + 8)
321 #define CAN_ERR_TRX_CANL_SHORT_TO_CANH BIT64(CAN_ERR_TRX_OFFSET + 9)
325 #define CAN_ERR_ACK BIT64(3)
329 #define CAN_ERR_BUSOFF BIT64(4)
333 #define CAN_ERR_BUSERROR BIT64(5)
337 #define CAN_ERR_RESTARTED BIT64(6)
339 #ifdef CONFIG_CAN_MULTI
344 struct can *(*can_init)(uint32_t index, uint32_t bitrate,
struct gpio_pin *pin,
bool pinHigh, bool (*callback)(
struct can *can,
can_error_t error,
can_errorData_t data,
void *userData),
void *data);
349 int32_t (*
can_send)(
struct can *can,
struct can_msg *msg, TickType_t waittime);
350 int32_t (*
can_recv)(
struct can *can, int32_t filterID,
struct can_msg *msg, TickType_t waittime);
353 int32_t (*
can_up)(
struct can *can);
354 int32_t (*
can_down)(
struct can *can);
366 #ifdef CONFIG_INSTANCE_NAME
372 #ifdef CONFIG_CAN_THREAD_SAVE
378 #ifdef CONFIG_CAN_MULTI
382 const struct can_ops *ops;
385 #ifndef CONFIG_CAN_MULTI
396 struct can *
can_init(uint32_t index, uint32_t bitrate,
struct gpio_pin *pin,
bool pinHigh,
bool (*callback)(
struct can *can,
can_error_t error,
can_errorData_t data,
void *userData),
void *data);
415 int32_t
can_setCallback(
struct can *can, int32_t filterID,
bool (*callback)(
struct can *can,
struct can_msg *msg,
void *data),
void *data);
449 int32_t
can_recv(
struct can *can, int32_t filterID,
struct can_msg *msg, TickType_t waittime);
481 inline struct can *
can_init(uint32_t index, uint32_t bitrate,
struct gpio_pin *pin,
bool pinHigh,
bool (*callback)(
struct can *can,
can_error_t error,
can_errorData_t data,
void *userData),
void *data) {
487 return a->ops->can_init(index, bitrate, pin, pinHigh, callback, data, userData);
491 return a->ops->can_deinit(can);
493 inline int32_t
can_setCallback(
struct can *can, int32_t filterID,
bool (*callback)(
struct can *can,
struct can_msg *msg,
void *data),
void *data) {
495 return a->ops->can_setCallback(can, filterID, callback, data);
499 return a->ops->can_registerFilter(can, filter);
503 return a->ops->can_deregisterFilter(can, filterID);
505 inline int32_t
can_send(
struct can *can,
struct can_msg *msg, TickType_t waittime) {
507 return a->ops->can_send(can, msg, waittime);
509 inline int32_t
can_recv(
struct can *can, int32_t filterID,
struct can_msg *msg, TickType_t waittime) {
511 return a->ops->can_recv(can, filterID, msg, waittime);
515 return a->ops->can_sendISR(can, msg);
519 return a->ops->can_recvISR(can, filterID, msg);
521 inline int32_t
can_up(
struct can *can) {
523 return a->ops->can_up(can);
525 inline int32_t
can_down(
struct can *can) {
527 return a->ops->can_down(can);