; z. E) o* j+ I% s" v0 D* i- X飞凌嵌入式OKMX8MP-C开发板有两路原生CAN总线,但用户在开发产品时可能需要用到更多的CAN,这该如何解决呢?今天小编将为大家介绍一种SPI转CAN的方法,供各位工程师小伙伴参考。 说明 ; d. \$ J& N' v$ @ i& ?) `
1 N5 \3 m$ v/ p9 S& ^
8 X7 e; Z+ K5 b( Q) @, R k: l
* ?" F$ e6 q7 P+ b7 t" R01移植MC2518芯片驱动 在OK8MP-linux-kernel/drivers/net/can/spi/路径下创建一个文件夹——mcp25xxfd,将相关文件(包含.c文件、.h文件、Makefile、Kconfig等)放置到此文件夹中。
" ]! [: K9 s- s: Y1 p5 V( {5 E/ q- a02补全对can_rx_offload_add_manual函数的定义 vi OK8MQ-linux-kernel/include/linux/can/rx-offload.h 添加: [url=]复制[/url] * A- _& ~: Z+ ?* K1 {) A' X2 q
% R" `5 ~8 K& k7 |- <font color="rgb(198, 120, 221)">int</font> can_rx_offload_add_manual(<font color="rgb(198, 120, 221)">struct</font> net_device *dev,
/ `: \1 r9 y+ z6 W - <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,' |3 y( _3 }) k
- <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)
+ Z$ k0 Z/ q7 Y5 F& M
复制代码
# A+ |( o B" B0 p# h4 O! i: Y, E- Wvi OK8MQ-linux-kernel/drivers/net/can/rx-offload.c 添加: [url=]复制[/url]
% H5 ?8 h5 @ p& s! e3 n: Z
$ z3 F& ^& q; I# J# C+ O- <font color="rgb(198, 120, 221)">int</font> can_rx_offload_add_manual(<font color="rgb(198, 120, 221)">struct</font> net_device *dev,
3 R7 V$ c4 e* r - <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,8 M% u5 C# D9 A; a
- <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)
9 k7 {# J) ?5 [ K/ i3 W - {- ~9 r b* h7 l/ K6 E
- <font color="rgb(198, 120, 221)">if</font> (offload->mailbox_read)
7 [8 ]2 R; ]5 h: O1 s0 ? - <font color="rgb(198, 120, 221)">return</font> -EINVAL;# Z d; w& n; B1 [4 y& a
- <font color="rgb(198, 120, 221)">return</font> can_rx_offload_init_queue(dev, offload, weight);6 r* Y; V# H# l/ s# _& C
- }
$ a B) P J: B% X - EXPORT_SYMBOL_GPL(can_rx_offload_add_manual);
复制代码
& _% ]& b' Z( r s6 F$ k1 Y& y# |7 y+ y: x: G; u8 e( }( l
03修改上一级目录spi/下的Makefile和Kconfig vi OK8MP-linux-kernel/drivers/net/can/spi/Makefile 添加: [url=]复制[/url] ) }8 x A/ i! S4 \0 U# i6 ?" F
4 B! u" _0 R3 y
4 k8 e' g0 _/ {* I d* P# c- q0 I6 Q
7 n3 B8 B, q! z9 S7 ^1 u! n) h5 q9 hvi OK8MP-linux-kernel/drivers/net/can/spi/Kconfig 添加: [url=]复制[/url] $ ?8 V! F6 |/ F$ C4 G4 p
- <font color="rgb(193, 132, 1)">source</font> <font color="rgb(80, 161, 79)">"drivers/net/can/spi/mcp25xxfd/Kconfig"</font>
复制代码
# ~5 J. Z) G* l. T% Q
; ^ {2 f3 y1 E# a, n; [$ l. F0 a, S& b04修改驱动配置文件,将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
; i* N9 h0 |- u5 e, I7 c! ?/ E1 N05在设备树中配置时钟 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 添加: [url=]复制[/url]
" P; Q( N" K' u% W; o+ @- clocks{
2 b* T& R' ~# G; [' P2 [ - mcp2518fd_clock: - g/ d2 |+ f9 r7 B# `
- mcp2518fd_clock{
* D1 R4 n& S5 a# J, h - compatible = "fixed-clock";2 `1 z: t+ Q9 L9 g5 I H) T2 t
- #clock-cells = <0>;# d; q; p4 ^* b d
- clock-frequency = <40000000>;8 [6 d' o7 r: k- l7 K
- };. x @/ \. [% e
- };
复制代码 8 O4 j5 R8 K6 N1 Y$ D4 _* J4 _$ @7 I
, \ W4 Q7 |! p/ E
06找一个引脚用作芯片的中断引脚 此处是将GPIO4_IO21用作了中断引脚。 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 添加: [url=]复制[/url]
* s( Z8 \+ q: A$ f+ X4 a, f+ C( Y: Q6 ]: T. @
pinctrl_ecspi2_can: ecspi2can{
$ c! d2 P7 D$ G fsl,pins = <5 l6 ^! p( z, c9 w) P9 w4 ~
MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO21 0x40000
. Z4 N' L1 U3 }9 u3 {8 ~ >;
3 M6 Q& q6 ^' b7 `8 C( b};" Z0 B, P, n. v( O1 ]% \
1 K e# X i4 I& W7 \9 F* H
07 在设备树的ecspi2节点中进行修改 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 从: [url=]复制[/url] $ ?) K( ^; F1 V8 @
) @* ^+ ?5 h3 d. `* G$ e
- &ecspi2{- ^6 ^! }$ j5 n
- #address-cells= <1>;
' z# s% z# _) S2 G9 M - #size-cells= <0>;
n4 z( O1 Z& y' ?% w2 d - fsl,spi-num-chipselects= <1>;$ B+ t9 {0 a8 k
- pinctrl-names= "default";, D- d/ y; M2 Y! a8 B# D
- pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>;' d$ f$ N* y, X: G( y2 Y
- cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
6 v5 s$ m( n7 y6 D - status= "okay";$ k7 z: }* W# [ `- z5 f* J& g
# o: y' h d4 i4 B3 d! c- spidev1:spi<a href="home.php?mod=space&uid=2514928" target="_blank">@0</a> {) X2 ?, `0 a& q* k9 ^
- reg= <0>;+ X* K# O# R( Q4 o4 h/ z
- compatible= "rohm,dh2228fv";( s1 Q2 Q. z$ h" s8 b9 e
- spi-max-frequency= <500000>;
+ C, o, @. ?+ v - };* g F) @7 |. y7 p1 F
- };
复制代码- <span style="float: left; margin-right: 5px;"><table width="98%" class="t_table"><tbody><tr><td>& C1 S0 V8 G$ I
- % A' ]9 L5 a7 a+ j$ P8 Q6 M
- <p style="line-height: 24px;"><font color="rgb(77, 77, 77)">改为:</font></p><div align="center">8 [' n6 j" c/ L& k
- <span style="float: right; margin-left: 5px;"><font color="white">[url=]复制[/url]</font></span></div>6 Z; g* w3 K$ D3 T) M4 B
- - f( t( R9 r" A+ d
- <div class="blockcode"><blockquote>&ecspi2{4 {' w% D9 e6 u- ]% ?1 D+ Z) Y! W
- #address-cells= <1>;. `. N* ]) G- E: ] |; ^- i6 U
- #size-cells= <0>;
/ n# j, Z6 u' N* X x - fsl,spi-num-chipselects= <1>;
1 ? |7 [5 w* Q: u1 x - pinctrl-names= "default";" y, p. Q& Y+ T8 ]- s) Y3 U
- pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs &pinctrl_ecspi2_can>; G4 _1 Y0 s1 {* |9 n
- cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
5 U0 q0 n% h! k - status= "okay";
- O8 ]- [6 X2 c) M$ g$ h- m. X
1 U: y6 e' U/ y: v6 ?& I, U# a- mcp1:mcp2518fd@0{
. e) w* S. u1 m& B- W- r; k - compatible= "microchip,mcp2518fd";. g% a: z' g* Q E1 l4 v7 l
- reg= <0>;' m; k6 B" D9 b6 W& c% N
- spi-max-frequency= <20000000>;/ \+ O9 G5 W) N' b5 q
- clocks= <&mcp2518fd_clock2>;
/ @% m6 W! u! c - interrupts-extended= <&gpio4 21 IRQ_TYPE_LEVEL_LOW>;% l3 s/ l/ A' v' L& I4 M
- };
7 D/ g! ~+ ` n' A - };
复制代码 4 J2 Y& }3 |8 L9 A( p9 L
, p* R" d2 y. M3 k完成上述修改后即可进行编译,并用新生成的镜像烧写OKMX8MP-C开发板。
; i, F3 o: C7 c; ?& c$ t08 开发板验证 将MCP2518芯片接到SPI2的接口上,启动OKMX8MP-C开发板,启动后使用ifconfig -a命令查看,即可看到多出了1个CAN节点。节点生成后,即可按照用户使用手册【4.18 FlexCAN测试】章节进行测试,验证功能是否正常。 |