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.

[参考译文] TCAN4550:TCAN4550RGYR 启动问题。

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/862270/tcan4550-tcan4550rgyr-bootup-issue

器件型号:TCAN4550

您好!

我们正在尝试在 Linux kernel-4.1.15中启动 tcan4x5x.c 驱动程序。  

已从以下链接下载 tcan4x5x.c 驱动程序、

链接: git.kernel.org/.../m_can  

我们在启动时遇到以下错误、

SPI_IMX 2008000.ecspi:探测
CAN 器件驱动程序接口
tcan4x5x spi0.0:无法获取消息 RAM 配置。
tcan4x5x:spi0.0的探测器失败,错误-12

我们的 DTS 文件如下所示、

ecspi1{(&E)
FSL、SPI-num-chipsects=<1>;
pinctrl-names ="default";
pinctrl-0 =<&pinctrl_ecspi1_1>;
CS-GPIO =<&GPIO4 26 0>;
状态="正常";

tcan4x5x:tcan4x5x@0{
兼容="ti、tcan4x5x";
reg =<0>;
#address-cells =<1>;
大小单元格=<1>;
SPI-max-frequency =<10000000>;
时钟名称="hclk"、"cclk";
Bosch、MRAM-cfg =<0x0 0 0 32 0 1 1>;
interrupt-parent =<&GPIO1>;
中断=<23 GPIO_ACTIVE_LOW_>;
RESET-GPIO =<&GPIO1 22 GPIO_ACTIVE_LOW>;
状态="正常";
};
}; 

注: 我们不确定"Bosch、MRAM-cfg =<0x0 0 0 32 0 1 1>;"是否正确。

供参考、我们确认 SPI (时钟、MOSI)线路正确。 通过启用 spidev.c 驱动程序进行验证。

请求您提供支持以解决此问题。

此致、
哈吉

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

    您好、Haji、

    tcan4x5x.c 驱动程序已被应用到 Linux 内核中、通常受 Linux 社区的支持。  此论坛主要面向 TCAN4550器件参数和物理层支持以及硬件本身、而不一定面向 Linux 固件调试支持。

    但是,我已经仔细查看了设备树源代码,它看起来与 Bosch MCAN 控制器设备树绑定 文档中的示例代码非常相似,我将在下面复制该示例代码,以使该线程受益。

    Bosch MCAN 控制器设备树绑定
    -------------------------------------------------------
    
    必需的属性:
    -兼容:对于 M_CAN 控制器,应该是"Bosch,m_CAN"
    - reg:M_CAN
    寄存器映射和消息 RAM 的物理基址和大小
    - reg 名称:应该是"m_CAN"和"message_ram"
    -中断: 应为 M_CAN 中断
    线路0和线路1的中断编号、如果共享
    同一中断、则可以相同。
    中断名称:应该包含"int0"和"int1"-
    时钟:控制器使用的时钟,应该是主机时钟
    和 CAN 时钟。
    -时钟名称:应包含"hclk"和"cclk"
    -pinctrl- :如 bindings/pinctrl/pinctrl-bindings.txt
    中所述的 Pinctrl 状态- pinctrl-names:与编号的 pinctrl 状态相对应的名称
    - Bosch,MRAM-cfg:消息 RAM 配置数据。
    多个 M_CAN 实例可以共享相同的消息
    RAM、
    并且消息 RAM 中的每个元素(例如 Rx FIFO 或 Tx 缓冲器等)的编号也是可配置
    
    的、因此该属性告诉驱动器此 M_CAN 控制器如何使用共享或私有消息 RAM。
    
    格式应如下:
    
    "offset"是消息 RAM 的地址偏移量
    、以下元素从该偏移量开始。
    如果您使用的是专用消息
    RAM、则通常会将其设置为0x0。 剩余单元用于指定
    每个 FIFO/缓冲器使用的元素数量。
    
    M_CAN 根据用户手册包含以下元素:
    11位滤波器0-128个元素/0-128个字
    29位滤波器0-64个元素/0-128个字
    Rx FIFO 0-64个元素/0-1152个字
    Rx FIFO 1-64个元素/0-1152个字
    Rx 缓冲器0-64个元素/0-1152个字
    Tx 事件 FIFO0-32个元素/0-64个字
    Tx 缓冲器0-32个元素/ 0-576字
    
    
    有关详细信息,请参阅博世 M_CAN 用户手册中的2.4.1消息 RAM 配置。
    
    可选子节点:
    - CAN-收 发器:描述
    可用于 CAN/CAN-FD 模式的最大速度的 CAN 收发器子节点。
    
    有关详细信息、请参阅 Documentation/devicetree/bindings/snet/CAN/can-transceiver.txt。
    示例:
    SoC dtsi:
    M_CAN1:CAN@20e8000{
    compatible ="Bosch、m_CAN";
    reg =<0x020e8000 0x4000>、<0x02298000 0x4000>;
    reg-names ="m_CAN"、"message_ram";
    interrupts =<0 114 0x04>、
    0 114 0x04>;
    中断名称="int0"、"INT1";
    时钟=<&CLKS IMX6SX_CLK_CANFD>、
    <&CLKS IMX6SX_CLK_CANFD>;
    时钟名称="hclk"、"cclk";
    Bosch、MRAM-cfg =<0x0 &CANFD>;CANTRL
    
    
    = 0
    
    
    = 0 = 0 = 1;CANCCTR0 = 0 = 0 = 0 = 1;INCCTRL
    
    
    0
    = 0 = 1;CANTRL 0 = 0 = 0 = INCC1;INTRL = INTRL 0 = INCC1;INTRL = INTRL 0 = INCC1;INTRL = INCC1 = INTRL 0 = INCC1;INTRL 0 = INCC1 = INTR
    
    

    根据您的代码:
    Bosch、MRAM-cfg =<0x0 0 0 32 0 1 1>;

    您需要32个 Rx FIFO 0元素、1个 Tx 事件 FIFO 元素和1个 Tx 缓冲器元素。 除了额外的 Tx 事件 FIFO 元素外、这看起来就像示例配置一样、我认为应该是可以的。  我曾经看到过一些在某一点上提到内核不支持 Tx 事件 FIFO 的信息、但这可能是过时的信息、现在可以支持此信息。  我会承认、我不是这方面的专家、只是分享我看到的内容。  但是、无论 Tx 事件 FIFO 当前是否受支持、我都不认为该值是导致问题的原因。

    我注意到您收到-12错误、如果我回答正确、Linux -12错误是从以下代码的 fwnode_property_read_u32_array 函数中抛出的"ENOMEM"或"Out of Memory"错误。  如果我理解正确、它会尝试拉取您在 DTS 文件中定义的 MRAM-cfg 值并将其存储到 MRAM_CONFIG_Vs 存储器分配中。  

    struct m_CAN_classdev *m_CAN_class_alloce_dev (struct device *dev)
    {
    struct m_CAN_classdev * class_dev = NULL;
    u32 mRAM_config_vals[MRAM_CFG_LEN];
    struct net_device * net_dev;
    u32 tx_fifo_size;
    int;
    
    RET = fwnode_property_read_u32_array (dev_fwnode (dev)、
    "Bosch、MRAM-cfg"、
    MRAM_CONFIG_Vs、
    sizeof (MRAM_CONFIG_vals)/ 4);
    if (ret){
    DEV_ERR (dev、"无法获取消息 RAM 配置。");
    goto out;
    }
    
    //获取 TX FIFO 大小
    *定义回送的回显缓冲器总量
    */
    TX_FIFO_SIZE = MRAM_CONFIG_Vs[7];
    
    //分配 m_size_net_device*
    (*= tfifo_size_siz_siz_salloc);//
    if (!net_dev){
    dev_err (dev、"分配 CAN 设备失败");
    goto out;
    }
    
    class_dev = netdev_priv(net_dev);
    if (!class_dev){
    dev_err (dev、"初始化 netdev cdevate"失败);
    goto out;
    }
    
    class_dev->net = net_dev_dev_m_devm
    
    ;net_dev_dev_dev_dev_dev_m_set_net_dev_dev_dev_m_dev_m_dev_dev_edv;
    
    MRAM_CONFIG_Vs);
    输出:
    返回 class_dev;
    }
    export_symbol_GPL (m_CAN_class_allocated_dev); 

    我还注意到、我们的 DTS 文件的"reg"参数设置为<0>、我认为这可能是一个问题、也可能是您想要检查的问题。  根据我对该属性的理解、这是 M_CAN 寄存器映射和消息 RAM 的物理基址和大小。  我在文档的示例代码中看到、它们设置了基址和大小分配、而代码不设置。

    这让我怀疑您的"内存不足"错误代码是否可能是未分配任何实际内存的结果。  我还是不是 Linux 驱动程序代码的专家、也不了解所有这些代码的运行方式、但内存分配代码和内存不足错误消息之间的差异似乎太容易指出。

    此致、

    Jonathan

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

    你好 Jonathan、

    我还注意到、我们的 DTS 文件的"reg"参数设置为<0>、我认为这可能是一个问题、也可能是您想要检查的问题。  根据我对该属性的理解、这是 M_CAN 寄存器映射和消息 RAM 的物理基址和大小。  我在文档的示例代码中看到、它们设置了基址和大小分配、而代码不设置。

    Haji->我们在下面提到了 tcan4x5x.txt 文档文件,以便为 tcan4x5x.c 驱动程序创建 DTS 文件项,如下所示

    德州仪器 TCAN4x5x CAN 控制器
    ========================================================================================================

    该文件提供 TCAN4x5x 接口包含的器件节点信息。

    所需属性:
           -兼容:"TI、tcan4x5x"
           -寄存器:0
           -#address-cells:1.
           -#SIZE–单元格:0
           - SPI-max-frequency:芯片可以使用的 SPI 总线的最大频率
                                工作频率应小于或等于18MHz。
           - DEVICE-WAKE-GPIO:唤醒 GPIO 以唤醒 TCAN 器件。
           -中断父级:提供的中断控制器的相位
                       中断。
           -中断:数据就绪的中断规范。

    更多信息、请参阅 Documentation/devicetree/bindings/snet/CAN/m_can.txt
    必需的属性详细信息。

    可选属性:
           -复位 GPIO:硬接线输出 GPIO。 如果未定义、则为软件
                          复位。
           -器件状态 GPIO:指示器件是否处于中的输入 GPIO
                                 睡眠状态或器件是否处于活动状态。

    示例:
    tcan4x5x:tcan4x5x@0{
                   兼容="ti、tcan4x5x";
                   reg =<0>;
                   #address-cells =<1>;
                   大小单元格=<1>;
                   SPI-max-frequency =<10000000>;
                   Bosch、MRAM-cfg =<0x0 0 0 32 0 1 1>;
                   interrupt-parent =<&GPIO1>;
                   中断=<14 GPIO_ACTIVE_LOW_>;
                   器件状态 GPIO =<&GPIO3 21 GPIO_ACTIVE_HIGH_>;
                   DEVICE-WAKE-GPIO =<&GPIO1 15 GPIO_ACTIVE_HIGH_>;
                   RESET-GPIO =<&GPIO1 27 GPIO_ACTIVE_LOW>;
    };

    此致、
    哈吉

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

    您好、Haji、

    好的一点、我也应该在我的原始帖子中引用了该文件、由于您遵循了该示例、我认为问题不在于您使用的设置。  

    我相信您收到的错误代码12是指处理器无法分配内存来存储从该文件检索到的设置。  由于这不是与硬件中的 TCAN4550器件通信所特有的问题、并且是引导过程的一部分、我将检查您的存储器是如何分配的。

    此致、

    Jonathan

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

    尊敬的 Jonathan:

    不是从 tcan4x5x.c 驱动程序中读取 DTS 文件中的"Bosch、MRAM-cfg"条目、而是按如下方式将值直接硬编码到驱动程序、以避免出现"tcan4x5x spi0.0:无法获取消息 RAM 配置"错误。

    #if 0 //注释
    的 ret = fwnode_property_read_u32_array (dev_fwnode (dev)、
    "Bosch、MRAM-cfg"、
    MRAM_CONFIG_Vs、
    sizeof (MRAM_CONFIG_R)/ 4);
    if (ret){
    DEV_err (dev、"Could not get Message RAM configuration (无法获取消息 RAM 配置)。");
    转至输出;
    }
    
    #endif
    MRAM_CONFIG_Vs[0]= 0;
    MRAM_CONFIG_Vs[1]= 0;
    MRAM_CONFIG_Vs[2]= 0;
    MRAM_CONFIG_Vs[3]= 32;
    MRAM_CONFIG_Vs[4]= 0;
    MRAM_CONFIG_Vs[5]= 0;
    MRAM_CONFIG_Vs[6]= 1;
    MRAM_CONFIG_Vs[7]= 1; 

    在执行上述更改后、我们在启动时会遇到以下错误、

    tcan4x5x spi0.0:不支持的版本号:0
    tcan4x5x spi0.0:探测器失败,错误=-22
    tcan4x5x:spi0.0的探测器失败,错误-22

    供参考、当我们尝试读取 mcan 寄存器时、返回值始终为"0"。 示例如下所示、

    int read_xidam = tcan4x5x_read_reg (mcan_class、90); 

    请告诉我们出错的地方。

     

    谢谢、此致、

    哈吉

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

    您好、Haji、

    在您的原始帖子中、您说过您使用的是 Linux 内核版本4.1.15。  我怀疑这可能与驱动程序与您使用的内核版本之间的兼容性问题有关。  

    内核版本5.4发布了这些驱动程序。  可能需要对驱动程序进行一些修改才能正确地返回到以前的内核版本。  例如、我相信您可以在此处找到向后移植到4.14的版本:

    我不知道有任何版本已回移植到4.14之前的版本。  您可以尝试使用较新版本的内核吗?

    此致、

    Jonathan

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

    尊敬的 Jonathan:

    已将 tcan4x5x.c 驱动程序移植到4.19.21 Linux 内核。  我们仍然面临以下错误、

    tcan4x5x spi0.0:不支持的版本号:0
    tcan4x5x spi0.0:探测器失败,错误=-22
    tcan4x5x:spi0.0的探测器失败,错误-22

    供参考、
    当驱动器尝试读取 MCAN 寄存 器以获取 MCAN 版本(m_CAN_CHECK_CORE_RELEASE)时、SPI 时钟未脉冲、通过示波器进行检查。

    此致、
    哈吉

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

    您好、Haji、

    您的 SPI 配置显然存在问题、妨碍了与 TCAN4550器件的通信。  这可能是 SPI 和/或时钟配置错误。  您如何配置 SPI 和时钟?  您是否也通过器件树实现了这一点?  您能否验证这些配置是否正确? 我尚未看到您的代码的那一部分。

    如果您认为这些配置正确、您是否可以进行任何形式的手动 SPI 通信?  如果可以、我们可以尝试读取和写入 TCAN4550中的寄存器、以测试 TCAN4550是否能够进行通信、并消除 TCAN4550硬件作为潜在错误源的问题。

    此外、您使用的硬件平台是什么?  这是 BeagleBone Black、Raspberry PI 等标准开发平台吗?  如果是、您是否将 TCAN4550EVM 或 BOOST-XL-CANFD 板用于 TCAN4550?  或者您是否开发了自己的电路板?

    此致、

    Jonathan

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

    尊敬的 Jonathan:

    请在下面找到我们的回复、

    您的 SPI 配置显然存在问题、妨碍了与 TCAN4550器件的通信。  这可能是 SPI 和/或时钟配置错误。  您如何配置 SPI 和时钟?  您是否也通过器件树实现了这一点?  您能否验证这些配置是否正确? 我尚未看到您的代码的那一部分。

    Haji ->下面是针对 Linux 内核中的 TCAN4550完成的 DTS 配置

    时钟{
    hclk:时钟@4{
    compatible ="固定时钟";
    reg =<3>;
    #clock-cells =<0>;
    clock-frequency =<40000000>;
    clock-output-names ="hclk";
    };
    cclk:时钟@5{
    兼容="固定时钟";
    reg =<3>;
    #clock-cells =<0>;
    时钟频率=<40000000>;
    时钟输出名称="cclk";
    };
    };
    ecspi1{
    FSL、SPI-num-chipsects=<1>;
    CS-GPIO =<&GPIO4 26 0>;
    pinctrl-names ="default";
    pinctrl-0 =<&pinctrl_ecspi1_1 &pinctrl_ecspi1_cs>;
    状态="正常";
    
    tcan4x5x:tcan4x5x@0{
    兼容="ti、tcan4x5x";
    reg =<0>;
    #address-cells =<1>;
    大小单元格=<1>;
    SPI-max-frequency =<10000000>;
    Bosch、MRAM-cfg =<0x0 0 0 32 0 1 1>;
    时钟=<&hclk>、<&cclk>;
    时钟名称="hclk"、"cclk";
    状态="正常";
    };
    };
    

    注意:   在 imx6ull 平台不支持的驱动程序中存在 cclk 和 hclk 时钟。 因此、如上所示启用时钟。 此配置是否正确?

    如果您认为这些配置正确、您是否可以进行任何形式的手动 SPI 通信?  如果可以、我们可以尝试读取和写入 TCAN4550中的寄存器、以测试 TCAN4550是否能够进行通信、并消除 TCAN4550硬件作为潜在错误源的问题。

    Haji -> 通过启用 Spidev 驱动程序验证了 SPI (时钟和 MOSI)线路。  由于 MISO 正在探测、因此未对 TCAN4550执行寄存器读取/写入操作。 是否仍需要验证测试?

    此外、您使用的硬件平台是什么?  这是 BeagleBone Black、Raspberry PI 等标准开发平台吗?  如果是、您是否将 TCAN4550EVM 或 BOOST-XL-CANFD 板用于 TCAN4550?  或者您是否开发了自己的电路板?

    Haji -> 是的,我们的平台是基于 IMX6ULL 的定制平台。 我们还使用 TCAN4550EVM 板。

    此致、
    哈吉

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

    Haji、

    感谢您的耐心等待、由于美国假期、一些回复将会延迟。 我们将在本周结束前再次与您进行讨论。

    此致、

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

    Haji、

    是的、CLK 和 SCLK 配置在分配和使用的速率方面看起来不错。 我认为 SPI 验证测试仍然很有用、可以验证数据是否正确地发送到 TCAN4550中或从 TCAN4550中输出。

    此致、

x 出现错误。请重试或与管理员联系。