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;
}
Beispiel #2
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;
}
Beispiel #3
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;
}
Beispiel #4
0
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);
}