标签:PCI bus 流程 probe driver pcie 枚举 pci device
//0、pci子系统首先注册pci bus struct bus_type pci_bus_type = { .name = "pci", .match = pci_bus_match, .uevent = pci_uevent, .probe = pci_device_probe, .remove = pci_device_remove, .shutdown = pci_device_shutdown, .dev_groups = pci_dev_groups, .bus_groups = pci_bus_groups, .drv_groups = pci_drv_groups, .pm = PCI_PM_OPS_PTR, .num_vf = pci_bus_num_vf, }; EXPORT_SYMBOL(pci_bus_type); static int __init pci_driver_init(void) { return bus_register(&pci_bus_type); } postcore_initcall(pci_driver_init);/* 将初始化函数放到内核代码特殊段,内核启动将会自动调用初始化函数 */ /* 设备的枚举流程和设备的驱动的调用过程 */ //1、pci控制器 设备树节点将会配转换成platform device pcie@3400000 { compatible = "fsl,ls1021a-pcie", "snps,dw-pcie"; .... } //2、pci控制器匹配platform driver static const struct of_device_id ls_pcie_of_match[] = { { .compatible = "fsl,ls1021a-pcie", .data = &ls1021_drvdata }, .. } static struct platform_driver ls_pcie_driver = { .driver = { .name = "layerscape-pcie", .of_match_table = ls_pcie_of_match, .suppress_bind_attrs = true, }, }; builtin_platform_driver_probe(ls_pcie_driver, ls_pcie_probe); //3、执行pci控制器驱动函数ls_pcie_probe函数将被调用,直到pci_bus_type.pci_device_probe被调用 ls_add_pcie_port pci_bus_add_devices pci_bus_add_device device_attach __device_attach __device_attach_driver driver_probe_device really_probe dev->bus->probe//将调用pci_bus_type.pci_device_probe //4、枚举pci设备调用设备驱动 pci_device_probe __pci_device_probe pci_call_probe local_pci_probe pci_drv->probe//设备的驱动的probe将被调用。
标签:PCI,bus,流程,probe,driver,pcie,枚举,pci,device 来源: https://blog.51cto.com/zhaoxiaohu/2467299
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。