2

我正在通过从 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)。

最好的,伊万

4

2 回答 2

3

好的,基本上我明白了。

首先,RTEMS 具有平面内存模型,因此 malloc() 返回的地址是内存中的实际物理地址。这意味着我不需要 dma_alloc_coherent() 因为 malloc() 已经在做同样的事情。对于对齐的内存,我使用了也受支持的 posix_memalign()。

其次,我需要查看卡和内存之间是否有任何地址转换。这与RTEMS无关,而是与系统架构有关,所以在查看GRLIB用户手册并查看grpci2内核的RTEMS初始化代码后,我发现没有内存转换(设置为1:1)。

底线是,如果我使用简单的 malloc 分配缓冲区并将该地址提供给 PCI 卡,它将能够访问(读/写)该缓冲区。

这些都是我一开始的假设,但最终我的问题在于有故障的 DMA 芯片。:)

于 2016-04-25T12:56:36.490 回答
0

我不确定我的问题是否正确,但无论如何:

RTEMS 没有为 LEON 系列 DMA 实现处理程序。要使用 DMA,您需要利用 leon.h 头文件中的 LEON 结构。该结构链接到 LEON3 处理器的内存地址。或者,您可以直接寻址寄存器。

之后你需要去http://www.gaisler.com/index.php/products/components/ut699 下载UT699的功能手册(或者搜索你正在使用的SoC:))

在那里,您将了解如何以正确的顺序编写注册表以启动从/到 PCI 目标的 DMA 传输。

干杯

于 2016-02-28T21:14:51.787 回答