You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
4.1 KiB
152 lines
4.1 KiB
/* |
|
* Copyright (c) 2018 Karsten Koenig |
|
* |
|
* SPDX-License-Identifier: Apache-2.0 |
|
* |
|
*/ |
|
|
|
#ifndef _MCP2515_H_ |
|
#define _MCP2515_H_ |
|
|
|
#include <zephyr/drivers/gpio.h> |
|
#include <zephyr/drivers/can.h> |
|
|
|
#define MCP2515_RX_CNT 2 |
|
/* Reduce the number of Tx buffers to 1 in order to avoid priority inversion. */ |
|
#define MCP2515_TX_CNT 1 |
|
#define MCP2515_FRAME_LEN 13 |
|
|
|
struct mcp2515_tx_cb { |
|
can_tx_callback_t cb; |
|
void *cb_arg; |
|
}; |
|
|
|
struct mcp2515_data { |
|
struct can_driver_data common; |
|
|
|
/* interrupt data */ |
|
struct gpio_callback int_gpio_cb; |
|
struct k_thread int_thread; |
|
k_thread_stack_t *int_thread_stack; |
|
struct k_sem int_sem; |
|
|
|
/* tx data */ |
|
struct k_sem tx_sem; |
|
struct mcp2515_tx_cb tx_cb[MCP2515_TX_CNT]; |
|
uint8_t tx_busy_map; |
|
|
|
/* filter data */ |
|
uint32_t filter_usage; |
|
can_rx_callback_t rx_cb[CONFIG_CAN_MAX_FILTER]; |
|
void *cb_arg[CONFIG_CAN_MAX_FILTER]; |
|
struct can_filter filter[CONFIG_CAN_MAX_FILTER]; |
|
|
|
/* general data */ |
|
struct k_mutex mutex; |
|
enum can_state old_state; |
|
uint8_t mcp2515_mode; |
|
}; |
|
|
|
struct mcp2515_config { |
|
const struct can_driver_config common; |
|
|
|
/* spi configuration */ |
|
struct spi_dt_spec bus; |
|
|
|
/* interrupt configuration */ |
|
struct gpio_dt_spec int_gpio; |
|
size_t int_thread_stack_size; |
|
int int_thread_priority; |
|
|
|
/* CAN timing */ |
|
uint32_t osc_freq; |
|
}; |
|
|
|
/* |
|
* Startup time of 128 OSC1 clock cycles at 1MHz (minimum clock in frequency) |
|
* see MCP2515 datasheet section 8.1 Oscillator Start-up Timer |
|
*/ |
|
#define MCP2515_OSC_STARTUP_US 128U |
|
|
|
/* MCP2515 Opcodes */ |
|
#define MCP2515_OPCODE_WRITE 0x02 |
|
#define MCP2515_OPCODE_READ 0x03 |
|
#define MCP2515_OPCODE_BIT_MODIFY 0x05 |
|
#define MCP2515_OPCODE_LOAD_TX_BUFFER 0x40 |
|
#define MCP2515_OPCODE_RTS 0x80 |
|
#define MCP2515_OPCODE_READ_RX_BUFFER 0x90 |
|
#define MCP2515_OPCODE_READ_STATUS 0xA0 |
|
#define MCP2515_OPCODE_RESET 0xC0 |
|
|
|
/* MCP2515 Registers */ |
|
#define MCP2515_ADDR_CANSTAT 0x0E |
|
#define MCP2515_ADDR_CANCTRL 0x0F |
|
#define MCP2515_ADDR_TEC 0x1C |
|
#define MCP2515_ADDR_REC 0x1D |
|
#define MCP2515_ADDR_CNF3 0x28 |
|
#define MCP2515_ADDR_CNF2 0x29 |
|
#define MCP2515_ADDR_CNF1 0x2A |
|
#define MCP2515_ADDR_CANINTE 0x2B |
|
#define MCP2515_ADDR_CANINTF 0x2C |
|
#define MCP2515_ADDR_EFLG 0x2D |
|
#define MCP2515_ADDR_TXB0CTRL 0x30 |
|
#define MCP2515_ADDR_TXB1CTRL 0x40 |
|
#define MCP2515_ADDR_TXB2CTRL 0x50 |
|
#define MCP2515_ADDR_RXB0CTRL 0x60 |
|
#define MCP2515_ADDR_RXB1CTRL 0x70 |
|
|
|
#define MCP2515_ADDR_OFFSET_FRAME2FRAME 0x10 |
|
#define MCP2515_ADDR_OFFSET_CTRL2FRAME 0x01 |
|
|
|
/* MCP2515 Operation Modes */ |
|
#define MCP2515_MODE_NORMAL 0x00 |
|
#define MCP2515_MODE_LOOPBACK 0x02 |
|
#define MCP2515_MODE_SILENT 0x03 |
|
#define MCP2515_MODE_CONFIGURATION 0x04 |
|
|
|
/* MCP2515_FRAME_OFFSET */ |
|
#define MCP2515_FRAME_OFFSET_SIDH 0 |
|
#define MCP2515_FRAME_OFFSET_SIDL 1 |
|
#define MCP2515_FRAME_OFFSET_EID8 2 |
|
#define MCP2515_FRAME_OFFSET_EID0 3 |
|
#define MCP2515_FRAME_OFFSET_DLC 4 |
|
#define MCP2515_FRAME_OFFSET_D0 5 |
|
|
|
/* MCP2515_CANINTF */ |
|
#define MCP2515_CANINTF_RX0IF BIT(0) |
|
#define MCP2515_CANINTF_RX1IF BIT(1) |
|
#define MCP2515_CANINTF_TX0IF BIT(2) |
|
#define MCP2515_CANINTF_TX1IF BIT(3) |
|
#define MCP2515_CANINTF_TX2IF BIT(4) |
|
#define MCP2515_CANINTF_ERRIF BIT(5) |
|
#define MCP2515_CANINTF_WAKIF BIT(6) |
|
#define MCP2515_CANINTF_MERRF BIT(7) |
|
|
|
#define MCP2515_INTE_RX0IE BIT(0) |
|
#define MCP2515_INTE_RX1IE BIT(1) |
|
#define MCP2515_INTE_TX0IE BIT(2) |
|
#define MCP2515_INTE_TX1IE BIT(3) |
|
#define MCP2515_INTE_TX2IE BIT(4) |
|
#define MCP2515_INTE_ERRIE BIT(5) |
|
#define MCP2515_INTE_WAKIE BIT(6) |
|
#define MCP2515_INTE_MERRE BIT(7) |
|
|
|
#define MCP2515_EFLG_EWARN BIT(0) |
|
#define MCP2515_EFLG_RXWAR BIT(1) |
|
#define MCP2515_EFLG_TXWAR BIT(2) |
|
#define MCP2515_EFLG_RXEP BIT(3) |
|
#define MCP2515_EFLG_TXEP BIT(4) |
|
#define MCP2515_EFLG_TXBO BIT(5) |
|
#define MCP2515_EFLG_RX0OVR BIT(6) |
|
#define MCP2515_EFLG_RX1OVR BIT(7) |
|
|
|
#define MCP2515_TXCTRL_TXREQ BIT(3) |
|
|
|
#define MCP2515_CANSTAT_MODE_POS 5 |
|
#define MCP2515_CANSTAT_MODE_MASK (0x07 << MCP2515_CANSTAT_MODE_POS) |
|
#define MCP2515_CANCTRL_MODE_POS 5 |
|
#define MCP2515_CANCTRL_MODE_MASK (0x07 << MCP2515_CANCTRL_MODE_POS) |
|
#define MCP2515_TXBNCTRL_TXREQ_POS 3 |
|
#define MCP2515_TXBNCTRL_TXREQ_MASK (0x01 << MCP2515_TXBNCTRL_TXREQ_POS) |
|
|
|
#endif /*_MCP2515_H_*/
|
|
|