15
15
#include <zephyr/logging/log.h>
16
16
LOG_MODULE_REGISTER (mdio_shell , CONFIG_LOG_DEFAULT_LEVEL );
17
17
18
- #if DT_HAS_COMPAT_STATUS_OKAY (atmel_sam_mdio )
19
- #define DT_DRV_COMPAT atmel_sam_mdio
20
- #elif DT_HAS_COMPAT_STATUS_OKAY (espressif_esp32_mdio )
21
- #define DT_DRV_COMPAT espressif_esp32_mdio
22
- #elif DT_HAS_COMPAT_STATUS_OKAY (nxp_imx_netc_emdio )
23
- #define DT_DRV_COMPAT nxp_imx_netc_emdio
24
- #elif DT_HAS_COMPAT_STATUS_OKAY (nxp_s32_netc_emdio )
25
- #define DT_DRV_COMPAT nxp_s32_netc_emdio
26
- #elif DT_HAS_COMPAT_STATUS_OKAY (nxp_s32_gmac_mdio )
27
- #define DT_DRV_COMPAT nxp_s32_gmac_mdio
28
- #elif DT_HAS_COMPAT_STATUS_OKAY (adi_adin2111_mdio )
29
- #define DT_DRV_COMPAT adi_adin2111_mdio
30
- #elif DT_HAS_COMPAT_STATUS_OKAY (smsc_lan91c111_mdio )
31
- #define DT_DRV_COMPAT smsc_lan91c111_mdio
32
- #elif DT_HAS_COMPAT_STATUS_OKAY (zephyr_mdio_gpio )
33
- #define DT_DRV_COMPAT zephyr_mdio_gpio
34
- #elif DT_HAS_COMPAT_STATUS_OKAY (nxp_enet_mdio )
35
- #define DT_DRV_COMPAT nxp_enet_mdio
36
- #elif DT_HAS_COMPAT_STATUS_OKAY (infineon_xmc4xxx_mdio )
37
- #define DT_DRV_COMPAT infineon_xmc4xxx_mdio
38
- #elif DT_HAS_COMPAT_STATUS_OKAY (nxp_enet_qos_mdio )
39
- #define DT_DRV_COMPAT nxp_enet_qos_mdio
40
- #elif DT_HAS_COMPAT_STATUS_OKAY (litex_liteeth_mdio )
41
- #define DT_DRV_COMPAT litex_liteeth_mdio
42
- #elif DT_HAS_COMPAT_STATUS_OKAY (st_stm32_mdio )
43
- #define DT_DRV_COMPAT st_stm32_mdio
44
- #elif DT_HAS_COMPAT_STATUS_OKAY (snps_dwcxgmac_mdio )
45
- #define DT_DRV_COMPAT snps_dwcxgmac_mdio
46
- #elif DT_HAS_COMPAT_STATUS_OKAY (sensry_sy1xx_mdio )
47
- #define DT_DRV_COMPAT sensry_sy1xx_mdio
48
- #elif DT_HAS_COMPAT_STATUS_OKAY (xlnx_axi_ethernet_1_00_a_mdio )
49
- #define DT_DRV_COMPAT xlnx_axi_ethernet_1_00_a_mdio
50
- #else
51
- #error "No known devicetree compatible match for MDIO shell"
52
- #endif
53
-
54
- #define MDIO_NODE_ID DT_COMPAT_GET_ANY_STATUS_OKAY(DT_DRV_COMPAT)
18
+ static bool device_is_mdio (const struct device * dev )
19
+ {
20
+ return DEVICE_API_IS (mdio , dev );
21
+ }
22
+
23
+ static void device_name_get (size_t idx , struct shell_static_entry * entry )
24
+ {
25
+ const struct device * dev = shell_device_filter (idx , device_is_mdio );
26
+
27
+ entry -> syntax = (dev != NULL ) ? dev -> name : NULL ;
28
+ entry -> handler = NULL ;
29
+ entry -> help = NULL ;
30
+ entry -> subcmd = NULL ;
31
+ }
32
+
33
+ SHELL_DYNAMIC_CMD_CREATE (dsub_device_name , device_name_get );
34
+
35
+ static int parse_device_arg (const struct shell * sh , char * * argv , const struct device * * dev )
36
+ {
37
+ * dev = shell_device_get_binding (argv [1 ]);
38
+ if (!* dev ) {
39
+ shell_error (sh , "device %s not found" , argv [1 ]);
40
+ return - ENODEV ;
41
+ }
42
+ return 0 ;
43
+ }
55
44
56
45
/*
57
46
* Scan the entire 5-bit address space of the MDIO bus
58
47
*
59
- * scan [<reg_addr>]
48
+ * scan <device> [<reg_addr>]
60
49
*/
61
50
static int cmd_mdio_scan (const struct shell * sh , size_t argc , char * * argv )
62
51
{
63
52
const struct device * dev ;
64
53
int cnt ;
65
54
uint16_t data ;
66
55
uint16_t reg_addr ;
56
+ int ret ;
67
57
68
- dev = DEVICE_DT_GET (MDIO_NODE_ID );
69
- if (!device_is_ready (dev )) {
70
- shell_error (sh , "MDIO: Device driver %s is not ready." , dev -> name );
71
-
72
- return - ENODEV ;
58
+ ret = parse_device_arg (sh , argv , & dev );
59
+ if (ret < 0 ) {
60
+ return ret ;
73
61
}
74
62
75
63
if (argc >= 2 ) {
76
- reg_addr = strtol (argv [1 ], NULL , 16 );
64
+ reg_addr = strtol (argv [2 ], NULL , 16 );
77
65
} else {
78
66
reg_addr = 0 ;
79
67
}
@@ -101,24 +89,23 @@ static int cmd_mdio_scan(const struct shell *sh, size_t argc, char **argv)
101
89
return 0 ;
102
90
}
103
91
104
- /* mdio write <port_addr> <reg_addr> <data> */
92
+ /* mdio write <device> < port_addr> <reg_addr> <data> */
105
93
static int cmd_mdio_write (const struct shell * sh , size_t argc , char * * argv )
106
94
{
107
95
const struct device * dev ;
108
96
uint16_t data ;
109
97
uint16_t reg_addr ;
110
98
uint16_t port_addr ;
99
+ int ret ;
111
100
112
- dev = DEVICE_DT_GET (MDIO_NODE_ID );
113
- if (!device_is_ready (dev )) {
114
- shell_error (sh , "MDIO: Device driver %s is not ready." , dev -> name );
115
-
116
- return - ENODEV ;
101
+ ret = parse_device_arg (sh , argv , & dev );
102
+ if (ret < 0 ) {
103
+ return ret ;
117
104
}
118
105
119
- port_addr = strtol (argv [1 ], NULL , 16 );
120
- reg_addr = strtol (argv [2 ], NULL , 16 );
121
- data = strtol (argv [3 ], NULL , 16 );
106
+ port_addr = strtol (argv [2 ], NULL , 16 );
107
+ reg_addr = strtol (argv [3 ], NULL , 16 );
108
+ data = strtol (argv [4 ], NULL , 16 );
122
109
123
110
mdio_bus_enable (dev );
124
111
@@ -134,23 +121,22 @@ static int cmd_mdio_write(const struct shell *sh, size_t argc, char **argv)
134
121
return 0 ;
135
122
}
136
123
137
- /* mdio read <port_addr> <reg_addr> */
124
+ /* mdio read <device> < port_addr> <reg_addr> */
138
125
static int cmd_mdio_read (const struct shell * sh , size_t argc , char * * argv )
139
126
{
140
127
const struct device * dev ;
141
128
uint16_t data ;
142
129
uint16_t reg_addr ;
143
130
uint16_t port_addr ;
131
+ int ret ;
144
132
145
- dev = DEVICE_DT_GET (MDIO_NODE_ID );
146
- if (!device_is_ready (dev )) {
147
- shell_error (sh , "MDIO: Device driver %s is not ready." , dev -> name );
148
-
149
- return - ENODEV ;
133
+ ret = parse_device_arg (sh , argv , & dev );
134
+ if (ret < 0 ) {
135
+ return ret ;
150
136
}
151
137
152
- port_addr = strtol (argv [1 ], NULL , 16 );
153
- reg_addr = strtol (argv [2 ], NULL , 16 );
138
+ port_addr = strtol (argv [2 ], NULL , 16 );
139
+ reg_addr = strtol (argv [3 ], NULL , 16 );
154
140
155
141
mdio_bus_enable (dev );
156
142
@@ -168,26 +154,25 @@ static int cmd_mdio_read(const struct shell *sh, size_t argc, char **argv)
168
154
return 0 ;
169
155
}
170
156
171
- /* mdio write_c45 <port_addr> <dev_addr> <reg_addr> <value> */
157
+ /* mdio write_c45 <device> < port_addr> <dev_addr> <reg_addr> <value> */
172
158
static int cmd_mdio_write_45 (const struct shell * sh , size_t argc , char * * argv )
173
159
{
174
160
const struct device * dev ;
175
161
uint16_t data ;
176
162
uint16_t reg_addr ;
177
163
uint8_t dev_addr ;
178
164
uint8_t port_addr ;
165
+ int ret ;
179
166
180
- dev = DEVICE_DT_GET (MDIO_NODE_ID );
181
- if (!device_is_ready (dev )) {
182
- shell_error (sh , "MDIO: Device driver %s is not ready." , dev -> name );
183
-
184
- return - ENODEV ;
167
+ ret = parse_device_arg (sh , argv , & dev );
168
+ if (ret < 0 ) {
169
+ return ret ;
185
170
}
186
171
187
- port_addr = strtol (argv [1 ], NULL , 16 );
188
- dev_addr = strtol (argv [2 ], NULL , 16 );
189
- reg_addr = strtol (argv [3 ], NULL , 16 );
190
- data = strtol (argv [4 ], NULL , 16 );
172
+ port_addr = strtol (argv [2 ], NULL , 16 );
173
+ dev_addr = strtol (argv [3 ], NULL , 16 );
174
+ reg_addr = strtol (argv [4 ], NULL , 16 );
175
+ data = strtol (argv [5 ], NULL , 16 );
191
176
192
177
mdio_bus_enable (dev );
193
178
@@ -203,25 +188,24 @@ static int cmd_mdio_write_45(const struct shell *sh, size_t argc, char **argv)
203
188
return 0 ;
204
189
}
205
190
206
- /* mdio read_c45 <port_addr> <dev_addr> <reg_addr> */
191
+ /* mdio read_c45 <device> < port_addr> <dev_addr> <reg_addr> */
207
192
static int cmd_mdio_read_c45 (const struct shell * sh , size_t argc , char * * argv )
208
193
{
209
194
const struct device * dev ;
210
195
uint16_t data ;
211
196
uint16_t reg_addr ;
212
197
uint8_t dev_addr ;
213
198
uint8_t port_addr ;
199
+ int ret ;
214
200
215
- dev = DEVICE_DT_GET (MDIO_NODE_ID );
216
- if (!device_is_ready (dev )) {
217
- shell_error (sh , "MDIO: Device driver %s is not ready." , dev -> name );
218
-
219
- return - ENODEV ;
201
+ ret = parse_device_arg (sh , argv , & dev );
202
+ if (ret < 0 ) {
203
+ return ret ;
220
204
}
221
205
222
- port_addr = strtol (argv [1 ], NULL , 16 );
223
- dev_addr = strtol (argv [2 ], NULL , 16 );
224
- reg_addr = strtol (argv [3 ], NULL , 16 );
206
+ port_addr = strtol (argv [2 ], NULL , 16 );
207
+ dev_addr = strtol (argv [3 ], NULL , 16 );
208
+ reg_addr = strtol (argv [4 ], NULL , 16 );
225
209
226
210
mdio_bus_enable (dev );
227
211
@@ -240,23 +224,23 @@ static int cmd_mdio_read_c45(const struct shell *sh, size_t argc, char **argv)
240
224
}
241
225
242
226
SHELL_STATIC_SUBCMD_SET_CREATE (sub_mdio_cmds ,
243
- SHELL_CMD_ARG (scan , NULL ,
244
- "Scan MDIO bus for devices: scan [<reg_addr>]" ,
245
- cmd_mdio_scan , 0 , 1 ),
246
- SHELL_CMD_ARG (read , NULL ,
247
- "Read from MDIO device: read <phy_addr> <reg_addr>" ,
248
- cmd_mdio_read , 3 , 0 ),
249
- SHELL_CMD_ARG (write , NULL ,
250
- "Write to MDIO device: write <phy_addr> <reg_addr> <value>" ,
251
- cmd_mdio_write , 4 , 0 ),
252
- SHELL_CMD_ARG (read_c45 , NULL ,
227
+ SHELL_CMD_ARG (scan , & dsub_device_name ,
228
+ "Scan MDIO bus for devices: scan <device> [<reg_addr>]" ,
229
+ cmd_mdio_scan , 1 , 1 ),
230
+ SHELL_CMD_ARG (read , & dsub_device_name ,
231
+ "Read from MDIO device: read <device> < phy_addr> <reg_addr>" ,
232
+ cmd_mdio_read , 4 , 0 ),
233
+ SHELL_CMD_ARG (write , & dsub_device_name ,
234
+ "Write to MDIO device: write <device> < phy_addr> <reg_addr> <value>" ,
235
+ cmd_mdio_write , 5 , 0 ),
236
+ SHELL_CMD_ARG (read_c45 , & dsub_device_name ,
253
237
"Read from MDIO Clause 45 device: "
254
- "read_c45 <port_addr> <dev_addr> <reg_addr>" ,
255
- cmd_mdio_read_c45 , 4 , 0 ),
256
- SHELL_CMD_ARG (write_c45 , NULL ,
238
+ "read_c45 <device> < port_addr> <dev_addr> <reg_addr>" ,
239
+ cmd_mdio_read_c45 , 5 , 0 ),
240
+ SHELL_CMD_ARG (write_c45 , & dsub_device_name ,
257
241
"Write to MDIO Clause 45 device: "
258
- "write_c45 <port_addr> <dev_addr> <reg_addr> <value>" ,
259
- cmd_mdio_write_45 , 5 , 0 ),
242
+ "write_c45 <device> < port_addr> <dev_addr> <reg_addr> <value>" ,
243
+ cmd_mdio_write_45 , 6 , 0 ),
260
244
SHELL_SUBCMD_SET_END /* Array terminated. */
261
245
);
262
246
0 commit comments