Skip to content

Commit b0c1b97

Browse files
henrikbrixandersencarlescufi
authored andcommitted
drivers: can: shell: add command for showing CAN controller information
Add a "can show <device>" command for showing information about a CAN controller. Signed-off-by: Henrik Brix Andersen <[email protected]>
1 parent 720eeab commit b0c1b97

File tree

1 file changed

+73
-0
lines changed

1 file changed

+73
-0
lines changed

drivers/can/can_shell.c

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,75 @@ static void can_shell_print_capabilities(const struct shell *sh, can_mode_t cap)
224224
}
225225
}
226226

227+
static int cmd_can_show(const struct shell *sh, size_t argc, char **argv)
228+
{
229+
const struct device *dev = device_get_binding(argv[1]);
230+
struct can_bus_err_cnt err_cnt;
231+
enum can_state state;
232+
uint32_t max_bitrate = 0;
233+
int max_std_filters = 0;
234+
int max_ext_filters = 0;
235+
uint32_t core_clock;
236+
can_mode_t cap;
237+
int err;
238+
239+
if (!device_is_ready(dev)) {
240+
shell_error(sh, "device %s not ready", argv[1]);
241+
return -ENODEV;
242+
}
243+
244+
err = can_get_core_clock(dev, &core_clock);
245+
if (err != 0) {
246+
shell_error(sh, "failed to get CAN core clock (err %d)", err);
247+
return err;
248+
}
249+
250+
err = can_get_max_bitrate(dev, &max_bitrate);
251+
if (err != 0 && err != -ENOSYS) {
252+
shell_error(sh, "failed to get maximum bitrate (err %d)", err);
253+
return err;
254+
}
255+
256+
max_std_filters = can_get_max_filters(dev, CAN_STANDARD_IDENTIFIER);
257+
if (max_std_filters < 0 && max_std_filters != -ENOSYS) {
258+
shell_error(sh, "failed to get maximum standard (11-bit) filters (err %d)", err);
259+
return err;
260+
}
261+
262+
max_ext_filters = can_get_max_filters(dev, CAN_EXTENDED_IDENTIFIER);
263+
if (max_ext_filters < 0 && max_ext_filters != -ENOSYS) {
264+
shell_error(sh, "failed to get maximum extended (29-bit) filters (err %d)", err);
265+
return err;
266+
}
267+
268+
err = can_get_capabilities(dev, &cap);
269+
if (err != 0) {
270+
shell_error(sh, "failed to get CAN controller capabilities (err %d)", err);
271+
return err;
272+
}
273+
274+
err = can_get_state(dev, &state, &err_cnt);
275+
if (err != 0) {
276+
shell_error(sh, "failed to get CAN controller state (%d)", err);
277+
return err;
278+
}
279+
280+
shell_print(sh, "core clock: %d Hz", core_clock);
281+
shell_print(sh, "max bitrate: %d bps", max_bitrate);
282+
shell_print(sh, "max std filters: %d", max_std_filters);
283+
shell_print(sh, "max ext filters: %d", max_ext_filters);
284+
285+
shell_fprintf(sh, SHELL_NORMAL, "capabilities: normal ");
286+
can_shell_print_capabilities(sh, cap);
287+
shell_fprintf(sh, SHELL_NORMAL, "\n");
288+
289+
shell_print(sh, "state: %s", can_shell_state_to_string(state));
290+
shell_print(sh, "rx errors: %d", err_cnt.rx_err_cnt);
291+
shell_print(sh, "tx errors: %d", err_cnt.tx_err_cnt);
292+
293+
return 0;
294+
}
295+
227296
static int cmd_can_bitrate_set(const struct shell *sh, size_t argc, char **argv)
228297
{
229298
const struct device *dev = device_get_binding(argv[1]);
@@ -739,6 +808,10 @@ SHELL_STATIC_SUBCMD_SET_CREATE(sub_can_filter_cmds,
739808
);
740809

741810
SHELL_STATIC_SUBCMD_SET_CREATE(sub_can_cmds,
811+
SHELL_CMD_ARG(show, &dsub_can_device_name,
812+
"Show CAN controller information\n"
813+
"Usage: can show <device>",
814+
cmd_can_show, 2, 0),
742815
SHELL_CMD_ARG(bitrate, &dsub_can_device_name,
743816
"Set CAN controller bitrate and optional sample point\n"
744817
"Usage: can bitrate <device> <bitrate> [sample point]",

0 commit comments

Comments
 (0)