原文地址:http://blog.chinaunix.net/u3/93255/showart_2004387.html
platform_device_系列函数,实际上是注册了一个叫platform的虚拟总线。使用约定是如果一个不属于任何总线的设备,例如蓝牙,串口等设备,都需要挂在这个虚拟总线上。
driver/base/platform.c
//platform设备声明
struct device platform_bus = {
.bus_id
= "platform",
};
EXPORT_SYMBOL_GPL(platform_bus);
//platform总线设备声明
struct bus_type platform_bus_type = {
.name
= "platform",
.dev_attrs =
platform_dev_attrs,
.match
= platform_match,
.uevent
= platform_uevent,
.suspend =
platform_suspend,
.suspend_late
= platform_suspend_late,
.resume_early
= platform_resume_early,
.resume
= platform_resume,
};
EXPORT_SYMBOL_GPL(platform_bus_type);
int __init platform_bus_init(void)
{
int
error;
error =
device_register(&platform_bus);//注册了"platform"的设备
if
(error)
return error;
error =
bus_register(&platform_bus_type);//注册了叫"platform"的总线
if
(error)
device_unregister(&platform_bus);
return
error;
}
//这里在platform总线上挂设备
int platform_device_add(struct platform_device *pdev)
{
int i, ret =
0;
if
(!pdev)
return -EINVAL;
if
(!pdev->dev.parent)
pdev->dev.parent =
&platform_bus;//父设备设置为platform_bus
pdev->dev.bus =
&platform_bus_type;//设置挂在platform总线上
if
(pdev->id != -1)
snprintf(pdev->dev.bus_id, BUS_ID_SIZE, "%s.%d",
pdev->name,
pdev->id);
else
strlcpy(pdev->dev.bus_id, pdev->name,
BUS_ID_SIZE);
for (i = 0;
i < pdev->num_resources; i++) {
struct resource *p, *r =
&pdev->resource[i];
if (r->name == NULL)
r->name = pdev->dev.bus_id;
p = r->parent;
if (!p) {
if (r->flags & IORESOURCE_MEM)
p = &iomem_resource;
else if (r->flags &
IORESOURCE_IO)
本文解析了Linux内核中platform总线的实现原理与使用方法。详细介绍了如何通过platform_bus_type进行设备注册,并阐述了platform_device_add函数的作用及其实现细节。
2404

被折叠的 条评论
为什么被折叠?



