回复 10# wenzhouyip
这样也是试过,是不行的。
不过昨天问题已经解决了。
在这一并谢过楼上几位回复。我也把详细过程写一下希望对大家以后的工作也有点帮助或启发.
需求:
在已经启动的平台上,通过写一个内核模块,将外存中的fpga逻辑,下载到芯片中,然后将此pci设备初始化,使之可加载驱动后正常工作。
思路:
在下载完fpga逻辑到芯片中后
通过重新扫描pci子系统、分配资源、添加设备到内核中。以期能完成在内核启动后,达到新添加一个PCI设备的目的。
过程和问题:
在下载完逻辑之后,执行上述操作,关键代码大致如下pci_scan_child_bus(fpga_bridge->subordinate)
pci_bus_assign_resources(fpga_bridge->subordinate)
pci_bus_add_devices(fpga_bridge->subordinate这里的参数试过fpga所在桥的bus和根之下所有的bus.情况一样
均会出现一些“can't allocate mem resouces"之类的错误。
此时是可以从桥下一级的设备中遍历到fpga的pci_dev了。
但pci_get_device是找不到的。*
然后做的修改是在download之前,
对桥的PCI_MEMORY_BASE和PCI_MEMORY_LIMIT设置了值(根据重启后读到的pci桥的数据)
然后对桥复位。
再行上述代码,分配资源的时候,出现了collision的错误。
但这次,pci_get_device是可以找到设备了,也可访问配置空间。只是加载驱动后,不能正常操作。
设备直接重启了(有watchdog,在死锁或无响应的时候会自动重启)
分析原因,应该是桥上的配置与其它设备冲突,在驱动操作fpga时,下发的事务不能正确路由到fpga上。
于是设备僵死,重启了系统。
昨天请同事在bootloader中配置了fpga所在的pci桥,这样系统启动时,会自动根据bar分配资源。
我在download完成fpga后,再执行一遍扫描、分配、添加的操作。也将fpga初始化完整。
这样,设备可正常运行了!!
等后期测试如果有其它问题,再回来补充。
谢谢大家的关注。 回复 11# smr
感谢分享问题解决方法! 感谢分享!
页:
1
[2]