板子:rk3568
平台:android11
1.问题描述
设备树中can的配置:
can1: can@fe580000 {
compatible = "rockchip,canfd-1.0";
reg = <0x0 0xfe580000 0x0 0x1000>;
interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru CLK_CAN1>, <&cru PCLK_CAN1>;
clock-names = "baudclk", "apb_pclk";
resets = <&cru SRST_CAN1>, <&cru SRST_P_CAN1>;
reset-names = "can", "can-apb";
tx-fifo-depth = <1>;
rx-fifo-depth = <6>;
status = "disabled";
};
...
&can1 {
assigned-clocks = <&cru CLK_CAN1>;
assigned-clock-rates = <150000000>;
pinctrl-names = "default";
pinctrl-0 = <&can1m1_pins>;
status = "okay";
};
本来我想通过下面的命令来将can配置成换回模式测试一下can是否发送接收正常,结果出现:RTNETLINK answers: Invalid argument日志而且同过ifconfig命令也看到can没有开启,但是设置成正常模式就不会出现这种情况
+ ip link set can0 down
+ ip link set can0 type can bitrate 500000 loopback on
+ ip -details link show can0
3: can0: <NOARP,ECHO> mtu 72 qdisc noop state DOWN mode DEFAULT group default qlen 10
link/can promiscuity 0
can <LOOPBACK,FD> state STOPPED (berr-counter tx 0 rx 0) restart-ms 0
bitrate 498322 sample-point 0.865
tq 13 prop-seg 64 phase-seg1 64 phase-seg2 20 sjw 1
rockchip_canfd: tseg1 1..128 tseg2 1..128 sjw 1..128 brp 1..256 brp-inc 2
rockchip_canfd: dtseg1 1..32 dtseg2 1..16 dsjw 1..16 dbrp 1..256 dbrp-inc 2
clock 148500000numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
+ ip link set can0 up
RTNETLINK answers: Invalid argument
下面是直接设置成正常收发模式的日志:
+ echo can0
+ grep can
+ result=can0
+ ip link set can0 down
+ ip link set can0 type can bitrate 1000000 dbitrate 3000000 fd on
+ ip -details link show can0
3: can0: <NOARP,ECHO> mtu 72 qdisc noop state DOWN mode DEFAULT group default qlen 10
link/can promiscuity 0
can <FD> state STOPPED (berr-counter tx 0 rx 0) restart-ms 0
bitrate 1003378 sample-point 0.743
tq 13 prop-seg 27 phase-seg1 27 phase-seg2 19 sjw 1
rockchip_canfd: tseg1 1..128 tseg2 1..128 sjw 1..128 brp 1..256 brp-inc 2
dbitrate 2970000 dsample-point 0.720
dtq 13 dprop-seg 8 dphase-seg1 9 dphase-seg2 7 dsjw 1
rockchip_canfd: dtseg1 1..32 dtseg2 1..16 dsjw 1..16 dbrp 1..256 dbrp-inc 2
clock 148500000numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
+ ip link set can0 up
于是我更改了设备树不用canfd,将其改成正常的can
can1: can@fe580000 {
compatible = "rockchip,can-1.0";//"rockchip,canfd-1.0";
reg = <0x0 0xfe580000 0x0 0x1000>;
interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru CLK_CAN1>, <&cru PCLK_CAN1>;
clock-names = "baudclk", "apb_pclk";
resets = <&cru SRST_CAN1>, <&cru SRST_P_CAN1>;
reset-names = "can", "can-apb";
tx-fifo-depth = <1>;
rx-fifo-depth = <6>;
status = "disabled";
};
...
&can1 {
assigned-clocks = <&cru CLK_CAN1>;
assigned-clock-rates = <150000000>;
pinctrl-names = "default";
pinctrl-0 = <&can1m1_pins>;
status = "okay";
};
打印:
+ ip link set can0 down
+ ip link set can0 type can bitrate 500000 loopback on
+ ip -details link show can0
3: can0: <NOARP,ECHO> mtu 16 qdisc noop state DOWN mode DEFAULT group default qlen 10
link/can promiscuity 0
can <LOOPBACK> state STOPPED (berr-counter tx 0 rx 0) restart-ms 0
bitrate 501689 sample-point 0.750
tq 498 prop-seg 1 phase-seg1 1 phase-seg2 1 sjw 1
rockchip_can: tseg1 1..16 tseg2 1..8 sjw 1..4 brp 1..128 brp-inc 2
clock 148500000numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
+ ip link set can0 up