@@ -1657,6 +1657,81 @@ static int cmd_i3c_ccc_setvendor_bc(const struct shell *shell_ctx, size_t argc,
1657
1657
return ret ;
1658
1658
}
1659
1659
1660
+ /* i3c ccc getmxds <device> <target> [<defining byte>] */
1661
+ static int cmd_i3c_ccc_getmxds (const struct shell * shell_ctx , size_t argc , char * * argv )
1662
+ {
1663
+ const struct device * dev , * tdev ;
1664
+ struct i3c_device_desc * desc ;
1665
+ union i3c_ccc_getmxds mxds ;
1666
+ enum i3c_ccc_getmxds_fmt fmt ;
1667
+ enum i3c_ccc_getmxds_defbyte defbyte = GETMXDS_FORMAT_3_INVALID ;
1668
+ int ret ;
1669
+
1670
+ dev = device_get_binding (argv [ARGV_DEV ]);
1671
+ if (!dev ) {
1672
+ shell_error (shell_ctx , "I3C: Device driver %s not found." , argv [ARGV_DEV ]);
1673
+ return - ENODEV ;
1674
+ }
1675
+ tdev = device_get_binding (argv [ARGV_TDEV ]);
1676
+ if (!tdev ) {
1677
+ shell_error (shell_ctx , "I3C: Device driver %s not found." , argv [ARGV_TDEV ]);
1678
+ return - ENODEV ;
1679
+ }
1680
+ desc = get_i3c_attached_desc_from_dev_name (dev , tdev -> name );
1681
+ if (!desc ) {
1682
+ shell_error (shell_ctx , "I3C: Device %s not attached to bus." , tdev -> name );
1683
+ return - ENODEV ;
1684
+ }
1685
+
1686
+ if (!(desc -> bcr & I3C_BCR_MAX_DATA_SPEED_LIMIT )) {
1687
+ shell_error (shell_ctx , "I3C: Device %s does not support max data speed limit" ,
1688
+ desc -> dev -> name );
1689
+ return - ENOTSUP ;
1690
+ }
1691
+
1692
+ /* If there is a defining byte, then it is assumed to be Format 3 */
1693
+ if (argc > 3 ) {
1694
+ fmt = GETMXDS_FORMAT_3 ;
1695
+ defbyte = strtol (argv [3 ], NULL , 16 );
1696
+ if (defbyte != GETMXDS_FORMAT_3_CRHDLY || defbyte != GETMXDS_FORMAT_3_WRRDTURN ) {
1697
+ shell_error (shell_ctx , "Invalid defining byte." );
1698
+ return - EINVAL ;
1699
+ }
1700
+ } else {
1701
+ fmt = GETMXDS_FORMAT_2 ;
1702
+ }
1703
+
1704
+ ret = i3c_ccc_do_getmxds (desc , & mxds , fmt , defbyte );
1705
+ if (ret < 0 ) {
1706
+ shell_error (shell_ctx , "I3C: unable to send CCC GETMXDS." );
1707
+ return ret ;
1708
+ }
1709
+
1710
+ if (fmt == GETMXDS_FORMAT_3 ) {
1711
+ if (defbyte == GETMXDS_FORMAT_3_WRRDTURN ) {
1712
+ shell_print (shell_ctx ,
1713
+ "WRRDTURN: maxwr 0x%02x; maxrd 0x%02x; maxrdturn 0x%06x" ,
1714
+ mxds .fmt3 .wrrdturn [0 ], mxds .fmt3 .wrrdturn [1 ],
1715
+ sys_get_le24 (& mxds .fmt3 .wrrdturn [2 ]));
1716
+ /* Update values in descriptor */
1717
+ desc -> maxwr = mxds .fmt3 .wrrdturn [0 ];
1718
+ desc -> maxrd = mxds .fmt3 .wrrdturn [1 ];
1719
+ desc -> max_read_turnaround = sys_get_le24 (& mxds .fmt3 .wrrdturn [2 ]);
1720
+ } else if (defbyte == GETMXDS_FORMAT_3_CRHDLY ) {
1721
+ shell_print (shell_ctx , "CRHDLY1: 0x%02x" , mxds .fmt3 .crhdly1 );
1722
+ }
1723
+ } else {
1724
+ shell_print (shell_ctx , "GETMXDS: maxwr 0x%02x; maxrd 0x%02x; maxrdturn 0x%06x" ,
1725
+ mxds .fmt2 .maxwr , mxds .fmt2 .maxrd , sys_get_le24 (mxds .fmt2 .maxrdturn ));
1726
+ /* Update values in descriptor */
1727
+ desc -> maxwr = mxds .fmt2 .maxwr ;
1728
+ desc -> maxrd = mxds .fmt2 .maxrd ;
1729
+ desc -> max_read_turnaround = sys_get_le24 (mxds .fmt2 .maxrdturn );
1730
+ }
1731
+
1732
+ return ret ;
1733
+ }
1734
+
1660
1735
static int cmd_i3c_attach (const struct shell * shell_ctx , size_t argc , char * * argv )
1661
1736
{
1662
1737
const struct device * dev , * tdev ;
@@ -2075,6 +2150,10 @@ SHELL_STATIC_SUBCMD_SET_CREATE(
2075
2150
"Send CCC GETCAPS\n"
2076
2151
"Usage: ccc getcaps <device> <target> [<defining byte>]" ,
2077
2152
cmd_i3c_ccc_getcaps , 3 , 1 ),
2153
+ SHELL_CMD_ARG (getmxds , & dsub_i3c_device_attached_name ,
2154
+ "Send CCC GETMXDS\n"
2155
+ "Usage: ccc getmxds <device> <target> [<defining byte>]" ,
2156
+ cmd_i3c_ccc_getmxds , 3 , 1 ),
2078
2157
SHELL_CMD_ARG (getvendor , & dsub_i3c_device_attached_name ,
2079
2158
"Send CCC GETVENDOR\n"
2080
2159
"Usage: ccc getvendor <device> <target> <id> [<defining byte>]" ,
0 commit comments