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.

[参考译文] RTOS/AM5728:适用于带 Linux 主机的 M4的 SPI 驱动程序

Guru**** 2550020 points
Other Parts Discussed in Thread: AM5728, SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/615167/rtos-am5728-spi-driver-for-m4-with-linux-host

器件型号:AM5728
Thread 中讨论的其他器件: SYSBIOS

工具/软件:TI-RTOS

我正在使用 AM5728 EVM。 我在 A15上运行 Linux、在 DSP 和 M4内核上运行 RTOS。 我正在尝试在 M4上设置 SPI。 我已使用器件树启用 SPI4、并且能够在 A15/Linux 上验证该情况。 根据我的项目要求、我需要在 M4处理器上设置 SPI。

我正尝试在 M4上设置 SPI、如下所示-

//…
SPI_init();//----如果 Linux 正在设置 IO,是否需要这样做?
SPI_Params spiParams;
SPI_Params_init (&spiParams);
//… …μ A
SPI_open (CSL_MPU_MCSPI4、&spiParams);


但 M4内核在调用 SPI_open()时崩溃-

“remoteproc0:在5882000.IPU 中检测到崩溃:类型设备异常”


RTOS SDK 中的所有 IO 驱动程序示例似乎都支持仅 RTOS 或裸机/独立用例、即没有 Linux 主机。 是否有适用于采用 Linux 主机的 TI-RTOS 的 IO 驱动程序示例? 如何使用 Linux 主机在 M4上读取/写入 SPI?

RTOS SDK 和 Linux SDK 版本为03.01.00.06。

谢谢、

Jimit

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jimit、

    我们最近多次请求在启动 ARM Linux 时启用 M4上的外设、因此、我们创建了一篇维基文章、介绍了 DSP 和 M4的此过程。 目前、我们使用的示例是 DSP 上的 GPIO 和 M4上的 UART、此处提供了重新创建设置的步骤:

    我希望这可以为您提供有关如何创建可使用 Remoteproc 加载的 M4固件的指导:

    我总结了您所需的更改:

    在 Processor SDK 中运行 IPC+PDK 固件所需的更改列表:

    • 从器件树中禁用 Linux 内核中使用的外设实例
    • 修改镂空和资源表以调整存储器映射/分配(可选步骤。 从 IPC 中的默认资源表开始)
    • 将 IPU/DSP 上的 PDK 驱动程序代码与 IPC MessageQ 代码合并  
    • 将 RTOS 设置更改为使用 DRA7xx IPC 资源表中的存储器映射
    • 删除电路板库初始化并使用 CSL 代码来配置 PRCM 和时钟。 (应在 uboot 中完成所有全局 pinmux 和 DPLL 初始化)
    • IPU 特定更改:从 IPC 删除 Ammu 配置并使用 L2 MMU 配置。 需要更改驱动程序代码以使用虚拟地址访问外设配置寄存器。

    请查看文章、如果您对此主题有任何疑问、请告知我们。

    此致、

    Rahul

    PS:有关资源表和存储器映射更改、请参阅  

    http://processors.wiki.ti.com/index.php/IPC_Resource_customTable

     

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

    感谢 Rahul、我将浏览 wiki 并尝试设置 SPI。 我会让您知道它是怎么发生的。  

    此致、

    Jimit

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

    Rahul、  

    我按照以下位置的指示操作:

    processors.wiki.ti.com/.../Linux_IPC_on_AM57xx

    我尝试使用 IPC 构建 UART 示例(我在 IPC 中使用了默认资源表)。 我得到此错误:

    ****项目 IPC_UART_Ex 的配置调试构建****

    /home/hmedev/ti/ccsv6/utils/bin/gmake -k all
    构建文件:./uart_m4_evmAM572x.cfg
    调用:XDCtools
    "/home/hmedev/ti/xdctools_3_32_00_06_core/xs "--xdcpath="/home/hmedev/ti/edma3_lld_2_12_01_25/packages;/home/hmedev/ti/ipc_3_43_02_04/packages;/home/hmedev/ti/bios_6_45_01_29/packages;/home/hmedev/ti/pdk_am57xx_1_0_4/packages;/home/hmedev/ti/ndk_2_24_03_35/packages;/home/hmedev/ti/ccsv6/ccs_base;" xdc.tools.configuro configPkg -t ti.targets.arm.elf.M4 -p ti.platforms.evmAM572X:ipu2 -r debug -b "/home/hmedev/projects/IPC_UART_Ex/config.bld "-c "/home/hmedev/ti/ccsv6/tools/compiler/ti-cgt-arm_15.12.1.LTS "-cfgArgs "{configBld\"}"572x_AMUART"。
    从 package/cfg/uart_m4_evmAM572x_pem4.cfg 配置 UART_M4_evmAM572x.xem4 ...
    subdir_rules.mk:42:目标'configPkg/linker.cmd'的配方失败
    警告:ti.sysbios.bios:"/home/hmedev/ti/bios_6_45_01_29/packages/ti/sysbios/BIOS.xs、第314行:ti.sysbios.bios heapSize:BIOS.heapSize 和 Memory.defaultHeapInstance 都已设置。 BIOS.heapSize 被忽略。 使用 Memory.defaultHeapInstance。

    错误:TI.trace.SysMin:“/home/hmedev/ti/ipc_3_43_02_04/packages/ti/trace/SysMin.xs”,第51行:TI.trace.SysMin:找到.tracebuf 段,但未在 Program.cpu.memoryMap 中找到

     

    JS:"/home/hmedev/ti/ipc_3_43_02_04/packages/ti/trace/SysMin.xs,第55行:TypeError: Cannot read property "len" from undefined (/home/hmedev/ti/ipc_3_43_02_04/packages/ti/trace/SysMin.xs #55)
    gmake:***[package/cfg/UART_M4_evmAM572x_pem4.xdl]错误1
    JS:"/home/hmedev/ti/xdctools_3_32_00_06_core/packages/xdc/tools/Cmdr.xs、第51行:错误:xdc.tools.configuro:由于早期错误(状态= 2)、配置失败;已删除'linker.cmd'。
    gmake:***[configPkg/linker.cmd]错误1.
    gmake:目标"全部"不会由于错误而重新生成。

    ****构建完成****

    我无法将从 wiki 下载的完整 CCS 工程导入到工作区中、因为我有 SDK 版本 03.01.00.06。我将更新工作站上的 SDK、并尝试使用 IPC 示例构建 UART。

    谢谢、

    Jimit

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

    Jimit、

    IPC 产品要求 AM57xx 用户将其平台定义为  

    • 对于  Target、选择  ti.targets.arm.elf.M4
    • 对于 平台、请选择  ti.platforms.evmDRA7XX

    在您的构建中、我仍然看到定义为  ti.platforms.evmAM572X:ipu2的平台。  

    您能否更改尝试重建此项目的内容?

    此致、

    Rahul

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

    您好、Rahul、

    我尝试将目标设置为  ti.targets.arm.elf.M4、并将平台设置 为 ti.platforms.evmDRA7XX。  但是、我仍然会得到相同的误差。

    ****项目 IPC_UART_Ex 的配置调试构建****

    /home/hmedev/ti/ccsv6/utils/bin/gmake -k all
    构建文件:./uart_m4_evmAM572x.cfg
    调用:XDCtools
    "/home/hmedev/ti/xdctools_3_32_00_06_core/xs "--xdcpath="/home/hmedev/ti/edma3_lld_2_12_01_25/packages;/home/hmedev/ti/ipc_3_43_02_04/packages;/home/hmedev/ti/bios_6_45_01_29/packages;/home/hmedev/ti/pdk_am57xx_1_0_4/packages;/home/hmedev/ti/ndk_2_24_03_35/packages;/home/hmedev/ti/ccsv6/ccs_base;" xdc.tools.configuro configPkg -t ti.targets.arm.elf.M4 -p ti.platforms.evmDRA7XX -r debug -b "/home/hmedev/projects/IPC_UART_Ex/config.bld "-c "/home/hmedev/ti/ccsv6/tools/compiler/ti-cgt-arm_15.12.1.LTS "-cfgArgs "{configBld\"}"572x_AMUART"。
    从 package/cfg/uart_m4_evmAM572x_pem4.cfg 配置 UART_M4_evmAM572x.xem4 ...
    subdir_rules.mk:42:目标'configPkg/linker.cmd'的配方失败
    警告:ti.sysbios.bios:"/home/hmedev/ti/bios_6_45_01_29/packages/ti/sysbios/BIOS.xs、第314行:ti.sysbios.bios heapSize:BIOS.heapSize 和 Memory.defaultHeapInstance 都已设置。 BIOS.heapSize 被忽略。 使用 Memory.defaultHeapInstance。


    错误:TI.trace.SysMin:“/home/hmedev/ti/ipc_3_43_02_04/packages/ti/trace/SysMin.xs”,第51行:TI.trace.SysMin:找到.tracebuf 段,但未在 Program.cpu.memoryMap 中找到


    JS:"/home/hmedev/ti/ipc_3_43_02_04/packages/ti/trace/SysMin.xs,第55行:TypeError: Cannot read property "len" from undefined (/home/hmedev/ti/ipc_3_43_02_04/packages/ti/trace/SysMin.xs #55)
    gmake:***[package/cfg/UART_M4_evmAM572x_pem4.xdl]错误1
    JS:"/home/hmedev/ti/xdctools_3_32_00_06_core/packages/xdc/tools/Cmdr.xs、第51行:错误:xdc.tools.configuro:由于早期错误(状态= 2)、配置失败;已删除'linker.cmd'。
    gmake:***[configPkg/linker.cmd]错误1.
    gmake:目标"全部"不会由于错误而重新生成。

    ****构建完成****

    我已附加我的 CCS 项目以供参考。  

    e2e.ti.com/.../IPC_5F00_UART_5F00_Ex.tar.gz

    谢谢、

    Jimit

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

    Jimit、

    如果您查看 Add_IPC_TO_TH_UART_example 部分 、您还需要将计划运行的内核添加到选项中。

    例如、如果要为 ipu1 或 dsp2构建此文件、 则需要使用"ti.platforms.evmDRA7XX:ipu1"或"ti.platforms.evmDRA7XX:dsp2"。

    您n`t 做过此操作、因此我在之前的回复中没有指明它。

    检查 CCS 中是否有正确的工程设置的一种好方法是查看 IPC 示例中 makefile 中的编译器和 RTSC 设置。

    IPC_3_46_00_02\examples\DRA7XX_Linux_elf\ex02_MessageQ\ipu2

    此致、

    Rahul

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

    谢谢! 通过将平台设置为"ti.platforms.evmDRA7XX:ipu2"、我得以解决此错误。

    但是、现在我收到有关缺少源文件的编译错误-我认为这是因为我仍在使用03.01.00.06。 我在中搜索了 csl_utils.h 文件 /pdk_am57xx_1_0_4/packages/ti/cSL/目录、它不在那里。

    >>编译失败
    subdir_rules.mk:21:目标'UART_SoC.obj'的配方失败
    "./UART_SoC.c"、第39行:致命错误#1965:无法打开源文件"ti/CSL_utils.h"
    1在编译"./UART_SoC.c"时检测到灾难性错误。
    编译已终止。
    gmake:***[UART_SoC.obj]错误1.
    编译文件:./main_UART_example.c


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

    正确、csl_utils.h 似乎已添加到处理器 SDK RTOS 3.03中。 您可以在此处的公共 epos 中找到 CSL 文件:
    git.ti.com/.../csl_utils.h

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

    Rahul、

    如何为 IPU1而不是 IPU2构建此示例? 我改变了

    1)将平台定义更改为"ti.platforms.evmDRA7XX:ipu1"

    2) 2)在 xdcscript 中、我将 Program.global.procName 设置 为"IPU1"、并将 Core.ipuId 设置为1

    当我使用这些更改构建和运行示例时、 /sys/kernel/debug/remoteproc/remoteproc0/state 会将 IPU1列为脱机。 我在 IPC 示例"ex02_MessageQ"中比较了 IPU1和 IPU2的 xdcsscripts、它们在时钟配置上似乎有所不同。

    如 wiki 中所述、在 xdcsscript 中注释 UART + IPC CCS 项目设置的 tick 部分的原因是什么:  

    processors.wiki.ti.com/.../Linux_IPC_on_AM57xx

    我能够在 IPU1上构建并运行 ex02_MessageQ、还希望在 IPU1上运行此集成 UART + IPC 示例。 在我的项目中、我要求使用两个 IPU 内核。

    谢谢、

    Jimit

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

    在  RSC_Table_vayu_IPU.c.中定义了 VAYU_IPU_1后、我能够在 IPU1上运行该代码

    -Jimit

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

    是的、当您发布此帖子时、我正在查看您的帖子。 这是我要为 IPU1推荐的唯一更改:)

    我将在几天内返回到您的问题、即删除配置中的节拍代码。 我的一位同事推荐了这种更改、可能是因为与 Linux 中的计时器使用冲突、但我将确认他休假回来后。

    另一个问题可能是需要根据资源虚拟地址映射调整 GPtimer、存储器映射。  

    请继续、将问题标记为已解决并关闭 TT。 如果您有任何其他问题、请随时打开新主题

    此致、
    Rahul

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

    Rahul、

    我扩展了 UART 示例以设置 MCSPI4。 我已将其添加到 board_init():

    CSL_FINST (l4PerCmReg -> CM_L4PER_MCSPI4_CLKCTRL_REG、
    L4PER_CM_CORE_COMPONENT_CM_L4PER_MCSPI4_CLKCTRL_REG_MODULEMODE、ENABLE);

    while (CSL_L4PER_CM_CORE_COMPONENT_CM_L4PER_MCSPI4_CLKCTRL_REG_IDLEST_FUNC!=
    CSL_FEXT (l4PerCmReg -> CM_L4PER_MCSPI4_CLKCTRL_REG、
    L4PER_CM_CORE_COMPONENT_CM_L4PER_MCSPI4_CLKCTRL_REG_IDLEST);

    然后、创建了一个 SPI_TEST 任务、该任务初始化 SPI 并发送测试数据-  

    spi_init();

    SPI_Params spiParams;/* SPI params 结构*/
    SPI_Handle handle;/* SPI handle *
    SPI_Transaction 事务;/* SPI 事务*/


    SPI_Params_init (&spiParams);

    //设置参数  
    spiParams.transferMode = SPI_MODE_BLOCKING;
    spiParams.transferTimeout = SPI_WAIT_FOREVER;
    spiParams.mode = SPI_MASTER;
    spiParams.bitrate = 50000;
    spiParams.transferCallbackFxn =空;
    spiParams.dataSize = 8;
    spiParams.frameFormat = SPI_POL1_PHA0;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /*打开 MCSPI4 */
    Handle = SPI_open (3、&spiParams);

    IF (句柄)

    System_printf ("SPI opened:%x\n"、handle);

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    while (句柄)

    //包含要发送的数据的缓冲区
    uint8_t txBuf[10U]= {0xAAU、0xBBU、0xCCU、0xDDU、0xEEU、 0xFFU、0x01、0x02、0x03、0x04};

    //包含接收数据的缓冲区
    //uint8_t rxBuf[1U]={0xFFU};

    transaction.count = 1;
    transaction.txBuf =&txBuf[0];
    transaction.rxBuf =空;  

    System_printf ("SPI 发送数据...\n");

    Int RetVal = SPI_TRANSFH (handle、&transaction);//从不返回此方法
    如果(!RetVal)

    System_printf ("SPI 无法发送数据:%d \n"、RetVal);

    其他

    System_printf ("SPI sent data:%d \n"、RetVal);

     

    我测试了此代码,SPI_open 成功,但似乎从未从 SPI_transfer()调用返回。 我在逻辑分析仪上看到数据被发出、但 SCLK 和 cs0不会切换回。 我验证了器件树是否启用了 SPI4。 我已经更新了 SPI_SoC.c 以包含 CSL_IPU_MCSPI4_regs 的0x20000000偏移量、并将其添加到 XDC 脚本中:

     VAR SPI = XDC.loadPackage ('ti.drv.SPI');

    谢谢、

    Jimit

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

    在将其集成到 IPC 环境中之前,您是否通过在 IPU 上独立运行来测试代码? 我会将其用作起点、并将调试与 SPI 驱动器或 IPC 相关的问题隔离开来。

    另一件事是、正如我们在 wiki 上指出的那样。 如果从 IPU 中使用 SPI 实例、则需要在器件树中禁用它、以便 IPU 可以像使用 UART 实例一样控制资源。 您能否在 Linux 设备树中禁用此功能并尝试。 在 ARM Linux 中、我们只需要 Uboot 即可为 SPI4正确设置引脚多路复用器。

    由于您不使用 DMA、MCSPI_primeTransfer_v1将用于传输数据。 请查看该函数并尝试隔离该函数调用中的问题。 如果您使用的是中断模式、则还需要确保

    另一个可能需要检查的地方是、对于我们在该器件的 SDK 中提供的 SPI3示例、我们调用 MCSPI_Board_crossbarInit、它设置交叉开关和某些时钟启用、即使使用 SPI4代码也可能需要这些启用。 请注意、这可能不是由执行的

    此致、
    Rahul