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.

[参考译文] AM6442:在具有 SDK 11.00.09.04 的 Linux 下、SPI1/通道 1 不能用于 spidev

Guru**** 2429850 points
Other Parts Discussed in Thread: AM6442

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1545418/am6442-spi1-channel-1-is-not-working-with-spidev-under-linux-with-sdk-11-00-09-04

器件型号:AM6442


工具/软件:

您好:

我尝试获取在 Linux 下运行的 AM6442 的 SPI1 模块。 虽然我在第一个信道 RESP 方面似乎很成功。 与 SPI1_CS0 关联的通道 0、使通道 1 与 SPI1_CS1 关联时也存在一些问题。

到目前为止、我做了什么:

我确实遵循了官方文档所说的内容: https://software-dl.ti.com/processor-sdk-linux/esd/AM64X/11_00_09_04/exports/docs/linux/Foundational_Components /内核/ Kernel_Drivers / SPI.html

但是,我发现现实中的情况有些不同。

首先、我扩展了  Linux 器件树文件 board-support/ti-linux-kernel-6.12.17+git-ti/arch/arm64/boot/dts/ti/k3-am642-evm.dts 的 main_pmx0-section 、如下所示:

    SPI1_PINS_s0:SPI1_PINS_s0{
        pinctrl-single、pins =<
            AM64X_IOPAD (0x021c、PIN_OUTPUT、0)/* SPI1_CS0 */
            AM64X_IOPAD (0x0220、PIN_OUTPUT、0)/* SPI1_CS1 *
            AM64X_IOPAD (0x0224、PIN_OUTPUT、0)/* SPI1_CLK *
            AM64X_IOPAD (0x0228、PIN_OUTPUT、0)/* SPI1_MOSI */
            AM64X_IOPAD (0x022c、PIN_INPUT_PULLDOWN、0)/* SPI1_MISO */
        >;
    };

这是为了定义直接的 PAD 函数、该函数也适用于通道 0。 这应该没问题。

接下来、我在器件树文件的末尾附加了以下块:

&MAIN_SPI1{
    状态=“正常“;
    pinctrl-names =“default";“;
    pinctrl-0 =<&SPI1_pins_s0>;
    TI、pindir-d0-out-D1-in;
    spidev@0{
        SPI-max-frequency =<24000000>;
        reg =<0>;
        compatible =“Rohm、dh2228fv“;
        数据大小=<8>;
    };
    Spidev@1{
        SPI-max-frequency =<24000000>;
        reg =<1>;
        compatible =“Rohm、dh2228fv“;
        数据大小=<8>;
    };
};

我的理解是、这定义了两个 spidev 通道 0 和 1。 这里分配给 reg 的值与相应的信道编号匹配似乎很重要。

使用 make linux-dtbs 构建新的设备树 是完美无瑕的。 相应地安装相应的.dtb 文件并引导系统后、有一个新的器件文件/dev/spidev2.0 可用。 实际上、应该也 可以在/dev/spidev2.1 上获取。 但事实并非如此。

当我扫描 dmesg 以查找与 SPI 相关的条目时、我找到这些条目:

[  21.390687] SPI_MASTER SPI2:SPI_DEVICE 寄存器错误/bus@f4000/SPI@20110000/spidev@1
[  21.484859] SPI_MASTER SPI2:无法为/bus@f4000/SPI@20110000/spidev@1 创建 SPI 器件

因此、显然在使第二个通道正常工作时存在一些问题。

问题是这是 spidev 驱动程序中的一些错误还是某些不受支持的功能、还是我在这里做了什么?

除此之外、我可以说、通过内核源代码 (tools/spidev_test.c) 中的 spidev 测试程序处理通道 0 就像处理通道 0 一样。   

谢谢、

Mario

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

    你好 Mario、你的方法看起来还可以。 有一件事我不知道它是否引起了问题、但值得尝试的是将 两个通道的“兼容“从特定硬件器件 (ROHM DH2228FV) 更改为通用器件“spidev"</s>“

    自:compatible =“Rohm、dh2228fv“; -->至:compatible =“linux、spidev“;

    谢谢您、

    Paula

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

    您好 Paula、

    感谢您的研究。

    很遗憾、您提议的尝试不起作用。 通过 dmesg 报告的错误消息是非常相同的。 但是、最重要的是、/dev/spidev2.0 也会消失、因此通过此设置、即使是通道 0 也无法再访问。 尽管我  在 dmesg 中没有看到与 spidev@0 相关的错误消息

    许多问候、

    Mario

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

    你好 Mario、谢谢检查。 今天稍后我将介绍。 同时,如果你只使用一个“spidev"与“与通道“1"的“的问题,它是有效的吗?

        spidev@0{
            SPI-max-frequency =<24000000>;
            reg =<1>;
            compatible =“Rohm、dh2228fv“;
            数据大小=<8>;
        };

    谢谢您、

    Paula

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

    您好 Paula、

    当我在 make linux-dtbs 期间收到警告/错误时

     DTC   arch/arm64/boot/dts/ti/k3-am642-evm.dtb
    arch/arm64/boot/dts/ti/k3-am642-evm.dts:988.18-994.11:警告 (spi_bus_reg):/bus@f4000/SPI@20110000/spidev@0:SPI 总线单元地址格式错误、预期为“1"</s>“

    当我使用该设置运行 Linux 时、dmesg ist 会显示以下错误:

    [  21.697307] SPI_MASTER SPI2:SPI_DEVICE 寄存器错误/BUS@f4000/SPI@20110000/spidev@0
    [  21.781290] SPI_MASTER SPI2:无法为/bus@f4000/SPI@20110000/spidev@0 创建 SPI 器件

    当然、/dev 下的 SPI 与它无关。

    顺便说一下、当我翻转指定(即 spidev@1 和 reg =<0>)时 、我正在接收  

     DTC   arch/arm64/boot/dts/ti/k3-am642-evm.dtb
    arch/arm64/boot/dts/ti/k3-am642-evm.dts:988.18-994.11:警告 (spi_bus_reg):/bus@f4000/SPI@20110000/spidev@1:SPI 总线单元地址格式错误、预期为“0"</s>“

    制作 Linux-dtb 期间。 Linux 未通过此处的 dmesg 报告错误、并且存在/dev/spidev2.0。 不过、我还没有检查对/dev/spidev2.0 的访问是否会激活 SPI_CS1。

    到目前为止、我的观察是、分配给 reg 的值必须等于@之后给出的值。 即 spidev@X 对应于 reg =  

    Mario

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

    “我想,我想去见你妈妈。

        Spidev@1{
            SPI-max-frequency =<24000000>;
            reg = <1>;
            compatible =“Rohm、dh2228fv“;
            数据大小=<8>;
        };

    我只想看看 通道 1 是否只有一个 spidev 可以正常工作、就像通道 0 一样。 或者 CS1 缺少其他内容。 如果你有一个机会来测试它,让我知道。 在此期间,我将尝试寻找其他信息,可以帮助我们

    Paula

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

    您好 Paula、

    这也不起作用。 此时将显示 dmesg  

    [  20.584311] SPI_MASTER SPI2:SPI_DEVICE 寄存器错误/BUS@f4000/SPI@20110000/spidev@1
    [  20.593998] SPI_MASTER SPI2:无法为/bus@f4000/SPI@20110000/spidev@1 创建 SPI 器件

    并且既没有/dev/spidev2.0(如这里预期的那样)、也没有/dev/spidev2.1.

    因此、问题似乎与此处的通道 1 有关。

    Mario

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

    嗨、Mario、  

    我找到了此有关启用 SPI CS1 inAM62 的常见问题解答: (+)【常见问题解答】SK-AM62:如何在 AM625 — 处理器论坛-处理器 — TI E2E 支持论坛中为 MCU_SPI0 CS1 配置 spidev

    因此、通过遵循此常见问题解答、我认为如果您  通过 向“添加“ti、spi-num-cs =<2>;“来修改 k3-am64-main.dtsi、那么这个常见问题解答应该有效。 main_spi1"

    请告诉我

    谢谢您、

    Paula

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

    您好 Paula、

    这将引领我们前进!

    不过、我没有将其添加到  k3-am64-main.dtsi 中、但我将其集成到 k3-am642-evm.dtb 中 、以保持较少的触及文件数量。

    因此、 k3-am642-evm.dtb 中的 main_SPI1 条目如下所示:

    &MAIN_SPI1{
        状态=“正常“;
        pinctrl-names =“default";“;
        pinctrl-0 =<&SPI1_pins_s0>;
        TI、pindir-d0-out-D1-in;
        TI、spi-num-cs =<2>;
        spidev@0{
            SPI-max-frequency =<24000000>;
            reg =<0>;
            compatible =“Rohm、dh2228fv“;
            数据大小=<8>;
        };
        Spidev@1{
            SPI-max-frequency =<24000000>;
            reg =<1>;
            compatible =“Rohm、dh2228fv“;
            数据大小=<8>;
        };
    };

    这会清除 dmesg 中报告的错误/dev/spidev2.1 也存在、就看起来来说、SPI 接口上的信号没有问题。

    所以我想我们可以认为这是“解决的“。

    顺便说一句,我没有做进一步的分析关于“兼容的“条目,我离开了,因为它是。 无论哪种情况、我相信有关 SPI 的官方 SDK 文档都需要进行一些更新。 例如“spidev@1“和“reg =<0>“之间存在差异。 我不确定这是否适用于某些受支持的微控制器、但对于 6442、它肯定不起作用。

    感谢您的支持!

    Mario