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 {
|
struct calc_bittiming_const {
|
||||||
const struct can_bittiming_const 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 struct calc_ref_clk ref_clk[16];
|
||||||
|
|
||||||
const void (*printf_btr)(struct can_bittiming *bt, bool hdr);
|
const void (*printf_btr)(struct can_bittiming *bt, bool hdr);
|
||||||
|
const void (*printf_data_btr)(struct can_bittiming *bt, bool hdr);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct calc_data {
|
struct calc_data {
|
||||||
|
|
@ -554,6 +556,17 @@ static const unsigned int common_bitrates[] = {
|
||||||
0
|
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_MAX_ERROR 50 /* in one-tenth of a percent */
|
||||||
#define CAN_CALC_SYNC_SEG 1
|
#define CAN_CALC_SYNC_SEG 1
|
||||||
|
|
||||||
|
|
@ -787,8 +800,8 @@ static void print_bittiming_one(const struct can_bittiming_const *bittiming_cons
|
||||||
|
|
||||||
if (!quiet) {
|
if (!quiet) {
|
||||||
printf("Bit timing parameters for %s%s%s%s with %.6f MHz ref clock\n"
|
printf("Bit timing parameters for %s%s%s%s with %.6f MHz ref clock\n"
|
||||||
"nominal real Bitrt nom real SampP\n"
|
" nominal real Bitrt nom real SampP\n"
|
||||||
"Bitrate TQ[ns] PrS PhS1 PhS2 SJW BRP Bitrate Error SampP SampP Error ",
|
" Bitrate TQ[ns] PrS PhS1 PhS2 SJW BRP Bitrate Error SampP SampP Error ",
|
||||||
bittiming_const->name,
|
bittiming_const->name,
|
||||||
ref_clk->name ? " (" : "",
|
ref_clk->name ? " (" : "",
|
||||||
ref_clk->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;
|
bt = *ref_bt;
|
||||||
|
|
||||||
if (can_fixup_bittiming(&dev, &bt, bittiming_const)) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (can_calc_bittiming(&dev, &bt, bittiming_const)) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -816,10 +829,10 @@ static void print_bittiming_one(const struct can_bittiming_const *bittiming_cons
|
||||||
bitrate_error = abs(bitrate_nominal - bt.bitrate);
|
bitrate_error = abs(bitrate_nominal - bt.bitrate);
|
||||||
sample_point_error = abs(sample_point_nominal - bt.sample_point);
|
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 */
|
"%6d %3d %4d %4d " /* TQ[ns], PrS, PhS1, PhS2 */
|
||||||
"%3d %3d " /* SJW, BRP */
|
"%3d %3d " /* SJW, BRP */
|
||||||
"%7d ", /* real Bitrate */
|
"%8d ", /* real Bitrate */
|
||||||
bitrate_nominal,
|
bitrate_nominal,
|
||||||
bt.tq, bt.prop_seg, bt.phase_seg1, bt.phase_seg2,
|
bt.tq, bt.prop_seg, bt.phase_seg1, bt.phase_seg2,
|
||||||
bt.sjw, bt.brp,
|
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)
|
if (100.0 * bitrate_error / bitrate_nominal > 99.9)
|
||||||
printf("≥100%% ");
|
printf("≥100%% ");
|
||||||
else
|
else
|
||||||
printf("%4.1f%% ",
|
printf("%4.1f%% ", /* Bitrate Error */
|
||||||
100.0 * bitrate_error / bitrate_nominal);
|
100.0 * bitrate_error / bitrate_nominal);
|
||||||
|
|
||||||
printf("%4.1f%% %4.1f%% ", /* nom Sample Point, real Sample Point */
|
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];
|
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;
|
continue;
|
||||||
|
|
||||||
found = true;
|
found = true;
|
||||||
|
|
@ -927,6 +942,27 @@ static void do_calc(struct calc_data *data)
|
||||||
|
|
||||||
print_bittiming(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) {
|
if (!found) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue