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.

[参考译文] AM625:OSPI 和 spidev 问题

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1472262/am625-issue-with-ospi-and-spidev

器件型号:AM625

工具/软件:

大家好

我一直使用具有 OSPI 接口的平台、并控制256MB SPI-NOR 四通道器件。

我已使用 TI OSPI/QSPI 指南中概述的 spi-cadence-quadspi 驱动器成功地初始化器件:

https://software-dl.ti.com/processor-sdk-linux/esd/AM62X/08_03_00_19/exports/docs/linux/Foundational_Components、Kernel_Drivers Kernel/Kernel/QSPI.html

我知道上面的链接适用于08.03.00.19版本、但仍然概述了内核中支持四路 SPI 所需的驱动程序。

我正在使用当前的10.01.10版本(6.6内核)

https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/snapshot/ti-linux-kernel-10.01.10.tar.gz

启用 SPI 和踏频内核驱动程序:

CONFIG_SPI=y
CONFIG_SPI_DEBUG=y
CONFIG_SPI_MASTER=y
CONFIG_SPI_MEM=y

#
# SPI Master Controller Drivers
#
CONFIG_SPI_BITBANG=y
CONFIG_SPI_CADENCE_QUADSPI=y
CONFIG_SPI_CADENCE_XSPI=y
CONFIG_SPI_GPIO=y
CONFIG_SPI_OMAP24XX=y

#
# SPI Protocol Masters
#
CONFIG_SPI_SPIDEV=m

和在用作 MTD 器件时正确识别闪存:

[    1.188137] cadence-qspi fc40000.spi: couldn't determine phase-detect-selector
[    1.190538] spi-nor spi0.0: xxxx25nw (32768 Kbytes)

SPI-NOR 调试提供了有关器件的正确信息:

$ cat /sys/kernel/debug/spi-nor/spi0.0/capabilities
Supported read modes by the flashddir
 1S-1S-1S
  opcode        0x13
  mode cycles   0
  dummy cycles  0
 1S-4S-4S
  opcode        0xec
  mode cycles   2
  dummy cycles  6
 4S-4S-4S
  opcode        0xec
  mode cycles   2
  dummy cycles  6

Supported page program modes by the flash
 1S-1S-1S
  opcode        0x12
 1S-4S-4S
  opcode        0x3e                                                                                                   cat /sys/kernel/debug/spi-nor/spi0.0/params

$ cat /sys/kernel/debug/spi-nor/spi0.0/params
id              xx xx xx 00 00 00
size            32.0 MiB
write size      1
page size       256
address nbytes  4
flags           4B_OPCODES | HAS_4BAIT | HAS_16BIT_SR | SOFT_RESET

opcodes
 read           0xec
  dummy cycles  8
 erase          0xdc
 program        0x3e
 8D extension   invert

protocols
 read           1S-4S-4S
 write          1S-4S-4S
 register       1S-1S-1S

erase commands
 21 (4.00 KiB) [1]
 ff (32.0 KiB) [2]
 dc (64.0 KiB) [3]
 c7 (32.0 MiB)

sector map
 region (in hex)   | erase mask | flags
 ------------------+------------+----------
 00000000-01ffffff |     [ 123] |

使用 flashrom 可以正常转储设备。  在写入设备时出现一些问题、但会将其放在另一张票上、因为我认为它与我的 spidev 问题无关。

当我启用 ospi 接口并将闪存设备设置为与 spidev 兼容时、我会获得一个/dev/spidev0.0节点、但无法对该接口执行任何操作。

通过驱动程序层、它似乎在 spi_async 操作中中断、返回 ENOTSUPP 错误代码。

DTS 配置:

&ospi0 {
	bootph-all;
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = <&ospi0_pins_default>;
    reg = <0x00 0x0fc40000 0x00 0x100>,
		  <0x05 0x00000000 0x01 0x2000000>;

	flash@0 {
		bootph-all;
		compatible = "micron,spi-authenta";
		reg = <0x0>;
		spi-tx-bus-width = <1>;
		spi-rx-bus-width = <1>;
		spi-max-frequency = <20000000>;
		cdns,tshsl-ns = <60>;
		cdns,tsd2d-ns = <60>;
		cdns,tchsh-ns = <60>;
		cdns,tslch-ns = <60>;
		cdns,read-delay = <4>;
	};	
};

我可以让 spidev 使用单线间隔、例如 main_spi0、1和2。

由于某种原因、无法让 spidev 使用 ospi 界面。

这是可能的吗?

我问,因为我们的设计需要使用 spidev 进行开发。

感谢您的帮助。

Marc

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    当我启用 ospi 接口并将闪存设备设置为与 spidev 兼容时、我会获得一个/dev/spidev0.0节点、但无法对该接口执行任何操作。

    根据错误消息的提示、SPIDEV 无法与 OSPI 外设一起使用。 它不适用于"基本"SPI 型操作、也不适用于此类操作。

    如果您尝试使用它的原因是您需要额外的 SPI 接口、可以执行以下操作:

    1. 使用内核中已有的软件 GPIO-Bitbang SPI 驱动程序、或
    2. 使用来自不同域(MCU 域)的 SPI 外设、或
    3. 使用 PRU 加速器来实现您自己的自定义 SPI 外设(遗憾的是、我们目前没有具体的示例代码、但可以从基于 PRU 的相关示例或驱动程序开始。 我认为有一个用于 UART)

    此外、您遇到的另一个错误  "Cadence-QSPI fc40000.spi: cannot determine-selector" 指向一个重要的缺失设备树属性。 确保使用与 SDK v10.1关联的正确/更新的器件特定器件树文件、而不是较旧/更早的文件。

    此致、Andreas

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

    尊敬的 Andreas:

    正如我的同事所提到的、我们使用 GPIO-SPIDEV 和 MTD 成功建立了通信。 但是、主要问题是 GPIO 模式非常慢。

    我们正在设计一个带有安全 SPI NOR 闪存芯片的电路板、它需要特定的读取/写入命令并且只接受特定加密格式的数据。 这也使 MTD 模式难以使用。

    我修改了器件树、使其在 SPIDEV 模式下使用 OSPI。 当 Linux 将其识别为spidev0.0时、没有传输或接收到任何数据。 由于通用 SPIDEV 驱动程序是从 Linux 内核中移除的、因此我使用了一个已知的兼容器件(spi-authenta、因为它也是一个 SPI NOR 芯片)。 这是我的器件树:

    &ospi0 {
        status = "okay";
        pinctrl-names = "default";
        pinctrl-0 = <&ospi0_pins_default>;
        ti,pindir-d0-out-d1-in = <1>;
        spidev@0 {
            compatible = "spi-authenta";
            status = "okay";
            reg = <0>;
            spi-tx-bus-width = <1>;
            spi-rx-bus-width = <4>;
            cs-gpios = <&main_gpio0 11 GPIO_ACTIVE_HIGH>;
            spi-max-frequency = <25000000>;
            cdns,tshsl-ns = <60>;
            cdns,tsd2d-ns = <60>;
            cdns,tchsh-ns = <60>;
            cdns,tslch-ns = <60>;
            cdns,read-delay = <4>;
            cdns,phy-mode;
            spi-nor,ddr;
        };
    };
    

    您能否建议在采用硬件加速而不是 GPIO 的同时、是否可以使用 SPIDEV 在 QSPI 或 OSPI 模式下连接此芯片?

    如果没有、是否有办法配置 GPIO 以利用 OSPI 并通过4条或8条线路传输数据?

    提前感谢您的指导。

    此致、
    Hossein

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否告知在利用硬件加速而不是 GPIO 的同时、是否可以在 QSPI 或 OSPI 模式下使用 SPIDEV 与该芯片连接?

    否、我们的 QSPI/OSPI 外设模块不能与 spidev 一起使用、这不受支持。

    如果没有、是否有办法将 GPIO 配置为利用 OSPI 并通过4或8行传输数据?

    我不确定这意味着什么? 您可以使用 GPIO 或 OSPI。 我不确定 GPIO 如何"利用"OSPI。

    利用硬件加速而不是 GPIO?

    在单线 SPI 模式下使用外部器件怎么样? 然后使用其中一个 McSPI 外设模块(它将与 spidev 配合使用)? 我认为、这样、即使使用多个信号、也能使其比任何基于 GPIO 的位移方法更快地工作。

    此致、Andreas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    否、我们的 QSPI/OSPI 外设模块不能与 spidev 一起使用、这不受支持。

    使用 QSPI/OSPI 支持 spidev 需要什么?

    我不确定这是什么意思? 您可以使用 GPIO 或 OSPI。 我不确定 GPIO 如何"利用"OSPI。

    它是指使用 GPIO SPI 位拆 裂驱动程序以四通道或八通道模式运行以加快数据传输、因为我们无法将 spidev 驱动程序与 Cadence_QSPI 驱动程序结合使用。

    在单线 SPI 模式下使用外部设备的情况如何? 然后使用其中一个 McSPI 外设模块(它将与 spidev 配合使用)? 我认为这样、即使使用多个信号、您也可以使其比任何基于 GPIO 的位移方法更快地工作。

    这对于 AM62x 来说很难做到、因为设计是利用处理器从 QSPI 引导的功能。

    引导在访问 SPI 芯片时不是问题。  我们的问题与 SPI 芯片中不支持的非标准"安全"寄存器的访问有关。

    我们已经考虑了如何实现 MTD 侧通道以允许使用 Cadence_QSPI.c 驱动程序将原始数据命令发送到闪存、但当需要虚拟时钟周期以允许在 SPI 芯片中执行命令时、这一切都会变得非常困难。  Cadence_QSPI 驱动程序最多支持31个虚拟周期、其中某些"安全"命令需要40个。

    使用 spidev 使我们能够管理芯片是一种经过试验和测试的方法,因为它使我们能够完全控制数据流。

    我们想找到一种从 Linux Kerenel 连接到 SPI 芯片的硬件加速方法、而不是使用慢速 GPIO SPI 驱动程序。

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

    您好:Marc、

    通过 QSPI/OSPI 支持 spidev 需要什么?

    OSPI 控制器中有一种"传统模式"、*可能*能够从硬件 POV 执行您需要的操作、但当前的驱动程序中没有软件基础结构、这就像不能以平凡的方式开发的东西一样。 另请参阅此处...

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1444100/am6421-more-flexible-use-of-the-ospi-interface/5538259#5538259
    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1444100/am6421-more-flexible-use-of-the-ospi-interface/5540138#5540138

    它是指使用 GPIO SPI bit-bang 驱动程序在四路或八路模式下运行

    如果要使用多个1位数据、则需要为存储器器件开发一个完全自定义的基于位拆分的驱动程序。 我认为通过扩展现有的 GPIO 位移驱动程序无法轻松或干净地实现此目的。

    访问 SPI 芯片时引导不是问题。  我们的问题与 SPI 芯片中的非标准"安全"寄存器的访问有关、该访问在内核驱动程序中不支持。

    AM62x 从技术上可以从常规 SPI 闪存引导。 因此、如果您重新接线可能有效的连接...

    1)使用常规 SPI 接口从闪存芯片进行 ROM 引导、
    2)内核启动后,在常规 SPI 接口上使用 spidev

    如果引导速度是一个问题、您也可以使用混合方法将闪存芯片同时连接到 OSPI 接口(用于 ROM 引导)和常规 SPI 接口(用于引导后使用)。

    该闪存芯片的供应商如何期望 Linux 用户使用该器件? 是否有任何驱动程序/参考代码?

    我们考虑了如何实现 MTD 侧通道、以允许使用 Cadence_QSPI.c 驱动程序将原始数据命令发送到闪存中

    您是如何做到的? 使用"Stig"模式?

    此致、Andreas

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

    您好 Andreas、

    我想问一下、是否可以在 Linux 中使用传统模式进行通信、或者这仅适用于 FreeRTOS? 如果可以通过 Linux 实现、请指导我如何实施、因为我找不到相关文档。 如果无法使用、请提供有关 Stig 模式的更多参考。 具体而言、我想知道我是否可以直接在 Stig 模式下发送命令、并且拥有超过32个虚拟周期。 为 AM62x 提供示例代码将大有帮助。

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

    尊敬的 Hossein:

    我想问是否可以在 Linux 中使用传统模式进行通信、或者这仅适用于 FreeRTOS?

    如本主题前面所述、 当前的驱动程序(Linux 和 RTOS 环境)中没有相应的软件基础架构、这就像不能以平凡的方式快速开发一样。

    请提供有关 Stig 模式的更多参考资料。 具体而言、我想知道我是否可以直接在 Stig 模式下发送命令、并且拥有超过32个虚拟周期。 为 AM62x 提供示例代码将非常有用。

    现有的 Linux 驱动程序(/drivers/spi/spi-cadence-quadspi.c)已使用 Stig 模式、因此您可以查看该模式。 请注意、 STIG 模式旨在读取闪存寄存器和 SFDP 数据等、并对闪存器件寄存器进行编程。 它不用于读取大数据。 因此、驱动程序会将其完全用于这些目的。

    控制器寄存器(RD_DATA_CAPTURE_REG)中只有5位来控制延迟行为、因此使用的虚拟周期不能超过32个。

    此致、Andreas

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

    尊敬的 Hossein:

    [引述 userid="644791" url="~/support/processors-group/processors/f/processors-forum/1472262/am625-issue-with-ospi-and-spidev/5759828 #5759828"]

    我能够通过直接访问寄存器从用户空间使用 Stig。 然而,由于我需要支持超过32个虚拟周期,并且传输超过16字节的数据,Stig 不符合我的要求。

    您能否告诉我、是否可以从用户空间以传统模式访问 OSPI? 如果是、是否有任何 API 可用于此目的?

    [/报价]

    我很惊讶你投入了多少努力,但我认为一般的方法(特别是"传统模式")听起来并不像一条可行的道路,你需要做的一切来管理传输,不? 假设您使用"256MB SPI-NOR 四通道器件"、您有一些最低吞吐量要求? 您是否考虑过使用另一种开箱即用且与控制器兼容的 NOR 闪存? 为什么需要使用这个特定器件? 器件型号是什么? 您想将其用于什么用途? 来保存数据/文件系统等?

    另外、如前所述、我们没有任何关于"传统模式"操作的示例代码。 我想、它的工作方式有点像常规 SPI 外设(但允许您访问总线的整个宽度)、但您需要手动管理所有内容、这可能会对性能造成很大影响。

    此致、Andreas

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

    我 现在正在处理一些关键任务、所以直到下周我才能再次查看。

    此致、Andreas

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

    我本周在 PTO 上、但下周我将再次获得 E2E 支持。 谢谢。