6 }# P- G4 X, V" T: ]& U# {飞凌嵌入式OKMX8MP-C开发板有两路原生CAN总线,但用户在开发产品时可能需要用到更多的CAN,这该如何解决呢?今天小编将为大家介绍一种SPI转CAN的方法,供各位工程师小伙伴参考。 说明 + n% g2 m% [& j8 w* F
1 L+ e* M$ c; W3 |+ P, V9 \6 z
7 L1 z) P( r9 B. m
$ Q) Z; _4 z# j0 W9 R8 [01移植MC2518芯片驱动 在OK8MP-linux-kernel/drivers/net/can/spi/路径下创建一个文件夹——mcp25xxfd,将相关文件(包含.c文件、.h文件、Makefile、Kconfig等)放置到此文件夹中。 : ?5 z' u. ?& O) X) S) y
02补全对can_rx_offload_add_manual函数的定义 vi OK8MQ-linux-kernel/include/linux/can/rx-offload.h 添加: [url=]复制[/url]
, I/ R. s0 v6 X% y. |. v6 @
1 A) v. _# r" u6 }- <font color="rgb(198, 120, 221)">int</font> can_rx_offload_add_manual(<font color="rgb(198, 120, 221)">struct</font> net_device *dev,
7 B+ b/ Z( b, c: V - <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,3 r; S. U: V; M7 C3 L
- <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)
; F. I) h* \7 l
复制代码
" z) Y% n# C+ Z; l$ E- X5 _vi OK8MQ-linux-kernel/drivers/net/can/rx-offload.c 添加: [url=]复制[/url]
4 z# T* F, {1 U( s1 O
3 Q' _3 g! R( F- B8 _8 v6 a- <font color="rgb(198, 120, 221)">int</font> can_rx_offload_add_manual(<font color="rgb(198, 120, 221)">struct</font> net_device *dev,
* S1 ^* X6 L5 z1 | - <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,
5 s8 ]2 n* b8 D7 d3 {, F - <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)
, M+ M0 Z% z9 n( X. \' ~* b - {
/ |, \+ X! q: x+ N! h; n - <font color="rgb(198, 120, 221)">if</font> (offload->mailbox_read)
6 H. ?/ |& o) u0 J4 d/ ]9 m - <font color="rgb(198, 120, 221)">return</font> -EINVAL;
- ~0 V9 N- i" C- s( O- b% {$ b - <font color="rgb(198, 120, 221)">return</font> can_rx_offload_init_queue(dev, offload, weight);/ H8 {% l0 K% q- L" i! a
- }
! a9 W3 m' o3 k! w) _; | - EXPORT_SYMBOL_GPL(can_rx_offload_add_manual);
复制代码
' _" O2 ?. W( x' M/ f& ~
4 _: Q( P; t# ?& d8 T03修改上一级目录spi/下的Makefile和Kconfig vi OK8MP-linux-kernel/drivers/net/can/spi/Makefile 添加: [url=]复制[/url]
, }% a% L2 S/ l, T v' R$ S( _& {- I: I# d& U J
' U' {. p0 e- b9 q6 H5 W
' H* t2 D- z# K7 u% ovi OK8MP-linux-kernel/drivers/net/can/spi/Kconfig 添加: [url=]复制[/url] f |# D) |5 Y
- <font color="rgb(193, 132, 1)">source</font> <font color="rgb(80, 161, 79)">"drivers/net/can/spi/mcp25xxfd/Kconfig"</font>
复制代码
, H9 l8 V+ f$ z/ \& ^1 s* \2 ], P, Q2 k
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 6 m+ x( H1 j" t" M
05在设备树中配置时钟 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 添加: [url=]复制[/url]
# R5 ~ x* b& T( ? I* q) {: y% z- clocks{: ^( U* H" S* Z& e, N
- mcp2518fd_clock: * Q: w! f: c& a2 [4 b. Z
- mcp2518fd_clock{% R, M6 H% e1 p
- compatible = "fixed-clock";
% w8 e! [$ g3 H/ W1 E! S. h5 J - #clock-cells = <0>;- A0 X! {* v0 k8 [7 _" x
- clock-frequency = <40000000>;, J2 C6 K& o$ o
- };3 h+ r' @6 Z5 M3 X S2 T
- };
复制代码 , X4 j( H% e$ `1 V- J7 l
* J; m% H* M! ?6 N }0 ]
06找一个引脚用作芯片的中断引脚 此处是将GPIO4_IO21用作了中断引脚。 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 添加: [url=]复制[/url]
) q5 V$ e6 m/ p9 o; b2 Z4 m3 }+ c O" f
: z1 @, m7 L; f0 } L) @0 }pinctrl_ecspi2_can: ecspi2can{
$ S" R. q9 h- ~5 J: p! @6 | fsl,pins = <; P4 r0 C7 \! Z
MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO21 0x40000
5 }) l( [6 }% O# j& [2 W >;
& t- |0 E6 B. ]! K A};8 M4 C+ e$ _& F' E
. G9 V% g! O+ U+ H07 在设备树的ecspi2节点中进行修改 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 从: [url=]复制[/url] 4 F/ c" Q4 D! U$ ]) j3 g
' R/ i- D* e% d
- &ecspi2{, [0 `- X' y: `, B1 P2 s/ w
- #address-cells= <1>;
+ l) m5 T4 s$ r& Q( I0 @+ j4 I& { - #size-cells= <0>;
& p* O2 ]0 ?+ X2 A# L: F( t - fsl,spi-num-chipselects= <1>;
9 ]4 Z& c! |4 H$ r: v - pinctrl-names= "default";6 r7 Y2 T* {7 V
- pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>;
% I0 N2 ]& F1 d' R - cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;( P5 M9 U( @( W& q* W
- status= "okay";* Z( Y/ f" B* d) f3 B2 V
- 2 y" N7 d& T2 p0 x' v
- spidev1:spi<a href="home.php?mod=space&uid=2514928" target="_blank">@0</a> {6 s: I" `- u& Y8 [9 n: c
- reg= <0>;
( ]# |0 H* \2 Q i7 l7 H8 U- i! h - compatible= "rohm,dh2228fv";6 S; f0 L2 J1 {4 N1 [
- spi-max-frequency= <500000>;% s8 @$ {+ e5 |2 i$ s4 e& Z% W
- };7 Z+ B! z. }8 D% N% p7 |. [0 s" S P
- };
复制代码- <span style="float: left; margin-right: 5px;"><table width="98%" class="t_table"><tbody><tr><td>
7 ^+ O* y- z, }% l - ! m! |3 `0 E) ^* \/ c
- <p style="line-height: 24px;"><font color="rgb(77, 77, 77)">改为:</font></p><div align="center">/ c4 f: i0 y6 R" A* U) q- U
- <span style="float: right; margin-left: 5px;"><font color="white">[url=]复制[/url]</font></span></div>: R& ^9 P. S8 L t( U7 ], j
- " d$ B. V3 b5 d# I% H1 k8 `
- <div class="blockcode"><blockquote>&ecspi2{4 a2 d4 W7 \# O
- #address-cells= <1>;
: g# V( w" w3 P( i6 Q: J- \; ` - #size-cells= <0>;
% F. n! K# W7 M3 P# M( p - fsl,spi-num-chipselects= <1>;
- g5 L0 B& C3 ~5 b' y) i - pinctrl-names= "default";) G0 e4 }" }% [$ F$ {
- pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs &pinctrl_ecspi2_can>;) r- j3 k5 ?+ y, Y8 W# l( s6 O
- cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
2 a; w* _" U" s$ u7 ` - status= "okay";2 l7 B& b! U9 G7 k) [
- % t+ B& W8 l! E
- mcp1:mcp2518fd@0{9 T& M3 Q1 d; I6 I& U
- compatible= "microchip,mcp2518fd";4 G3 T3 x, ]% u7 b
- reg= <0>;, a" i8 i! ]7 p6 s7 n
- spi-max-frequency= <20000000>;, y5 o4 B$ q4 O# G3 K4 e+ Z0 c6 P1 f: {
- clocks= <&mcp2518fd_clock2>;' V; n6 y' Q+ P, h& x8 i) R
- interrupts-extended= <&gpio4 21 IRQ_TYPE_LEVEL_LOW>;
: \: z9 ?0 n4 y: I# d5 ] - };! W0 ]9 E3 V* Y* ?- P
- };
复制代码 ! A: Q% C8 ^6 Q: z9 k: ^
# f1 g* F% U: _* H( F( M* [完成上述修改后即可进行编译,并用新生成的镜像烧写OKMX8MP-C开发板。
& d7 T" Z7 y9 ^6 ~) ?+ y$ ~08 开发板验证 将MCP2518芯片接到SPI2的接口上,启动OKMX8MP-C开发板,启动后使用ifconfig -a命令查看,即可看到多出了1个CAN节点。节点生成后,即可按照用户使用手册【4.18 FlexCAN测试】章节进行测试,验证功能是否正常。 |