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結構體,硬...