一.安卓8.1 设备匹配驱动过程

本文详细解析了安卓8.1系统中设备与驱动的匹配过程,包括设备添加、驱动注册、匹配条件及探查流程等关键技术点。

一.安卓8.1 设备匹配驱动过程
当内核发现一个新设备总是会调用device_add
Y:\kernel\drivers\base\core.c
device_add->{
bus_add_device
bus_probe_device(dev);
}

bus_add_device->                            Y:\kernel\drivers\base\bus.c
 bus_probe_device(dev);->
            device_initial_probe->           Y:\kernel\drivers\base\dd.c
                __device_attach(dev, true);->
                                bus_for_each_drv->          Y:\kernel\drivers\base\bus.c
                                         error = fn(drv, data);
        fn 等于传递的函数指针 __device_attach_driver

__device_attach_driver->                                  Y:\kernel\drivers\base\dd.c
       driver_match_device    //检查设备与驱动是否匹配
        ->driver_probe_device(drv, dev);->
                    really_probe(dev, drv);             Y:\kernel\drivers\base\dd.c

static int really_probe(struct device *dev, struct device_driver *drv)
{
if (dev->bus->probe) { //设备级别
ret = dev->bus->probe(dev);
if (ret)
goto probe_failed;
} else if (drv->probe) { //interface级别:
ret = drv->probe(dev);
if (ret)
goto probe_failed;
}

}
1.对于usb设备则是调用一下2种方式
① usb设备
usb_register_device_driver-> Y:\kernel\drivers\usb\core\driver.c
usb_probe_device ->
udriver->probe(udev);
②usb接口
usb_register_driver->
usb_probe_interface->
driver->probe(intf, id);

二.检查驱动与设备是否匹配

__device_attach_driver-> Y:\kernel\drivers\base\dd.c
driver_match_device-> drivers/base/base.h //检查设备与驱动是否匹配

static inline int driver_match_device(struct device_driver *drv,
struct device *dev)
{
return drv->bus->match ? drv->bus->match(dev, drv) : 1;
}
1.对于平台设备 drivers/base/platform.c中

 int __platform_driver_register(struct platform_driver *drv,struct module *owner)   中

{
drv->driver.owner = owner;
drv->driver.bus = &platform_bus_type;
drv->driver.probe = platform_drv_probe;
drv->driver.remove = platform_drv_remove;
drv->driver.shutdown = platform_drv_shutdown;

    return driver_register(&drv->driver);

}
而struct bus_type platform_bus_type = {
.name = “platform”,
.dev_groups = platform_dev_groups,
.match = platform_match,
.uevent = platform_uevent,
.pm = &platform_dev_pm_ops,
};

所以 ->drv->bus->match()==platform_match()
->比较strncmp(pdev->name, drv->name, BUS_ID_SIZE)
如果相符就调用platform_drv_probe()->driver->probe(),如果probe成功则绑定该设备到该驱动.
1.对于usb设备Y:\kernel\drivers\usb\core\driver.c中
int usb_register_device_driver(struct usb_device_driver *new_udriver,
struct module *owner)
{
int retval = 0;

if (usb_disabled())
    return -ENODEV;

new_udriver->drvwrap.for_devices = 1;
new_udriver->drvwrap.driver.name = new_udriver->name;
new_udriver->drvwrap.driver.bus = &usb_bus_type;
new_udriver->drvwrap.driver.probe = usb_probe_device;
new_udriver->drvwrap.driver.remove = usb_unbind_device;
new_udriver->drvwrap.driver.owner = owner;

retval = driver_register(&new_udriver->drvwrap.driver);

if (!retval)
    pr_info("%s: registered new device driver %s\n",
        usbcore_name, new_udriver->name);
else
    printk(KERN_ERR "%s: error %d registering device "
        "    driver %s\n",
        usbcore_name, retval, new_udriver->name);

return retval;

}
struct bus_type usb_bus_type = {
.name = “usb”,
.match = usb_device_match,
.uevent = usb_uevent,
};
所以usb_device_match 简单判断是否usb设备
if (is_usb_device(dev)) {
}
else if (is_usb_interface(dev)) {}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术求索者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值