drivers: can: stm32: switch to supporting CAN_MODE_ONE_SHOT
Switch from using a driver-specific, compile-time devicetree one-shot property to supporting the newly added CAN_MODE_ONE_SHOT flag for enabling/disabling one-shot mode at run-time. Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
This commit is contained in:
parent
bc320d2a54
commit
c0cba8f21a
3 changed files with 8 additions and 15 deletions
|
@ -351,7 +351,7 @@ static int can_stm32_set_mode(const struct device *dev, can_mode_t mode)
|
||||||
|
|
||||||
LOG_DBG("Set mode %d", mode);
|
LOG_DBG("Set mode %d", mode);
|
||||||
|
|
||||||
if ((mode & ~(CAN_MODE_LOOPBACK | CAN_MODE_LISTENONLY)) != 0) {
|
if ((mode & ~(CAN_MODE_LOOPBACK | CAN_MODE_LISTENONLY | CAN_MODE_ONE_SHOT)) != 0) {
|
||||||
LOG_ERR("unsupported mode: 0x%08x", mode);
|
LOG_ERR("unsupported mode: 0x%08x", mode);
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
}
|
}
|
||||||
|
@ -386,6 +386,13 @@ static int can_stm32_set_mode(const struct device *dev, can_mode_t mode)
|
||||||
can->BTR &= ~CAN_BTR_SILM;
|
can->BTR &= ~CAN_BTR_SILM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((mode & CAN_MODE_ONE_SHOT) != 0) {
|
||||||
|
/* No automatic retransmission */
|
||||||
|
can->MCR |= CAN_MCR_NART;
|
||||||
|
} else {
|
||||||
|
can->MCR &= ~CAN_MCR_NART;
|
||||||
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
ret = can_leave_init_mode(can);
|
ret = can_leave_init_mode(can);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -534,10 +541,6 @@ static int can_stm32_init(const struct device *dev)
|
||||||
#ifdef CONFIG_CAN_AUTO_BUS_OFF_RECOVERY
|
#ifdef CONFIG_CAN_AUTO_BUS_OFF_RECOVERY
|
||||||
can->MCR |= CAN_MCR_ABOM;
|
can->MCR |= CAN_MCR_ABOM;
|
||||||
#endif
|
#endif
|
||||||
if (cfg->one_shot) {
|
|
||||||
can->MCR |= CAN_MCR_NART;
|
|
||||||
}
|
|
||||||
|
|
||||||
timing.sjw = cfg->sjw;
|
timing.sjw = cfg->sjw;
|
||||||
if (cfg->sample_point && USE_SP_ALGO) {
|
if (cfg->sample_point && USE_SP_ALGO) {
|
||||||
ret = can_calc_timing(dev, &timing, cfg->bus_speed,
|
ret = can_calc_timing(dev, &timing, cfg->bus_speed,
|
||||||
|
@ -1202,7 +1205,6 @@ static const struct can_stm32_config can_stm32_cfg_##inst = { \
|
||||||
.prop_ts1 = DT_INST_PROP_OR(inst, prop_seg, 0) + \
|
.prop_ts1 = DT_INST_PROP_OR(inst, prop_seg, 0) + \
|
||||||
DT_INST_PROP_OR(inst, phase_seg1, 0), \
|
DT_INST_PROP_OR(inst, phase_seg1, 0), \
|
||||||
.ts2 = DT_INST_PROP_OR(inst, phase_seg2, 0), \
|
.ts2 = DT_INST_PROP_OR(inst, phase_seg2, 0), \
|
||||||
.one_shot = DT_INST_PROP(inst, one_shot), \
|
|
||||||
.pclken = { \
|
.pclken = { \
|
||||||
.enr = DT_INST_CLOCKS_CELL(inst, bits), \
|
.enr = DT_INST_CLOCKS_CELL(inst, bits), \
|
||||||
.bus = DT_INST_CLOCKS_CELL(inst, bus), \
|
.bus = DT_INST_CLOCKS_CELL(inst, bus), \
|
||||||
|
|
|
@ -74,7 +74,6 @@ struct can_stm32_config {
|
||||||
uint8_t sjw;
|
uint8_t sjw;
|
||||||
uint8_t prop_ts1;
|
uint8_t prop_ts1;
|
||||||
uint8_t ts2;
|
uint8_t ts2;
|
||||||
bool one_shot;
|
|
||||||
struct stm32_pclken pclken;
|
struct stm32_pclken pclken;
|
||||||
void (*config_irq)(CAN_TypeDef *can);
|
void (*config_irq)(CAN_TypeDef *can);
|
||||||
const struct pinctrl_dev_config *pcfg;
|
const struct pinctrl_dev_config *pcfg;
|
||||||
|
|
|
@ -20,14 +20,6 @@ properties:
|
||||||
pinctrl-names:
|
pinctrl-names:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
one-shot:
|
|
||||||
type: boolean
|
|
||||||
required: false
|
|
||||||
description: |
|
|
||||||
Disable automatic retransmissions. A CAN frame will only be transmitted
|
|
||||||
once, independently of the transmission result (successful, error, or
|
|
||||||
arbitration lost).
|
|
||||||
|
|
||||||
master-can-reg:
|
master-can-reg:
|
||||||
type: int
|
type: int
|
||||||
required: false
|
required: false
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue