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.

[参考译文] AM3356:从 PRU 直接访问 SPI (无位拆裂)

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1213480/am3356-direct-access-to-spi-from-pru-no-bitbanging

器件型号:AM3356

大家好!

我编写了一个简单的 PRU 程序来处理 McSPI1 模块、充当一个 SPI 从器件 器件。
我 从 AM335XmcspiFlash.c StarterWare 软件包(v 02.00.01.01)中提供的示例开始、并更改了配置以启用从模式。

在我的程序的当前版本中、我只是轮询 MCSPI_IRQSTATUS 用于检测 我通过正确设置启用的 RX_FULL/RX_FLOPE/TX_EMPTY 中断的寄存器 MCSPI_IRQENABLE 寄存器。 这样、我不需要配置 PRU 中断控制器。

从 Code Composer Studio 执行时、我的程序实际上运行良好(在 GEL 初始化脚本中执行引脚多路复用)、但是、我无法在通过 Linux 5.10下运行的 Remoteproc 驱动程序加载程序时工作。 为了简化测试、我将 PRU 从程序精简为无限循环、不断地用0xFF 加载 MCSPI_TX 寄存器、然后我用示波器来监视 MISO 线路。 通过 Linux remoteproc 驱动程序加载 elf 文件时、我无法在 MISO 行上看到任何活动。

请注意、我既没有配置 inTC、也没有配置 resource_table、因为我没有使用来自 ARM 内核的中断和 RPMsg 机制(我使用共享内存来与 ARM 内核交换数据)。

remoteproc 驱动程序告知我固件已正确加载并正在运行:

# echo "start" > /sys/class/remoteproc/remoteproc1/state 
[   31.089553] remoteproc remoteproc1: powering up 4a334000.pru
[   31.122632] remoteproc remoteproc1: Booting fw image am335x-pru0-fw, size 79244
[   31.139047] remoteproc remoteproc1: remote processor 4a334000.pru is now up
# cat /sys/class/remoteproc/remoteproc1/state
running
#

在电路板的 dts 文件中、我按如下方式配置引脚多路复用:

&am33xx_pinmux {
    spi1_pins: spi1_pins {
        pinctrl-single,pins = <
            AM33XX_PADCONF(AM335X_PIN_MCASP0_ACLKX, PIN_INPUT, MUX_MODE3)    /* (A13) (0x990) mcasp0_aclkx.spi1_sclk */
            AM33XX_PADCONF(AM335X_PIN_MCASP0_FSX, PIN_OUTPUT, MUX_MODE3)     /* (B13) (0x994) mcasp0_fsx.spi1_d0 */
            AM33XX_PADCONF(AM335X_PIN_MCASP0_AXR0, PIN_INPUT, MUX_MODE3)     /* (D12) (0x998) mcasp0_axr0.spi1_d1 */
            AM33XX_PADCONF(AM335X_PIN_MCASP0_AHCLKR, PIN_INPUT, MUX_MODE7)   /* (C12) (0x99c) mcasp0_ahclkr.spi1_cs0 */
        >;
    };
};

&pruss_tm {
    status = "okay";
};

&pruss {
    pinctrl-names = "default";
    pinctrl-0 = <&spi1_pins>;
};

并禁用了&spi1&mcasp0节点、以防止 Linux 控制总线。

您是否知道主 CPU 上运行的 Linux 为什么阻止 PRU 代码与 McSPI 模块交互?
在 remoteproc 加载并启动 elf 文件后、如何调试 PRU 代码?

一些最后说明:

  • SPI 主器件定期选择从器件以读取状态寄存器
  • 我正在从 git.ti.com/.../ti-linux-kernel.git 上的源代码 (ti-linux-5.10.y 分支)构建 Linux

提前感谢您的宝贵帮助!

此致、

一个循环