( Y8 z. B; ^, v3 V. u8 n. s飞凌嵌入式OKMX8MP-C开发板有两路原生CAN总线,但用户在开发产品时可能需要用到更多的CAN,这该如何解决呢?今天小编将为大家介绍一种SPI转CAN的方法,供各位工程师小伙伴参考。 说明
4 j2 T+ X* Q: y
! u3 C) n0 v, U& W5 \: p8 h4 ~8 C3 p) ~- n7 U7 T5 V
2 ]# r! s0 O/ W4 o' T4 W01移植MC2518芯片驱动 在OK8MP-linux-kernel/drivers/net/can/spi/路径下创建一个文件夹——mcp25xxfd,将相关文件(包含.c文件、.h文件、Makefile、Kconfig等)放置到此文件夹中。
' [) ~; [0 z7 d" W9 k" e/ t02补全对can_rx_offload_add_manual函数的定义 vi OK8MQ-linux-kernel/include/linux/can/rx-offload.h 添加: [url=]复制[/url]
& S4 y& e: X/ v4 O6 ^- 9 ?) f8 M4 n4 ]. q4 ~2 |
- <font color="rgb(198, 120, 221)">int</font> can_rx_offload_add_manual(<font color="rgb(198, 120, 221)">struct</font> net_device *dev,
/ u, X! V1 A' P0 @ \- V+ X# i - <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,
% e# |# B# B. U+ ~! L0 M - <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)% @+ z/ d; A# y( c# R; ^, S
复制代码 $ K- n' z' g% k: X! S- x
vi OK8MQ-linux-kernel/drivers/net/can/rx-offload.c 添加: [url=]复制[/url]
+ W# o7 J5 D0 z& D9 u- . X$ f& I3 `: p4 X
- <font color="rgb(198, 120, 221)">int</font> can_rx_offload_add_manual(<font color="rgb(198, 120, 221)">struct</font> net_device *dev,
$ V* e Y3 C6 c; q - <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,6 w. E; \4 F7 _6 R3 z
- <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)! {, @# D5 W& f
- {6 i7 G, I) x. A- i+ z' E, K
- <font color="rgb(198, 120, 221)">if</font> (offload->mailbox_read) i7 S$ w; [3 B/ S. Y2 ^5 }5 G( }
- <font color="rgb(198, 120, 221)">return</font> -EINVAL;) W. u# M/ n/ \- ?2 D @' Q8 S
- <font color="rgb(198, 120, 221)">return</font> can_rx_offload_init_queue(dev, offload, weight);9 V) V8 M% s$ S; G; j" ]0 N
- }" Q7 x/ m1 O- L' j6 m
- EXPORT_SYMBOL_GPL(can_rx_offload_add_manual);
复制代码
3 {, a" J+ S# N# Y2 ?/ U& A% s1 T
7 F5 k6 P; A% D' u! v$ r03修改上一级目录spi/下的Makefile和Kconfig vi OK8MP-linux-kernel/drivers/net/can/spi/Makefile 添加: [url=]复制[/url]
/ }# ?7 Y( c2 D n/ _ S+ o9 g# L/ |2 s9 _
0 [: ]4 K& P. N) t( J/ R$ l7 G" t% W
# R8 `, Y( x1 y" D! h. [: S5 Lvi OK8MP-linux-kernel/drivers/net/can/spi/Kconfig 添加: [url=]复制[/url]
9 {4 a1 l- v# l- <font color="rgb(193, 132, 1)">source</font> <font color="rgb(80, 161, 79)">"drivers/net/can/spi/mcp25xxfd/Kconfig"</font>
复制代码 1 |2 N" \& l b9 J1 z7 k1 `; e" q
. }) {$ Q) z! _) t% h
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
# m C6 m- b) h* h' H05在设备树中配置时钟 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 添加: [url=]复制[/url] - ; F9 _1 ?$ _. B8 A
- clocks{
- z0 @' q9 X0 @1 b - mcp2518fd_clock: $ h; q8 U0 `) r/ g7 B( B
- mcp2518fd_clock{
$ B m' ?5 T5 R& d7 } - compatible = "fixed-clock";) N7 o* c+ X; @
- #clock-cells = <0>;
) |6 j& W7 \5 Y3 `. L2 M - clock-frequency = <40000000>;$ }. ~% ~+ T4 z2 o
- };
+ a$ k5 m' {& z$ ~! B - };
复制代码
" Z+ v9 d- l4 F" Q( c+ r
) Y& S8 E, ~# ?: F* v; N06找一个引脚用作芯片的中断引脚 此处是将GPIO4_IO21用作了中断引脚。 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 添加: [url=]复制[/url]
5 d% X4 p6 M/ a# S) u; X% r1 g) t
pinctrl_ecspi2_can: ecspi2can{
3 a) s5 `4 S3 x: B1 h: L% K fsl,pins = <3 c+ I$ S" l4 u, Y* l9 G1 s) S5 I+ V
MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO21 0x400003 j0 z$ q! A' W6 w( X
>;
( ]+ ]5 q |6 {- Y% ~};7 ^9 e, \0 [; P j% R; o0 _
, Y+ N5 n) w# b' L: a+ P, l07 在设备树的ecspi2节点中进行修改 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 从: [url=]复制[/url] " n/ j9 o3 S5 i7 e; n
. L' _5 i' j" `" M. m- &ecspi2{
) x8 v0 |: I; r% c2 C - #address-cells= <1>;
/ |3 F! Z. ^4 k0 R6 p% @ - #size-cells= <0>;" ^+ v* D4 u$ \5 ]$ S' V0 e7 y
- fsl,spi-num-chipselects= <1>;
9 e9 W% r% C& ^4 d1 N8 s9 y- p" z - pinctrl-names= "default";
4 V$ }& v6 {0 w - pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>;: B- Z) B" ?; t
- cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;5 T% H0 F% m2 E( y. R& q4 G5 V
- status= "okay";
) h# V7 h8 S3 i5 S. h" { - / |& ]& t" }$ B. Q. z
- spidev1:spi<a href="home.php?mod=space&uid=2514928" target="_blank">@0</a> {
* T9 j; ?" j8 ~# g' H b - reg= <0>;8 J7 r$ _2 h/ U2 l
- compatible= "rohm,dh2228fv";
0 `8 H7 Y9 ^' I2 T3 M - spi-max-frequency= <500000>;
: j, ]9 c" [6 ^; l" x" |/ A - };
, u7 N5 Q+ r/ z9 ~7 \ - };
复制代码- <span style="float: left; margin-right: 5px;"><table width="98%" class="t_table"><tbody><tr><td>1 X3 a( z' n# o8 j w
- : P! |0 h& c. T! Y/ a. C/ w0 P
- <p style="line-height: 24px;"><font color="rgb(77, 77, 77)">改为:</font></p><div align="center">, y S. S8 D i
- <span style="float: right; margin-left: 5px;"><font color="white">[url=]复制[/url]</font></span></div>
$ Y7 S0 `* c9 O# D
3 M, a3 ]; Y& t1 a& ^! q- <div class="blockcode"><blockquote>&ecspi2{
) T2 P9 Y2 o6 m. g6 s( C3 R - #address-cells= <1>;
+ E2 ~: \8 U9 a0 F+ x$ H - #size-cells= <0>;" i5 V2 H9 N/ L& z7 N; K4 e/ T
- fsl,spi-num-chipselects= <1>;; \/ ^. ~% H7 @
- pinctrl-names= "default";
' e9 k7 l7 e U: s" W9 q" Z. ~ - pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs &pinctrl_ecspi2_can>;4 r4 s7 Z w1 G
- cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
. z' T4 N8 z3 u! @ - status= "okay";
" h$ D7 }( J# v6 a& s- G( B: O
. w& D, {, Z& d- K8 `4 h- mcp1:mcp2518fd@0{2 f9 {5 @8 k, K9 v& k ]' Y
- compatible= "microchip,mcp2518fd";
* Q$ J m" i0 |0 y' j - reg= <0>;1 T+ N0 F; r2 b1 y& }1 f% Z
- spi-max-frequency= <20000000>;; U+ f6 h2 ~: {; I9 V8 j" O
- clocks= <&mcp2518fd_clock2>;
3 w+ L$ K( {8 e# s, g - interrupts-extended= <&gpio4 21 IRQ_TYPE_LEVEL_LOW>;
( Q* @# @4 s9 W1 T9 V - };# O: I5 M% ?$ p- i9 O! H4 K& f4 Y
- };
复制代码 , b0 W/ ]& N2 O+ B J
3 n9 F6 c! |, i8 W完成上述修改后即可进行编译,并用新生成的镜像烧写OKMX8MP-C开发板。 , N3 `3 V& P% M3 x1 Q
08 开发板验证 将MCP2518芯片接到SPI2的接口上,启动OKMX8MP-C开发板,启动后使用ifconfig -a命令查看,即可看到多出了1个CAN节点。节点生成后,即可按照用户使用手册【4.18 FlexCAN测试】章节进行测试,验证功能是否正常。 |