SPI-Transaktions-Timeout Linux-Gerätetreiber

11

Ich stecke die letzten 3 Tage an einem Punkt fest.

Ich arbeite am eink Gerätetreiber mit msm8960 qualcomm Chipsatz.

Scenario: In der Datei: kernel / arch / arm / mach-msm / device-8960.c

Ich kann die use of spidm_channels" and "spidm_crci"und die entsprechenden Einträge nicht überprüfen . (Msm8960 pro) (aus einem Referenzcode kopiert) Wie kann ich überprüfen, ob die entsprechenden Werte start and endkorrekt sind? Ich habe ein Datenblatt für msm, kann aber keine Referenz finden.

Ich habe den folgenden Code hinzugefügt, um eine neue gsbi-Ressource in der Datei zu erstellen als:

static struct resource resources_qup_spi_gsbi9[] = {
    {
            .name   = "spi_base",
            .start  = MSM_GSBI9_QUP_PHYS,
            .end    = MSM_GSBI9_QUP_PHYS + SZ_4K - 1,
            .flags  = IORESOURCE_MEM,
    },
    {
            .name   = "gsbi_base",
            .start  = MSM_GSBI9_PHYS,
            .end    = MSM_GSBI9_PHYS + 4 - 1,
            .flags  = IORESOURCE_MEM,
    },
    {
            .name   = "spi_irq_in",
            .start  = GSBI9_QUP_IRQ,
            .end    = GSBI9_QUP_IRQ,
            .flags  = IORESOURCE_IRQ,
    },
    {
             .name   = "spidm_channels",
            .start  = 3,
            .end    = 4,
            .flags  = IORESOURCE_DMA,
    },
    {
            .name   = "spidm_crci",
            .start  = 12,
            .end    = 13,
            .flags  = IORESOURCE_DMA,
    }, 
};

Der Grund für diesen Zweifel ist, dass unsere DMA-Operation mit dem Fehler fehlschlägt: aus Protokollen:

<6>[    0.764932] wait_for_ready: I/F Ready.^M
<7>[    0.765176] s1d13522_ spi9.0: setup mode 0, 16 bits/w, 51200000 Hz max --> 0^M
<3>[    1.756630] spi_qsd spi_qsd.9: msm_spi_process_transfer: SPI transaction timeout^M

Wenn wir dann versuchen, eine andere DMA-Operation auszuführen, wird der folgende Fehler ausgegeben:

<3>[    6.773355] s1d13522if_cmd: wait_for_ready: I/F busy bit stuck^M
<7>[    6.775400] s1d13522_ spi9.0: setup mode 0, 16 bits/w, 51200000 Hz max --> 0^M
<4>[    6.775583] ------------[ cut here ]------------^M
<4>[    6.775614] WARNING: at /home/anshul_10605816/hip_mirror_2330_code/kernel        /lib/list_debug.c:32 __list_add+0x58/0x78()^M
<4>[    6.775644] list_add corruption. prev->next should be next (c0d5124c), but was 00100100. (prev=edf643b8).^M
<4>[    6.775675] Modules linked in:^M
<4>[    6.775766] [<c00149b8>] (unwind_backtrace+0x0/0x11c) from [<c007c818>] (warn_slowpath_common+0x4c/0x64)^M
<4>[    6.775827] [<c007c818>] (warn_slowpath_common+0x4c/0x64) from [<c007c8b0>] (warn_slowpath_fmt+0x2c/0x3c)^M
<4>[    6.775888] [<c007c8b0>] (warn_slowpath_fmt+0x2c/0x3c) from [<c02a9538>] (__list_add+0x58/0x78)^M
<4>[    6.775919] [<c02a9538>] (__list_add+0x58/0x78) from [<c001e3d4>] (start_ready_cmd+0x84/0x13c)^M
<4>[    6.775980] [<c001e3d4>] (start_ready_cmd+0x84/0x13c) from [<c001e704>] (msm_dmov_enqueue_cmd_ext_work+0x148/0x284)^M
<4>[    6.776041] [<c001e704>] (msm_dmov_enqueue_cmd_ext_work+0x148/0x284) from [<c0094e0c>] (process_one_work+0x27c/0x484)^M
<4>[    6.776072] [<c0094e0c>] (process_one_work+0x27c/0x484) from [<c0095224>] (worker_thread+0x210/0x3b0)^M
<4>[    6.776133] [<c0095224>] (worker_thread+0x210/0x3b0) from [<c00990c0>] (kthread+0x80/0x8c)^M
<4>[    6.776194] [<c00990c0>] (kthread+0x80/0x8c) from [<c000f108>] (kernel_thread_exit+0x0/0x8)^M
<4>[    6.776224] ---[ end trace da227214a82491b8 ]---^M
<3>[   11.766732] spi_qsd spi_qsd.9: msm_spi_process_transfer: SPI transaction timeout^M

Jede Hilfe wäre sehr dankbar.

Wenn weitere Codeinformationen erforderlich sind, lassen Sie es mich bitte wissen.

Anshul
quelle

Antworten:

1

Die Einrichtung der Ressourcen hängt von Ihrer Plattform ab, nicht nur vom Treiber.

Eine Idee könnte sein, Ihren SPI-Bus zu validieren, bevor Sie ihn direkt mit dem Zielchipsatz verwenden. Ich schlage vor, eine Spidev-Schnittstelle und einen User-Space-Code zu verwenden, um etwas auf den Bus zu senden und das Ergebnis auf einem logischen Analysator oder einem Oszilloskop zu beobachten. Normalerweise mache ich das, um neue Boards zu validieren.

Die Verfälschung von list_add ist verdächtig, aber an dieser Stelle ist es schwierig, mehr zu sagen.

Jean-Christian de Rivaz
quelle