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/AM3352:SPI CS 信号始终为低电平

Guru**** 2782615 points

Other Parts Discussed in Thread: AM3352

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/683845/linux-am3352-spi-cs-signal-always-low

器件型号:AM3352

工具/软件:Linux

大家好。

我使用了 SDK 04.00.04 (linux-4.9.28+gitAUTOINC+e43d1050-geed43d1050)。  

当我使用 SPI0连接一个作为 SPI 从器件的芯片时、我发现 SPI0_CS 信号始终保持低电平。

我知道  OMAP2_mcspi_set_enable 函数会启用 SPI 通道、从而设置 OMAP2_MCSPI_CHCCTRL0寄存器的位0。 和 用于 设置 OMAP2_MCSPI_CHCONF0寄存器的 mcspi_WRITE_CHconf0函数。  OMAP2_MCSPI_CHCONF0的位20可以将 SPI0_CS 控制为低电平或高电平。

我在  mcspi_write_chconf0函数中添加 printk 以打印 OMAP2_MCSPI_CHCONF0寄存器、我发现在 Linux 运行后、OMAP2_MCSPI_CHCONF0寄存器的位20 (FORCE)为1 (ePol=1)、即 SPI0_CS 保持低电平。

但是、 当 SPI0不访问从器件时、我需要 SPI0_CS 保持在高电平、当访问从器件时、我需要变为低电平。 我认为这是正确的逻辑、但当我在 SDK 04.00.00.04中使用 SPI 驱动程序时、我无法获得该结果。

我想知道如何获得我想要的结果? SPI 驱动程序中是否存在任何错误?

以下是我关于 SPI 的 DTS:

spi0_pins:pinmux_spi0_pins{
pinctrl-single、pins =<
AM33XX_IOPAD (0x950、PIN_INPUT_PULLUP | MUX_MODE0)/* spi0_SCLK.spi0_SCLK *
AM33XX_IOPAD (0x954、PIN_INPUT_PULLUP | MUX_MODE0)/* spi0_d0.spi0_d0 *
AM33XX_IOPAD (0x958、PIN_INPUT_PULLUP | MUX_MODE0)/* spi0_D1.spi0_D1 *
AM33XX_IOPAD (0x95C、PIN_OUTPUT 上拉| MUX_MODE0)/* spi0_cs0.spi0_cs0 *
/*SPI0_IRQ*/
AM33XX_IOPAD (0x97C、PIN_INPUT_PULLUP | MUX_MODE7)/* uart1_rtsn.GPIO0_13 *
/*SPI0_RST*/
AM33XX_IOPAD (0x964、PIN_OUTPUT_PULLUP | MUX_MODE7)/* ecap0_in_pwm0_OUT.GPIO0_7 *
>;
};

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

wk2166@0{
兼容="wk2xxxspi";
SPI-max-frequency =<1000000>;
reg =<0>;
IRQ-GPIO =<&GPIO0 13 GPIO_ACTIVE_LOW_>;
RST-GPIO =<&GPIO0 7 GPIO_ACTIVE_LOW_>;
};
};

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

    你好

    文件 drivers/spi/spi.c 中的 spi_transfer_one_message 函数存在一些疑问

    如果(xfer->delay_usecs)

    udelay (xfer->delay_usecs);

    if (xfer->cs_change){

    如果(list_is_last (&xfer->transfer_list、

    &msg->transfers)){

    keep_cs = true; //如果是最后一次传输,为什么将 keep_cs 设置为 true? 如果为 true、则不会执行蓝色的后续代码、并且不会将 SPI_cs 设置为 false。

    }否则{

    spi_set_cs (msg->spi、false);

    udelay (10);

    spi_set_cs (msg->spi、true);

    MSG->actual_length += xfer->len;

    输出:

    如果(ret!= 0 ||!keep_cs)

    spi_set_cs (msg->spi、false);

    if (msg->status ==-EINPROGRESS)

    MSG->STATUS = RET;

    是错误吗?

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

    您好、Longfei、

    我查看了 AM335x MCSPI 驱动程序(linux-kernel/drivers/spi/spi-omap2-mcspi.c)、我发现只有在函数 OMAP2_mcspi_set_cs ()中、McSPI_CH (i) CONF [20]强制位才能设置为1。 如果 SPI_CS_HIGH 标志设置为1、则位强制设置为1、这将使"低电平有效"默认状态为过载。

    请将 printk 语句放在 OMAP2_mcspi_set_cs()函数中,并检查 SPI_CS_HIGH 和 L 的值

    静态空 OMAP2_mcspi_set_cs (struct spi_device *spi、bool 启用)

       struct omap2_mcspi *mcspi = spi_master_get_devdata (spi->master);
       u32 l;

       /*控制器处理反相芯片选择
       *使用 OMAP2_MCSPI_CHCONF_ePOL 位进行恢复
       *内核 SPI_SET_cs 函数的反转。
       *
       IF (SPI->MODE 和 SPI_CS_HIGH)

          printk (选择了"SPI_CS_HIGH \n");
          ENABLE =!ENABLE;

       if (SPI->controller_state){
          int err = pm_runtime_get_sync (mcspi->dev);
          如果(err < 0){
             dev_err (mcspi->dev、"无法获取同步:%d\n"、err);
             返回;
          }

          l = mcspi_cached_chconf0 (SPI);

          如果(启用)
             L &=~OMAP2_MCSPI_CHCONF_FORCE;
          其他
             L |= OMAP2_MCSPI_CHCONF_FORCE;

           printk ("l =%x\n");

            mcspi_write_chconf0 (SPI、l);

          Pm_runtime_mark_last_busy (mcspi->dev);
          Pm_runtime_put_autouspend (mcspi->dev);
       }


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Pavel Botev
    我像您说的那样执行测试、结果是:
    printk ("SPI_CS_HIGH 被选中\n"),不能打印,而 printk ("l =%x\n")可以打印,即 l = 80。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Longfei、

    [报价用户="LONGFEI LI"]printk ("SPI_CS_HIGH 被选中\n")不能打印,而 printk ("l =%x\n")可以打印,即 l = 80。

    看起来 OMAP2_mcspi_set_cs ()函数未将 McSPI_CH0CONF [20]强制位设置为1。

    请添加以下 printk()语句并提供结果:

    静态空 OMAP2_mcspi_set_cs (struct spi_device *spi、bool 启用)

    printk ("Enter OMAP2_mcspi_set_cs ()\n");

    printk ("退出 OMAP2_mcspi_set_cs ()\n");

    静态内联 void mcspi_write_chconf0 (const 结构 SPI_device * SPI、u32 val)

     u32 val1;

       printk ("Enter mcspi_write_chconf0 ()\n");
       struct omap2_mcspi_cs *cs = spi-> controller_state;

       printk ("val =%x\n"val);

       cs->chconf0 = val;
       mcspi_write_cs_reg (SPI、OMAP2_MCSPI_CHCONF0、val);
       val1 = mcspi_read_cs_reg (SPI、OMAP2_MCSPI_CHCONF0);

       printk ("OMAP2_MCSPI_CHCONF0 =%x\n"、val1);

      printk ("退出 mcspi_write_chconf0 ()\n");

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

    器件型号:AM3352

    工具/软件:Linux

    你好

    一个月前、我在这个社区中提出这个问题、以下是 TI 工程师的最后一个回复:

    看起来 OMAP2_mcspi_set_cs ()函数未将 McSPI_CH0CONF [20]强制位设置为1。

    请添加以下 printk()语句并提供结果:

    静态空 OMAP2_mcspi_set_cs (struct spi_device *spi、bool 启用)

    printk ("Enter OMAP2_mcspi_set_cs ()\n");

    printk ("退出 OMAP2_mcspi_set_cs ()\n");

    静态内联 void mcspi_write_chconf0 (const 结构 SPI_device * SPI、u32 val)

     u32 val1;

       printk ("Enter mcspi_write_chconf0 ()\n");
       struct omap2_mcspi_cs *cs = spi-> controller_state;

       printk ("val =%x\n"val);

       cs->chconf0 = val;
       mcspi_write_cs_reg (SPI、OMAP2_MCSPI_CHCONF0、val);
       val1 = mcspi_read_cs_reg (SPI、OMAP2_MCSPI_CHCONF0);

       printk ("OMAP2_MCSPI_CHCONF0 =%x\n"、val1);

      printk ("退出 mcspi_write_chconf0 ()\n");

    由于 某些原因、我没有进行测试。 我现在进行测试、 结果如下:

    [1.904067]输入 OMAP2_mcspi_set_cs ()
    [1.907991] val = 201103fc
    [1.910889] OMAP2_MCSPI_CHCONF0 = 201103fc
    [1.915172]退出 mcspi_write_chconf0 ()
    [1.919090]退出 OMAP2_mcspi_set_cs ()
    [1.922943] val = 201103fc
    [1.925774] OMAP2_MCSPI_CHCONF0 = 201103fc
    [1.930073]退出 mcspi_write_chconf0 ()
    [1.934018]输入 OMAP2_mcspi_set_cs ()
    [1.937939] val = 200103fc
    [1.940809] OMAP2_MCSPI_CHCONF0 = 200103fc
    [1.945094]退出 mcspi_write_chconf0 ()
    [1.949012]退出 OMAP2_mcspi_set_cs ()

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

    Longfei、

    [引用用户="LONGFEI LI"][1.940809] OMAP2_MCSPI_CHCONF0 = 200103fc[/引用]

    您在强制位中的最后一个值为0。 您能否在用户空间中检查 McSPI0.MCSPI_CH0CONF/0x4803012C 寄存器中的值? 您可以使用 devmem2工具。 您是否只需要在用户空间中设置强制= 0、或者也需要在内核中设置强制= 0?

    请添加以下打印件并提供结果:

    静态空 OMAP2_mcspi_set_cs (struct spi_device *spi、bool 启用)

    struct omap2_mcspi *mcspi = spi_master_get_devdata (spi->master);
       u32 l;

       /*控制器处理反相芯片选择
       *使用 OMAP2_MCSPI_CHCONF_ePOL 位进行恢复
       *内核 SPI_SET_cs 函数的反转。
       *

      +printk ("enable =%x\n"、enable);
       IF (SPI->MODE 和 SPI_CS_HIGH)
          ENABLE =!ENABLE;
      +printk ("enable =%x\n"、enable);


       if (SPI->controller_state){
          int err = pm_runtime_get_sync (mcspi->dev);
          如果(err < 0){
             dev_err (mcspi->dev、"无法获取同步:%d\n"、err);
             返回;
          }

            +printk ("l =%x\n"l);
            l = mcspi_cached_chconf0 (SPI);
           +printk ("l =%x\n"l);

          如果(启用)
             L &=~OMAP2_MCSPI_CHCONF_FORCE;
          其他
             L |= OMAP2_MCSPI_CHCONF_FORCE;

          mcspi_write_chconf0 (SPI、l);

          Pm_runtime_mark_last_busy (mcspi->dev);
          Pm_runtime_put_autouspend (mcspi->dev);
       }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Pavel Botev
    首先感谢您的回复。
    结果如下:
    [1.722093] OMAP_VOLTGE_LARD_INIT:未添加电压驱动器支持
    [1.736128]输入 OMAP2_mcspi_set_cs ()
    [1.740071]使能= 0
    [1.742799] ENABLE = 0
    [1.745273] l = 200103fc
    [1.747922] l = 201103fc
    [1.750630] val = 201103fc
    [1.753465] OMAP2_MCSPI_CHCONF0 = 201103fc
    [1.757750]退出 mcspi_write_chconf0 ()
    [1.761734]退出 OMAP2_mcspi_set_cs ()
    [1.765576] val = 201103fc
    [1.768408] OMAP2_MCSPI_CHCONF0 = 201103fc
    [1.772721]退出 mcspi_write_chconf0 ()
    [1.800342] tysWK4在 I/O 0x1 (IRQ = 40、base_baud = 230400)处是一个 wk2xxx
    [1.808003] I/O 0x2处的 tysWK5 (IRQ = 40、base_baud = 230400)是一个 wk2xxx
    [1.815552] tysWK6在 I/O 0x3 (IRQ = 40、base_baud = 230400)上是一个 wk2xxx
    [1.823053] I/O 0x4处的 tysWK7 (IRQ = 40、base_baud = 230400)是一个 wk2xxx
    [1.830571] UART_ADD_ONE_PORT = 0x0
    [1.834282]寄存器 SPI 返回 v=0
    [1.839676] ubi0:连接 mtd9
    [2.107705] ubi0:扫描完成

    您可能会发现前面的结果有一些不同、这是我的错误、请使用此结果来分析问题。

    OMAP2_MCSPI_CHCONF0 = 201103fc
    这意味着强制位为1、ePol 位为1、然后 SPIEN 线路为低电平、这与我的测试一致、即我使用示波器测试 spi0_cs0的电压。
    但我认为这是不寻常的,我希望 SPIEN 线路在自由时保持高电平。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    更多测试结果:

    在 SPI_TRANSFER_ONE_MESSAGE 函数中添加列印:

    静态 int spi_transfer_One_message (struct spi_master *主控方、

      struct spi_message *msg)

    struct spi_transfer *xfer;

    bool keep_cs = false;

    int ret = 0;

    无符号超长整型 ms = 1;

    struct spi_statistics *statm =&master->statistics;

    struct spi_statistics *stats =&msg->spi-> statistics;

    spi_set_cs (msg->spi、true);

    printk ("%s-%d:将 cs 设置为 true\n"、__func__、__line__);

    SPI_statusing_increment_field (statm、消息);

    SPI_statistes_increment_field (stats、messages);

    list_for_each 条目(xfer、&msg->transfer、transfer_list){

    trace_spi_transfer_start (msg、xfer);

    SPI_statuss_add_transfer_stats (statm、xfer、master);

    SPI_statistes_add_transfer_stats (stats、xfer、master);

    if (xfer->TX_Buf || xfer->Rx_Buf){

    reinit_completion (&master->xfer_completion);

    RET = MASTER->TRANSFER_ONE (MASTER、msg->SPI、xfer);

    如果(ret < 0){

    SPI_status_increment_field (statm、

       错误);

    SPI_statistes_increment_field (stats、

       错误);

    DEV_ERR(&msg->SPI->DEV,

    "SPI 传输失败:%d\n"、ret);

    转至输出;

    如果(ret > 0){

    RET = 0;

    ms = 8LL * 1000LL * xfer->len;

    do_div (ms、xfer->speed_Hz);

    ms += ms + 100;/*一些容差*/

    IF (ms > UINT_MAX)

    MS = UINT_MAX;

    MS = WAIT_for_Completion_TIMEOUT (&MASTER->xfer_Completion、

    mss_TO_jiffies (ms));

    如果(ms = 0){

    SPI_status_increment_field (statm、

       (滴);

    SPI_statistes_increment_field (stats、

       (滴);

    DEV_ERR(&msg->SPI->DEV,

    "SPI 传输超时\n");

    MSG->STATUS =-ETIMEDOUT;

    }否则{

    如果(xfer->len)

    DEV_ERR(&msg->SPI->DEV,

    "无缓冲器传输的长度为%u\n"、

    xfer->len);

    trace_spi_transfer_stop (msg、xfer);

    if (msg->status !=-EINPROGRESS)

    转至输出;

    如果(xfer->delay_usecs)

    udelay (xfer->delay_usecs);

    if (xfer->cs_change){

    如果(list_is_last (&xfer->transfer_list、

    &msg->transfers)){

    keep_cs = true;

    }否则{

    spi_set_cs (msg->spi、false);

    printk ("%s-%d:将 cs 设置为 false \n"、__func__、__line__);

    udelay (10);

    spi_set_cs (msg->spi、true);

    printk ("%s-%d:将 cs 设置为 ture \n"、__func__、__line__);

    MSG->actual_length += xfer->len;

    输出:

    if (ret!= 0 ||!keep_cs){

    spi_set_cs (msg->spi、false);

    printk ("%s-%d:将 cs 设置为 false \n"、__func__、__line__);

    if (msg->status ==-EINPROGRESS)

    MSG->STATUS = RET;

    if (msg->status && master->handle_err)(如果(msg->status && master->handle

    master->handle_err (master、msg);

    SPI_res_release (master、msg);

    SPI_finaling_curry_message (主器件);

    回程;

    测试的结果是、在  SPI_TRANSFER_ONE_MESSAGE 函数中、仅将 cs 设置为 true、而不将 cs 设置为 false:

    1.730103] ENABLE = 0
    [1.732830] ENABLE = 0
    [1.735306] l = 200103fc
    [1.737954] l = 201103fc
    [1.740666] val = 201103fc
    [1.74349] OMAP2_MCSPI_CHCONF0 = 201103fc
    [1.747782]在 mcspi_write_chconf0 ()出口下
    [1.751764]退出 OMAP2_mcspi_set_cs ()
    [1.755599] SPI_TRANSFER_ONE_MESSAGE-985:将 cs 设置为 true
    [1.761096] val = 201103fc
    [1.763927] OMAP2_MCSPI_CHCONF0 = 201103fc
    [1.768211]退出 mcspi_write_chconf0 ()
    [1.800291] I/O 0x1处的 tysWK4 (IRQ = 40、base_baud = 230400)是一个 wk2xxx
    [1.807956] I/O 0x2上的 tysWK5 (IRQ = 40、base_baud = 230400)是一个 wk2xxx
    [1.815489] I/O 0x3处的 tysWK6 (IRQ = 40、base_baud = 230400)是一个 wk2xxx
    [1.823041] I/O 0x4处的 tysWK7 (IRQ = 40、base_baud = 230400)是一个 wk2xxx
    [1.830524] UART_ADD_ONE_PORT = 0x0
    [1.834237]寄存器 SPI return v =:0
    [1.839625] ubi0:连接 mtd9
    [2.107665] ubi0:扫描完成

    这可以解释为什么我的系统中 spi0_cs 线路为低电平、SPI 从器件的驱动程序使用 SPI 驱动程序在探测功能中访问 SPI 从器件。

    我修改了 SPI 从器件(wk2166)的驱动程序、探针函数不使用 SPI 驱动程序来读取和写入从器件。 换言之、系统仅运行 SPI_setup 函数将 cs 设置为 false、而不运行 SPI_TRANSFER_ONE_MESSAGE 函数向 SPI 从器件发送消息。  系统运行并使用示波器测试 spi0_cs0的电压、spi0_cs0为高电平。

    那么、我认为 SPI 驱动程序中可能存在一些错误、对吗?  

    非常感谢。

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

    查看 SPI-OMAP2-mcspi.c 驱动程序、只有当 GPIO 引脚用于 CS (而不是 McSPI CS 引脚 sp0_cs0)时、才会设置强制位。 是否为 CS 使用 GPIO 引脚? 请向我提供最新的 DTS 文件以供审核。

    另外,请输入以下 printk()并提供结果:

    静态 int omap2_mcspi_transfer_one (struct spi_master *主控方、
    struct spi_device * spi、
    struct spi_transfer * t)


    IF (GPIO_IS 有效(SPI->CS_GPIO))
    +{
    +printk ("GPIO_IS_VALID、SPI->MODE 和 SPI_CS_HIGH_n");
    +printk ("SPI->cs_gpio =%d\n"、SPI->cs_gpio);
    OMAP2_mcspi_set_cs (SPI、SPI->MODE 和 SPI_CS_HIGH);
    +}



    IF (GPIO_IS 有效(SPI->CS_GPIO))
    +{
    +printk ("GPIO_IS_VALID、!(SPI->MODE 和 SPI_CS_HIGH)\n");
    +printk ("SPI->cs_gpio =%d\n"、SPI->cs_gpio);
    OMAP2_mcspi_set_cs (SPI、!(SPI->MODE 和 SPI_CS_HIGH));
    +}


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

    [引用 USER="LONGFEI LI"]因此、我认为 SPI 驱动程序中可能存在一些错误、我对吗?  [/报价]

    究竟是哪个 SPI 驱动器? SPI-OMAP2-mcspi.c?

    我认为该错误位于您的 DTS 文件 SPI 节点中。

    此致、
    帕维尔

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

    你好 Pavel

    我不使用 GPIO、下面是我的 DTS、并在 OMAP2_mcspi_transfer_one 函数中添加了列印、当系统运行时、我无法收到有关该打印的任何消息。 这意味 着 OMAP2_mcspi_transfer_one 函数在系统启动时不运行。

    SPI_TRANSFERS_One_message 函数位于 drivers/SPI/SPI.c 中

    spi0_pins:pinmux_spi0_pins{
    pinctrl-single、pins =<
    AM33XX_IOPAD (0x950、PIN_INPUT_PULLUP | MUX_MODE0)/* spi0_SCLK.spi0_SCLK *
    AM33XX_IOPAD (0x954、PIN_INPUT_PULLUP | MUX_MODE0)/* spi0_d0.spi0_d0 *
    AM33XX_IOPAD (0x958、PIN_INPUT_PULLUP | MUX_MODE0)/* spi0_D1.spi0_D1 *
    AM33XX_IOPAD (0x95C、PIN_OUTPUT 上拉| MUX_MODE0)/* spi0_cs0.spi0_cs0 *
    /*SPI0_IRQ*/
    AM33XX_IOPAD (0x97C、PIN_INPUT_PULLUP | MUX_MODE7)/* uart1_rtsn.GPIO0_13 *
    /*SPI0_RST*/
    AM33XX_IOPAD (0x964、PIN_OUTPUT_PULLUP | MUX_MODE7)/* ecap0_in_pwm0_OUT.GPIO0_7 *
    >;
    };

    spi0{(&S)
    pinctrl-names ="default";
    pinctrl-0 =<&spi0_PINs>;
    状态="正常";
    /*cs-GPIO =<&GPIO0 5 GPIO_ACTIVE_LOW>;*/

    wk2166@0{
    兼容="wk2xxxspi";
    SPI-max-frequency =<1000000>;
    reg =<0>;
    IRQ-GPIO =<&GPIO0 13 GPIO_ACTIVE_LOW_>;
    RST-GPIO =<&GPIO0 7 GPIO_ACTIVE_LOW_>;
    };
    };

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

    [引用 user="LONGFEI LI"]

    我不使用 GPIO、下面是我的 DTS、并在 OMAP2_mcspi_transfer_one 函数中添加了列印、当系统运行时、我无法收到有关该打印的任何消息。 这意味 着 OMAP2_mcspi_transfer_one 函数在系统启动时不运行。

    SPI_TRANSFERS_One_message 函数位于 drivers/SPI/SPI.c 中

    [/报价]

    我认为 linux-kernel/drivers/spi/spi.c 中没有错误、但我们可以跟踪强制位为什么设置为1。 请输入以下 printk 函数并为我提供结果:

    静态空 SPI_SET_cs (struct spi_device * spi、bool 启用)

       printk ("Enter SPI_SET_cs.\n");

       printk ("enable =%d\n"、enable);

       IF (SPI->MODE 和 SPI_CS_HIGH)
          ENABLE =!ENABLE;

      printk ("enable =%d\n"、enable);

       IF (GPIO_IS 有效(SPI->CS_GPIO))

           printk ("gpio_is_valid\n");
           printk ("SPI->cs_gpio =%d\n"、SPI->cs_gpio);
          GPIO_SET_VALUE (SPI->CS_GPIO、!ENABLE);


       否则(SPI->MASTER->Set_cs)

         printk ("SPI->MASTER->Set_CS\n");
         printk ("enable =%d\n"、enable);      
          SPI->MASTER->SET_cs (SPI、!enable);


     

    静态 int spi_transfer_One_message (struct spi_master *主控方、
                   struct spi_message *msg)


    printk ("Enter SPI_transfer_One_message.\n");

    printk ("true=%d\n");

    printk ("调用 SPI_SET_cs (msg->SPI、true)\n");

    spi_set_cs (msg->spi、true);


    if (xfer->cs_change){

          printk ("xfer->cs_change =%d\n"、xfer->cs_change);           
             if (list_is_last (&xfer->transfer_list、&msg->transfer)){
                keep_cs = true;
             }否则{

                   printk ("keep_cs =%d\n"keep_cs);
                spi_set_cs (msg->spi、false);
                udelay (10);
                spi_set_cs (msg->spi、true);
             }
          }


    输出:
       如果(ret!= 0 ||!keep_cs)

    {       
           printk ("ret!= 0 ||!keep_cs\n");
          printk ("keep_cs =%d\n"keep_cs);
          spi_set_cs (msg->spi、false);


     

    int spi_setup (struct spi_device *spi)

    printk ("Enter SPI_setup.\n");


    printk ("调用 SPI_SET_cs (SPI、false)\n");

    SPI_SET_cs (SPI、false);


     

    [引用 user="LONGFEI LI"]wk2166@0{
    兼容="wk2xxxspi";
    SPI-max-frequency =<1000000>;
    reg =<0>;
    IRQ-GPIO =<&GPIO0 13 GPIO_ACTIVE_LOW_>;
    RST-GPIO =<&GPIO0 7 GPIO_ACTIVE_LOW_>;
    };[/报价]

    此 DTS 节点看起来可疑。 兼容项通常指向有效的驱动程序,而我在4.9.69内核中找不到 wk2xxxspi 驱动程序。 请参阅以下 DTS 文件示例:

    AM335x-bonebblack-spi0.dtsi ->兼容="spidev";->驱动程序/spi/spidev.c

    AM335x-icev2.dts ->兼容="pisosr-gpio";->驱动程序/GPIO/GPIO-pisosr.c

    AM335x-icev2.dts ->兼容="Winbond、w25q64"、"JEDEC、SPI-NOR ";->驱动程序/MTD/DEVICes/m25p80.c

    此外、我在4.9.69内核中找不到 rst-gpio 选项。

    此致、
    帕维尔

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

    你好 Pavel

    首先、我需要解释一下我的 DTS 中关于 spi0的内容、wk2166是中国制造的芯片、这个芯片用于扩展串行端口(一个芯片使用 SPI 总线扩展四个串行端口)。 此芯片的驱动程序由制造商提供、Linux 内核中不包含此驱动程序。

    IRQ-GPIO 和 rst-GPIO 由我自己添加、这是因为芯片需要一个 GPIO 连接到其用于响应芯片 IRQ 的 IRQ 引脚、并且需要一个 GPIO 连接到用于在需要时复位芯片的芯片复位引脚。 在 wk2166驱动程序中、我使用以下方法来获取 IRQ GPIO 和 rst GPIO:

      iIrq = of _get_named_gpio (SPI->dev.of _node、"IRQ-GPIO"、0);

      if (iIrq >0){

      //printk ("IRQ_GPIO=%d\n"、iIrq);

      GPIO_REQUEST (iIrq、"SPI_IRQ");

      GPIO_DIRECTION _INPUT (iIrq);

      }   

      IRST = of _get_named_gpio (SPI->dev.for_node、"rst-gpio"、0);

      if (IRST > 0){

      //printk ("rst_gpio=%d\n"、IRST);

      GPIO_REQUEST (IRST、"SPI_IRQ");

      GPIO_DIRECT_OUTPUT (IRST、0);

      休眠(1);

      GPIO_DIRECT_OUTPUT (IRST、1);

      }

    其次,按您所说的方式添加打印稿时,测试结果如下:

    [0.000000]  在物理 CPU 0x0上引导 Linux

    [0.000000]  Linux 版本4.9.28-geed43d1050 (LLF@LLF -虚拟机)(gcc 版本6.2.1 20161016 (Linaro GCC 6.2-2016.11))#11抢占 Wed Jun 6 11:07:40 CST 2018

    [0.000000]  CPU:ARMv7处理器[413fc082]修订版2 (ARMv7)、CR=10c5387d

    [0.000000]  CPU:PIPT/VIPT 非混叠数据高速缓存、VIPT 别名指令高速缓存

    [0.000000]  、共个:FDT:机器模型:TI AM335x EVM

    [0.000000]  EFI:从 FDT 获取 EFI 参数:

    [0.000000]  EFI:未找到 UEFI。

    [0.000000]  CMA:保留0x8a800000处的48 MIB

    [0.000000]  内存策略:数据高速缓存写回

    [0.000000]  CPU:所有 CPU 均在 SVC 模式下启动。

    [0.000000]  AM335X ES2.1 (NEON)

    [0.000000]  在区域顺序和移动分组中构建了1个区域列表。  总页数:64960

    [0.000000]  内核命令行:console=ttyO0、115200n8 root=ubi0:rootfs rw ubi.mtd=NAND.file-system、2048 rootfstype=ubifs rootwait=1

    [0.000000]  PID 哈希表条目:1024 (顺序:0、4096字节)

    [0.000000]  条目高速缓存散列表条目:32768 (顺序:5、131072字节)

    [0.000000]  inode 高速缓存散列表条目:16384 (顺序:4、65536字节)

    [0.000000]  内存:198348K/262144K 可用(7168K 内核代码、264K RWdata、2340K rodata、1024K init、276K BSS、 14644K 保留、49152K CMA 保留、0K HIGHMEM)

    [0.000000]  虚拟内核内存布局:

    [0.000000]    矢量 :0xff0000-0xff1000 (4KB)  

    [0.000000]    fixmap :0xc00000 - 0xc00000 (3072 KB)

    [0.000000]    vmalloc:0xd0800000 - 0x0x800000 (752MB)

    [0.000000]    低内存 :0xC0000000 - 0xd0000000 (256 MB)

    [0.000000]    pkmap :bbfe00000 - 0xC0000000 ( 2 MB)

    [0.000000]    模块:bbf000000 - bbbfe00000 ( 14 MB)

    [0.000000]     .text:0xc0008000 - 0xc0800000 (8160 KB)

    [0.000000]     .init:0xc0b00000 - 0xc0c00000 (1024KB)

    [0.000000]     .data:0xc0c00000 - 0xc0c42110 (265KB)

    [0.000000]      .bss:0xc0c42110 - 0xc0c87234 (277 KB)

    [0.000000]  slub:HWalign=64、order=0-3、MinObjects=0、CPU=1、Nodes=1

    [0.000000]  可抢占的分层 RCU 实现。

    [0.000000]   叶扇出的生成时间调整为32。

    [0.000000]  NR_IRQ:16 nr_IRQ:16 16.

    [0.000000]  IRQ:在0xfa200000 (修订版5.0)处找到具有128个中断的 INTC

    [0.000000]  OMAP 时钟事件源:timer2为24000000 Hz

    [0.000020]  sched_clock:24MHz 时为32位、分辨率为41ns、每89478484971ns 换行一次

    [0.000049]  时钟源:Timer1:屏蔽:0xFFFFFFFF max_cycles:0xFFFFFFFF、max_idle_ns:79635851949 ns

    [0.000064]  OMAP 时钟源:Timer1为24000000 Hz

    [0.000286]  clocksource_probe:未找到匹配的时钟源

    [0.000524]  控制台:彩色虚拟设备80x30

    [0.000561]  校准延迟环路... 597.60茂物剪(lpj=2988032)

    [0.118860]  pid_max:默认值:32768最小值:301

    [0.119033]  安装高速缓存散列表条目:1024 (顺序:0、4096字节)

    [0.119048]  安装点缓存散列表条目:1024 (顺序:0、4096字节)

    [0.120134]  CPU:测试写入缓冲区一致性:好的

    [0.120636]  为0x80100000 - 0x80100060设置静态标识映射

    [0.121808]  EFI 服务将不可用。

    [0.123632]  devtmpfs:已初始化

    [0.140037]  VFP 支持 v0.3:实施者41架构3第30部分版本 c 版本3

    [0.140513]  时钟源:Jiffies:MASK:0xFFFFFFFF max_cycles:0xFFFFFFFF、max_idle_ns:19112604462750000 ns

    [0.140550]  futex 散列表条目:256 (顺序:-1、3072字节)

    [0.145437]  pinctrl 内核:已初始化 pinctrl 子系统

    [0.147144]  NET:注册协议系列16.

    [0.150007]  DMA:为原子相干分配预分配256 K2B 池

    [0.168505]  OMAP-hwmod:debugss:_wait_target_disable 失败

    [0.258870]  空闲:使用调节梯

    [0.288852]  空闲:使用调速器菜单

    [0.297156]  OMAP GPIO 硬件版本0.1

    [0.320799]  硬件断点:不支持调试架构0x4。

    [0.370516]  EDMA 49000000.EDMA:TI EDMA DMA 引擎驱动程序

    [0.371033]  稳压器固定电压稳压器0:固定稳压器、额定电压可变

    [0.371080]  reg-fixed-voltage:fixedregulator0的探测器失败,错误-22

    [0.375976]  介质:Linux 介质接口:v0.10

    [0.376058]  Linux 视频捕捉接口:v2.00

    [0.376118]  pps_core:LinuxPPS API 版本。 1已注册

    [0.376129]  pps_core:软件版本 5.3.6 -版权所有2005-2007 Rodolfo Giometti

    [0.376162]  PTP 时钟支持已注册

    [0.376219]  EDAC MC:版本:3.0.0

    [0.377829]  OMAP-mailbox 480c8000.mailbox:OMAP mailbox 修订版0x400

    [0.378330]  已初始化高级 Linux 声音架构驱动程序。

    [0.380155]  时钟源:切换到时钟源 Timer1

    [0.394711]  NET:注册协议系列2.

    [0.395800]  TCP 建立哈希表条目:2048 (顺序:1、8192字节)

    [0.395850]  TCP 绑定哈希表条目:2048 (顺序:1、8192字节)

    [0.395887]  TCP:已配置哈希表(建立2048 BIND 2048)

    [0.395989]  UDP 哈希表条目:256 (顺序:0、4096字节)

    [0.396015]  UP-Lite 哈希表条目:256 (顺序:0、4096字节)

    [0.396197]  NET:注册协议系列1.

    [0.396799]  RPC:注册后命名的 UNIX 套接字传输模块。

    [0.396819]  RPC:注册的 UDP 传输模块。

    [0.396828]  RPC:注册的 TCP 传输模块。

    [0.396837]  RPC:注册的 TCP NFSv4 4.1反向通道传输模块。

    [0.398144]  硬件性能事件:通过 armv7_cortex_A8 PMU 驱动器启用、5个计数器可用

    [0.401684]  工作集:TIMESTAMP_BITS =14 max_order=16 bucke_order=2

    [0.412512]  squashfs:版本4.0 (2009/01/31) Phillip Lougher

    [0.413837]  NFS:注册 id_resolver 密钥类型

    [0.413902]  已注册密钥类型 id_resolver

    [0.413913]  注册了密钥类型 id_legacy

    [0.413979]  NTFS:驱动程序2.1.32 [Flags:R/O]。

    [0.416616]  块层 SCSI 通用(BSG)驱动程序0.4版已加载(主要246)

    [0.416644]  已注册 IO 调度程序 NOP

    [0.416655]  已注册 IO 调度程序截止日期

    [0.416868]  已注册 IO 调度程序 cfq (默认)

    [0.418240]  pinctrl-single 44e10800.pinmux:请更新 DTS 以使用#pinctrl-cells =<1>

    [0.418783]  pinctrl-single 44e10800.pinmux:142引脚、PA f9e10800大小568

    [0.507372]  OMAP-UART 44e09000.serial: uart0无 wakeirq

    [0.507527]  44e09000.serial:在 MMIO 0x44e09000 (IRQ = 158、base_baud = 3000000)处的 ttyO0是 OMAP UART0

    [1.107064]  控制台[ttyO0]已启用

    [1.111647]  OMAP-UART 48022000.serial: uart1无 wakeirq

    [1.117701]  48022000.serial: tmio 0x48022000 (IRQ = 159、base_baud = 3000000)上的 ttyO1是 OMAP UART1

    [1.128191]  OMAP-UART 48024000.serial: uart2无 wakeirq

    [1.134332]  48024000.serial:在 MMIO 0x48024000 (IRQ = 160、base_baud = 3000000)处的 ttyO2是 OMAP UART2

    [1.144756]  OMAP-UART 481a6000.serial: uart3无 wakeirq

    [1.150859]  481a6000.serial: tmio 0x481a6000 (IRQ = 161、base_baud = 3000000)处的 ttyO3是 OMAP UART3

    [1.161268]  OMAP-UART 481a8000.serial: uart4无 wakeirq

    [1.167312]  481a8000.serial: tmio 0x481a8000处的 ttyO4 (IRQ = 162、base_baud = 3000000)是 OMAP UART4

    [1.177742]  OMAP-UART 481aa000.serial: uart5无 wakeirq

    [1.183828]  481aa000.serial: tmio 0x481aa000处的 ttyO5 (IRQ = 163、base_baud = 3000000)是 OMAP UART5

    [1.195319]  OMAP_rng 48310010.rng:OMAP 随机数生成器版本 20.

    [1.202663]  构建器件:/dev/nts_io DEV_IRQ=0

    [1.207406]  [DRM]已初始化

    [1.229727]  返修:模块已加载

    [1.242186]  loop:模块已加载

    [1.248979]  输入 SPI_setup。

    [1.252322]  调用 SPI_SET_cs (SPI、false)

    [1.256622]  输入 SPI_SET_cs。

    [1.259729]  ENABLE = 0

    [1.262240]  ENABLE = 0

    [1.264710]  SPI->MASTER->Set_cs

    [1.267999]  启用= 0

    [1.272108]  libphy:固定 MDIO 总线:探测

    [1.279308]  mousedev:PS/2鼠标设备,适用于所有鼠标

    [1.286026]  i2c /dev/entries 驱动程序

    [1.321309]  RTC-rx8025 0-0032:RTC 内核:将 rx8025注册为 rtc0

    [1.327868]  OMAP_i2c 44e0b000.i2c:总线0修订版0.11、频率为400kHz

    [1.336440]  OMAP-WDT:OMAP 看门狗计时器修订版0x01:初始超时60秒

    寄存  了[1.344395] sp706s 看门狗驱动程序。

    [1.350437]  cpudidle: enable-method 属性'ti,am3352'找到操作

    [1.358831]  omap_hmc 48060000.mmc:获得 CD GPIO

    [1.363825]  omap_hmc 48060000.mmc:获取 WP GPIO

    [1.426777]  ledtrig-CPU:已注册以指示 CPU 上的活动

    [1.434360]  OMAP-GPMC 50000000。GPMC:GPMC 版本6.0

    [1.439835]  GPMC_mem_init:禁用映射在0x0-0x1000000的 CS 0

    [1.451800]  Nand:找到器件、制造商 ID:0x01、芯片 ID:0xda

    [1.458472]  Nand:AMD/Spanion S34ML02G1

    [1.462779]  nand:256 mib,SLC,擦除大小:128 KiB,页大小:2048,OOB 大小:64

    [1.470835]  nand:Using OMAP-ECC_BCH8_CODE_HW ECC scheme

    [1.476573]  在 MTD 器件8000000.nand 上找到11个部件分区

    [1.482996]  在"8000000.nand"上创建11个 MTD 分区:

    [1.488669]  0x000000000000-0x000000020000:“NAND.SPL”

    [1.496040]  0x00000002000-0x000000040000:“NAND.SPL.Backup1”

    [1.504189]  0x000000040000-0x000000060000:“NAND.SPL.Backup2”

    [1.512383]  0x000000060000-0x000000080000:"NAND.SPL.backup3"

    [1.520517]  0x000000080000-0x0000000c0000:“NAND.u-boot-spl-OS”

    [1.526980]  mmc0:地址8bf6处的新高速 SDHC 卡

    [1.527853]  mmcblk0:mmc0:8bf6 SE08G 7.29 GiB

    [1.534938]   mmcblk0:P1 P2 P3

    [1.546293]  0x0000000c0000-0x0000001c0000:“NAND.u-boot”

    [1.554061]  0x0000001c0000-0x0000001e0000:“NAND.u-boot-env”

    [1.561809]0x0000001e0000-0x000000200000  :“NAND.u-boot-env.Backup1”

    [1.570131]  0x000000200000-0x000001200000:“NAND.kernel”

    [1.583473]  0x000001200000-0x000005200000:“NAND.FILE-SYSTEM”

    [1.615092]  0x000005200000-0x000010000000:"用户"

    [1.688239]  NET:注册协议系列10.

    [1.694697]  SIT:IPv6、IPv4和基于 IPv4隧道的 MPLS 驱动程序

    [1.702169]  NET:注册协议系列17.

    [1.707238]  注册了密钥类型 DNS_旋 变传感器

    [1.712229]  OMA_VOLTGE_LARD_INIT:未添加电压驱动器支持

    [1.726301]  输入 SPI_TRANSFER_ONE_MESSAGE。

    [1.730972]  true = 1.

    [1.733267]  调用 SPI_SET_cs (msg->SPI、true)

    [1.737921]  输入 SPI_SET_cs。

    [1.741097]  ENABLE = 1

    [1.743570]  ENABLE = 1

    [1.746039]  SPI->MASTER->Set_cs

    [1.749328]  使能= 1.

    [1.751902]  xfer->cs_change = 1.

    [1.780295]  I/O 0x1处的 tysWK4 (IRQ = 40、base_baud = 230400)是一个 wk2xxx

    [1.787960]  I/O 0x2处的 tysWK5 (IRQ = 40、base_baud = 230400)是一个 wk2xxx

    [1.795501]  I/O 0x3上的 tysWK6 (IRQ = 40、base_baud = 230400)是一个 wk2xxx

    [1.803011]  I/O 0x4处的 tysWK7 (IRQ = 40、base_baud = 230400)是一个 wk2xxx

    [1.810486]  UART_add_One_port = 0x0

    [1.814204]  寄存器 SPI 返回 v =:0

    [1.819595]  ubi0:连接 mtd9

    [2.087595]  ubi0:扫描完成

    [2.098358]  ubi0警告:ubi_EBA_init:无法为不良的 PEB 处理保留足够的 PEB,保留11,需要39

    [2.110003]  ubi0:附加的 mtd9 (名称"NAND.file-system"、大小为64 mib)

    [2.116954]  ubi0:PEB 大小:131072字节(128 KiB)、LEB 大小:126976字节

    [2.124224]  ubi0:最小/最大 I/O 单元大小:2048/248、子页大小为512

    [2.131278]  ubi0:VID 标头偏移:2048 (对齐2048)、数据偏移:4096

    [2.138579]  普遍性0:良好的 PEB:511、不良 PEB:1、损坏的 PEB:0

    [2.144894]  ubi0:用户卷:1,内部卷:1,最大 卷数:128

    [2.152508]  ubi0:最大/平均擦除计数器:2/0、WL 阈值:4096、图像序列编号:2121165256

    [2.162104]  ubi0:可用 PEB:0、总保留 PEB:511、为不良 PEB 处理保留的 PEB:11

    [2.171803]  ubi0:启动后台线程"ubi_bgt0d"、PID 78

    [2.250218]  随机:快速初始化完成

    [2.253872]  DaVinci_MDIO 4a101000.MDIO:达芬奇 MDIO 修订版1.6

    [2.260303]  DaVinci_MDIO 4a101000.MDIO:Detected phy mask ffffffdd

    [2.268499]  libphy: 4a101000.mdio:探测

    [2.272854]  DaVinci_MDIO 4a101000.MDIO:PHY[1]:器件4a101000.MDIO:01、驱动程序未知

    [2.281356]  DaVinci_MDIO 4a101000.MDIO:PHY[5]:器件4a101000.MDIO:05、驱动程序未知

    [2.291696]  cpsw 4a100000.以太网:检测到的 MACID = 98:5d:AD:B3:3f:be

    [2.360331]  CPsw 4a100000.以太网:CPT:溢出检查周期500 (jiffies)

    [2.369719]  cpsw 4a100000.以太网:cpsw:检测到的 MACID = 98:5d:AD:B3:3f:c0

    [2.380629]  RTC-rx8025 0-0032:将系统时钟设置为2018-06-06 11:10:40 UTC (15283440)

    [2.390066]  lis3_reg:正在禁用

    [2.393452]  WLAN-en-regulator:正在禁用

    [2.397570]  ALSA 器件列表:

    [2.400764]   未找到声卡。

    [2.410300]  UBIFS (ubi0:0):后台线程"ubifs_bgt0_0"已启动、PID 81

    [2.484452]  UBIFS (ubi0:0):UBIFS:安装的 UBI 设备0、卷0、名称"rootfs"

    [2.492360]  UBIFS (ubi0:0):LEB 大小:126976字节(124 KiB)、最小值

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

    [引用 user="LONGFEI LI"]其次,按您所说的方式添加打印稿时,测试结果如下:[/引用]

    [引用 user="LONGFEI LI"]

    [1.248979]  输入 SPI_setup。

    [1.252322]  调用 SPI_SET_cs (SPI、false)

    [1.256622]  输入 SPI_SET_cs。

    [1.259729]  ENABLE = 0

    [1.262240]  ENABLE = 0

    [1.264710]  SPI->MASTER->Set_cs

    [1.267999]  启用= 0

    [/报价]

    [引用 user="LONGFEI LI"]

    [1.712229]  OMA_VOLTGE_LARD_INIT:未添加电压驱动器支持

    [1.726301]  输入 SPI_TRANSFER_ONE_MESSAGE。

    [1.730972]  true = 1.

    [1.733267]  调用 SPI_SET_cs (msg->SPI、true)

    [1.737921]  输入 SPI_SET_cs。

    [1.741097]  ENABLE = 1

    [1.743570]  ENABLE = 1

    [1.746039]  SPI->MASTER->Set_cs

    [1.749328]  使能= 1.

    [1.751902]  xfer->cs_change = 1.

    [/报价]

    在此日志中,我看到您的流调用 SPI_SET_CS()函数两次:

    从 SPI_setup()开始,并将位强制设置为1

    第二个来自 SPI_TRANSFER_ONE_MESSAGE(),并将位强制设置为0

    因此、您最终应该得到强制位= 0。 这与您在以下 e2e 帖子中提供的流程相匹配:

    [1.904067]输入 OMAP2_mcspi_set_cs ()
    [1.907991] val = 201103fc
    [1.910889] OMAP2_MCSPI_CHCONF0 = 201103fc
    [1.915172]退出 mcspi_write_chconf0 ()
    [1.919090]退出 OMAP2_mcspi_set_cs ()
    [1.922943] val = 201103fc
    [1.925774] OMAP2_MCSPI_CHCONF0 = 201103fc
    [1.930073]退出 mcspi_write_chconf0 ()
    [1.934018]输入 OMAP2_mcspi_set_cs ()
    [1.937939] val = 200103fc
    [1.940809] OMAP2_MCSPI_CHCONF0 = 200103fc
    [1.945094]退出 mcspi_write_chconf0 ()
    [1.949012]退出 OMAP2_mcspi_set_cs ()

    您如何定义您的力位为1? 您在哪里以及如何检查它? 从我在日志中看到的内容来看、内核启动时位强制应为0。

    此致、
    帕维尔

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

    你好 Pavel

    我认为 您的分析中有一些错误:

    [1.248979] 输入 SPI_setup。

    [1.252322]  调用 SPI_SET_cs (SPI、false)

    [1.256622]  输入 SPI_SET_cs。

    [1.259729]  ENABLE = 0

    [1.262240]  ENABLE = 0

    [1.264710]  SPI->MASTER->Set_cs

    [1.267999]  启用= 0

    这是 SPI_setup 函数设置 enable=0中的打印消息、在 SPI_SET_cs 函数中、将运行以下代码(红色部分):

    静态空 SPI_SET_cs (struct spi_device * spi、bool 启用)

      printk ("Enter SPI_SET_cs.\n");

      printk ("enable =%d\n"、enable);

    IF (SPI->MODE 和 SPI_CS_HIGH)

    ENABLE =!ENABLE;

     printk ("enable =%d\n"、enable);

    IF (GPIO_IS 有效(SPI->CS_GPIO))

        printk ("gpio_is_valid\n");

        printk ("SPI->cs_gpio =%d\n"、SPI->cs_gpio);

    GPIO_SET_VALUE (SPI->CS_GPIO、!ENABLE);

    否则(SPI->MASTER->Set_cs)

        printk ("SPI->MASTER->Set_CS\n");

        printk ("enable =%d\n"、enable);

    SPI->MASTER->SET_cs (SPI、!enable);

    在 SPI->master-set_cs (SPI、!enable)函数中,第二个参数设置为1,这意味着在 OMAP2_mcspi_set_cs 函数中,enable=1,强制位将设置为0。

    如果内核在运行时没有 SPI 总线发送任何消息(SPI_TRANSFER_ONE_MESSAGE()未运行)、则强制位为0。

    但是 我的系统有一个 SPI 从器件、这个器件驱动程序将通过 SPI 总线访问器件寄存   器、然后函数 SPI_TRANSLASE_Oe_MESSAGE()将运行并将位强制设置为1 (不将强制位设置为0)、因此、当我的系统启动时、SPIEN 线路会变为低电平。

    当系统启动时、SPI 从器件驱动程序只读取从器件的一个寄存器、当读取操作完成时、SPIEN 线路需要恢复到高电平、但它不会恢复到高电平、这是毫无疑问的。

    我认为在 SPI_TRANSFER_ONE_MESSAGE 函数中、不仅  调用 SPI_SET_Cs()函数将 FORCE 位设置为1、还需要 在消息发送时调用 SPI_SET_Cs()函数将 FORCE 位设置为0。

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

    我同意您的观点,我忽略了 SPI->MASTER-SET_cs (SPI,!enable)。 因此、我们具有以下流程:

    1. spi_setup()-> spi_set_cs (spi、false)->启用= 1 ->强制= 0
    2. spi_transfer_One_message()-> spi_set_cs (SPI、TRUE)->启用= 0 ->强制= 1

    因此、您最终得到的 FORCE=1与您的定制电路板实现不匹配。 我可以建议您启用标志 SPI_CS_HIGH、因此对于 SPI_TRANSION_ONG_ONE_MESSAGE、您将具有=0的强制值。

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

    你好 Pavel

    我认为启用标志 SPI_CS_HIGH 无法解决我的问题。

    SPI 驱动程序向 SPI 从器件发送消息将运行 SPI_TRANSLASE_ON_MESSAGE 函数、  在函数 SPI_TRANSFER_ON_MESSAGE 中、MASTER->TRANSLUS_ONE (MASTER、msg->SPI、xfer) 将真正将消息发送到 SPI 从器件、在发送消息之前、驱动程序需要启用 SPIEN 线路、 如果    启用标志 SPI_CS_HIFH、 SPI_SET_cs (SPI、TRUE)将强制位设置为0 (SPIEN 线路为高电平、SPIEN 线路禁用)、则在 MASTER->TRANSFER_ONE (MASTER->SCMA->SPI、xfer)之前调用 SPI_SET_CS (SPI、TRUE)。

    在  SPI_TRANSFER_ONE_MESSAGE 函数中,需要在 发送消息之前调用 SPI_SET_cs (SPI,TRUE)启用 SPIEN 行,并在 发送消息后调用 SPI_SET_cs (SPI,FALSE)禁用 SPIEN 行,但不禁用 SPIEN 行操作,不是吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    TRANSFER_ON_MESSAGE -子系统调用驱动程序在同时对到达的传输进行排队时传输单个消息。 驱动程序完成此消息后,必须调用 SPI_finaling_current_message(),以便子系统可以发出下一条消息。 这可能会休眠。

    我认为您不应该修改 SPI 驱动程序(SPI-OMAP2-mcspi.c 和 SPI.c)、这些驱动程序是通用的。 我建议您将从器件驱动程序与 SPI.c/SPI-OMAP2-mcspi.c 保持一致和/或根据您的定制电路板细节配置 SPI 参数。 有关更多信息、请参阅以下指针:

    Linux-4.9.69/Documentation/SPI/SPI-summary
    linux-4.9.69/Documentation/devicetree/bindings/smspi/spi-bus.txt
    inux-4.9.69/Documentation/devicetree/bindings/smspi/omap-spi.txt

    processors.wiki.ti.com/.../Linux_Core_SPI_User's_Guide

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