当前位置: 技术问答>linux和unix
linux pci设备在枚举过程中向驱动程序模型注册的问题。
来源: 互联网 发布时间:2016-10-19
本文导语: 看材料说在linux启动过程中执行pci设备的探测和枚举,当检测到pci设备时,建立pci_dev,并调用device_register()将pci_dev中的device向驱动核心中注册,可我搜了整个源码树就是没找到这个device_register是在那里调用的,请大家...
看材料说在linux启动过程中执行pci设备的探测和枚举,当检测到pci设备时,建立pci_dev,并调用device_register()将pci_dev中的device向驱动核心中注册,可我搜了整个源码树就是没找到这个device_register是在那里调用的,请大家帮帮忙。
|
http://blog.chinaunix.net/u1/51562/showart_1137525.html
推荐文章
推荐文章
|
static int __init pci_legacy_init(void)
void pci_bus_add_devices(struct pci_bus *bus)
int pci_bus_add_device(struct pci_dev *dev)
int device_add(struct device *dev)
void bus_attach_device(struct device * dev)
-> klist_add_tail(&dev->knode_bus, &bus->klist_devices);
把设备链入BUS的klist_devices链表。
注册一个PCI驱动
static inline int __must_check pci_register_driver(struct pci_driver *driver)
int __pci_register_driver(struct pci_driver *drv, struct module *owner,
const char *mod_name)
int driver_register(struct device_driver * drv)
int bus_add_driver(struct device_driver *drv)
int driver_attach(struct device_driver * drv)
{
return bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);
}
在 int bus_for_each_dev(struct bus_type * bus, struct device * start,
void * data, int (*fn)(struct device *, void *))
函数中扫描BUS的klist_devices链表中的每一个PCI设备,在调用__driver_attach()
去匹配,剩下的的工作很简单了。
void pci_bus_add_devices(struct pci_bus *bus)
int pci_bus_add_device(struct pci_dev *dev)
int device_add(struct device *dev)
void bus_attach_device(struct device * dev)
-> klist_add_tail(&dev->knode_bus, &bus->klist_devices);
把设备链入BUS的klist_devices链表。
注册一个PCI驱动
static inline int __must_check pci_register_driver(struct pci_driver *driver)
int __pci_register_driver(struct pci_driver *drv, struct module *owner,
const char *mod_name)
int driver_register(struct device_driver * drv)
int bus_add_driver(struct device_driver *drv)
int driver_attach(struct device_driver * drv)
{
return bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);
}
在 int bus_for_each_dev(struct bus_type * bus, struct device * start,
void * data, int (*fn)(struct device *, void *))
函数中扫描BUS的klist_devices链表中的每一个PCI设备,在调用__driver_attach()
去匹配,剩下的的工作很简单了。