Skip to content

Commit 3f97d11

Browse files
henrikbrixandersencarlescufi
authored andcommitted
drivers: can: convert enum can_mode to a bit field
Convert the can_mode enum to a bit field to prepare for future extensions (CAN-FD mode, transmitter delay compensation, one-shot mode, 3-samples mode, ...). Rename the existing modes: - CAN_NORMAL_MODE -> CAN_MODE_NORMAL - CAN_SILENT_MODE -> CAN_MODE_LISTENONLY - CAN_LOOPBACK_MODE -> CAN_MODE_LOOPBACK These mode names align with the Linux naming for CAN control modes. The old CAN_SILENT_LOOPBACK_MODE can be set with the bitmask (CAN_MODE_LISTENONLY | CAN_MODE_LOOPBACK). Signed-off-by: Henrik Brix Andersen <[email protected]>
1 parent 85c2c91 commit 3f97d11

File tree

25 files changed

+156
-111
lines changed

25 files changed

+156
-111
lines changed

drivers/can/can_handlers.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ static inline int z_vrfy_can_get_max_filters(const struct device *dev, enum can_
138138
}
139139
#include <syscalls/can_get_max_filters_mrsh.c>
140140

141-
static inline int z_vrfy_can_set_mode(const struct device *dev, enum can_mode mode)
141+
static inline int z_vrfy_can_set_mode(const struct device *dev, can_mode_t mode)
142142
{
143143
Z_OOPS(Z_SYSCALL_DRIVER_CAN(dev, set_mode));
144144

drivers/can/can_loopback.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,11 +197,11 @@ static void can_loopback_remove_rx_filter(const struct device *dev, int filter_i
197197
k_mutex_unlock(&data->mtx);
198198
}
199199

200-
static int can_loopback_set_mode(const struct device *dev, enum can_mode mode)
200+
static int can_loopback_set_mode(const struct device *dev, can_mode_t mode)
201201
{
202202
struct can_loopback_data *data = dev->data;
203203

204-
data->loopback = mode == CAN_LOOPBACK_MODE ? 1 : 0;
204+
data->loopback = (mode & CAN_MODE_LOOPBACK) != 0 ? 1 : 0;
205205
return 0;
206206
}
207207

drivers/can/can_mcan.c

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -240,12 +240,17 @@ int can_mcan_set_timing_data(const struct device *dev,
240240
}
241241
#endif /* CONFIG_CAN_FD_MODE */
242242

243-
int can_mcan_set_mode(const struct device *dev, enum can_mode mode)
243+
int can_mcan_set_mode(const struct device *dev, can_mode_t mode)
244244
{
245245
const struct can_mcan_config *cfg = dev->config;
246246
struct can_mcan_reg *can = cfg->can;
247247
int ret;
248248

249+
if ((mode & ~(CAN_MODE_LOOPBACK | CAN_MODE_LISTENONLY)) != 0) {
250+
LOG_ERR("unsupported mode: 0x%08x", mode);
251+
return -ENOTSUP;
252+
}
253+
249254
if (cfg->phy != NULL) {
250255
ret = can_transceiver_enable(cfg->phy);
251256
if (ret != 0) {
@@ -269,32 +274,19 @@ int can_mcan_set_mode(const struct device *dev, enum can_mode mode)
269274
/* Configuration Change Enable */
270275
can->cccr |= CAN_MCAN_CCCR_CCE;
271276

272-
switch (mode) {
273-
case CAN_NORMAL_MODE:
274-
LOG_DBG("Config normal mode");
275-
can->cccr &= ~(CAN_MCAN_CCCR_TEST | CAN_MCAN_CCCR_MON);
276-
break;
277-
278-
case CAN_SILENT_MODE:
279-
LOG_DBG("Config silent mode");
280-
can->cccr &= ~CAN_MCAN_CCCR_TEST;
281-
can->cccr |= CAN_MCAN_CCCR_MON;
282-
break;
283-
284-
case CAN_LOOPBACK_MODE:
285-
LOG_DBG("Config loopback mode");
286-
can->cccr &= ~CAN_MCAN_CCCR_MON;
277+
if ((mode & CAN_MODE_LOOPBACK) != 0) {
278+
/* Loopback mode */
287279
can->cccr |= CAN_MCAN_CCCR_TEST;
288280
can->test |= CAN_MCAN_TEST_LBCK;
289-
break;
281+
} else {
282+
can->cccr &= ~CAN_MCAN_CCCR_TEST;
283+
}
290284

291-
case CAN_SILENT_LOOPBACK_MODE:
292-
LOG_DBG("Config silent loopback mode");
293-
can->cccr |= (CAN_MCAN_CCCR_TEST | CAN_MCAN_CCCR_MON);
294-
can->test |= CAN_MCAN_TEST_LBCK;
295-
break;
296-
default:
297-
break;
285+
if ((mode & CAN_MODE_LISTENONLY) != 0) {
286+
/* Bus monitoring mode */
287+
can->cccr |= CAN_MCAN_CCCR_MON;
288+
} else {
289+
can->cccr &= ~CAN_MCAN_CCCR_MON;
298290
}
299291

300292
ret = can_leave_init_mode(can, K_MSEC(CAN_INIT_TIMEOUT));

drivers/can/can_mcan.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ struct can_mcan_reg;
257257
.custom = _custom_data, \
258258
}
259259

260-
int can_mcan_set_mode(const struct device *dev, enum can_mode mode);
260+
int can_mcan_set_mode(const struct device *dev, can_mode_t mode);
261261

262262
int can_mcan_set_timing(const struct device *dev,
263263
const struct can_timing *timing);

drivers/can/can_mcp2515.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -440,21 +440,21 @@ static int mcp2515_set_timing(const struct device *dev,
440440
return ret;
441441
}
442442

443-
static int mcp2515_set_mode(const struct device *dev, enum can_mode mode)
443+
static int mcp2515_set_mode(const struct device *dev, can_mode_t mode)
444444
{
445445
const struct mcp2515_config *dev_cfg = dev->config;
446446
struct mcp2515_data *dev_data = dev->data;
447447
uint8_t mcp2515_mode;
448448
int ret;
449449

450450
switch (mode) {
451-
case CAN_NORMAL_MODE:
451+
case CAN_MODE_NORMAL:
452452
mcp2515_mode = MCP2515_MODE_NORMAL;
453453
break;
454-
case CAN_SILENT_MODE:
454+
case CAN_MODE_LISTENONLY:
455455
mcp2515_mode = MCP2515_MODE_SILENT;
456456
break;
457-
case CAN_LOOPBACK_MODE:
457+
case CAN_MODE_LOOPBACK:
458458
mcp2515_mode = MCP2515_MODE_LOOPBACK;
459459
break;
460460
default:
@@ -952,7 +952,7 @@ static int mcp2515_init(const struct device *dev)
952952
return ret;
953953
}
954954

955-
ret = can_set_mode(dev, CAN_NORMAL_MODE);
955+
ret = can_set_mode(dev, CAN_MODE_NORMAL);
956956

957957
return ret;
958958
}

drivers/can/can_mcux_flexcan.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -179,13 +179,18 @@ static int mcux_flexcan_set_timing(const struct device *dev,
179179
return 0;
180180
}
181181

182-
static int mcux_flexcan_set_mode(const struct device *dev, enum can_mode mode)
182+
static int mcux_flexcan_set_mode(const struct device *dev, can_mode_t mode)
183183
{
184184
const struct mcux_flexcan_config *config = dev->config;
185185
uint32_t ctrl1;
186186
uint32_t mcr;
187187
int err;
188188

189+
if ((mode & ~(CAN_MODE_LOOPBACK | CAN_MODE_LISTENONLY)) != 0) {
190+
LOG_ERR("unsupported mode: 0x%08x", mode);
191+
return -ENOTSUP;
192+
}
193+
189194
if (config->phy != NULL) {
190195
err = can_transceiver_enable(config->phy);
191196
if (err != 0) {
@@ -199,7 +204,7 @@ static int mcux_flexcan_set_mode(const struct device *dev, enum can_mode mode)
199204
ctrl1 = config->base->CTRL1;
200205
mcr = config->base->MCR;
201206

202-
if (mode == CAN_LOOPBACK_MODE || mode == CAN_SILENT_LOOPBACK_MODE) {
207+
if ((mode & CAN_MODE_LOOPBACK) != 0) {
203208
/* Enable loopback and self-reception */
204209
ctrl1 |= CAN_CTRL1_LPB_MASK;
205210
mcr &= ~(CAN_MCR_SRXDIS_MASK);
@@ -209,7 +214,7 @@ static int mcux_flexcan_set_mode(const struct device *dev, enum can_mode mode)
209214
mcr |= CAN_MCR_SRXDIS_MASK;
210215
}
211216

212-
if (mode == CAN_SILENT_MODE || mode == CAN_SILENT_LOOPBACK_MODE) {
217+
if ((mode & CAN_MODE_LISTENONLY) != 0) {
213218
/* Enable listen-only mode */
214219
ctrl1 |= CAN_CTRL1_LOM_MASK;
215220
} else {

drivers/can/can_rcar.c

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -566,30 +566,34 @@ static int can_rcar_enter_operation_mode(const struct can_rcar_cfg *config)
566566
return 0;
567567
}
568568

569-
static int can_rcar_set_mode(const struct device *dev, enum can_mode mode)
569+
static int can_rcar_set_mode(const struct device *dev, can_mode_t mode)
570570
{
571571
const struct can_rcar_cfg *config = dev->config;
572572
struct can_rcar_data *data = dev->data;
573573
uint8_t tcr = 0;
574574
int ret = 0;
575575

576+
if ((mode & ~(CAN_MODE_LOOPBACK | CAN_MODE_LISTENONLY)) != 0) {
577+
LOG_ERR("Unsupported mode: 0x%08x", mode);
578+
return -ENOTSUP;
579+
}
580+
576581
k_mutex_lock(&data->inst_mutex, K_FOREVER);
577-
switch (mode) {
578-
case CAN_NORMAL_MODE:
579-
tcr = 0;
580-
break;
581-
/*Controller is not allowed to send dominant bits*/
582-
case CAN_SILENT_MODE:
583-
tcr = RCAR_CAN_TCR_LISTEN_ONLY | RCAR_CAN_TCR_TSTE;
584-
break;
585-
/*Controller is in loopback mode (receive own messages)*/
586-
case CAN_LOOPBACK_MODE:
587-
tcr = RCAR_CAN_TCR_INT_LOOP | RCAR_CAN_TCR_TSTE;
588-
break;
589-
/*Combination of loopback and silent*/
590-
case CAN_SILENT_LOOPBACK_MODE:
582+
583+
if ((mode & (CAN_MODE_LOOPBACK | CAN_MODE_LISTENONLY)) ==
584+
(CAN_MODE_LOOPBACK | CAN_MODE_LISTENONLY)) {
585+
LOG_ERR("Combination of loopback and listenonly modes not supported");
591586
ret = -ENOTSUP;
592587
goto unlock;
588+
} else if ((mode & CAN_MODE_LOOPBACK) != 0) {
589+
/* Loopback mode */
590+
tcr = RCAR_CAN_TCR_INT_LOOP | RCAR_CAN_TCR_TSTE;
591+
} else if ((mode & CAN_MODE_LISTENONLY) != 0) {
592+
/* Listen-only mode */
593+
tcr = RCAR_CAN_TCR_LISTEN_ONLY | RCAR_CAN_TCR_TSTE;
594+
} else {
595+
/* Normal mode */
596+
tcr = 0;
593597
}
594598

595599
/* Enable CAN transceiver */
@@ -957,7 +961,7 @@ static int can_rcar_init(const struct device *dev)
957961
return ret;
958962
}
959963

960-
ret = can_rcar_set_mode(dev, CAN_NORMAL_MODE);
964+
ret = can_rcar_set_mode(dev, CAN_MODE_NORMAL);
961965
if (ret) {
962966
return ret;
963967
}

drivers/can/can_shell.c

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ static struct k_poll_event msgq_events[1] = {
2020
};
2121

2222
static inline int read_config_options(const struct shell *sh, int pos,
23-
char **argv, bool *silent, bool *loopback)
23+
char **argv, bool *listenonly, bool *loopback)
2424
{
2525
char *arg = argv[pos];
2626

@@ -31,10 +31,10 @@ static inline int read_config_options(const struct shell *sh, int pos,
3131
for (arg = &arg[1]; *arg; arg++) {
3232
switch (*arg) {
3333
case 's':
34-
if (silent == NULL) {
34+
if (listenonly == NULL) {
3535
shell_error(sh, "Unknown option %c", *arg);
3636
} else {
37-
*silent = true;
37+
*listenonly = true;
3838
}
3939
break;
4040
case 'l':
@@ -231,8 +231,8 @@ static int cmd_config(const struct shell *sh, size_t argc, char **argv)
231231
{
232232
const struct device *can_dev;
233233
int pos = 1;
234-
bool silent = false, loopback = false;
235-
enum can_mode mode;
234+
bool listenonly = false, loopback = false;
235+
can_mode_t mode = CAN_MODE_NORMAL;
236236
uint32_t bitrate;
237237
int ret;
238238

@@ -245,19 +245,17 @@ static int cmd_config(const struct shell *sh, size_t argc, char **argv)
245245

246246
pos++;
247247

248-
pos = read_config_options(sh, pos, argv, &silent, &loopback);
248+
pos = read_config_options(sh, pos, argv, &listenonly, &loopback);
249249
if (pos < 0) {
250250
return -EINVAL;
251251
}
252252

253-
if (silent && loopback) {
254-
mode = CAN_SILENT_LOOPBACK_MODE;
255-
} else if (silent) {
256-
mode = CAN_SILENT_MODE;
257-
} else if (loopback) {
258-
mode = CAN_LOOPBACK_MODE;
259-
} else {
260-
mode = CAN_NORMAL_MODE;
253+
if (listenonly) {
254+
mode |= CAN_MODE_LISTENONLY;
255+
}
256+
257+
if (loopback) {
258+
mode |= CAN_MODE_LOOPBACK;
261259
}
262260

263261
ret = can_set_mode(can_dev, mode);
@@ -447,8 +445,8 @@ SHELL_STATIC_SUBCMD_SET_CREATE(sub_can,
447445
SHELL_CMD_ARG(config, NULL,
448446
"Configure CAN controller.\n"
449447
" Usage: config device_name [-sl] bitrate\n"
450-
" -s Silent mode\n"
451-
" -l Listen-only mode",
448+
" -s Listen-only mode\n"
449+
" -l Loopback mode",
452450
cmd_config, 3, 1),
453451
SHELL_CMD_ARG(send, NULL,
454452
"Send a CAN frame.\n"

drivers/can/can_stm32.c

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ static int can_leave_sleep_mode(CAN_TypeDef *can)
341341
return 0;
342342
}
343343

344-
static int can_stm32_set_mode(const struct device *dev, enum can_mode mode)
344+
static int can_stm32_set_mode(const struct device *dev, can_mode_t mode)
345345
{
346346
const struct can_stm32_config *cfg = dev->config;
347347
CAN_TypeDef *can = cfg->can;
@@ -350,6 +350,11 @@ static int can_stm32_set_mode(const struct device *dev, enum can_mode mode)
350350

351351
LOG_DBG("Set mode %d", mode);
352352

353+
if ((mode & ~(CAN_MODE_LOOPBACK | CAN_MODE_LISTENONLY)) != 0) {
354+
LOG_ERR("unsupported mode: 0x%08x", mode);
355+
return -ENOTSUP;
356+
}
357+
353358
k_mutex_lock(&data->inst_mutex, K_FOREVER);
354359

355360
if (cfg->phy != NULL) {
@@ -366,23 +371,18 @@ static int can_stm32_set_mode(const struct device *dev, enum can_mode mode)
366371
goto done;
367372
}
368373

369-
switch (mode) {
370-
case CAN_NORMAL_MODE:
371-
can->BTR &= ~(CAN_BTR_LBKM | CAN_BTR_SILM);
372-
break;
373-
case CAN_LOOPBACK_MODE:
374-
can->BTR &= ~(CAN_BTR_SILM);
374+
if ((mode & CAN_MODE_LOOPBACK) != 0) {
375+
/* Loopback mode */
375376
can->BTR |= CAN_BTR_LBKM;
376-
break;
377-
case CAN_SILENT_MODE:
378-
can->BTR &= ~(CAN_BTR_LBKM);
377+
} else {
378+
can->BTR &= ~CAN_BTR_LBKM;
379+
}
380+
381+
if ((mode & CAN_MODE_LISTENONLY) != 0) {
382+
/* Silent mode */
379383
can->BTR |= CAN_BTR_SILM;
380-
break;
381-
case CAN_SILENT_LOOPBACK_MODE:
382-
can->BTR |= CAN_BTR_LBKM | CAN_BTR_SILM;
383-
break;
384-
default:
385-
break;
384+
} else {
385+
can->BTR &= ~CAN_BTR_SILM;
386386
}
387387

388388
done:
@@ -568,7 +568,7 @@ static int can_stm32_init(const struct device *dev)
568568
return ret;
569569
}
570570

571-
ret = can_stm32_set_mode(dev, CAN_NORMAL_MODE);
571+
ret = can_stm32_set_mode(dev, CAN_MODE_NORMAL);
572572
if (ret) {
573573
return ret;
574574
}

0 commit comments

Comments
 (0)