diff options
| author | Vincent Mailhol <mailhol@kernel.org> | 2025-11-26 11:16:14 +0100 |
|---|---|---|
| committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2025-11-26 11:20:44 +0100 |
| commit | a6ddf91a4f9718cec712785904c57b7117f61d6c (patch) | |
| tree | 6fee796a4198cab2533fa84ecdbb7a4a3e6037e7 /drivers/net/can | |
| parent | 1d147cb7c51d6e994ba740709072adf270d7b878 (diff) | |
can: calc_bittiming: add can_calc_sample_point_nrz()
CAN XL optimal sample point for PWM encoding (when TMS is on) differs
from the NRZ optimal one. There is thus a need to calculate a
different sample point depending whether TMS is on or off.
This is a preparation change: move the sample point calculation from
can_calc_bittiming() into the new can_calc_sample_point_nrz()
function.
In an upcoming change, a function will be added to calculate the
sample point for PWM encoding.
Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
Link: https://patch.msgid.link/20251126-canxl-v8-13-e7e3eb74f889@pengutronix.de
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Diffstat (limited to 'drivers/net/can')
| -rw-r--r-- | drivers/net/can/dev/calc_bittiming.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/drivers/net/can/dev/calc_bittiming.c b/drivers/net/can/dev/calc_bittiming.c index c8c166b383cd..bacdf3b218d3 100644 --- a/drivers/net/can/dev/calc_bittiming.c +++ b/drivers/net/can/dev/calc_bittiming.c @@ -10,6 +10,18 @@ #define CAN_CALC_MAX_ERROR 50 /* in one-tenth of a percent */ +/* CiA recommended sample points for Non Return to Zero encoding. */ +static int can_calc_sample_point_nrz(const struct can_bittiming *bt) +{ + if (bt->bitrate > 800 * KILO /* BPS */) + return 750; + + if (bt->bitrate > 500 * KILO /* BPS */) + return 800; + + return 875; +} + /* Bit-timing calculation derived from: * * Code based on LinCAN sources and H8S2638 project @@ -79,17 +91,10 @@ int can_calc_bittiming(const struct net_device *dev, struct can_bittiming *bt, u64 v64; int err; - /* Use CiA recommended sample points */ - if (bt->sample_point) { + if (bt->sample_point) sample_point_reference = bt->sample_point; - } else { - if (bt->bitrate > 800 * KILO /* BPS */) - sample_point_reference = 750; - else if (bt->bitrate > 500 * KILO /* BPS */) - sample_point_reference = 800; - else - sample_point_reference = 875; - } + else + sample_point_reference = can_calc_sample_point_nrz(bt); /* tseg even = round down, odd = round up */ for (tseg = (btc->tseg1_max + btc->tseg2_max) * 2 + 1; |