個人對kobject的一點研究 5

2021-05-27 03:22:43 字數 4120 閱讀 1577

在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天,第三個人需...