浅分析linux 2.6.23ドライバ登録関数driver_レジスター
linux 2.6.23 driver_register()
:http://gliethttp.cublog.cn
int driver_register(struct device_driver * drv)
{
if ((drv->bus->probe && drv->probe) ||
//drv drv bus 1 , bus , drv
(drv->bus->remove && drv->remove) ||
(drv->bus->shutdown && drv->shutdown)) {
printk(KERN_WARNING "Driver '%s' needs updating - please use bus_type methods/n", drv->name);
}
klist_init(&drv->klist_devices, NULL, NULL);// drv
return bus_add_driver(drv);// drv drv->bus
}
void klist_init(struct klist * k, void (*get)(struct klist_node *),
void (*put)(struct klist_node *))
{
INIT_LIST_HEAD(&k->k_list);//
spin_lock_init(&k->k_lock);//
k->get = get;//
k->put = put;
}
int bus_add_driver(struct device_driver *drv)
{
struct bus_type * bus = get_bus(drv->bus);
int error = 0;
if (!bus)
return -EINVAL;
pr_debug("bus %s: add driver %s/n", bus->name, drv->name);
//kboj->name[KOBJ_NAME_LEN], KOBJ_NAME_LEN , kmalloc
// kobj->k_name kboj->name kmalloc
error = kobject_set_name(&drv->kobj, "%s", drv->name);
if (error)
goto out_put_bus;
//bus->drivers kset , drv->kobj kset
drv->kobj.kset = &bus->drivers;
//gliethttp_20071025 kobject_register()
// drv kobj kset ,
//gliethttp_20071026
// kobj, kobj kset, entry kset list ,
// kset , kobj->parent=&kset->kobj,parent kset kobj
// kobj kset, parent, parent 1
// kobj kset , kset kobj, kobj kset
// kobj parent , , kobj parent,parent
// parent kobj
//parent , kset ,
// parent
// create_dir() kobj sysfs
// kobject_uevent() KOBJ_ADD
error = kobject_register(&drv->kobj);
if (error)
goto out_put_bus;
if (drv->bus->drivers_autoprobe) {
//gliethttp_20071025
//driver ,
// driver
error = driver_attach(drv);
if (error)
goto out_unregister;
}
// driver bus klist_drivers klist
klist_add_tail(&drv->knode_bus, &bus->klist_drivers);
module_add_driver(drv->owner, drv);
//gliethttp_20071026
// 1 klist kobj -- drv->kobj , kobj sysfs
// kobj , kobj kobj ,
// kobj 0 , , kobj , ,
// , ,
// : hub1 ,hub1 , 2.4 .
// kset、kobj driver , , 、
// kset、kobj driver , , linux c++ , eCos ,
// , ,
// , , , ,
//kset、kobj driver 3 , , 3 、 、 、 、
// 、 、 、 , " , , !"
// , ( , ,
// , , , )
// c ,
// , , c (gliethttp_20071026 ).
//
error = driver_add_attrs(bus, drv);
if (error) {
/* How the hell do we get out of this pickle? Give up */
printk(KERN_ERR "%s: driver_add_attrs(%s) failed/n",
__FUNCTION__, drv->name);
}
error = add_bind_files(drv);
if (error) {
/* Ditto */
printk(KERN_ERR "%s: add_bind_files(%s) failed/n",
__FUNCTION__, drv->name);
}
return error;
out_unregister:
kobject_unregister(&drv->kobj);
out_put_bus:
put_bus(bus);
return error;
}