7 c! z& K( |; |; D" J) r飞凌嵌入式OKMX8MP-C开发板有两路原生CAN总线,但用户在开发产品时可能需要用到更多的CAN,这该如何解决呢?今天小编将为大家介绍一种SPI转CAN的方法,供各位工程师小伙伴参考。 说明 2 W, V% \+ K/ j- K6 H
7 w* a5 \5 o9 M1 U: g1 U
8 V `0 ]% S8 a$ {2 w1 V. D
! T, s, {$ C+ z( l) K01移植MC2518芯片驱动 在OK8MP-linux-kernel/drivers/net/can/spi/路径下创建一个文件夹——mcp25xxfd,将相关文件(包含.c文件、.h文件、Makefile、Kconfig等)放置到此文件夹中。
9 G& F& E! Y# N1 s: g; d6 B; t02补全对can_rx_offload_add_manual函数的定义 vi OK8MQ-linux-kernel/include/linux/can/rx-offload.h 添加: [url=]复制[/url]
% n: j' @% `) [2 J- + ?3 S, x) q2 }7 Z) t
- <font color="rgb(198, 120, 221)">int</font> can_rx_offload_add_manual(<font color="rgb(198, 120, 221)">struct</font> net_device *dev,8 i- b+ @ Y3 c0 ^
- <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,
, f/ c1 M3 [, |" Q! F, o8 Z - <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)
1 x' L6 Z3 P* N6 R7 [7 E
复制代码
/ }1 M0 ]3 P5 E# { ^2 n) A& w+ Dvi OK8MQ-linux-kernel/drivers/net/can/rx-offload.c 添加: [url=]复制[/url] / p$ S8 v& F' G$ M: u- x
- x7 S6 D j3 w$ `, c+ B% c
- <font color="rgb(198, 120, 221)">int</font> can_rx_offload_add_manual(<font color="rgb(198, 120, 221)">struct</font> net_device *dev,$ z# q. q1 F7 u& r, j. S; P6 w3 @
- <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,0 ]2 V8 k: A8 N1 P. P$ ?
- <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)
/ k% c) ]+ b) p! R5 V6 m8 j. z8 ?1 `+ F - {
6 V# P( S. G: I; ^2 S - <font color="rgb(198, 120, 221)">if</font> (offload->mailbox_read)
# O! Q. p' q4 ~4 v) C - <font color="rgb(198, 120, 221)">return</font> -EINVAL;
' g7 w# D/ n4 ?% ?0 M5 z - <font color="rgb(198, 120, 221)">return</font> can_rx_offload_init_queue(dev, offload, weight);
6 A1 `, E5 U# {8 [+ e8 K7 Y* v' s - }
4 `2 ^" r2 _( u0 h9 I* Y2 a7 Z - EXPORT_SYMBOL_GPL(can_rx_offload_add_manual);
复制代码 " U6 C" N0 _% _3 L9 t* P4 S! I
2 X+ t1 h: C, v' I03修改上一级目录spi/下的Makefile和Kconfig vi OK8MP-linux-kernel/drivers/net/can/spi/Makefile 添加: [url=]复制[/url]
0 H- B; E. @! `, U$ G2 [
/ @! p! m( P" z2 y$ v# P: e- t! D. E& `
% P# X1 M) u" h" |2 [# E" d
vi OK8MP-linux-kernel/drivers/net/can/spi/Kconfig 添加: [url=]复制[/url] ~, B- y8 k" q; m6 }% d
- <font color="rgb(193, 132, 1)">source</font> <font color="rgb(80, 161, 79)">"drivers/net/can/spi/mcp25xxfd/Kconfig"</font>
复制代码
# u9 d. J! E# G1 ~" w0 ]( L& B4 }) V
04修改驱动配置文件,将MCP2518编译进内核 vi OK8MP-linux-kernel/arch/ARM64/configs/OK8MP-C_defconfig 找到:CONFIG_CAN_MCP251X=y 改为:# CONFIG_CAN_MCP251X is not set 添加:CONFIG_CAN_MCP25XXFD=y
/ n ?7 j* P; R! T7 u' z: ^05在设备树中配置时钟 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 添加: [url=]复制[/url] - 5 s2 G% D0 U$ S
- clocks{2 h0 a, d# S/ _$ h% G0 x! G' @
- mcp2518fd_clock: # J7 h/ N1 X6 S6 \
- mcp2518fd_clock{1 Z7 m9 o# q! n6 [! J. w
- compatible = "fixed-clock";
/ ?; F! p. Z; {# \ ` - #clock-cells = <0>;
7 w7 S1 D7 D; n - clock-frequency = <40000000>;1 s" p2 U. f3 G8 e/ |! \: X3 Z
- };! W' ?$ I3 i* W S2 D7 m ?# ?
- };
复制代码 % {0 w7 T8 k* w2 Y- t- a+ C
( ]3 p, k8 M# D p06找一个引脚用作芯片的中断引脚 此处是将GPIO4_IO21用作了中断引脚。 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 添加: [url=]复制[/url]
# a* y ]7 J8 O3 I$ F H
6 T( v6 i: e2 a" jpinctrl_ecspi2_can: ecspi2can{
; G+ N W0 @4 E q H6 a1 D fsl,pins = <
- B& s+ S$ y1 K$ B q( p0 S MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO21 0x40000
3 I! E% L% L5 l4 {& ^* R >;5 w! l4 Y2 C& D
};
' Z J- }8 s" D' O2 w1 F
f q& ^0 R9 Z& l2 l07 在设备树的ecspi2节点中进行修改 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 从: [url=]复制[/url] # W; e) ^& |. w: ?. i
7 S& l4 l; g; O3 j; A; `0 w+ k- &ecspi2{
S3 T8 B; x0 U - #address-cells= <1>;
& W( M# z" e6 ?! H, P4 ?: ]0 Q - #size-cells= <0>;: c) r+ F- r3 a, o' a0 [! V$ K4 U
- fsl,spi-num-chipselects= <1>;, G: D, `4 H, s2 U
- pinctrl-names= "default";0 I3 a$ r" n# g
- pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>;- B7 A% I/ h2 G* P H V
- cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
) ~" W0 a& B5 Q7 J8 x6 P* O - status= "okay";9 j4 R# K) y5 N
- I! V- g3 L s& _ s3 A7 v# D
- spidev1:spi<a href="home.php?mod=space&uid=2514928" target="_blank">@0</a> {! X$ f/ Z: |: U- a( P0 k& _ e
- reg= <0>;* B; v2 F; X! l+ Q% e5 _) p$ L
- compatible= "rohm,dh2228fv";5 I. ~1 E. m1 m7 r6 `& a0 o! u
- spi-max-frequency= <500000>;- R5 e% k# B4 H- F+ F0 Q
- };
M1 N# q/ T1 r \$ ?( ~ - };
复制代码- <span style="float: left; margin-right: 5px;"><table width="98%" class="t_table"><tbody><tr><td>5 a! y0 r* b3 {: f. I1 S x
- . P7 j) \9 z4 ?$ h0 }/ V
- <p style="line-height: 24px;"><font color="rgb(77, 77, 77)">改为:</font></p><div align="center">
7 b9 Y! c) C! t( W1 i1 _* l - <span style="float: right; margin-left: 5px;"><font color="white">[url=]复制[/url]</font></span></div>/ n- g3 K* K H- F) l+ |2 i
) a% k( t' N5 P# u. a/ t. H3 ?7 ^- <div class="blockcode"><blockquote>&ecspi2{
. U6 ?+ @2 T8 Y3 e& s/ |: d, l - #address-cells= <1>;. K/ @, m0 ]# M- t4 o
- #size-cells= <0>;
: q: a6 s/ A: {' Z w - fsl,spi-num-chipselects= <1>;) u3 J# F3 o9 F) i+ O
- pinctrl-names= "default";5 `6 ?! ~5 a+ I& d$ w
- pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs &pinctrl_ecspi2_can>;3 e/ I4 a, x8 P1 ], D s$ _7 t
- cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
; s2 e0 S4 n# i9 T* M: a8 Z - status= "okay";7 S/ d% L. D) Q6 l! P- }
- ; p' T! x/ r4 l. l
- mcp1:mcp2518fd@0{" W/ j, E) b* X$ s8 s
- compatible= "microchip,mcp2518fd";' e3 b0 _ e: U# M) L d
- reg= <0>;
, g7 N, F) H4 C- N1 Y - spi-max-frequency= <20000000>;2 d5 r: Q7 k4 d( }+ u
- clocks= <&mcp2518fd_clock2>;7 J P1 K$ m8 ?, I" f6 B, ~+ h; o
- interrupts-extended= <&gpio4 21 IRQ_TYPE_LEVEL_LOW>;
, @4 J& k7 n2 Z& e1 |( s* U' ` - };
j" w2 B+ E* r% D - };
复制代码 ?# S+ H! W( T) O7 @6 j2 G
' I3 Y5 K' s5 _' H p+ H
完成上述修改后即可进行编译,并用新生成的镜像烧写OKMX8MP-C开发板。
4 y& P1 G; A, p& Y) Y" E08 开发板验证 将MCP2518芯片接到SPI2的接口上,启动OKMX8MP-C开发板,启动后使用ifconfig -a命令查看,即可看到多出了1个CAN节点。节点生成后,即可按照用户使用手册【4.18 FlexCAN测试】章节进行测试,验证功能是否正常。 |