linux 设备与驱动的绑定

本文详细解析了Linux内核中设备与驱动的注册过程,包括device_register与driver_register函数的作用,以及如何通过这些函数实现设备与驱动之间的绑定。特别介绍了在没有显式指定驱动的情况下,如何自动探测并绑定合适的驱动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.设备通过device_register函数向bus注册,将device注册到bus的设备链表的尾端,同时试图将设备与总线上的驱动对象进行绑定操作。
2.驱动通过diver_register函数将某一驱动注册到bus的驱动链表上,同时试图将驱动与总线的设备进行绑定操作。

//分析
int device_register(struct device *dev)
{
    device_initialize(dev);
    return device_add(dev);
            bus_probe_device(dev);
                if (bus && bus->p->drivers_autoprobe) {
                    ret = device_attach(dev); //
                        if (dev->driver)  //如果此设备有驱动
                        {
                            ret = device_bind_driver(dev); 
                                klist_add_tail(&dev->p->knode_driver, &dev->driver->p->klist_devices);
                                    blocking_notifier_call_chain(&dev->bus->p->bus_notifier,BUS_NOTIFY_BOUND_DRIVER, dev);
                        }else //没有驱动去寻找驱动匹配
                        {
                            ret = bus_for_each_drv(dev->bus, NULL, dev, __device_attach); //__device_attach 匹配 
                        }
                }
}

static int __device_attach(struct device_driver *drv, void *data)
{
    struct device *dev = data;

    if (!driver_match_device(drv, dev)) //首先匹配
        return 0;

    return driver_probe_device(drv, dev); //再调用proble
}

static inline int driver_match_device(struct device_driver *drv,
                      struct device *dev)
{
    return drv->bus->match ? drv->bus->match(dev, drv) : 1;  //调用总线的匹配函数 
}

int driver_probe_device(struct device_driver *drv, struct device *dev)
{
    ret = really_probe(dev, drv);
        if (dev->bus->probe) { 
        ret = dev->bus->probe(dev); //probe 
        if (ret)
            goto probe_failed;
        } else if (drv->probe) {
        ret = drv->probe(dev); //执行probe
        if (ret)
            goto probe_failed;
        }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值