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,305 @@ 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
+ #ifdef RT_USING_OFW
209
+ if (dev -> ofw_node )
210
+ {
211
+ return ofw_api_call (get_address_by_name , dev -> ofw_node , name ,
212
+ out_address , out_size );
213
+ }
214
+ #endif
215
+
216
+ return - RT_ENOSYS ;
217
+ }
218
+
219
+ int rt_dm_dev_get_address_array (rt_device_t dev , int nr , rt_uint64_t * out_regs )
220
+ {
221
+ RT_ASSERT (dev != RT_NULL );
222
+
223
+ #ifdef RT_USING_OFW
224
+ if (dev -> ofw_node )
225
+ {
226
+ return ofw_api_call (get_address_array , dev -> ofw_node , nr , out_regs );
227
+ }
228
+ #endif
229
+
230
+ return - RT_ENOSYS ;
231
+ }
232
+
233
+ void * rt_dm_dev_iomap (rt_device_t dev , int index )
234
+ {
235
+ RT_ASSERT (dev != RT_NULL );
236
+
237
+ #ifdef RT_USING_OFW
238
+ if (dev -> ofw_node )
239
+ {
240
+ return ofw_api_call_ptr (iomap , dev -> ofw_node , index );
241
+ }
242
+ #endif
243
+
244
+ return RT_NULL ;
245
+ }
246
+
247
+ void * rt_dm_dev_iomap_by_name (rt_device_t dev , const char * name )
248
+ {
249
+ RT_ASSERT (dev != RT_NULL );
250
+
251
+ #ifdef RT_USING_OFW
252
+ if (dev -> ofw_node )
253
+ {
254
+ return ofw_api_call_ptr (iomap_by_name , dev -> ofw_node , name );
255
+ }
256
+ #endif
257
+
258
+ return RT_NULL ;
259
+ }
260
+
261
+ int rt_dm_dev_get_irq_count (rt_device_t dev )
262
+ {
263
+ RT_ASSERT (dev != RT_NULL );
264
+
265
+ #ifdef RT_USING_OFW
266
+ if (dev -> ofw_node )
267
+ {
268
+ return ofw_api_call (get_irq_count , dev -> ofw_node );
269
+ }
270
+ #endif
271
+
272
+ return - RT_ENOSYS ;
273
+ }
274
+
275
+ int rt_dm_dev_get_irq (rt_device_t dev , int index )
276
+ {
277
+ RT_ASSERT (dev != RT_NULL );
278
+
279
+ #ifdef RT_USING_OFW
280
+ if (dev -> ofw_node )
281
+ {
282
+ return ofw_api_call (get_irq , dev -> ofw_node , index );
283
+ }
284
+ #endif
285
+
286
+ return - RT_ENOSYS ;
287
+ }
288
+
289
+ int rt_dm_dev_get_irq_by_name (rt_device_t dev , const char * name )
290
+ {
291
+ RT_ASSERT (dev != RT_NULL );
292
+
293
+ #ifdef RT_USING_OFW
294
+ if (dev -> ofw_node )
295
+ {
296
+ return ofw_api_call (get_irq_by_name , dev -> ofw_node , name );
297
+ }
298
+ #endif
299
+
300
+ return - RT_ENOSYS ;
301
+ }
302
+
303
+ void rt_dm_dev_bind_fwdata (rt_device_t dev , void * fw_np , void * data )
304
+ {
305
+ RT_ASSERT (dev != RT_NULL );
306
+
307
+ #ifdef RT_USING_OFW
308
+ if (!dev -> ofw_node && fw_np )
309
+ {
310
+ dev -> ofw_node = fw_np ;
311
+ rt_ofw_data (fw_np ) = data ;
312
+ }
313
+
314
+ RT_ASSERT (dev -> ofw_node != RT_NULL );
315
+
316
+ rt_ofw_data (dev -> ofw_node ) = data ;
317
+ #endif
318
+ }
319
+
320
+ void rt_dm_dev_unbind_fwdata (rt_device_t dev , void * fw_np )
321
+ {
322
+ RT_ASSERT (dev != RT_NULL );
323
+
324
+ #ifdef RT_USING_OFW
325
+ void * dev_fw_np ;
326
+
327
+ if (!dev -> ofw_node && fw_np )
328
+ {
329
+ dev_fw_np = fw_np ;
330
+ rt_ofw_data (fw_np ) = RT_NULL ;
331
+ }
332
+
333
+ RT_ASSERT (dev_fw_np != RT_NULL );
334
+
335
+ rt_ofw_data (dev_fw_np ) = RT_NULL ;
336
+ #endif
337
+ }
338
+
339
+ int rt_dm_dev_prop_read_u8_array_index (rt_device_t dev , const char * propname ,
340
+ int index , int nr , rt_uint8_t * out_values )
341
+ {
342
+ RT_ASSERT (dev != RT_NULL );
343
+
344
+ #ifdef RT_UISNG_OFW
345
+ if (dev -> ofw_node )
346
+ {
347
+ return ofw_api_call (prop_read_u8_array_index , dev -> ofw_node , propname ,
348
+ index , nr , out_value );
349
+ }
350
+ #endif
351
+
352
+ return - RT_ENOSYS ;
353
+ }
354
+
355
+ int rt_dm_dev_prop_read_u16_array_index (rt_device_t dev , const char * propname ,
356
+ int index , int nr , rt_uint16_t * out_values )
357
+ {
358
+ RT_ASSERT (dev != RT_NULL );
359
+
360
+ #ifdef RT_USING_OFW
361
+ if (dev -> ofw_node )
362
+ {
363
+ return ofw_api_call (prop_read_u16_array_index , dev -> ofw_node , propname ,
364
+ index , nr , out_values );
365
+ }
366
+ #endif
367
+
368
+ return - RT_ENOSYS ;
369
+ }
370
+
371
+ int rt_dm_dev_prop_read_u32_array_index (rt_device_t dev , const char * propname ,
372
+ int index , int nr , rt_uint32_t * out_values )
373
+ {
374
+ RT_ASSERT (dev != RT_NULL );
375
+
376
+ #ifdef RT_USING_OFW
377
+ if (dev -> ofw_node )
378
+ {
379
+ return ofw_api_call (prop_read_u32_array_index , dev -> ofw_node , propname ,
380
+ index , nr , out_values );
381
+ }
382
+ #endif
383
+
384
+ return - RT_ENOSYS ;
385
+ }
386
+
387
+ int rt_dm_dev_prop_read_u64_array_index (rt_device_t dev , const char * propname ,
388
+ int index , int nr , rt_uint64_t * out_values )
389
+ {
390
+ RT_ASSERT (dev != RT_NULL );
391
+
392
+ #ifdef RT_USING_OFW
393
+ if (dev -> ofw_node )
394
+ {
395
+ return ofw_api_call (prop_read_u64_array_index , dev -> ofw_node , propname ,
396
+ index , nr , out_values );
397
+ }
398
+ #endif
399
+
400
+ return - RT_ENOSYS ;
401
+ }
402
+
403
+ int rt_dm_dev_prop_read_string_array_index (rt_device_t dev , const char * propname ,
404
+ int index , int nr , const char * * out_strings )
405
+ {
406
+ RT_ASSERT (dev != RT_NULL );
407
+
408
+ #ifdef RT_USING_OFW
409
+ if (dev -> ofw_node )
410
+ {
411
+ return ofw_api_call (prop_read_string_array_index , dev -> ofw_node , propname ,
412
+ index , nr , out_strings );
413
+ }
414
+ #endif
415
+
416
+ return - RT_ENOSYS ;
417
+ }
418
+
419
+ int rt_dm_dev_prop_count_of_size (rt_device_t dev , const char * propname , int size )
420
+ {
421
+ RT_ASSERT (dev != RT_NULL );
422
+
423
+ #ifdef RT_USING_OFW
424
+ if (dev -> ofw_node )
425
+ {
426
+ return ofw_api_call (prop_count_of_size , dev -> ofw_node , propname , size );
427
+ }
428
+ #endif
429
+
430
+ return - RT_ENOSYS ;
431
+ }
432
+
433
+ int rt_dm_dev_prop_index_of_string (rt_device_t dev , const char * propname , const char * string )
434
+ {
435
+ RT_ASSERT (dev != RT_NULL );
436
+
437
+ #ifdef RT_USING_OFW
438
+ if (dev -> ofw_node )
439
+ {
440
+ return ofw_api_call (prop_index_of_string , dev -> ofw_node , propname , string );
441
+ }
442
+ #endif
443
+
444
+ return - RT_ENOSYS ;
445
+ }
446
+
447
+ rt_bool_t rt_dm_dev_prop_read_bool (rt_device_t dev , const char * propname )
448
+ {
449
+ RT_ASSERT (dev != RT_NULL );
450
+
451
+ #ifdef RT_USING_OFW
452
+ if (dev -> ofw_node )
453
+ {
454
+ return ofw_api_call (prop_read_bool , dev -> ofw_node , propname );
455
+ }
456
+ #endif
457
+
458
+ return RT_FALSE ;
459
+ }
460
+
0 commit comments