现有的内核驱动程序(如xilinx)有特定的注册方式(作为tty设备),如果它们直接映射到cpu内存映射,就像这里使用设备树所做的那样:https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842249/Uartlite+驱动
但在其他情况下,有一个PCIe设备(如具有xilinx-uart IP的FPGA)连接到和cpu。
使用PCIe设备时,我们应该如何注册uart?
我尝试注册到PCIe的设备树是uartlite驱动程序:https://github.com/Xilinx/linux-xlnx/blob/master/drivers/tty/serial/uartlite.c
我想我可能需要做的是:
-
编写一个自定义的pci驱动程序。
-
需要准备platform_device结构,然后从pci驱动程序调用uart探测例程:
ulite_probe(struct-platform_device*pdev)
我看到过其他人在连接多个设备的情况下使用FPGA的相关问题,但似乎没有描述如何做到这一点的文档或教程。
如有任何意见、示例或文件,我们将不胜感激。
所以类似于ARM CPU通过PCIe连接到Artix FPGA的东西,对吧?
是的,您需要一个自定义PCIe驱动程序。必须映射PCIe配置和数据空间。看看pci_resource_{start,len}和pci_remap_bar函数。然后,您可以使用pci_get_device获取指向结构设备的指针,并检索PCIe配置空间的虚拟地址。UART驱动程序可以使用结构设备指针,并且根据您的设计,它的寄存器映射应该位于PCIe配置空间的虚拟地址的某个偏移处。您可以在自己的驱动程序中调用UARTlite IP驱动程序的探测调用。
"现有的内核驱动程序(如xilinx)有特定的注册方式(作为tty设备),如果它们直接映射到cpu内存映射,就像这里使用设备树所做的那样"。请注意,如果我们只谈论tty设备,这是真的。GPIO外设IP不会公开为tty,而是在/sys/class/GPIO中。