u盘驱动 内核代码阅读 2.6.11.12版本

本文主要是对从U盘插入电脑后,驱动是咋样加载识别流程

先从device_register开始,这个函数在哪里调用的以后再分析

/**
 * 往设备驱动程序模型中插入一个新的设备驱动。
 * 并自动的在sysfs文件系统下为其创建一个新的目录
 */

//drivers\base\Core.c


int device_register(struct device *dev)
{
device_initialize(dev);
return device_add(dev);
}



int device_add(struct device *dev)
{
struct device *parent = NULL;
int error = -EINVAL;

dev = get_device(dev);
if (!dev || !strlen(dev->bus_id))
goto Error;

parent = get_device(dev->parent);

pr_debug("DEV: registering device: ID = '%s'\n", dev->bus_id);

/* first, register with generic layer. */
kobject_set_name(&dev->kobj, "%s", dev->bus_id);
if (parent)
dev->kobj.parent = &parent->kobj;

if ((error = kobject_add(&dev->kobj)))
goto Error;
if ((error = device_pm_add(dev)))
goto PMError;
if ((error = bus_add_device(dev)))
goto BusError;
down_write(&devices_subsys.rwsem);
if (parent)
list_add_tail(&dev->node, &parent->children);
up_write(&devices_subsys.rwsem);

/* notify platform of device entry */
if (platform_notify)
platform_notify(dev);
 Done:
put_device(dev);
return error;
 BusError:
device_pm_remove(dev);
 PMError:
kobject_del(&dev->kobj);
 Error:
if (parent)
put_device(parent);
goto Done;
}

int bus_add_device(struct device * dev)
{
struct bus_type * bus = get_bus(dev->bus);
int error = 0;

if (bus) {
down_write(&dev->bus->subsys.rwsem);
pr_debug("bus %s: add device %s\n", bus->name, dev->bus_id);
list_add_tail(&dev->bus_list, &dev->bus->devices.list);
device_attach(dev);
up_write(&dev->bus->subsys.rwsem);
device_add_attrs(bus, dev);
sysfs_create_link(&bus->devices.kobj, &dev->kobj, dev->bus_id);
}
return error;
}


int device_attach(struct device * dev)
{
  struct bus_type * bus = dev->bus;
struct list_head * entry;
int error;


if (dev->driver) {
device_bind_driver(dev);
return 1;
}


if (bus->match) {
list_for_each(entry, &bus->drivers.list) {
struct device_driver * drv = to_drv(entry);
error = driver_probe_device(drv, dev);
if (!error)
/* success, driver matched */
return 1;
if (error != -ENODEV && error != -ENXIO)
/* driver matched but the probe failed */
printk(KERN_WARNING
   "%s: probe of %s failed with error %d\n",
   drv->name, dev->bus_id, error);
}
}


return 0;
}


int driver_probe_device(struct device_driver * drv, struct device * dev)
{
if (drv->bus->match && !drv->bus->match(dev, drv))
return -ENODEV;


dev->driver = drv;
if (drv->probe) {
int error = drv->probe(dev);
if (error) {
dev->driver = NULL;
return error;
}
}


device_bind_driver(dev);
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值