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 kernel-4.1.15中启动 tcan4x5x.c 驱动程序。
已从以下链接下载 tcan4x5x.c 驱动程序、
我们在启动时遇到以下错误、
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);
请告诉我们出错的地方。
谢谢、此致、
哈吉
尊敬的 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中输出。
此致、