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.

[参考译文] PROCESSOR-SDK-J722S:mcspi 从器件模式挂起?

Guru**** 2544110 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1556783/processor-sdk-j722s-mcspi-slave-mode-hang

器件型号:PROCESSOR-SDK-J722S


工具/软件:

您好!

我正在使用评估板上的 40 引脚用户扩展接头上的跳线测试 J722S 在环回 (MAIN_SPI2:MASTER <> MAIN_spi0:slave、或 MCU_spi0:master <> MAIN_spi0:slave) 配置中的 MCSPI 从模式。

当使用“spidev_test"程序“程序完成传输测试时、我似乎看到从机端倾向于在(看似)内核内等待时挂起。

命令读取通常如下所示。 环路计数为 500 时、测试有时会成功、但从器件侧卡在环路中间的某个位置时失败。

更改 SPI 时钟速度“delay"参数“参数后、删除“-v"选项“选项似乎没有太大帮助。

  master:
        (main_spi2)
        ./spidev_test -D /dev/spidev3.0  -s 500000 -S 32 -I 500 -v

        -OR-

        (mcu_spi0)
        ./spidev_test -D /dev/spidev1.0  -s 500000 -S 32 -I 500 -v

  slave:
        (main_spi0)
        ./spidev_test -D /dev/spidev2.0  -s 500000 -S 32  -I 500 -v


是否出现了类似这样的行为? 任何诊断提示都很受欢迎。

提前感谢!


跳线外观:


文件所示

e2e.ti.com/.../k3_2D00_j722s_2D00_evm_2D00_main_5F00_spi0_2D00_slave.dtso.txt


TI SDK 版本

ti-processor-sdk-linux-edgeai-j722s-evm-10_01_00_04

ti-processor-sdk-linux-edgeai-j722s-evm-11_00_00_08

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

    尊敬的 Kenji:

    很高兴再次与您合作。

    快速浏览 dtso、到目前为止它看起来很好。 我还没有深入研究引脚多路复用、但其他属性看起来不错。

    两个问题:

    1. 您能详细介绍一下跳线连接情况吗? 我想检查引脚多路复用是否存在差异
    2. 我看到 edgeai SDK 有两个版本。 如果我要在电路板上进行测试、是否优先选择使用哪个版本?

    此致。

    Takuma

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

    你好 Takuma、如果说日语、或者 Takuma San:)

    关于:电线布置

    下面是我在插入电缆时多次提到的手写 40 引脚接头和电路板。

    如果我做错了 、那么在这个图中、比起在电路板上实际的跳线引脚放置、我咨询的可能性更大。

    原始消息中的导线图片是在 MCU_spi0 用于与 MAIN_spi0 通信时、下面中的第二张导线图片是在 MAIN_SPI2 用于与 MAIN_spi0 通信时。

    这两种情况下的 mcu_spi0<>main_spi0 和 main_spi2<>main_spi0 的行为和失败方式相似、即前一到两百次迭代往往可以正常工作、直到在某个时候从器件侧卡住了。 根据测试参数、“数百“有时会变成“数十“、看似延迟可能(?)

    跳线有时被放置在 20 cm 扁平带状电缆的“另一端“上、以连接到用户扩展接头、如下图所示。





    我主要使用  10_01_00_04 进行测试;使用 11_00_08 进行轻度测试最初给我留下了一些更具弹性的印象、但毕竟没有太大差异。

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

    (可选)、下面是对原始 工具/spi/spidev_test.c 的一些本地修改、以查看在每个事务之间的主器件侧添加延迟是否可以防止挂起(diff 中的`-P`选项)。 毕竟这对我没有什么帮助 — FYI

    e2e.ti.com/.../spidev_5F00_test.c.diff.txte2e.ti.com/.../spidev_5F00_test.c_2D00_modified.txt 

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

    我的一些测试结果看起来像这样--在一个 50 计数的循环中、从端(图中的*shell2* emacs 缓冲区)卡在迭代 25 处。 -帧损坏如丢失的字节看不到。 (buffer *shell*是运行到完成的主设备)。

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

    尊敬的 Kenji-San:

    我将在结束时尝试、看看是否可以复制测试设置。 就我个人而言、我没有看到 McSPI 有时会成功,有时会失败的情况 — 通常是所有成功或全部失败-因此这是一种有点新的行为。

     否则、我之前查看了 硬件连接、但我看到两条 SPI 数据线中只有 1 条数据线连接。 这是有意的吗?

    此致、

    Takuma

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

    谢谢你、Takuma

    我同意。 观察到的偶尔故障使我认为问题可能是更多软件(时序?) 性质比硬件(电路板设置)问题。

    仅允许使用一个数据线 — 默认情况下,J722S EVM 板仅将 MAIN_spi0 的一条数据线路由到 40 引脚用户扩展头、除非需要填充或删除相应的寄存器。 对于当前的应用用例、我不需要从设备到主设备的流量、因此 EVM 板未修改。 (相应的 spidev_test 主侧仅按预期输出 0xff)

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

    RE:“不需要从器件到主器件数据“

     

    再次阅读,这可能是一个有点混乱的措辞:)

    。 我希望 MAIN_SPI2 (MASTER) 转 MAIN_spi0 (slave) 数据->安装跳线  

    。 我不需要 MAIN_SPI2(主器件)数据 MAIN_spi0(从器件)->不存在跳线  

    …μ s 这就是我想说的

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

    尊敬的 Kenji-San:

    我目前在 SPI2 从器件侧面临一些问题。 获得如下所示的分段故障:

    root@j722s-evm:~# ./spidev_test -D /dev/spidev3.0  -s 500000 -S 32 -I 5 -v
    spi mode: 0x0
    bits per word: 8
    max speed: 500000 Hz (500 kHz)
    [  211.835719] spidev spi3.0: RXS timed out
    TX | 67 C6 69 73 51 FF 4A EC 29 CD BA AB F2 FB E3 46 7C C2 54 F8 1B E8 E7 8D 76 5A 2E 63 33 9F C9 9A  |g.isQ.J.)......F|.T.....vZ.c3...|
    RX | 05 EF F7 00 E9 A1 3A E5 CA 0B CB D0 48 47 64 BD 1F 23 1E A8 1C 7B 64 C5 14 73 5A C5 5E 4B 79 63  |......:.....HGd..#...{d..sZ.^Kyc|
    [  212.843693] spidev spi3.0: RXS timed out
    TX | 66 32 0D B7 31 58 A3 5A 25 5D 05 17 58 E9 5E D4 AB B2 CD C6 9B B4 54 11 0E 82 74 41 21 3D DC 87  |f2..1X.Z%]..X.^.......T...tA!=..|
    RX | 05 EF F7 00 E9 A1 3A E5 CA 0B CB D0 48 47 64 BD 1F 23 1E A8 1C 7B 64 C5 14 73 5A C5 5E 4B 79 63  |......:.....HGd..#...{d..sZ.^Kyc|
    [  213.851667] spidev spi3.0: RXS timed out
    TX | 70 E9 3E A1 41 E1 FC 67 3E 01 7E 97 EA DC 6B 96 8F 38 5C 2A EC B0 3B FB 32 AF 3C 54 EC 18 DB 5C  |p.>.A..g>.~...k..8\*..;.2.<T...\|
    RX | 05 EF F7 00 E9 A1 3A E5 CA 0B CB D0 48 47 64 BD 1F 23 1E A8 1C 7B 64 C5 14 73 5A C5 5E 4B 79 63  |......:.....HGd..#...{d..sZ.^Kyc|
    [  214.859640] spidev spi3.0: RXS timed out
    TX | 02 1A FE 43 FB FA AA 3A FB 29 D1 E6 05 3C 7C 94 75 D8 BE 61 89 F9 5C BB A8 99 0F 95 B1 EB F1 B3  |...C...:.)...<|.u..a..\.........|
    RX | 05 EF F7 00 E9 A1 3A E5 CA 0B CB D0 48 47 64 BD 1F 23 1E A8 1C 7B 64 C5 14 73 5A C5 5E 4B 79 63  |......:.....HGd..#...{d..sZ.^Kyc|
    [  215.867615] spidev spi3.0: RXS timed out
    TX | 05 EF F7 00 E9 A1 3A E5 CA 0B CB D0 48 47 64 BD 1F 23 1E A8[  215.871787] Unable to handle kernel paging request at virtual address fffffffffffffff8
     1C 7B 64 C5 14 73 5A C5 5E 4B 79 63  |......:.....HGd..#...{d..[  215.885123] Mem abort info:
    sZ.^Kyc|
    RX | 05 EF F7 00 E9 A1 3A E5 CA 0B CB D0 48 47 64 BD 1[  215.893447]   ESR = 0x0000000096000006
    F 23 1E A8 1C 7B 64 C5 14 73 5A C5 5E 4B 79 63  |......:.....HGd[  215.902727]   EC = 0x25: DABT (current EL), IL = 32 bits
    ..#...{d..sZ.^Kyc|
    total: tx 0.2KB, rx 0.2KB
    [  215.913567]   SET = 0, FnV = 0
    [  215.920680]   EA = 0, S1PTW = 0
    [  215.923810]   FSC = 0x06: level 2 translation fault
    [  215.928674] Data abort info:
    [  215.931542]   ISV = 0, ISS = 0x00000006, ISS2 = 0x00000000
    [  215.937011]   CM = 0, WnR = 0, TnD = 0, TagAccess = 0
    [  215.942047]   GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
    [  215.947344] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000083142000
    [  215.954029] [fffffffffffffff8] pgd=0000000000000000, p4d=000000008353b003, pud=000000008353c003, pmd=0000000000000000
    [  215.964631] Internal error: Oops: 0000000096000006 [#1] PREEMPT SMP
    [  215.970883] Modules linked in: onboard_usb_dev rpmsg_ctrl rpmsg_char overlay cdns3 cdns_usb_common snd_soc_hdmi_codec spidev snd_soc_simple_card wave5 snd_soc_simple_card_utils videobuf2_dma_contig crct10dif_ce pci_endpoint_test phy_can_transceiver v4l2_mem2mem cfg80211 display_connector videobuf2_v4l2 cdns3_ti rtc_ti_k3 videobuf2_memops rti_wdt k3_j72xx_bandgap videobuf2_common ti_k3_r5_remoteproc videodev mc tidss sa2ul drm_dma_helper mcrc64 bluetooth drm_display_helper ecdh_generic sii902x ecc ti_k3_dsp_remoteproc ti_k3_common rfkill drm_kms_helper snd_soc_davinci_mcasp m_can_platform snd_soc_ti_udma m_can snd_soc_ti_edma snd_soc_ti_sdma omap_mailbox can_dev omap_hwspinlock snd_soc_tlv320aic3x_i2c snd_soc_tlv320aic3x spi_omap2_mcspi drm drm_panel_orientation_quirks backlight fuse ipv6
    [  216.040679] CPU: 1 UID: 0 PID: 1027 Comm: spidev_test Not tainted 6.12.17-ti-gcdcaeac783e3-dirty #3
    [  216.049709] Hardware name: Texas Instruments J722S EVM (DT)
    [  216.055266] pstate: 000000c5 (nzcv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
    [  216.062214] pc : complete+0x58/0x94
    [  216.065704] lr : complete+0x24/0x94
    [  216.069184] sp : ffff80008578bd10
    [  216.072486] x29: ffff80008578bd10 x28: ffff0008082e6300 x27: 0000000000000000
    [  216.079611] x26: 0000000000000000 x25: 0000000000000000 x24: 0000000000000000
    [  216.086736] x23: ffff0008035981a0 x22: ffff000804d1fc00 x21: 0000000000000000
    [  216.093860] x20: ffff000804f788b8 x19: 0000000000000000 x18: 0000000000000000
    [  216.100984] x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000000
    [  216.108108] x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000
    [  216.115232] x11: 0000000000000000 x10: 0000000000000000 x9 : 0000000000000000
    [  216.122356] x8 : ffff80008578bd38 x7 : 0000000000000000 x6 : 000000000000003f
    [  216.129480] x5 : ffff0008082e6300 x4 : 0000000000000000 x3 : 0000000000000001
    [  216.136605] x2 : 0000000000000000 x1 : 0000000000000003 x0 : ffff000804f788c0
    [  216.143730] Call trace:
    [  216.146166]  complete+0x58/0x94
    [  216.149301]  omap2_mcspi_target_abort+0x28/0x4c [spi_omap2_mcspi]
    [  216.155390]  spi_target_abort+0x24/0x38
    [  216.159222]  spidev_release+0xa8/0xe0 [spidev]
    [  216.163662]  __fput+0xc8/0x2d0
    [  216.166712]  __fput_sync+0x48/0x54
    [  216.170106]  __arm64_sys_close+0x38/0x7c
    [  216.174019]  invoke_syscall+0x48/0x10c
    [  216.177761]  el0_svc_common.constprop.0+0xc0/0xe0
    [  216.182456]  do_el0_svc+0x1c/0x28
    [  216.185763]  el0_svc+0x28/0x98
    [  216.188813]  el0t_64_sync_handler+0x120/0x12c
    [  216.193160]  el0t_64_sync+0x190/0x194
    [  216.196818] Code: 54000160 f9400a73 52800061 52800002 (f85f8260)
    [  216.202898] ---[ end trace 0000000000000000 ]---
    [  216.207502] note: spidev_test[1027] exited with irqs disabled
    [  216.213289] note: spidev_test[1027] exited with preempt_count 1
    Segmentation fault
    root@j722s-evm:~#
    

    您 在实施过程中是否看到类似的情况?  

    此致、

    Takuma

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

    感谢 Takuma San 对此的跟进。

    没有、我在测试过程中没有看到任何内核错误。 除设备树外、我的测试环境中没有修改任何 kenel 源代码、但内核.config (defconfig) 文件除外、如下所示。 (基本上只有一个条目`CONFIG_SPI_SLAVE=y`是相关变化):

    $ cd ti-processor-sdk-linux-edgeai-j722s-evm-10_01_00_04/board-support/ti-linux-kernel-6.6.44+git-ti
    $ git diff 541c20281af79a7df96bb94b4e3a923092d7ceff -- 	kernel/configs/ti_arm64_prune.config
    diff --git a/kernel/configs/ti_arm64_prune.config b/kernel/configs/ti_arm64_prune.config
    index fbdb3225671e..ec1f623c6bd3 100644
    --- a/kernel/configs/ti_arm64_prune.config
    +++ b/kernel/configs/ti_arm64_prune.config
    @@ -492,3 +492,19 @@ CONFIG_DVB_TDA665x=n
     CONFIG_DVB_DRX39XYJ=n
     CONFIG_DVB_CXD2099=n
     CONFIG_DVB_SP2=n
    +CONFIG_DYNAMIC_DEBUG=y
    +CONFIG_DEBUG_DRIVER=y
    +CONFIG_I2C_DEBUG_CORE=y
    +CONFIG_I2C_DEBUG_ALGO=y
    +CONFIG_I2C_DEBUG_BUS=y
    +CONFIG_TEST_DYNAMIC_DEBUG=y
    +CONFIG_SPI_SPIDEV=m
    +CONFIG_SPI_OMAP24XX=m
    +CONFIG_SPI_DEBUG=y
    +CONFIG_SPI_SLAVE_TIME=y
    +CONFIG_SPI_SLAVE_SYSTEM_CONTROL=y
    +CONFIG_CRAMFS=y
    +CONFIG_CRAMFS_BLOCKDEV=y
    +CONFIG_CRAMFS_MTD=y
    +CONFIG_ADXL345_SPI=m
    +CONFIG_AD5686_SPI=m
    $ cd ../../..
    $ cd ti-processor-sdk-linux-edgeai-j722s-evm-11_00_00_08/board-support/ti-linux-kernel-6.12.17+git-ti/
    $ git diff 34d0b070130a8cd2cddd9260389ad974e8cb8468 --	kernel/configs/ti_arm64_prune.config
    diff --git a/kernel/configs/ti_arm64_prune.config b/kernel/configs/ti_arm64_prune.config
    index e0023c8cf50f..b27a6e8735a3 100644
    --- a/kernel/configs/ti_arm64_prune.config
    +++ b/kernel/configs/ti_arm64_prune.config
    @@ -494,3 +494,4 @@ CONFIG_DVB_TDA665x=n
     CONFIG_DVB_DRX39XYJ=n
     CONFIG_DVB_CXD2099=n
     CONFIG_DVB_SP2=n
    +CONFIG_SPI_SLAVE=y
    $
    


    查看您的控制 台日志我注意到控制台消息:“`[ 211.835719] spidev spi3.0: Rxs timed out`“

    我想知道您的从站总线是否不在 DMA 下运行、而是在 PIO 模式下运行、因为该消息看起来属于 PIO 相关功能...


     grep -n 'RXS timed out' drivers/spi/spi-omap2-mcspi.c
    737:					dev_err(&spi->dev, "RXS timed out\n");
    750:							"RXS timed out\n");
    786:					dev_err(&spi->dev, "RXS timed out\n");
    799:							"RXS timed out\n");
    835:					dev_err(&spi->dev, "RXS timed out\n");
    848:							"RXS timed out\n");
    $ 

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

    哎呀、抱歉收回了 PIo-vs-dma 注释、把我自己的 MCU_spi0 混淆了、 支持仅 DMA、而不支持仅 Pio。 这是仅 Pio!

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

    关于:   #define DMA_MIN_Bytes           160  (DMA 与 Pio)

    另外一个后续测试在大小“(-S)“大于“dma_min_bytes"时“时执行时执行,如下所示,但行为似乎相同 — 当迭代“(-i)“大于 1 时、从器件 (MAIN_spi0) 侧往往沿此方向挂起... -供参考。

      master: (mcu_spi0)
         ./spidev_test -D /dev/spidev2.0  -s 5000000 -S 1024 -I 16
    
      slave: (main_spi0)
         ./spidev_test -D /dev/spidev1.0  -s 5000000 -S 1024 -I 16


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

    再次浏览网络:我可能会看到相关的注释(我们可能会在 j722 秒后切换到 am62a-LP)。 它们是否适用?

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

    尊敬的 Kenji-San:

    我能够让 spidev 在 10.1 SDK 上的 J722S 上运行。 不知道 11.0 会发生什么。 我想我看到了与您的实验类似的结果、从站端似乎挂起并在从主站连续发送消息后返回相同的消息。  

    下面是一个示例、其中左侧是从器件、右侧是主器件。 对于从主器件一次写入 1 次迭代、从器件正常响应。 当针对超过 1 次迭代进行迭代时、从器件侧将挂起、主器件将继续接收最后接收到的字节。  

    我以前没有使用 spidev_test 的迭代版本进行测试、因此这可能是 spidev_test 应用程序本身的限制。 几天时间来研究这个问题。

    此致、

    Takuma

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

    很棒! 非常感谢 Takuma San、


    我同意复制的行为是足够接近...实际上是相同的可能。


    在内部、我们可能会看到为 spidev_test 程序的“-R (READY)“选项实现一些基于 GPIO 的备份、这可能会有所帮助、但这一过程仍在进行中、而且不确定。  


    https://git.ti.com/cgit/keystone-linux/linux/tree/Documentation/spi/spidev_test.c?id=b55f627feeb9d48fdbde3835e18afbc76712e49b#n147

    		case 'R':
    			mode |= SPI_READY;
    			break;


    希望我们对这方面的原始问题有一些见解 — 这将使我们的头脑得到很大的澄清!

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

    尊敬的 Kenji-San:

    我认为这是 spidev_test 的-i(用于迭代模式)选项的行为。 我制作了一个包含大量数字的大文本文件,并将其用作从端 spidev_test 的输入文件,直到文件结束才会看到挂起(我将“themoffile “作为实验文件中的最后一个文本)。 在文件末尾、spidev_test 应用程序会继续在 RX 中打印一个随机值、直到到达 TX 输入的结束、这与我们在 spidev_test 迭代模式下看到的类似。

    • ./spidev_test -D /dev/spidev3.0 -s 500000 -i test_text.txt -v &
    • ./spidev_test -D /dev/spidev1.0 -s 500000 -S 32 -i 10 -v

    结果日志:

    e2e.ti.com/.../spidev_5F00_experiment.txt

    此致、

    Takuma

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

    好的、明白了。 谢谢你、Takuma San、

    在从端使用“-I"的“的原始问题我认为归结为固有的竞态条件,当从端发出 SPI“ioctl ()“来执行其从端传输时,主端可能已经开始了帧传输;而 Linux 驱动程序不能正常地处理该情况。 删除从器件侧的“-I"选项“选项可消除该竞态条件... 对于对此进行分析而言、这实际上已经足够了。 让我们关闭此主题!

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

    尊敬的 Kenji-San:

    好的、明白。

    此致、

    Takuma