Skip to content

Commit 10b1627

Browse files
authored
[drivers][core] 完善设备模型 (#8384)
1 parent cc157ba commit 10b1627

File tree

17 files changed

+1301
-246
lines changed

17 files changed

+1301
-246
lines changed

components/drivers/core/bus.c

+236-126
Large diffs are not rendered by default.

components/drivers/core/dm.c

+317-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2006-2023, RT-Thread Development Team
2+
* Copyright (c) 2006-2024, RT-Thread Development Team
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*
@@ -10,6 +10,10 @@
1010

1111
#include <rtthread.h>
1212

13+
#ifdef RT_USING_OFW
14+
#include <drivers/ofw_io.h>
15+
#include <drivers/ofw_irq.h>
16+
#endif
1317
#include <drivers/core/dm.h>
1418

1519
#ifdef RT_USING_SMP
@@ -56,10 +60,10 @@ struct prefix_track
5660
int uid;
5761
const char *prefix;
5862
};
59-
static struct rt_spinlock _prefix_nodes_lock;
63+
static struct rt_spinlock _prefix_nodes_lock = { 0 };
6064
static rt_list_t _prefix_nodes = RT_LIST_OBJECT_INIT(_prefix_nodes);
6165

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)
6367
{
6468
int uid = -1;
6569
struct prefix_track *pt = RT_NULL;
@@ -104,17 +108,17 @@ int rt_dm_set_dev_name_auto(rt_device_t dev, const char *prefix)
104108
rt_spin_unlock(&_prefix_nodes_lock);
105109
}
106110

107-
return rt_dm_set_dev_name(dev, "%s%u", prefix, uid);
111+
return rt_dm_dev_set_name(dev, "%s%u", prefix, uid);
108112
}
109113

110-
int rt_dm_get_dev_name_id(rt_device_t dev)
114+
int rt_dm_dev_get_name_id(rt_device_t dev)
111115
{
112116
int id = 0, len;
113117
const char *name;
114118

115119
RT_ASSERT(dev != RT_NULL);
116120

117-
name = rt_dm_get_dev_name(dev);
121+
name = rt_dm_dev_get_name(dev);
118122
len = rt_strlen(name) - 1;
119123
name += len;
120124

@@ -137,7 +141,7 @@ int rt_dm_get_dev_name_id(rt_device_t dev)
137141
return id;
138142
}
139143

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, ...)
141145
{
142146
int n;
143147
va_list arg_ptr;
@@ -152,9 +156,314 @@ int rt_dm_set_dev_name(rt_device_t dev, const char *format, ...)
152156
return n;
153157
}
154158

155-
const char *rt_dm_get_dev_name(rt_device_t dev)
159+
const char *rt_dm_dev_get_name(rt_device_t dev)
156160
{
157161
RT_ASSERT(dev != RT_NULL);
158162

159163
return dev->parent.name;
160164
}
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

Comments
 (0)