@@ -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+
227296static 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
741810SHELL_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