When testing or improving the bit timing algorithm, you're probably
interested in the values of all can controllers. Further you might not
know the all reference clocks of the controllers.
This patch add a "ref_clock" member to the "struct can_bittiming_const"
that holds the reference clock of the controller in Hz.
By default now the bit timing is calculated for all known can
controllers with the default ref_clock defined in "can_bittiming_const".
It's still possible to overwrite the ref clock with the command line
option "-c".
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
git-svn-id: svn://svn.berlios.de//socketcan/trunk@1188
030b6a49-0b11-0410-94ab-
b0dab22257f2
__u32 brp_inc;
/* added for can-calc-bit-timing utility */
__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);
};
void (*printf_btr)(struct can_bittiming *bt, int hdr);
};
"\t-c <clock> : real CAN system clock in Hz\n",
cmd);
"\t-c <clock> : real CAN system clock in Hz\n",
cmd);
}
static void printf_btr_sja1000(struct can_bittiming *bt, int hdr)
}
static void printf_btr_sja1000(struct can_bittiming *bt, int hdr)
.brp_max = 64,
.brp_inc = 1,
.brp_max = 64,
.brp_inc = 1,
.printf_btr = printf_btr_sja1000,
},
{
.printf_btr = printf_btr_sja1000,
},
{
.brp_max = 64,
.brp_inc = 1,
.brp_max = 64,
.brp_inc = 1,
.printf_btr = printf_btr_sja1000,
},
{
.printf_btr = printf_btr_sja1000,
},
{
.brp_max = 128,
.brp_inc = 1,
.brp_max = 128,
.brp_inc = 1,
.printf_btr = printf_btr_at91,
},
{
.printf_btr = printf_btr_at91,
},
{
.brp_max = 64,
.brp_inc = 1,
.brp_max = 64,
.brp_inc = 1,
.printf_btr = printf_btr_mcp251x,
},
{
.printf_btr = printf_btr_mcp251x,
},
{
.brp_max = 256,
.brp_inc = 1,
.brp_max = 256,
.brp_inc = 1,
.printf_btr = printf_btr_rtcantl1,
},
};
.printf_btr = printf_btr_rtcantl1,
},
};
+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[])
{
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 sampl_pt = 0;
int quiet = 0;
int list = 0;
char *name = NULL;
+ unsigned int i, j;
+ int opt, found = 0;
const struct can_bittiming_const *btc = NULL;
const struct can_bittiming_const *btc = NULL;
- ref_clk = atoi(optarg);
+ opt_ref_clk = atoi(optarg);
name = argv[optind];
if (list) {
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 (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);