static int can_get_bittiming(struct net_device *dev, struct can_bittiming *bt) { struct can_priv *priv = netdev_priv(dev); int err; if (priv->bittiming_const) { if (!bt->tq) err = can_calc_bittiming(dev, bt); else err = can_fixup_bittiming(dev, bt); if (err) return err; } return 0; }
static int can_get_bittiming(struct net_device *dev, struct can_bittiming *bt) { struct can_priv *priv = netdev_priv(dev); int err; /* Check if the CAN device has bit-timing parameters */ if (priv->bittiming_const) { /* Non-expert mode? Check if the bitrate has been pre-defined */ if (!bt->tq) /* Determine bit-timing parameters */ err = can_calc_bittiming(dev, bt); else /* Check bit-timing params and calculate proper brp */ err = can_fixup_bittiming(dev, bt); if (err) return err; } return 0; }
static int can_get_bittiming(struct net_device *dev, struct can_bittiming *bt, const struct can_bittiming_const *btc) { int err; /* Check if the CAN device has bit-timing parameters */ if (!btc) return -EOPNOTSUPP; /* * Depending on the given can_bittiming parameter structure the CAN * timing parameters are calculated based on the provided bitrate OR * alternatively the CAN timing parameters (tq, prop_seg, etc.) are * provided directly which are then checked and fixed up. */ if (!bt->tq && bt->bitrate) err = can_calc_bittiming(dev, bt, btc); else if (bt->tq && !bt->bitrate) err = can_fixup_bittiming(dev, bt, btc); else err = -EINVAL; return err; }
static void print_bit_timing(const struct can_bittiming_const *btc, __u32 bitrate, __u32 sample_point, __u32 ref_clk, int quiet) { struct net_device dev = { .priv.bittiming_const = btc, .priv.clock.freq = ref_clk, }; struct can_bittiming bt = { .bitrate = bitrate, .sample_point = sample_point, }; long rate_error, spt_error; if (!quiet) { printf("Bit timing parameters for %s with %.6f MHz ref clock\n" "nominal real Bitrt nom real SampP\n" "Bitrate TQ[ns] PrS PhS1 PhS2 SJW BRP Bitrate Error SampP SampP Error ", btc->name, ref_clk / 1000000.0); btc->printf_btr(&bt, 1); printf("\n"); } if (can_calc_bittiming(&dev, &bt)) { printf("%7d ***bitrate not possible***\n", bitrate); return; } /* get nominal sample point */ if (!sample_point) sample_point = get_cia_sample_point(bitrate); rate_error = abs((__s32)(bitrate - bt.bitrate)); spt_error = abs((__s32)(sample_point - bt.sample_point)); printf("%7d " "%6d %3d %4d %4d " "%3d %3d " "%7d %4.1f%% " "%4.1f%% %4.1f%% %4.1f%% ", bitrate, bt.tq, bt.prop_seg, bt.phase_seg1, bt.phase_seg2, bt.sjw, bt.brp, bt.bitrate, 100.0 * rate_error / bitrate, sample_point / 10.0, bt.sample_point / 10.0, 100.0 * spt_error / sample_point); btc->printf_btr(&bt, 0); printf("\n"); } static void do_list(void) { unsigned int i; for (i = 0; i < ARRAY_SIZE(can_calc_consts); i++) printf("%s\n", can_calc_consts[i].name); }