Skip to content

Commit 241d869

Browse files
committed
drivers: can: mcp2515: Fixes for DT SPI cs
Fixed using chipselect with seperate chipselect GPIOs and how they were referenced from/in DeviceTree. Also configure the device during initialization so it's ready to go after init. Signed-off-by: Karsten Koenig <[email protected]>
1 parent 016fe3f commit 241d869

File tree

5 files changed

+42
-26
lines changed

5 files changed

+42
-26
lines changed

drivers/can/Kconfig.mcp2515

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,6 @@ config CAN_MCP2515_INT_THREAD_PRIO
6262
Priority level of the internal thread which is ran for
6363
interrupt handling and incoming packets.
6464

65-
config CAN_MCP2515_GPIO_SPI_CS
66-
bool "Manage SPI CS through a GPIO pin"
67-
help
68-
This option is useful if one needs to manage SPI CS through a GPIO
69-
pin to by-pass the SPI controller's CS logic.
70-
7165
config CAN_MCP2515_MAX_FILTER
7266
int "Maximum number of concurrent active filters"
7367
default 5

drivers/can/mcp2515.c

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ static void mcp2515_convert_zcanframe_to_mcp2515frame(const struct zcan_frame
131131
}
132132

133133
static void mcp2515_convert_mcp2515frame_to_zcanframe(const u8_t *source,
134-
struct zcan_frame *target)
134+
struct zcan_frame *target)
135135
{
136136
u8_t data_idx = 0U;
137137

@@ -220,6 +220,10 @@ static int mcp2515_configure(struct device *dev, enum can_mode mode,
220220
/* CNF3, CNF2, CNF1, CANINTE */
221221
u8_t config_buf[4];
222222

223+
if (bitrate == 0) {
224+
bitrate = dev_cfg->bus_speed;
225+
}
226+
223227
const u8_t bit_length = 1 + dev_cfg->tq_prop + dev_cfg->tq_bs1 +
224228
dev_cfg->tq_bs2;
225229

@@ -257,13 +261,17 @@ static int mcp2515_configure(struct device *dev, enum can_mode mode,
257261
const u8_t rx0_ctrl = BIT(6) | BIT(5) | BIT(2);
258262
const u8_t rx1_ctrl = BIT(6) | BIT(5);
259263

260-
__ASSERT((cfg->tq_sjw >= 1) && (cfg->tq_sjw <= 4), "1 <= SJW <= 4");
261-
__ASSERT((cfg->tq_prop >= 1) && (cfg->tq_prop <= 8), "1 <= PROP <= 8");
262-
__ASSERT((cfg->tq_bs1 >= 1) && (cfg->tq_bs1 <= 8), "1 <= BS1 <= 8");
263-
__ASSERT((cfg->tq_bs2 >= 2) && (cfg->tq_bs2 <= 8), "2 <= BS2 <= 8");
264-
__ASSERT(cfg->tq_prop + cfg->tq_bs1 >= cfg->tq_bs2,
264+
__ASSERT((dev_cfg->tq_sjw >= 1) && (dev_cfg->tq_sjw <= 4),
265+
"1 <= SJW <= 4");
266+
__ASSERT((dev_cfg->tq_prop >= 1) && (dev_cfg->tq_prop <= 8),
267+
"1 <= PROP <= 8");
268+
__ASSERT((dev_cfg->tq_bs1 >= 1) && (dev_cfg->tq_bs1 <= 8),
269+
"1 <= BS1 <= 8");
270+
__ASSERT((dev_cfg->tq_bs2 >= 2) && (dev_cfg->tq_bs2 <= 8),
271+
"2 <= BS2 <= 8");
272+
__ASSERT(dev_cfg->tq_prop + dev_cfg->tq_bs1 >= dev_cfg->tq_bs2,
265273
"PROP + BS1 >= BS2");
266-
__ASSERT(cfg->tq_bs2 > cfg->tq_sjw, "BS2 > SJW");
274+
__ASSERT(dev_cfg->tq_bs2 > dev_cfg->tq_sjw, "BS2 > SJW");
267275

268276
if (CONFIG_CAN_MCP2515_OSC_FREQ % (bit_length * bitrate * 2)) {
269277
LOG_ERR("Prescaler is not a natural number! "
@@ -292,8 +300,8 @@ static int mcp2515_configure(struct device *dev, enum can_mode mode,
292300
mcp2515_convert_canmode_to_mcp2515mode(mode));
293301
}
294302

295-
int mcp2515_send(struct device *dev, struct zcan_frame *msg, s32_t timeout,
296-
can_tx_callback_t callback)
303+
int mcp2515_send(struct device *dev, const struct zcan_frame *msg,
304+
s32_t timeout, can_tx_callback_t callback)
297305
{
298306
struct mcp2515_data *dev_data = DEV_DATA(dev);
299307
u8_t tx_idx = 0U;
@@ -519,6 +527,7 @@ static int mcp2515_init(struct device *dev)
519527
{
520528
const struct mcp2515_config *dev_cfg = DEV_CFG(dev);
521529
struct mcp2515_data *dev_data = DEV_DATA(dev);
530+
int ret;
522531

523532
k_sem_init(&dev_data->int_sem, 0, UINT_MAX);
524533
k_mutex_init(&dev_data->tx_mutex);
@@ -539,7 +548,7 @@ static int mcp2515_init(struct device *dev)
539548
return -EINVAL;
540549
}
541550

542-
#ifdef CONFIG_CAN_MCP2515_GPIO_SPI_CS
551+
#ifdef DT_MICROCHIP_MCP2515_0_CS_GPIO_PIN
543552
dev_data->spi_cs_ctrl.gpio_dev =
544553
device_get_binding(dev_cfg->spi_cs_port);
545554
if (!dev_data->spi_cs_ctrl.gpio_dev) {
@@ -553,7 +562,7 @@ static int mcp2515_init(struct device *dev)
553562
dev_data->spi_cfg.cs = &dev_data->spi_cs_ctrl;
554563
#else
555564
dev_data->spi_cfg.cs = NULL;
556-
#endif /* CAN_MCP2515_GPIO_SPI_CS */
565+
#endif /* DT_MICROCHIP_MCP2515_0_CS_GPIO_PIN */
557566

558567
/* Reset MCP2515 */
559568
if (mcp2515_cmd_soft_reset(dev)) {
@@ -596,7 +605,9 @@ static int mcp2515_init(struct device *dev)
596605
sizeof(dev_data->filter_response));
597606
(void)memset(dev_data->filter, 0, sizeof(dev_data->filter));
598607

599-
return 0;
608+
ret = mcp2515_configure(dev, CAN_NORMAL_MODE, dev_cfg->bus_speed);
609+
610+
return ret;
600611
}
601612

602613
#ifdef CONFIG_CAN_1
@@ -622,14 +633,15 @@ static const struct mcp2515_config mcp2515_config_1 = {
622633
.int_port = DT_MICROCHIP_MCP2515_0_INT_GPIOS_CONTROLLER,
623634
.int_thread_stack_size = CONFIG_CAN_MCP2515_INT_THREAD_STACK_SIZE,
624635
.int_thread_priority = CONFIG_CAN_MCP2515_INT_THREAD_PRIO,
625-
#ifdef CONFIG_CAN_MCP2515_GPIO_SPI_CS
626-
.spi_cs_pin = DT_MICROCHIP_MCP2515_0_CS_GPIOS_PIN,
627-
.spi_cs_port = DT_MICROCHIP_MCP2515_0_CS_GPIOS_CONTROLLER,
628-
#endif /* CAN_MCP2515_GPIO_SPI_CS */
636+
#ifdef DT_MICROCHIP_MCP2515_0_CS_GPIO_PIN
637+
.spi_cs_pin = DT_MICROCHIP_MCP2515_0_CS_GPIO_PIN,
638+
.spi_cs_port = DT_MICROCHIP_MCP2515_0_CS_GPIO_CONTROLLER,
639+
#endif /* DT_MICROCHIP_MCP2515_0_CS_GPIO_PIN */
629640
.tq_sjw = CONFIG_CAN_SJW,
630641
.tq_prop = CONFIG_CAN_PROP_SEG,
631642
.tq_bs1 = CONFIG_CAN_PHASE_SEG1,
632643
.tq_bs2 = CONFIG_CAN_PHASE_SEG2,
644+
.bus_speed = DT_MICROCHIP_MCP2515_0_BUS_SPEED,
633645
};
634646

635647
DEVICE_AND_API_INIT(can_mcp2515_1, DT_MICROCHIP_MCP2515_0_LABEL, &mcp2515_init,

drivers/can/mcp2515.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ struct mcp2515_data {
2626
/* spi device data */
2727
struct device *spi;
2828
struct spi_config spi_cfg;
29-
#ifdef CONFIG_CAN_MCP2515_GPIO_SPI_CS
29+
#ifdef DT_MICROCHIP_MCP2515_0_CS_GPIO_PIN
3030
struct spi_cs_control spi_cs_ctrl;
31-
#endif
31+
#endif /* DT_MICROCHIP_MCP2515_0_CS_GPIO_PIN */
3232

3333
/* interrupt data */
3434
struct device *int_gpio;
@@ -70,6 +70,7 @@ struct mcp2515_config {
7070
u8_t tq_prop;
7171
u8_t tq_bs1;
7272
u8_t tq_bs2;
73+
u32_t bus_speed;
7374
};
7475

7576
/* MCP2515 Opcodes */

samples/drivers/CAN/mcp2515-dts.overlay

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@
66

77
&spi1 {
88
status = "ok";
9+
cs-gpios = <&gpioa 4 GPIO_DIR_OUT>;
910
mcp2515@0 {
1011
compatible = "microchip,mcp2515";
1112
spi-port-name = "SPI_1";
1213
spi-max-frequency = <1000000>;
13-
int-gpios = <&gpiob 4 GPIO_INT_ACTIVE_LOW>;
14+
int-gpios = <&gpioa 0 GPIO_INT_ACTIVE_LOW>;
1415
status = "ok";
1516
label = "CAN_1";
1617
reg = <0>;
18+
bus-speed = <250000>;
1719
};
1820
};

samples/drivers/CAN/prj.conf.mcp2515

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,11 @@ CONFIG_SPI=y
33
CONFIG_CAN=y
44
CONFIG_CAN_INIT_PRIORITY=80
55
CONFIG_CAN_1=y
6-
CONFIG_CAN_MCP2515=y
6+
CONFIG_CAN_STM32=n
7+
CONFIG_CAN_MCP2515=y
8+
CONFIG_GPIO_LED_DEV="GPIOB"
9+
CONFIG_PIN_LED_1=3
10+
CONFIG_GPIO_BUTTON_DEV="GPIOB"
11+
CONFIG_PIN_USER_BUTTON=4
12+
CONFIG_LOG=y
13+
CONFIG_CAN_LOG_LEVEL=4

0 commit comments

Comments
 (0)