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.

[参考译文] Linux/DM388:如何在内核4.4的器件树中启用 SPI 接口?

Guru**** 2551110 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/598118/linux-dm388-how-to-enable-the-spi-interface-from-the-device-tree-of-kernel-4-4

器件型号:DM388
Thread 中讨论的其他器件: SysConfig

工具/软件:Linux

您好!

我需要使用 SPI 接口来控制电机。

我尝试任何可能的方法、但 仍然无法识别。

您能给我一个启用它的示例吗?

--------------------------------------------------

这来自 ti81xx.dtsi

mcspi1:mcspi@30000{
            兼容="ti、omAP4-mcspi";
            #address-cells =<1>;
            #size-cells =<0>;
            ti、hwmids ="mcspi1";
            TI、SPI-num-cs =<4>;
            reg =<0x30000 0x1000>;
            中断=<65>;
            DMA =<&EDMA 16 &EDMA 17
               EDMA 18 EDMA 19 (&E)
               EDMA 20 EDMA 21 (&E)
               EDMA 22 EDMA 23>(&E);
            dma-names ="tx0"、"rx0"、"tx1"、"rx1"、
               "tx2"、"rx2"、"TX3"、"rx3";
            STATUS ="禁用";
         };

         mcspi2:mcspi@1A0000{
            兼容="ti、omAP4-mcspi";
            #address-cells =<1>;
            #size-cells =<0>;
            ti、hwmids ="mcspi2";
            TI、SPI-num-cs =<2>;
            reg =<0x1A0000 0x1000>;
            中断=<125>;
            DMA =<&EDMA 42 &EDMA 43
               EDMA 44 EDMA 45>(&E);
            dma-names ="tx0"、"rx0"、
               "tx1"、"rx1";
            STATUS ="禁用";    
         };

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

    您应该在自定义 DTS 文件中将状态从禁用更改为启用。 例如、请参阅 DM38x TI 电路板 dts 文件 dm38x-csk.dts、例如、请参阅如何启用 uart1。 您应该对 mcspi1/2执行相同的操作

    uart1{(&U)
    状态="正常";
    };

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

    您好、Pavel、

    我已重新编写 SPI 设备驱动程序。  

    现在,我可以看到正确的 SPI 接口。

    但是、如果我想从 DM388的 SPI 控制器向我的从器件发送1个字节、它总是显示错误消息" spidev 1.0:TXS 超时"。  

    (它运行 PIO 模式、在 DMA 模式下不成功。)

    我跟踪 SPI 控制器的新驱动程序(SPI-OMAP2-mcspi.c)。 我看不到任何有关启用/禁用时钟的功能(例如、 从 IPNC_RDK 3.8开始执行 ick 和 fck 操作)。

    您是否知道如何在 设备树中启用 SPI 时钟?

    谢谢。

    S.K.

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

    启动时(在用户空间中)、使用 devmem2工具检查以下寄存器:

    CM_ALWON_SPI_CLKCTRL -如果时钟被启用、[1:0] MODULEMODE 中的值应该为0x2、[17:16] IDLEST 应该为0x0
    MCSPI_SysConfig -如果能够成功读取/写入该寄存器(或任何 McSPI 寄存器)、则启用时钟

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

    您好 、Pavel、

     CM_ALWON_SPI_CLKCTRL

    root@ti81xx:/dev/# devmem2 0x48181590
    /dev/mem 已打开。
    映射到地址 bb6f86000的内存。
    在地址0x48181590 (b6f86590):0x00030000处读取

    ----------------------------------------------------

    2. MCSPI_SysConfig

    root@ti81xx:/dev/# devmem2 0x48030110
    /dev/mem 已打开。[14770.449131]未处理故障:在 bb6f6f110上非线性获取(0x1018)上的外部中止
    [14770.458045] PgD = c26d8000
    [14770.460763][b6f6f110]* PgD=81966831、* Pte=48030303、* Ppte=48030a33

    映射到地址 bb6f6f000的内存。
    总线错误(转储内核)

    ----------------------------------------------------

     CM_ALWON_I2C_0_CLKCTRL

    root@ti81xx:/dev/# devmem2 0x48181564
    /dev/mem 已打开。
    映射到地址 bb6f72000的内存。
    在地址0x48181564 (0xb6f72564)上读取:0x00000002

    ----------------------------------------------------

    4. 对于 TRM 文档、SPI 和 I2C 使用相同的时钟源。

       我可以找到器件树的时钟文件"ti81xx-clocks.dtsi"。

      I2C 和 SPI 对时钟源使用相同的设置。

      I2C 时钟启用、但 SPI 时钟未启用。

      你有什么想法吗?

     

    谢谢。

    S.K.

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

    您是否更新了 dm38x-csk.dts 文件以在其中添加 SPI 支持? 默认情况下、该文件支持 I2C、但不支持 SPI。 请将您的 DTS 文件(dm38x-csk.dts 或您自己的自定义 DTS 文件)发送给我以供查看。

    在 ti81xx-clocks.dtsi 文件中处理 SPI 和 I2C 时钟、您只需在主 DTS 文件中启用 SPI 即可。

    /* I2C02功能时钟(最终)*/
    i2c02_ck:i2c02_ck{
    #clock-cells =<0>;
    兼容="ti、栅极时钟";
    时钟=<&sysclk10_ck>;
    TI、bit-shift =<1>;
    reg =<0x1564>;// CM_ALWON_I2C_0_CLKCTRL *

    /* I2C1功能时钟(最终)*/
    i2c1_fck:i2c1_fck{
    #clock-cells =<0>;
    兼容="固定因子时钟";
    时钟=<&i2c02_ck>;
    时钟多路复用=<1>;
    clock-div =<1>;
    };

    /* SPI0功能时钟(最终)*/
    mcspi1_fck:mcspi1_fck{
    #clock-cells =<0>;
    兼容="ti、栅极时钟";
    时钟=<&sysclk10_ck>;
    TI、bit-shift =<1>;
    REG =<0x1590>;// CM_ALWON_SPI_CLKCTRL *
    };

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

    您好,

    I2C 和 SPI 对时钟源使用相同的设置。

      I2C 时钟启用、但 SPI 时钟未启用。

    SPI 和 I2C 或相同接口时钟。 但是,SPI 的功能时钟是"mcspi1_fck"。
    您可以通过 TRM 了解功能时钟和接口时钟的差异。

    谢谢、此致、

    Vishwanath Patil

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

    您好、Pavel、

    [dm38x-csk.dts ]

    SPI_0和我的电机驱动器的设置。

    spi0_pins:pinmux_spi0_pins{
          pinctrl-single、引脚=<
             0x14C (上拉| MUX_MODE0)
             0x148 (上拉| MUX_MODE0)
             0x144 (上拉| MUX_MODE0)
             0x140 (上拉| MUX_MODE0)
          >;
       };

    mcspi1{(&M)
       pinctrl-names ="default";
       pinctrl-0 =<&spi0_PINs>;
       
       状态="正常";

       电机:电机@0{
          兼容="MIIS、MOTOR";
          reg =<0>;
          SPI-max-frequency =<5000000>;
       };
    };

    e2e.ti.com/.../dm38x_2D00_csk.dts.zip

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

    S.K.

    您能否尝试以下3种方法:

    1.在 ti81xx.dtsi 文件中添加以下行代码:

    别名{
    Serial0 = uart1;
    Ethernet0 =&cpsw_emac0;
    i2c0 =&i2c1;
    i2c1 =&i2c2;
    USB0 = usb0;
    phy0 = usb0_phy;
    + mcspi0=&mcspi1;

    };

    2.在 ti81xx.dtsi 文件中更新此行代码:

    mcspi1:mcspi@30000{
    兼容="ti、omAP4-mcspi";
    #address-cells =<1>;
    #size-cells =<0>;
    ti、hwmids ="mcspi1";
    TI、SPI-num-cs =<4>;
    reg =<0x30000 0x1000>;
    中断=<65>;
    DMA =<&EDMA 16 &EDMA 17
    EDMA 18 EDMA 19 (&E)
    EDMA 20 EDMA 21 (&E)
    EDMA 22 EDMA 23>(&E);
    dma-names ="tx0"、"rx0"、"tx1"、"rx1"、
    "tx2"、"rx2"、"TX3"、"rx3";
    -status ="已禁用";
    +status ="确定";
    };

    3.同时尝试1和2

    此致、
    帕维尔

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

    您好、Pavel、

    我试过它们。 结果是相同的。

    SPI 功能时钟仍然未启用。

    我认为问题在于 ti、hwmids ="mcspi1"、 但我没有太多时间来跟踪它们。

    (ti/ipnc_RDK-3.9.0/source/ti_tools/ipnc_spm_arago/kernel/arch/arm/mach-omap2/omap_hwmod_81xx_data.c)

    我尝试直接访问寄存器 CM_ALWON_SPI_CLKCTRL 以 在内核模式下启用、但它们不起作用。

    //method1.

    //OMA_writel (0x2、0x48181590);

    //method2.


    unsigned long * reg;
    reg = ioremap_nocache (0x48181590、4);
    *reg =0x02;
    iounmap(reg);

    您知道怎么做吗?

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

    [引用 user="S.K. 黄"]

    SPI 功能时钟仍然未启用。

    我认为问题在于 ti、hwmids ="mcspi1"、 但我没有太多时间来跟踪它们。

    [/报价]

    我不知道为什么这不起作用。 通过下面的链接、您可以看到这是启用模块(即 McSPI1)的官方方式:

    您可以检查是否为 McSPI1调用了"__Of_DEVICE_IS_Available ()"函数:

    kernel/drivers/of /base.c

    /**
     * __of _device_is 可用-检查器件是否可用
     *
     * @器件:用于检查可用性的节点、已锁定
     *
     如果 status 属性不存在或设置为"ok"或"ok"、则返回 true、
     * 否则为 false
     *

    [引用 user="S.K. 黄"]

    我尝试直接访问寄存器 CM_ALWON_SPI_CLKCTRL 以 在内核模式下启用、但它们不起作用。

    //method1.

    //OMA_writel (0x2、0x48181590);

    //method2.


    unsigned long * reg;
    reg = ioremap_nocache (0x48181590、4);
    *reg =0x02;
    iounmap(reg);

    您知道怎么做吗?

    [/报价]

    请参阅以下 e2e 帖子:

    为了写入寄存器、您可以使用__raW_writel (value、addr);

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

    你(们)好  

    我可以使用 ioremap 方法读取/写入寄存器。

    我尝试启用 SPI 函数时钟以避免此问题。 (CM_ALWON_SPI_CLKCTRL)

    第1步:我读取寄存器并获取值:0x00030000。 (正确)

    第2步:我向寄存器写入值0x2。

          我读取它并获取值 :0x00030002。(错误)

    17-16. IDLEST R 0h 模块空闲状态。
    0x0 (读取)=模块功能齐全、包括 OCP
    0x1 (读取)=模块正在执行转换:唤醒、睡眠、或者
    堕胎
    0x2 (读取)=模块处于空闲模式(仅 OCP 部分)。 它的功能是 IF
    使用单独的功能时钟
    0x3 (读取)=模块被禁用、无法访问

    步骤3:

    我转到 shell 层并读取它。 值为  0x00030000。

    我是否需要在内核模式下设置其他寄存器?

    您知道如何设置接口时钟吗? (它是否调用 ick?)

    谢谢。

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

    [引用 user="S.K. Huang"]我读取它并得到值 :0x00030002。(错误)

    您需要等待一段时间、因为 SPI 模块正在从禁用状态转换为启用状态。

    您还可以尝试通过时钟框架启用 mcspi1_fck:

    [引用 user="S.K. Huang"]您知道如何设置接口时钟吗? (是否调用 ick?)

    默认情况下应启用该功能。 McSPI 连接到 L4慢速互连。 检查以下寄存器值以验证 sysclk6/mcspi_ick 是否打开:

    CM_ALWON_SYSCLK6_CLKSTCTRL

    CM_ALWON_L4LS_CLKCTRL

    此致、
    帕维尔

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

    [引用 user="S.K. Huang"]我是否需要在内核模式下设置其他寄存器?

    检查 USB DPLL (USBPLL_x 寄存器)、它应该被配置和锁定。 USB DPLL 提供 sysclk10、后者提供 mcspi1_fck。

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

    您好、黄

    我想向您添加一些详细信息、

    SPI1的接口时钟(节拍)已经启用。

    在控制台上、首先尝试此操作、

    1) 1)读取 SPI 功能性时钟控制寄存器。

    $devmem2 0x48181590

    2) 2)在不启用时钟的情况下尝试读取 SPI 控制寄存器

    $devmem2 0x48030000

    由于未启用功能时钟、因此预计会出现崩溃页面故障。

    3) 3)立即启用时钟、

    $devmem2 0x48181590 w 0x00030002

    4) 4)现在尝试读取 SPI 控制寄存器

    $devmem2 0x48030000

    您应该能够读取寄存器。

    现在、对于器件节点、

    mcspi1{(&M)
       pinctrl-names ="default";
       pinctrl-0 =<&spi0_PINs>;
       
       状态="正常";

       电机:电机@0{
          兼容="MIIS、MOTOR";
          reg =<0>;

        时钟=<&mcspi1_fck>;

           时钟名称="Fck";
          SPI-max-frequency =<5000000>;
       };
    };


    在您的驱动器中、

    CLK = devm_clk_get (&pdev->dev、"Fck");

    clk_prepare_enable (clk);或//clk_prepare (clk);和 clk_enable (clk);

    谢谢、此致、

    Vishwanath Patil