zynq 在linux下can总线bus-off无法自恢复的问题

2022/4/27 7:14:41

本文主要是介绍zynq 在linux下can总线bus-off无法自恢复的问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

内核dump

[   10.972675] at803x_config_init !
[   10.973178] IPv6: ADDRCONF(NETDEV_UP): eth2: link is not ready
[   11.629082] macb ff0b0000.ethernet eth0: link up (1000/Full)
[   11.629110] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[   11.980898] xilinx_axienet a0000000.ethernet eth2: Link is Down
[   13.072256] xilinx_can ff060000.can can0: bitrate error 0.0%
[   13.114484] xilinx_can ff070000.can can1: bitrate error 0.0%
[   13.155897] xilinx_can a0020000.can can2: bitrate error 0.0%
[   13.197189] xilinx_can a0030000.can can3: bitrate error 0.0%
[   13.239037] xilinx_can a0040000.can can4: bitrate error 0.0%
[   13.281563] xilinx_can a0050000.can can5: bitrate error 0.0%
[   13.324999] xilinx_can a0060000.can can6: bitrate error 0.0%
[   13.367929] xilinx_can a0070000.can can7: bitrate error 0.0%
[   14.189016] random: crng init done
[   14.189026] random: 7 urandom warning(s) missed due to ratelimiting
[ 5796.758579] xilinx_can a0060000.can can6: bus-off
[ 6894.946613] xilinx_can ff060000.can can0: bitrate error 0.0%
[ 6894.998665] xilinx_can ff070000.can can1: bitrate error 0.0%
[ 6895.052884] xilinx_can a0020000.can can2: bitrate error 0.0%
[ 6895.106374] xilinx_can a0030000.can can3: bitrate error 0.0%
[ 6895.156836] xilinx_can a0040000.can can4: bitrate error 0.0%
[ 6895.208594] xilinx_can a0050000.can can5: bitrate error 0.0%
[ 6895.258665] xilinx_can a0060000.can can6: bitrate error 0.0%
[ 6895.274154] IPv6: ADDRCONF(NETDEV_UP): can6: link is not ready
[ 6895.274179] IPv6: ADDRCONF(NETDEV_CHANGE): can6: link becomes ready
[ 6895.308874] xilinx_can a0070000.can can7: bitrate error 0.0%

可以看到在内核启动5796s时发现can的bus-off error从而导致这一路can出现问题后,再没有进行数据的接收了

通过查看内核的can的驱动框架

不需要看的很深,其大体的uml关系图如下

在这里插入图片描述
可以看到内核对于can_bus-off是由相关的处理机制的

/*
 * CAN bus-off
 *
 * This functions should be called when the device goes bus-off to
 * tell the netif layer that no more packets can be sent or received.
 * If enabled, a timer is started to trigger bus-off recovery.
 */
void can_bus_off(struct net_device *dev)
{
    struct can_priv *priv = netdev_priv(dev);
 
    netdev_info(dev, "bus-off\n");
 
    netif_carrier_off(dev);
//debug时发现该值为0
    if (priv->restart_ms)
        schedule_delayed_work(&priv->restart_work,
                      msecs_to_jiffies(priv->restart_ms));
}
EXPORT_SYMBOL_GPL(can_bus_off);

通过debug,发现这个时间值为0,那么只需要在probe时加上该值的赋值即可



这篇关于zynq 在linux下can总线bus-off无法自恢复的问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程