本文是该系列文章驱动加载部分的第一篇,主要讲述ethernet device和driver的匹配和probe函数做了哪些工作。 2 ethernet driver和device的匹配 一款芯片中所有IP的描述与配置,在linux3.1之后都是用dts(device tree source)表示的,即linux设备(device)的信息描述在了dts中。本文我们关注dts中ethernet这个节点,它是网卡这个de...
* driver_probe_device() will spit a warning if there * is an error. */ if (!driver_match_device(drv, dev)) return 0; if (dev->parent) /* Needed for USB */ device_lock(dev->parent); device_lock(dev); if (!dev->driver) driver_probe_device(drv, dev); //此函数就是我们要找...
1intdriver_probe_device(structdevice_driver *drv,structdevice *dev)2{3intret =0;45if(!device_is_registered(dev))6return-ENODEV;78pr_debug("bus: '%s': %s: matched device %s with driver %s\n",9drv->bus->name, __func__, dev_name(dev), drv->name);1011pm_runtime_barrier(dev);1...
我们先不关注了),内核就会执行device_driver中的probe回调函数,而该函数就是所有driver的入口,可以执行诸如硬件设备初始化、字符设备注册、设备文件操作ops注册等动作("remove”是它的反操作,发生在device或者device_driver任何一方从内核注销时,其原理类似,就不再单独说明了)。
对每个挂在虚拟的platform bus的设备作__driver_attach()->driver_probe_device()->drv->bus->match()==platform_match()->比较strncmp(pdev->name, drv->name, BUS_ID_SIZE), 如果相符就调用platform_drv_probe()->driver->probe(),如果probe成功则绑定该设备到该驱动. ...
对每个挂在虚拟的platform bus的设备作__driver_attach()->driver_probe_device()->drv->bus->match()==platform_match()->比较strncmp(pdev->name, drv->name, BUS_ID_SIZE), 如果相符就调用platform_drv_probe()->driver->probe(),如果probe成功则绑定该设备到该驱动. ...
这样在 platform_driver_register() 注册时,会将当前注册的 platform_driver 中的 name 变量的值和已注册的所有 platform_device 中的 name 变量的值进行比较,只有找到具有相同名称的 platform_device 才能注册成功。当注册成功时,会调用 platform_driver 结构元素 probe 函数指针。
driver_probe_device(drv, dev); 跑到driver_probe_device中去看看: 有一段很重要: if (drv->bus->match && !drv->bus->match(dev, drv)) goto Done; 明显,是调用的驱动的总线上的match函数。如果返回1,则可以继续,否则就Done了。 继承执行的话: ...
int (*match)(struct device *dev, struct device_driver *drv); int (*probe)(struct device *dev); const struct dev_pm_ops *pm; const struct iommu_ops *iommu_ops; structsubsys_private*p; ... }; The subsys_private structure is the one that is the actual kobject allowing struct bus_typ...
int driver_register(struct device_driver *drv) { int ret; struct device_driver *other; BUG_ON(!drv->bus->p); if ((drv->bus->probe && drv->probe) || (drv->bus->remove && drv->remove) || (drv->bus->shutdown && drv->shutdown)) printk(KERN_WARNING "Driver '%s'...