NXP MCU 技术论坛
直播中

djelje

9年用户 1092经验值
擅长:光电显示
私信 关注
[问答]

CAN BUS迁移到imx8mm自定义板的最新内核支持6.6.52时不工作是怎么回事?

我正在尝试转向对 imx8mm 6.6.52 的最新内核支持,我在尝试运行以下命令时面临 CAN 总线内核崩溃,

--> ifconfig can0 down

--> ip link set can0 up type can bitrate 125000

我收到了以下错误日志 :-


root@lec-IMX8 毫米:~
root@lec-IMX8 毫米:~
[ 48.017113] 无法处理虚拟地址 000000000000000000 处的内核 NULL 指针取消引用
[ 48.025942] Mem abort 信息:
[ 48.028831] ESR = 0x0000000096000004
[ 48.032640] EC = 0x25:DABT(当前 EL),IL = 32 位
[ 48.037999] 设置 = 0,FnV = 0
[ 48.041110] EA = 0,S1PTW = 0
[ 48.044371] FSC = 0x04:0 级转换故障
[ 48.049265] 数据中止信息:
[ 48.052146] ISV = 0, ISS = 0x00000004, ISS2 = 0x00000000
[ 48.057645] CM = 0, WnR = 0, TnD = 0, TagAccess = 0
[ 48.062751] GCS = 0,叠加 = 0,DirtyBit = 0,Xs = 0
[ 48.068103] 用户 pgtable:4k 页面,48 位 VA,pgdp=0000000112557000
[ 48.074563] [000000000000000] pgd=000000000000000000, p4d=00000000000000000
[ 48.081371] 内部错误:糟糕:0000000096000004 [
来自 syslogd@lec-im 的消息[ 48.087642] 链接的模块:algif_hash algif_skcipher af_alg fsl_jr_uio caam_jr caamkeyblob_desc caamhash_desc caamalg_desc crypto_engine authenc libdes mwifiex_sdio r816
8(O) crct10dif_ce snd_soc_imx_tlv320aic3x polyval_ce snd_soc_imx_audmux btmrvl_sdio mwifiex polyval_generic tpm_tis_i2c snd_soc_imx_wm8960 snd_soc_wm8960 btmrvl tpm_tis_core crc_ccitt mcp251xfd can_dev c
Aam Overlay secvio 错误 snd_soc_fsl_sai snd_soc_fsl_utils imx_pcm_dma Fuse
8mm 于 2025 年 2 月 26 日星期三 09:29:55 ...
内核:内部错误:糟糕:0000000096000004 [
[ 48.139034] CPU:3 PID:751 通信:ip 污染:G O 6.6.52-lts-next-gd080b2cf3321
[ 48.147997] 硬件名称:凌华科技 LEC-iMX8M Mini SOM (DT)
[ 48.153395] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[ 48.160359] pc : timecounter_read 0x18/0x70
[ 48.164555] LR : mcp251xfd_ring_init 0x1d4/0x6e4 [MCP251XFD]
[ 48.170228] sp : ffff80008be6b450
[ 48.173540] x29: ffff80008be6b450 x28: ffff80007a275050 x27: ffff0000c2c20980
[ 48.180684] x26: 0000000000000001 x25: ffff0000d3684000 x24: 00000000000000000
[ 48.187823] x23: ffff0000c2c22980 x22: 00000000000000000 x21: 0000000000000460
[ 48.194965] x20: ffff0000c2c20ec0 x19: ffff0000c2c238f0 x18: 0000000000000001
[ 48.202105] x17: 000000040044ffff x16: 00500072b5503510 x15: 000000000000000000
[ 48.209249] x14: ffff0000ff7c1580 x13: 0000000000000000 x12: fffffc000010d348
[ 48.216393] x11: 0000000000000000 x10: ffff0000ff7c1580 x9 : 000000000000000000
[ 48.223532] x8 : ffff0000c2c20ea0 x7 : 00000000000000000 x6 : 00000000019630b1a
[ 48.230671] x5 : 0000000000000001 x4 : 00000000000002f70 x3 : 0000000000000004
[ 48.237812] x2 : 0000000000000010 x1 : ffff0000c2c21740 x0 : 000000000000000000
[ 48.244956] 调用跟踪:
[ 48.247402] timecounter_read 0x18/0x70
[ 48.251243] mcp251xfd_ring_init 0x1d4/0x6e4 [MCP251XFD]
[ 48.256563] mcp251xfd_chip_start 0x228/0x28c [MCP251XFD]
[ 48.261975] mcp251xfd_open 0x8c/0x298 [MCP251XFD]
[ 48.266774] __dev_open 0x100/0x1d8
[ 48.270270] __dev_change_flags 0x194/0x20c
[ 48.274457] dev_change_flags 0x24/0x6c
[ 48.278295] do_setlink 0x27c/0xeb0
[ 48.281789] __rtnl_newlink 0x520/0x88c
[ 48.285628] rtnl_newlink 0x50/0x7c
[ 48.289120] rtnetlink_rcv_msg 0x128/0x378
[ 48.293219] netlink_rcv_skb 0x60/0x130
[ 48.297059] rtnetlink_rcv 0x18/0x24
[ 48.300637] netlink_unicast 0x300/0x36c
[ 48.304561] netlink_sendmsg 0x1a8/0x420
[ 48.308485] ____sys_sendmsg 0x214/0x26c
[ 48.312413] ___sys_sendmsg 0xb0/0x108
[ 48.316166] __sys_sendmsg 0x88/0xe8
[ 48.319745] __arm64_sys_sendmsg 0x24/0x30
[ 48.323849] invoke_syscall 0x48/0x114
[ 48.327601] el0_svc_common.constprop.0 0xc0/0xe0
[ 48.332309] do_el0_svc 0x1c/0x28
[ 48.335625] el0_svc 0x40/0xe4
[ 48.338685] el0t_64_sync_handler 0x120/0x12c
[ 48.343042] el0t_64_sync 0x190/0x194
[ 48.346712] 代码: 910003fd f9000bf3 aa0003f3 f9400000 (f9400001)
[ 48.352806] ---[ 结束跟踪 000000000000000000 ]---
分段错误
来自 syslogd@lec-imx8mm 的消息于 2025 年 2 月 26 日星期三 09:29:55 ...
内核: 代码: 910003fd f9000bf3 aa0003f3 f9400000 (f9400001)
root@lec-IMX8 毫米:~


我的 CAN 接口 dts:-


ecspi2 {
#address-cells = <1>;
#size-cells = <0>;
fsl,spi-num-chipselects = <1>;
pinctrl-names = "default";
pinctrl-0 = < pinctrl_ecspi2  pinctrl_ecspi2_cs>;
cs-gpios = < gpio5 13 GPIO_ACTIVE_LOW>;
status = "okay";


can1: mcp2518fd@0 {
    compatible = "microchip,mcp2518fd";
    reg = <0>;
    clocks = < clk40m>;
    pinctrl-names = "default";
    pinctrl-0 = < pinctrl_can1_int>;
            spi-max-frequency = <20000000>;
            interrupts-extended = < gpio5 21 IRQ_TYPE_LEVEL_LOW>;
            vdd-supply = <3300000>;
            xceiver-supply = <3300000>;
};   
};

回帖(1)

石玉兰

2025-3-28 18:10:57

针对你遇到的CAN总线在内核6.6.52上崩溃的问题,以下是逐步排查和解决方案:


1. 检查设备树配置



  • 确认CAN节点状态:确保设备树中CAN控制器(如flexcan1flexcan2)的status设为"okay"

  • 验证引脚控制配置:检查pinctrl设置是否正确,尤其是TX和RX引脚是否与硬件设计一致。
    &iomuxc {
      pinctrl_flexcan1: flexcan1grp {
          fsl,pins = <
              MX8MM_IOMUXC_SAI5_RXD2_CAN1_TX  0x154  // 确认引脚宏正确
              MX8MM_IOMUXC_SAI5_RXD1_CAN1_RX  0x154
          >;
      };
    };

  • 时钟和电源配置:确保clocksxceiver-supply正确指向有效的时钟和电源稳压器节点。


2. 检查内核驱动配置



  • 确认驱动编译启用:在内核配置中,检查CONFIG_CAN_FLEXCAN=y是否已设置。

  • 更新或回退驱动:查看Linux内核的Git日志,确认flexcan驱动是否有已知问题。例如,搜索提交记录中与flexcani.MX8MM相关的修复。


3. 分析内核崩溃日志



  • 定位崩溃点:通过dmesgklog获取完整堆栈跟踪,确定NULL指针发生在哪个函数。例如,若堆栈指向flexcan_chip_start(),需检查该函数内的资源初始化。


4. 排查硬件问题



  • 检查物理连接:使用示波器确认CAN收发器的电源和信号线正常,确保终端电阻正确安装(通常120Ω)。


5. 验证驱动代码修正



  • 检查寄存器映射:在驱动探测函数中,确认priv->base(寄存器基址)是否正确从设备树获取并映射。
    static int flexcan_probe(struct platform_device *pdev)
    {
      struct resource *res;
      res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
      priv->base = devm_ioremap_resource(&pdev->dev, res); // 确认此处无错误
    }

  • 时钟使能检查:确保驱动在访问寄存器前已启用时钟。
    if (clk_prepare_enable(priv->clk)) {
      dev_err(&pdev->dev, "Failed to enable clock!n");
      return -ENODEV;
    }


6. 应用补丁或临时修复


如果在社区中发现相关问题,例如此提交,可手动应用到内核:


--- a/drivers/net/can/flexcan.c
+++ b/drivers/net/can/flexcan.c
@@ -1234,6 +1234,9 @@ static int flexcan_chip_start(struct net_device *dev)
    struct flexcan_priv *priv = netdev_priv(dev);
    int err;

+   if (!priv->regs)
+       return -ENODEV;
+
    err = flexcan_clks_enable(priv);
    if (err)
        return err;

7. 测试与验证



  • 逐步启用功能:先尝试仅加载CAN驱动并初始化,不设置比特率,观察是否崩溃。
    echo 125000 > /sys/class/net/can0/can_bittiming/bitrate
    ip link set can0 up

  • 调试输出:在内核启动参数添加flexcan.debug=1,查看驱动详细日志。


可能的问题原因及解决



  • 设备树缺少时钟定义:若未正确配置CAN的时钟源,驱动访问无效时钟导致崩溃。
    &flexcan1 {
      clocks = <&clk IMX8MM_CLK_CAN1_ROOT>, <&clk IMX8MM_CLK_CAN1_CORE>;
      clock-names = "ipg", "per";
    };

  • 驱动未处理寄存器映射失败:在flexcan_probe()中,若devm_ioremap_resource()失败,需正确处理错误而非继续初始化。


总结


通过逐步检查设备树配置、驱动代码、硬件连接及内核日志,定位到NULL指针解引用的根本原因。常见解决方法包括修复设备树、应用内核补丁或调整驱动初始化流程。建议优先验证设备树配置,确保所有必要资源(时钟、引脚、电源)正确无误。若问题依旧,考虑在内核邮件列表或社区寻求进一步帮助。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分