sysfs之platform匯流排初始化簡單分析

2021-06-16 07:39:02 字數 4486 閱讀 8547

int __init platform_bus_init(void)

第5行使用device_register函式註冊platform_bus裝置

第8行使用bus_register函式註冊乙個匯流排。

第10行如果註冊失敗,解除安裝匯流排。

int device_register(struct device *dev)

第1行初始化裝置

第2行把裝置新增到裝置層次結構中。

void device_initialize(struct device *dev)

第1行裝置的kobject物件的kset欄位指向全域性的kset物件,

第2行初始化裝置物件中的kobject物件,並把它加到某個類別中。

第7行裝置被初始化和喚醒。

第8行初始化裝置的電源狀態

第9行初始化裝置的節點,指的是記憶體管理的節點。

int device_add(struct device *dev)

014 dev->p->device = dev;

015 klist_init(&dev->p->klist_children, klist_children_get,

016 klist_children_put);

017018 /*

019 * for statically allocated devices, which should all be converted

020 * some day, we need to initialize the name. we prevent reading back

021 * the name, and force the use of dev_name()

022 */

023 if (dev->init_name)

027028 if (!dev_name(dev))

029 goto name_error;

030031 pr_debug("device: '%s': %s\n", dev_name(dev), __func__);

032033 parent = get_device(dev->parent);

034 setup_parent(dev, parent);

035036 /* use parent numa_node */

037 if (parent)

038 set_dev_node(dev, dev_to_node(parent));

039040 /* first, register with generic layer. */

041 /* we require the name to be set before, and pass null */

042 error = kobject_add(&dev->kobj, dev->kobj.parent, null);

043 if (error)

044 goto error;

045046 /* notify platform of device entry */

047 if (platform_notify)

048 platform_notify(dev);

049050 error = device_create_file(dev, &uevent_attr);

051 if (error)

052 goto attrerror;

053054 if (major(dev->devt))

063064 error = device_add_class_symlinks(dev);

065 if (error)

066 goto symlinkerror;

067 error = device_add_attrs(dev);

068 if (error)

069 goto attrserror;

070 error = bus_add_device(dev);

071 if (error)

072 goto buserror;

073 error = dpm_sysfs_add(dev);

074 if (error)

075 goto dpmerror;

076 device_pm_add(dev);

077078 /* notify clients of device addition. this call must come

079 * after dpm_sysf_add() and before kobject_uevent().

080 */

081 if (dev->bus)

082 blocking_notifier_call_chain(&dev->bus->p->bus_notifier,

083 bus_notify_add_device, dev);

084085 kobject_uevent(&dev->kobj, kobj_add);

086 bus_attach_device(dev);

087 if (parent)

088 klist_add_tail(&dev->p->knode_parent,

089 &parent->p->klist_children);

090091 if (dev->class)

104done:

105 put_device(dev);

106 return error;

107 dpmerror:

108 bus_remove_device(dev);

109 buserror:

110 device_remove_attrs(dev);

111 attrserror:

112 device_remove_class_symlinks(dev);

113 symlinkerror:

114 if (major(dev->devt))

115 device_remove_sys_dev_entry(dev);

116 devtattrerror:

117 if (major(dev->devt))

118 device_remove_file(dev, &devt_attr);

119 ueventattrerror:

120 device_remove_file(dev, &uevent_attr);

121 attrerror:

122 kobject_uevent(&dev->kobj, kobj_remove);

123 kobject_del(&dev->kobj);

124 error:

125 cleanup_device_parent(dev);

126 if (parent)

127 put_device(parent);

128name_error:

129 kfree(dev->p);

130 dev->p = null;

131 goto done;

132}

第5行使用get_device函式來增加對裝置的引用,其實get_device函式是kobject_get函式的封裝。

第9行對裝置的私有指標進行分配空間。

第14行裝置的私有指標的裝置物件指向目錄的裝置物件

第15行初始化裝置的的鍊錶。

第23行如果裝置的名字為真

第24-25行設定裝置的名字,然後設定為空。

第28行使用dev_name函式找到裝置的名字,其實也是通過kobject_name來返回裝置的名字,如果沒有這個名字,剛跳轉到錯誤地方,處理。

第33行增加到裝置的父裝置的引用,其實是增加對kobject父物件的引用。

第34行使這個裝置和父裝置連線起來。通過get_device_parent這個函式返回裝置的父kobject物件。

第42行把裝置的kobject物件,加到kobject層次結構中。

第50行建立裝置的屬性檔案,屬性為uenevt_attr結構體型別。

第55行建立裝置的屬性檔案,屬性為devt_attr結構體型別

第59行建立裝置的鏈結檔案。

第64行增加裝置類的鏈結檔案。

第67行增加裝置的屬性,比如裝置的類別屬性,組屬性等

第70行增加到裝置到匯流排上,建立鏈結到裝置的匯流排。

第76行新增乙個裝置到乙個活動裝置列表中。

第81行如果裝置被新增到匯流排中

第82行會把裝置新增到通知鏈中

第85行通知使用者空間。

第86行新增裝置到匯流排鍊錶中,試著找到它的驅動。

第87行如果父裝置為真,把它加到列表的末尾。

第91行如果裝置的類為真,也把它加到列表的末尾。

第114-131行是對前面的程式出錯後,進行的錯誤處理。

sysfs節點之DEVICE ATTR類

define device attr name,mode,show,store struct device attribute dev attr name attr name,mode,show,store name 名稱,也就是將在sys fs中生成的檔名稱。mode 上述檔案的訪問許可權 sho...

platform裝置驅動之LED(misc裝置)

一 開發環境 1 硬體平台 fs2410 2 主機 ubuntu 10.10 3 核心版本 linux 2.6.35 4 交叉編譯工具鏈 arm none linux gnueabi 二 詳細 led device.c include include include include include ...

linux驅動之platform匯流排

第一部分 裝置驅動模型 1 匯流排 bus type結構體,關鍵函式是match函式和uevent函式 匯流排將裝置和驅動繫結,在系統每註冊乙個裝置的時候,會尋找與之匹配的驅動,相反,在系統每註冊乙個驅動的時候,會尋找與之匹配的裝置,而匹配由匯流排完成。2 裝置 struct device結構體,硬...