我正在通过从 Linux 移植它来实现以太网卡的 RTEMS 驱动程序。大部分工作已完成,处理器 IO 模式工作正常,中断处理也正常。现在我在实现 DMA 时遇到问题。
具体来说,在我用作基础的 Linux 驱动程序中,使用了函数 dma_alloc_coherent()。此函数将返回两个不同的地址:一个是驱动程序代码(主机 CPU)将看到的地址,另一个是卡在 DMA 期间通过 PCI 访问同一内存区域的地址。
我在寻找合适的替换功能时遇到问题。首先我想到了使用 malloc() 然后 pci_pci2cpu 将此地址转换为一张卡可以访问的地址,但是 pci_pci2cpu 对于 IO 返回 0xFFFFFFFF ,对于其余两种模式返回 0x0 。
我考虑的第二种方法是使用双端口内存管理器,但我没有找到有用的使用示例。例如,rtems_port_create() 函数需要提供指针 *internal_start 和 *external_start,但我不确定这些指针来自哪里?
我使用 Gaisler RTEMS 4.11 版和 Sparc 架构(LEON3 cpu)。
最好的,伊万