1
1
/*
2
- * Copyright (c) 2006-2023 , RT-Thread Development Team
2
+ * Copyright (c) 2006-2024 , RT-Thread Development Team
3
3
*
4
4
* SPDX-License-Identifier: Apache-2.0
5
5
*
10
10
11
11
#include <rtthread.h>
12
12
13
+ #ifdef RT_USING_OFW
14
+ #include <drivers/ofw_io.h>
15
+ #include <drivers/ofw_irq.h>
16
+ #endif
13
17
#include <drivers/core/dm.h>
14
18
15
19
#ifdef RT_USING_SMP
@@ -56,10 +60,10 @@ struct prefix_track
56
60
int uid ;
57
61
const char * prefix ;
58
62
};
59
- static struct rt_spinlock _prefix_nodes_lock ;
63
+ static struct rt_spinlock _prefix_nodes_lock = { 0 } ;
60
64
static rt_list_t _prefix_nodes = RT_LIST_OBJECT_INIT (_prefix_nodes );
61
65
62
- int rt_dm_set_dev_name_auto (rt_device_t dev , const char * prefix )
66
+ int rt_dm_dev_set_name_auto (rt_device_t dev , const char * prefix )
63
67
{
64
68
int uid = -1 ;
65
69
struct prefix_track * pt = RT_NULL ;
@@ -104,17 +108,17 @@ int rt_dm_set_dev_name_auto(rt_device_t dev, const char *prefix)
104
108
rt_spin_unlock (& _prefix_nodes_lock );
105
109
}
106
110
107
- return rt_dm_set_dev_name (dev , "%s%u" , prefix , uid );
111
+ return rt_dm_dev_set_name (dev , "%s%u" , prefix , uid );
108
112
}
109
113
110
- int rt_dm_get_dev_name_id (rt_device_t dev )
114
+ int rt_dm_dev_get_name_id (rt_device_t dev )
111
115
{
112
116
int id = 0 , len ;
113
117
const char * name ;
114
118
115
119
RT_ASSERT (dev != RT_NULL );
116
120
117
- name = rt_dm_get_dev_name (dev );
121
+ name = rt_dm_dev_get_name (dev );
118
122
len = rt_strlen (name ) - 1 ;
119
123
name += len ;
120
124
@@ -137,7 +141,7 @@ int rt_dm_get_dev_name_id(rt_device_t dev)
137
141
return id ;
138
142
}
139
143
140
- int rt_dm_set_dev_name (rt_device_t dev , const char * format , ...)
144
+ int rt_dm_dev_set_name (rt_device_t dev , const char * format , ...)
141
145
{
142
146
int n ;
143
147
va_list arg_ptr ;
@@ -152,9 +156,314 @@ int rt_dm_set_dev_name(rt_device_t dev, const char *format, ...)
152
156
return n ;
153
157
}
154
158
155
- const char * rt_dm_get_dev_name (rt_device_t dev )
159
+ const char * rt_dm_dev_get_name (rt_device_t dev )
156
160
{
157
161
RT_ASSERT (dev != RT_NULL );
158
162
159
163
return dev -> parent .name ;
160
164
}
165
+
166
+ #ifdef RT_USING_OFW
167
+ #define ofw_api_call (name , ...) rt_ofw_##name(__VA_ARGS__)
168
+ #define ofw_api_call_ptr (name , ...) ofw_api_call(name, __VA_ARGS__)
169
+ #else
170
+ #define ofw_api_call (name , ...) (-RT_ENOSYS)
171
+ #define ofw_api_call_ptr (name , ...) RT_NULL
172
+ #endif
173
+
174
+ int rt_dm_dev_get_address_count (rt_device_t dev )
175
+ {
176
+ RT_ASSERT (dev != RT_NULL );
177
+
178
+ #ifdef RT_USING_OFW
179
+ if (dev -> ofw_node )
180
+ {
181
+ return ofw_api_call (get_address_count , dev -> ofw_node );
182
+ }
183
+ #endif
184
+
185
+ return - RT_ENOSYS ;
186
+ }
187
+
188
+ rt_err_t rt_dm_dev_get_address (rt_device_t dev , int index ,
189
+ rt_uint64_t * out_address , rt_uint64_t * out_size )
190
+ {
191
+ RT_ASSERT (dev != RT_NULL );
192
+
193
+ #ifdef RT_USING_OFW
194
+ if (dev -> ofw_node )
195
+ {
196
+ return ofw_api_call (get_address , dev -> ofw_node , index ,
197
+ out_address , out_size );
198
+ }
199
+ #endif
200
+
201
+ return - RT_ENOSYS ;
202
+ }
203
+
204
+ rt_err_t rt_dm_dev_get_address_by_name (rt_device_t dev , const char * name ,
205
+ rt_uint64_t * out_address , rt_uint64_t * out_size )
206
+ {
207
+ RT_ASSERT (dev != RT_NULL );
208
+
209
+ #ifdef RT_USING_OFW
210
+ if (dev -> ofw_node )
211
+ {
212
+ return ofw_api_call (get_address_by_name , dev -> ofw_node , name ,
213
+ out_address , out_size );
214
+ }
215
+ #endif
216
+
217
+ return - RT_ENOSYS ;
218
+ }
219
+
220
+ int rt_dm_dev_get_address_array (rt_device_t dev , int nr , rt_uint64_t * out_regs )
221
+ {
222
+ RT_ASSERT (dev != RT_NULL );
223
+
224
+ #ifdef RT_USING_OFW
225
+ if (dev -> ofw_node )
226
+ {
227
+ return ofw_api_call (get_address_array , dev -> ofw_node , nr , out_regs );
228
+ }
229
+ #endif
230
+
231
+ return - RT_ENOSYS ;
232
+ }
233
+
234
+ void * rt_dm_dev_iomap (rt_device_t dev , int index )
235
+ {
236
+ RT_ASSERT (dev != RT_NULL );
237
+
238
+ #ifdef RT_USING_OFW
239
+ if (dev -> ofw_node )
240
+ {
241
+ return ofw_api_call_ptr (iomap , dev -> ofw_node , index );
242
+ }
243
+ #endif
244
+
245
+ return RT_NULL ;
246
+ }
247
+
248
+ void * rt_dm_dev_iomap_by_name (rt_device_t dev , const char * name )
249
+ {
250
+ RT_ASSERT (dev != RT_NULL );
251
+
252
+ #ifdef RT_USING_OFW
253
+ if (dev -> ofw_node )
254
+ {
255
+ return ofw_api_call_ptr (iomap_by_name , dev -> ofw_node , name );
256
+ }
257
+ #endif
258
+
259
+ return RT_NULL ;
260
+ }
261
+
262
+ int rt_dm_dev_get_irq_count (rt_device_t dev )
263
+ {
264
+ RT_ASSERT (dev != RT_NULL );
265
+
266
+ #ifdef RT_USING_OFW
267
+ if (dev -> ofw_node )
268
+ {
269
+ return ofw_api_call (get_irq_count , dev -> ofw_node );
270
+ }
271
+ #endif
272
+
273
+ return - RT_ENOSYS ;
274
+ }
275
+
276
+ int rt_dm_dev_get_irq (rt_device_t dev , int index )
277
+ {
278
+ RT_ASSERT (dev != RT_NULL );
279
+
280
+ #ifdef RT_USING_OFW
281
+ if (dev -> ofw_node )
282
+ {
283
+ return ofw_api_call (get_irq , dev -> ofw_node , index );
284
+ }
285
+ #endif
286
+
287
+ return - RT_ENOSYS ;
288
+ }
289
+
290
+ int rt_dm_dev_get_irq_by_name (rt_device_t dev , const char * name )
291
+ {
292
+ RT_ASSERT (dev != RT_NULL );
293
+
294
+ #ifdef RT_USING_OFW
295
+ if (dev -> ofw_node )
296
+ {
297
+ return ofw_api_call (get_irq_by_name , dev -> ofw_node , name );
298
+ }
299
+ #endif
300
+
301
+ return - RT_ENOSYS ;
302
+ }
303
+
304
+ void rt_dm_dev_bind_fwdata (rt_device_t dev , void * fw_np , void * data )
305
+ {
306
+ RT_ASSERT (dev != RT_NULL );
307
+
308
+ #ifdef RT_USING_OFW
309
+ if (!dev -> ofw_node && fw_np )
310
+ {
311
+ dev -> ofw_node = fw_np ;
312
+ rt_ofw_data (fw_np ) = data ;
313
+ }
314
+
315
+ if (dev -> ofw_node == RT_NULL )
316
+ {
317
+ rt_kprintf ("[%s:%s] line=%d ofw_node is NULL\r\n" , __FILE__ , __func__ , __LINE__ );
318
+ return ;
319
+ }
320
+
321
+ rt_ofw_data (dev -> ofw_node ) = data ;
322
+ #endif
323
+ }
324
+
325
+ void rt_dm_dev_unbind_fwdata (rt_device_t dev , void * fw_np )
326
+ {
327
+ RT_ASSERT (dev != RT_NULL );
328
+
329
+ #ifdef RT_USING_OFW
330
+ void * dev_fw_np ;
331
+
332
+ if (!dev -> ofw_node && fw_np )
333
+ {
334
+ dev_fw_np = fw_np ;
335
+ rt_ofw_data (fw_np ) = RT_NULL ;
336
+ }
337
+
338
+ if (dev_fw_np == RT_NULL )
339
+ {
340
+ rt_kprintf ("[%s:%s] line=%d dev_fw_np is NULL\r\n" , __FILE__ , __func__ , __LINE__ );
341
+ return ;
342
+ }
343
+
344
+ rt_ofw_data (dev_fw_np ) = RT_NULL ;
345
+ #endif
346
+ }
347
+
348
+ int rt_dm_dev_prop_read_u8_array_index (rt_device_t dev , const char * propname ,
349
+ int index , int nr , rt_uint8_t * out_values )
350
+ {
351
+ RT_ASSERT (dev != RT_NULL );
352
+
353
+ #ifdef RT_UISNG_OFW
354
+ if (dev -> ofw_node )
355
+ {
356
+ return ofw_api_call (prop_read_u8_array_index , dev -> ofw_node , propname ,
357
+ index , nr , out_value );
358
+ }
359
+ #endif
360
+
361
+ return - RT_ENOSYS ;
362
+ }
363
+
364
+ int rt_dm_dev_prop_read_u16_array_index (rt_device_t dev , const char * propname ,
365
+ int index , int nr , rt_uint16_t * out_values )
366
+ {
367
+ RT_ASSERT (dev != RT_NULL );
368
+
369
+ #ifdef RT_USING_OFW
370
+ if (dev -> ofw_node )
371
+ {
372
+ return ofw_api_call (prop_read_u16_array_index , dev -> ofw_node , propname ,
373
+ index , nr , out_values );
374
+ }
375
+ #endif
376
+
377
+ return - RT_ENOSYS ;
378
+ }
379
+
380
+ int rt_dm_dev_prop_read_u32_array_index (rt_device_t dev , const char * propname ,
381
+ int index , int nr , rt_uint32_t * out_values )
382
+ {
383
+ RT_ASSERT (dev != RT_NULL );
384
+
385
+ #ifdef RT_USING_OFW
386
+ if (dev -> ofw_node )
387
+ {
388
+ return ofw_api_call (prop_read_u32_array_index , dev -> ofw_node , propname ,
389
+ index , nr , out_values );
390
+ }
391
+ #endif
392
+
393
+ return - RT_ENOSYS ;
394
+ }
395
+
396
+ int rt_dm_dev_prop_read_u64_array_index (rt_device_t dev , const char * propname ,
397
+ int index , int nr , rt_uint64_t * out_values )
398
+ {
399
+ RT_ASSERT (dev != RT_NULL );
400
+
401
+ #ifdef RT_USING_OFW
402
+ if (dev -> ofw_node )
403
+ {
404
+ return ofw_api_call (prop_read_u64_array_index , dev -> ofw_node , propname ,
405
+ index , nr , out_values );
406
+ }
407
+ #endif
408
+
409
+ return - RT_ENOSYS ;
410
+ }
411
+
412
+ int rt_dm_dev_prop_read_string_array_index (rt_device_t dev , const char * propname ,
413
+ int index , int nr , const char * * out_strings )
414
+ {
415
+ RT_ASSERT (dev != RT_NULL );
416
+
417
+ #ifdef RT_USING_OFW
418
+ if (dev -> ofw_node )
419
+ {
420
+ return ofw_api_call (prop_read_string_array_index , dev -> ofw_node , propname ,
421
+ index , nr , out_strings );
422
+ }
423
+ #endif
424
+
425
+ return - RT_ENOSYS ;
426
+ }
427
+
428
+ int rt_dm_dev_prop_count_of_size (rt_device_t dev , const char * propname , int size )
429
+ {
430
+ RT_ASSERT (dev != RT_NULL );
431
+
432
+ #ifdef RT_USING_OFW
433
+ if (dev -> ofw_node )
434
+ {
435
+ return ofw_api_call (prop_count_of_size , dev -> ofw_node , propname , size );
436
+ }
437
+ #endif
438
+
439
+ return - RT_ENOSYS ;
440
+ }
441
+
442
+ int rt_dm_dev_prop_index_of_string (rt_device_t dev , const char * propname , const char * string )
443
+ {
444
+ RT_ASSERT (dev != RT_NULL );
445
+
446
+ #ifdef RT_USING_OFW
447
+ if (dev -> ofw_node )
448
+ {
449
+ return ofw_api_call (prop_index_of_string , dev -> ofw_node , propname , string );
450
+ }
451
+ #endif
452
+
453
+ return - RT_ENOSYS ;
454
+ }
455
+
456
+ rt_bool_t rt_dm_dev_prop_read_bool (rt_device_t dev , const char * propname )
457
+ {
458
+ RT_ASSERT (dev != RT_NULL );
459
+
460
+ #ifdef RT_USING_OFW
461
+ if (dev -> ofw_node )
462
+ {
463
+ return ofw_api_call (prop_read_bool , dev -> ofw_node , propname );
464
+ }
465
+ #endif
466
+
467
+ return RT_FALSE ;
468
+ }
469
+
0 commit comments