417 字
2 分钟
Linux FlexCAN调试

设备树#

按照手册来即可,注意Alpha版上Flexcan2节点的引脚被ecspi3复用,节点中要屏蔽掉flexcan2:

/* Conflict with ECSPI3 */
&can2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_flexcan2>;
xceiver-supply = <&reg_can_3v3>;
status = "disabled";
};

原厂设备树节点中xceiver-supply = <&reg_can_3v3>;这个属性可能会导致deferred probing,让CANprobe不出来,屏蔽掉这个属性就可以,完成后的节点如下:

&can1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_flexcan1>;
//xceiver-supply = <&reg_can_3v3>;
status = "okay";
};

完成后ifconfig -a应该可以看得到CAN节点信息:

/ # ifconfig -a
can0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
NOARP MTU:16 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:10
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:206
eth0 Link encap:Ethernet HWaddr EA:36:EF:87:91:0F
inet addr:192.168.1.103 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::e836:efff:fe87:910f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3294 errors:0 dropped:0 overruns:0 frame:0
TX packets:1444 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4472406 (4.2 MiB) TX bytes:259612 (253.5 KiB)
eth1 Link encap:Ethernet HWaddr C6:F2:80:26:D2:07
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
sit0 Link encap:IPv6-in-IPv4
NOARP MTU:1480 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

iproute库编译#

经过试验,新版本的iproute确实会出现找不到诸如libelf头文件等奇怪的情况,暂未深究原因。

编译时可能报错:

错误: 对‘setns’的静态声明出现在非静态声明之后 方法是打开iproute根目录/include/namespace.h文件,注释掉下面几行:

#ifndef HAVE_SETNS
static inline int setns(int fd, int nstype)
{
#ifdef __NR_setns
return syscall(__NR_setns, fd, nstype);
#else
errno = ENOSYS;
return -1;
#endif
}
#endif /* HAVE_SETNS */

然后重新编译

Linux FlexCAN调试
https://arkmostima.pages.dev/posts/linuxflexcan调试/
作者
Aki
发布于
2025-04-17
许可协议
CC BY-NC-SA 4.0