大家好!
我编写了一个简单的 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
提前感谢您的宝贵帮助!
此致、
一个循环