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:spi_sync () 中 1 秒超时

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1649459/am625-1-second-timeout-in-spi_sync

器件型号: AM625

您好 TI、

我希望您可以帮助我解决以下问题:
我构建了一个用于控制 LED 的驱动器、该驱动器可以与 apa102 LED 类似链接在一起。

所以我的驱动程序工作,与 PIO 但我的内核线程使用了很多周期,我想切换到 DMA 但注意到一个问题,如果我看我的逻辑分析仪输出,我看到在 PIO 模式下数据不是很好的打包,但它是所有完成(有时一个缺口,因为处理器可能会中断内核进程),一切都好。
切换到 DMA 时、数据流在传输之间有很大的差距、这一差距几乎正好是 1 秒给出或需要几毫秒。

我不知道为什么这正是发生的,希望你能帮我。

驱动程序是帧缓冲驱动程序和 LED 驱动程序、
我已经将帧缓冲驱动程序设置为可内存映射、并且它使用一个由计时器每 33ms 触发一次的内核线程(以每秒获得 30 个数据包)。
这通过 FRAME_TIMER_CALLBACK 进行
这会唤醒 FRAME_TASK(即 FRAME_THREAD_fn)
数据是在 RGBLED_write () 内部被复制到私有缓冲区中的数据、该缓冲区用于对数据格式进行编码、然后通过 SPI 传输数据。
此私有缓冲区分配有 devm_kzalloc ()
SPI 设置为每字 8 位、总共发送 248 个字节、是否仅发送这一问题? 我的 DMA 设置可能出错了吗、很难找到正确的数字。
是因为我使用 GPIO 作为芯片选择吗?

 /* thread */
static int frame_thread_fn(void *data) {
    // struct kitt_fb_par *par = data;
    set_freezable();
    while (!kthread_should_stop()) {
        try_to_freeze();
        set_current_state(TASK_INTERRUPTIBLE);
        schedule();
        if (kthread_should_stop())
            break;
        /* do frame work */
        if (led_spi)
            rgbled_write(led_spi, (uint32_t *)videomemory, 60);
    }
    return 0;
}
static unsigned long setup_frame_thread(struct kitt_fb_par *par) {
    pr_info("Setting up a frame thread.\n");
    frame_thread = kthread_create(frame_thread_fn, par, "frame thread");
    if(frame_thread) {
        par->frame_task = frame_thread;
        wake_up_process(frame_thread);
        return 0;
    }

    pr_err("Could not create and run the frame thread.");
    return -ENOMEM;
}

static int probe(..) {
..
    hrtimer_init(&par->frame_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
    par->frame_timer.function = frame_timer_callback;
    hrtimer_start(&par->frame_timer, ms_to_ktime(33), HRTIMER_MODE_REL);
..
}



dmesg 日志中没有错误消息。
我发现问题的方式是关于 spi_sync()、方法是用 ktime() 对其进行计时

更多器件信息:

Linux version 6.6.138-7.2.0-devel (oe-user@oe-host) (aarch64-tdx-linux-gcc (GCC) 13.3.0, GNU ld (GNU Binutils) 2.42.0.20240723) #1 SMP PREEMPT Fri May  8 07:27:41 UTC 2026
Machine model: Toradex Verdin AM62 WB on Verdin Development Board

root@verdin-am62-15599560:~# tdx-info

Software summary
------------------------------------------------------------
Bootloader:               U-Boot
Kernel version:           6.6.138-7.2.0-devel #1 SMP PREEMPT Fri May  8 07:27:41 UTC 2026
Kernel command line:      root=PARTUUID=076c4a2a-01 ro rootwait console=tty1 console=ttyS2,115200 no_console_suspend rauc.slot=A
Distro name:              NAME="TDX Wayland with XWayland"
Distro version:           VERSION_ID=7.2.0-devel-20251204100250-build.0
Distro variant:           -
Hostname:                 verdin-am62-15599560
------------------------------------------------------------

Hardware info
------------------------------------------------------------
HW model:                 Toradex Verdin AM62 WB on Verdin Development Board
Toradex version:          0072 V1.2A
Serial number:            15599560
Processor arch:           aarch64
------------------------------------------------------------
root@verdin-am62-15599560:~#

root@verdin-am62-15599560:~# cat /sys/kernel/debug/dmaengine/summary
dma0 (485c0100.dma-controller): number of channels: 48
 dma0chan0    | 2b00000.audio-controller:tx (MEM_TO_DEV, tchan0 [0x2000 -> 0xc500], PDMA[ ACC32 BURST ], TR mode)
 dma0chan1    | 2b00000.audio-controller:rx (DEV_TO_MEM, rchan6 [0x4500 -> 0xa006], PDMA[ ACC32 BURST ], TR mode)
 dma0chan2    | in-use (MEM_TO_MEM, bchan0)

dma1 (485c0000.dma-controller): number of channels: 35
 dma1chan0    | 20110000.spi:rx0 (DEV_TO_MEM, rchan0 [0x4304 -> 0x9000], rflow0, PDMA, Packet mode)
 dma1chan1    | 20110000.spi:tx0 (MEM_TO_DEV, tchan0 [0x1000 -> 0xc304], tflow0, PDMA, Packet mode)
 dma1chan2    | 40900000.crypto:rx1 (DEV_TO_MEM, rchan22 [0x7506 -> 0x9016], rflow43, PSI-L Native[ EPIB PSDsize:64 ], Packet mode)
 dma1chan3    | 40900000.crypto:rx2 (DEV_TO_MEM, rchan23 [0x7507 -> 0x9017], rflow44, PSI-L Native[ EPIB PSDsize:64 ], Packet mode)
 dma1chan4    | 40900000.crypto:tx (MEM_TO_DEV, tchan28 [0x101c -> 0xf501], tflow91, PSI-L Native[ EPIB PSDsize:64 ], Packet mode)
root@verdin-am62-15599560:~#

这位于 SPI 器件的器件树中:

&main_spi1 {
	#address-cells = <1>;
	#size-cells = <0>;
	status = "okay";

	dmas = <&main_pktdma 0xC304 0>, <&main_pktdma 0x4304 0>;
	dma-names = "tx0", "rx0";

	sparkled: spark-led@0 {
		compatible = "wurth,spark-led";

		reg = <0>;
		
		spi-max-frequency = <115264>;
		num-cs = <1>;
		cs-gpios = <&main_gpio1 93 GPIO_ACTIVE_HIGH>;
		spi-cs-high;

		vled-supply = <&reg_V5V0_LED>;
	};
};

希望你能帮助我朝着正确的方向,或有任何想法为什么这可能发生