在platform模型裝置的建立中,需要2個部分的註冊,驅動的註冊和裝置的註冊
platform_device_register(&test_device);
platform_driver_register(&test_driver);
首先看platform_device_register
註冊引數為test_device,結構如下
static struct platform_device test_device = ;
這個結構主要描述了裝置的名字,id和資源和私有資料,其中資源和私有資料我們在這裡不使用,將在別的文章中進行講解
int platform_device_register(struct platform_device *pdev)
void device_initialize(struct device *dev)
int platform_device_add(struct platform_device *pdev)
if (p && insert_resource(p, r))
}pr_debug("registering platform device '%s'. parent at %s\n",pdev->dev.bus_id, pdev->dev.parent->bus_id);
//新增裝置到裝置層次中
ret = device_add(&pdev->dev);
if (ret == 0)
return ret;
failed:
while (--i >= 0)
if (pdev->resource.flags & (ioresource_mem|ioresource_io))
release_resource(&pdev->resource);
return ret;
}int device_add(struct device *dev)
pr_debug("device: '%s': %s\n", dev->bus_id, __func__);
//取得上層device,而dev->parent的賦值是在platform_device_add中的pdev->dev.parent = &platform_bus完成的
parent = get_device(dev->parent);
//以上層devices為準重設dev->kobj.parent
setup_parent(dev, parent);
if (parent)
set_dev_node(dev, dev_to_node(parent));
//設定dev->kobj的名字和父物件,並建立相應目錄
error = kobject_add(&dev->kobj, dev->kobj.parent, "%s", dev->bus_id);
if (error)
goto error;
if (platform_notify)
platform_notify(dev);
//一種新型的通知機制,但是platform中沒有設定相應的結構,所以在這裡跳過
/* notify clients of device entry (new way) */
if (dev->bus)
blocking_notifier_call_chain(&dev->bus->p->bus_notifier,bus_notify_add_device, dev);
//建立uevent檔案
error = device_create_file(dev, &uevent_attr);
if (error)
goto attrerror;
//裝置有裝置號則建立dev檔案
if (major(dev->devt))
//建立subsystem連線檔案連線到所屬class
error = device_add_class_symlinks(dev);
if (error)
goto symlinkerror;
//新增dev的描述檔案
error = device_add_attrs(dev);
if (error)
goto attrserror;
//新增鏈結檔案至所屬bus
error = bus_add_device(dev);
if (error)
goto buserror;
//新增power檔案
error = device_pm_add(dev);
if (error)
goto pmerror;
kobject_uevent(&dev->kobj, kobj_add);
//檢測驅動中有無適合的裝置進行匹配,現在只新增了裝置,還沒有載入驅動,所以不會進行匹配
bus_attach_device(dev);
if (parent)
klist_add_tail(&dev->knode_parent, &parent->klist_children);
if (dev->class)
done:
put_device(dev);
return error;
pmerror:
bus_remove_device(dev);
buserror:
if (dev->bus)
blocking_notifier_call_chain(&dev->bus->p->bus_notifier,bus_notify_del_device, dev);
device_remove_attrs(dev);
attrserror:
device_remove_class_symlinks(dev);
symlinkerror:
if (major(dev->devt))
device_remove_file(dev, &devt_attr);
ueventattrerror:
device_remove_file(dev, &uevent_attr);
attrerror:
kobject_uevent(&dev->kobj, kobj_remove);
kobject_del(&dev->kobj);
error:
cleanup_device_parent(dev);
if (parent)
put_device(parent);
goto done;
}static void setup_parent(struct device *dev, struct device *parent)
static struct kobject *get_device_parent(struct device *dev,
struct device *parent)
spin_unlock(&dev->class->class_dirs.list_lock);
if (kobj)
return kobj;
k = kobject_create();
if (!k)
return null;
k->kset = &dev->class->class_dirs;
retval = kobject_add(k, parent_kobj, "%s", dev->class->name);
if (retval < 0)
return k;
}if (parent)
//返回上層device的kobj
return &parent->kobj;
return null;
}在bus_attach_device中雖然沒有成功進行匹配,但是有很重要的一步為之後正確的匹配打下基礎
void bus_attach_device(struct device *dev)
}klist_add_tail(&dev->knode_bus, &bus->p->klist_devices)就是這一行
在這一行**中將裝置掛載到了bus下的devices鍊錶下,這樣,當驅動請求匹配的時候,platform匯流排就會歷遍devices鍊錶為驅動尋找合適的裝置
現在來看一下test_device的模型
個人對kobject的一點研究 4
現在到bus register了 註冊的引數platform bus type如下所示 struct bus type platform bus type int bus register struct bus type bus 建立drivers目錄 priv drivers kset kset ...
個人對kobject的一點研究 6
然後platform driver unregister,他的引數 test driver的結構如下 static struct platform driver test driver int platform driver register struct platform driver drv 從...
個人對專注力的一點看法
假設乙個人總共擁有10個點的注意力,那麼對於以下簡單的數學公式,可以幫助我們理解分散注意力對學習效率的影響。1.10 0 10 2.10 2 8 3.10 2 2 6 4.10 2 2 2 4 如果完成一項工作需要10個點的注意力,那麼對於第乙個人需要一天的時間,第二個人需要 1.25天,第三個人需...