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
Marc Kleine-Budde 2019-05-09 10:59:15 +02:00
parent 04123b3b36
commit 36d76ba07a
1 changed files with 48 additions and 12 deletions

View File

@ -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
@ -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) {