__u32 brp_inc;
/* added for can-calc-bit-timing utility */
+ __u32 ref_clk; /* CAN system clock frequency in Hz */
void (*printf_btr)(struct can_bittiming *bt, int hdr);
};
"\t-c <clock> : real CAN system clock in Hz\n",
cmd);
- exit(1);
+ exit(EXIT_FAILURE);
}
static void printf_btr_sja1000(struct can_bittiming *bt, int hdr)
.brp_max = 64,
.brp_inc = 1,
+ .ref_clk = 8000000,
.printf_btr = printf_btr_sja1000,
},
{
.brp_max = 64,
.brp_inc = 1,
+ .ref_clk = 33000000,
.printf_btr = printf_btr_sja1000,
},
{
.brp_max = 128,
.brp_inc = 1,
+ .ref_clk = 100000000,
.printf_btr = printf_btr_at91,
},
{
.brp_max = 64,
.brp_inc = 1,
+ .ref_clk = 16000000,
.printf_btr = printf_btr_mcp251x,
},
{
.brp_max = 256,
.brp_inc = 1,
+ .ref_clk = 8000000,
.printf_btr = printf_btr_rtcantl1,
},
};
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);
+}
+
int main(int argc, char *argv[])
{
- long bitrate = 0;
- long ref_clk = 8000000;
+ __u32 bitrate = 0;
+ __u32 opt_ref_clk = 0, ref_clk;
int sampl_pt = 0;
int quiet = 0;
int list = 0;
char *name = NULL;
- int i, opt;
+ unsigned int i, j;
+ int opt, found = 0;
const struct can_bittiming_const *btc = NULL;
break;
case 'c':
- ref_clk = atoi(optarg);
+ opt_ref_clk = atoi(optarg);
break;
case 'l':
name = argv[optind];
if (list) {
- for (i = 0; i < sizeof(can_calc_consts) /
- sizeof(struct can_bittiming_const); i++)
- printf("%s\n", can_calc_consts[i].name);
- return 0;
+ do_list();
+ exit(EXIT_SUCCESS);
}
if (sampl_pt && (sampl_pt >= 1000 || sampl_pt < 100))
print_usage(argv[0]);
- if (name) {
- for (i = 0; i < sizeof(can_calc_consts) /
- sizeof(struct can_bittiming_const); i++) {
- if (!strcmp(can_calc_consts[i].name, name)) {
- btc = &can_calc_consts[i];
- break;
- }
- }
- if (!btc)
- print_usage(argv[0]);
+ for (i = 0; i < ARRAY_SIZE(can_calc_consts); i++) {
+ if (name && strcmp(can_calc_consts[i].name, name))
+ continue;
- } else {
- btc = &can_calc_consts[0];
+ found = 1;
+ btc = &can_calc_consts[i];
+
+ if (opt_ref_clk)
+ ref_clk = opt_ref_clk;
+ else
+ ref_clk = btc->ref_clk;
+
+ if (bitrate) {
+ print_bit_timing(btc, bitrate, sampl_pt, ref_clk, quiet);
+ } else {
+ for (j = 0; j < ARRAY_SIZE(common_bitrates); j++)
+ print_bit_timing(btc, common_bitrates[j],
+ sampl_pt, ref_clk, j);
+ }
+ printf("\n");
}
- if (bitrate) {
- print_bit_timing(btc, bitrate, sampl_pt, ref_clk, quiet);
- } else {
- for (i = 0; i < sizeof(common_bitrates) / sizeof(long); i++)
- print_bit_timing(btc, common_bitrates[i], sampl_pt,
- ref_clk, i);
+ if (!found) {
+ printf("error: unknown CAN controller '%s', try one of these:\n\n", name);
+ do_list();
+ exit(EXIT_FAILURE);
}
- return 0;
+ exit(EXIT_SUCCESS);
}