can-calc-bit-timing: add support for calculation of CAN-FD bit timings
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>pull/333/head
parent
04123b3b36
commit
36d76ba07a
|
|
@ -120,10 +120,12 @@ struct calc_ref_clk {
|
|||
|
||||
struct calc_bittiming_const {
|
||||
const struct can_bittiming_const bittiming_const;
|
||||
const struct can_bittiming_const data_bittiming_const;
|
||||
|
||||
const struct calc_ref_clk ref_clk[16];
|
||||
|
||||
const void (*printf_btr)(struct can_bittiming *bt, bool hdr);
|
||||
const void (*printf_data_btr)(struct can_bittiming *bt, bool hdr);
|
||||
};
|
||||
|
||||
struct calc_data {
|
||||
|
|
@ -554,6 +556,17 @@ static const unsigned int common_bitrates[] = {
|
|||
0
|
||||
};
|
||||
|
||||
static const unsigned int common_data_bitrates[] = {
|
||||
12000000,
|
||||
10000000,
|
||||
8000000,
|
||||
5000000,
|
||||
4000000,
|
||||
2000000,
|
||||
1000000,
|
||||
0
|
||||
};
|
||||
|
||||
#define CAN_CALC_MAX_ERROR 50 /* in one-tenth of a percent */
|
||||
#define CAN_CALC_SYNC_SEG 1
|
||||
|
||||
|
|
@ -787,8 +800,8 @@ static void print_bittiming_one(const struct can_bittiming_const *bittiming_cons
|
|||
|
||||
if (!quiet) {
|
||||
printf("Bit timing parameters for %s%s%s%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 ",
|
||||
" nominal real Bitrt nom real SampP\n"
|
||||
" Bitrate TQ[ns] PrS PhS1 PhS2 SJW BRP Bitrate Error SampP SampP Error ",
|
||||
bittiming_const->name,
|
||||
ref_clk->name ? " (" : "",
|
||||
ref_clk->name ? ref_clk->name : "",
|
||||
|
|
@ -803,12 +816,12 @@ static void print_bittiming_one(const struct can_bittiming_const *bittiming_cons
|
|||
bt = *ref_bt;
|
||||
|
||||
if (can_fixup_bittiming(&dev, &bt, bittiming_const)) {
|
||||
printf("%7d ***parameters exceed controller's range***\n", bitrate_nominal);
|
||||
printf("%8d ***parameters exceed controller's range***\n", bitrate_nominal);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (can_calc_bittiming(&dev, &bt, bittiming_const)) {
|
||||
printf("%7d ***bitrate not possible***\n", bitrate_nominal);
|
||||
printf("%8d ***bitrate not possible***\n", bitrate_nominal);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
@ -816,10 +829,10 @@ static void print_bittiming_one(const struct can_bittiming_const *bittiming_cons
|
|||
bitrate_error = abs(bitrate_nominal - bt.bitrate);
|
||||
sample_point_error = abs(sample_point_nominal - bt.sample_point);
|
||||
|
||||
printf("%7d " /* Bitrate */
|
||||
printf("%8d " /* Bitrate */
|
||||
"%6d %3d %4d %4d " /* TQ[ns], PrS, PhS1, PhS2 */
|
||||
"%3d %3d " /* SJW, BRP */
|
||||
"%7d ", /* real Bitrate */
|
||||
"%8d ", /* real Bitrate */
|
||||
bitrate_nominal,
|
||||
bt.tq, bt.prop_seg, bt.phase_seg1, bt.phase_seg2,
|
||||
bt.sjw, bt.brp,
|
||||
|
|
@ -828,7 +841,7 @@ static void print_bittiming_one(const struct can_bittiming_const *bittiming_cons
|
|||
if (100.0 * bitrate_error / bitrate_nominal > 99.9)
|
||||
printf("≥100%% ");
|
||||
else
|
||||
printf("%4.1f%% ",
|
||||
printf("%4.1f%% ", /* Bitrate Error */
|
||||
100.0 * bitrate_error / bitrate_nominal);
|
||||
|
||||
printf("%4.1f%% %4.1f%% ", /* nom Sample Point, real Sample Point */
|
||||
|
|
@ -906,7 +919,9 @@ static void do_calc(struct calc_data *data)
|
|||
|
||||
btc = &can_calc_consts[i];
|
||||
|
||||
if (data->name && strcmp(data->name, btc->bittiming_const.name))
|
||||
if (data->name &&
|
||||
strcmp(data->name, btc->bittiming_const.name) &&
|
||||
strcmp(data->name, btc->data_bittiming_const.name))
|
||||
continue;
|
||||
|
||||
found = true;
|
||||
|
|
@ -927,6 +942,27 @@ static void do_calc(struct calc_data *data)
|
|||
|
||||
print_bittiming(data);
|
||||
}
|
||||
|
||||
if (btc->data_bittiming_const.name[0]) {
|
||||
data->bittiming_const = &btc->data_bittiming_const;
|
||||
|
||||
if (btc->printf_data_btr)
|
||||
data->printf_btr = btc->printf_data_btr;
|
||||
else
|
||||
data->printf_btr = btc->printf_btr;
|
||||
|
||||
if (data->opt_ref_clk)
|
||||
data->ref_clks = data->opt_ref_clk;
|
||||
else
|
||||
data->ref_clks = btc->ref_clk;
|
||||
|
||||
if (data->opt_bitrates)
|
||||
data->bitrates = data->opt_bitrates;
|
||||
else
|
||||
data->bitrates = common_data_bitrates;
|
||||
|
||||
print_bittiming(data);
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue