This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM623:存储器将外部器件映射到 OSPI 以实现更快的读取速度

Guru**** 2463330 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1542795/am623-memory-map-an-external-device-to-ospi-for-faster-reads

器件型号:AM623


工具/软件:

尊敬的 TI 支持团队:

我之前遇到了一个问题、我无法足够快地从 Cadence OSPI 控制器读取数据。 我已经使用 OSPI 控制器驱动程序来执行寄存器读取。

FPGA 有一个 FIFO、正在提取数据、并且基于 AM62x 处理器的 Linux 板正在从中读取数据。 我当时使用 spi-cadence qsp.c OSPI Linux 驱动程序中的 readl () 来读取一个 32 位寄存器、时间约为 33 - 35us。 而应用程序要求我在 7uS 以下完成 64 位读取。  

我是否可以通过将 FPGA 的 FIFO 映射到 Cadence conroller 以实现更快的读取?

非常感谢为实现此吞吐量而提供的任何见解。

我希望我能尽快收到你们的回复。

此致、
Maneesh N

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Maneesh:

    我正在将您的问题发送给我们的 SPI 专家以征求意见。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Maneesh、 Cadence OSPI 控制器可配置为 DAC 模式以进行存储器映射。

    其他性能注意事项:

    - DTR:这应该默认启用,但值得仔细检查没有禁用  

    -启用 OSPI PHY: https://www.ti.com/lit/ug/spruiv7b/spruiv7b.pdf#page=1380 

    希望这对您有所帮助、谢谢您、

    Paula

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Paula、

    感谢您分享一些见解、我在使用 linux/drivers/spi/spi-cadence 驱动程序进行实验、

    我只想了解各个函数在读取 OSPI 数据时所花费的时间。
    对于我使用 for 循环读取的 1024 个样本的突发读取、我发现删除函数'cqspi_wait_for_bit()'后、数据的读取时间显著减少。

    for (counter = 0;counter < 1024;counter++)

    start = ktime_get ();
    writel (offset、cqspi->iobase + CSSPI_REG_CMDADDRESS);
    write (0x00bb0001、cqspi->iobase + CSSPI_REG_CMDCTRL);

                 /*将此函数注释掉
                 cqspi_wait_for_bit (cqspi->iobase + CSSPI_REG_CMDCTRL、
                                    CSSPI_REG_CMDCTRL_INPROGRESS_MASK、1);
    */

    reg = readl (cqspi->iobase + CSSPI_REG_CMDREADDATALOWER);
    end = ktime_get();
           duration_dns = ktime_to_ns (ktime_sub (end、start));
    printk(“reg:%x\print: tt %lli\n“、reg、duration_ns);
    }

    将 cqspi_wait_for_bit 函数注释掉后、我可以实现约 1.6 - 1.7us 的读取时间。

    使用 readl 跳过'cqspi_wait_for_bit()'是否安全? 我是否应该担心一些安全问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Maneesh、如果没有“cqspi_wait_for_bit",“,则、则存在读取控制寄存器尚未完成设置的风险。 您是否验证了读取的数据? 正常吗?

    一件事可以是将“Busyway"作为“作为 true 添加到这个函数中,看看时间是否更好

    从下面的代码中可以看到、当 Busyway 为 false 时、则使用常规轮询并使用“10",“,这、这可能是我们两次读取之间的延迟

    位于 Master Torvalds/Linux··GitHub 上的 linux/drivers/spi/spi-cadence quadspi.c

    static int cqspi_wait_for_bit(const struct cqspi_driver_platdata *ddata,
    			      void __iomem *reg, const u32 mask, bool clr,
    			      bool busywait)
    {
    	u64 timeout_us = CQSPI_TIMEOUT_MS * USEC_PER_MSEC;
    	u32 val;
    
    	if (busywait) {
    		int ret = readl_relaxed_poll_timeout(reg, val,
    						     (((clr ? ~val : val) & mask) == mask),
    						     0, CQSPI_BUSYWAIT_TIMEOUT_US);
    
    		if (ret != -ETIMEDOUT)
    			return ret;
    
    		timeout_us -= CQSPI_BUSYWAIT_TIMEOUT_US;
    	}
    
    	return readl_relaxed_poll_timeout(reg, val,
    					  (((clr ? ~val : val) & mask) == mask),
    					  10, timeout_us);
    }
     

    建议的更改

    for (counter = 0; counter < 1024; counter++) {
    	start = ktime_get();
    	writel(offset, cqspi->iobase + CQSPI_REG_CMDADDRESS);
    	writel(0x00bb0001, cqspi->iobase + CQSPI_REG_CMDCTRL);
    
    	cqspi_wait_for_bit(cqspi->iobase + CQSPI_REG_CMDCTRL,
    			   CQSPI_REG_CMDCTRL_INPROGRESS_MASK, 1, true);
    
    	reg = readl(cqspi->iobase + CQSPI_REG_CMDREADDATALOWER);
    	end = ktime_get();
    	duration_ns = ktime_to_ns(ktime_sub(end, start));
    	printk("reg: %x\tt: %lli\n", reg, duration_ns);
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Paula、

    我正在按预期读取数据。 我需要试验建议的更改并重新检查时间。

    谢谢、
    Maneesh N

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Paula、

    很抱歉稍后回复。
    就像您说的、我在尝试连续读取这个具有不同地址的寄存器时遇到了问题。

    我做了以下更改、但没有像您所建议的那样使用 busywait 方法、但有类似的事情


    static int cqspi_wait_for_bit(void __iomem *reg, const u32 mask, bool clr)
    {
    	u32 val;
    
    	return readl_relaxed_poll_timeout(reg, val,
    					  (((clr ? ~val : val) & mask) == mask),
    					  0, CQSPI_TIMEOUT_MS * 1000);
    }

    只创建了 delay_us 字段 0 而不是 10。
    您能帮助我了解此方法是否正常吗? 还是由于您希望我添加 busywait 的任何特定原因造成的?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Maneesh、不使用“busywait"的“的原因是什么?

    来自 Master Torvalds/Linux··GitHub 上的 linux/drivers/spi/spi-cadence quadspi.c

    我看到“cqspi_wait_for_bit"的“的当前实现,如果启用了“busywait",“,它会执行与您的嗅探代码类似的积极轮询,但它也有一个回退,更宽松的轮询,使用 10us DALYs,在激进轮询超时后.

    因此、这可能是驱动程序中已经实现的良好平衡。

    谢谢您、

    Paula