9 L) i$ U' [ y5 X
飞凌嵌入式OKMX8MP-C开发板有两路原生CAN总线,但用户在开发产品时可能需要用到更多的CAN,这该如何解决呢?今天小编将为大家介绍一种SPI转CAN的方法,供各位工程师小伙伴参考。 说明
7 M/ W7 u7 I9 O; `# N4 t$ Y
9 _, c/ _+ P8 F* i1 B2 x! u& ]2 P2 u. _3 z8 ^- u, P
! \ x, s. }0 V! E
01移植MC2518芯片驱动 在OK8MP-linux-kernel/drivers/net/can/spi/路径下创建一个文件夹——mcp25xxfd,将相关文件(包含.c文件、.h文件、Makefile、Kconfig等)放置到此文件夹中。 ' C! B, q3 G; \8 ^* h
02补全对can_rx_offload_add_manual函数的定义 vi OK8MQ-linux-kernel/include/linux/can/rx-offload.h 添加: [url=]复制[/url]
0 `2 H* q) }# ~8 X8 C
) S( ]2 w8 @6 R0 P8 @ s# 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,
. J3 l( m; g7 S/ r; i; U - <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,
- z8 k/ K$ Y T3 J" y' @ - <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)# ?# `9 F6 R. z+ P; V
复制代码 ( d% Z9 w' ~5 L! j0 r: E( ~
vi OK8MQ-linux-kernel/drivers/net/can/rx-offload.c 添加: [url=]复制[/url]
% O9 M! `% b, Z9 w% ^9 g
# T, O9 H! Q6 |' k- d- <font color="rgb(198, 120, 221)">int</font> can_rx_offload_add_manual(<font color="rgb(198, 120, 221)">struct</font> net_device *dev,2 z# Y1 C- U$ t- v, t) c9 O2 {
- <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,: t4 C1 I. R5 R f
- <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)( C p" j1 T8 S/ X% ^ F
- {! m9 d' X* U$ a3 r% g5 g8 j4 n7 k! j; h
- <font color="rgb(198, 120, 221)">if</font> (offload->mailbox_read)5 e9 w1 u4 [" j7 W% y
- <font color="rgb(198, 120, 221)">return</font> -EINVAL; K: }! r+ a; p9 e
- <font color="rgb(198, 120, 221)">return</font> can_rx_offload_init_queue(dev, offload, weight);% I! |; H! r( Z9 t2 ?
- }& H6 o8 D, G; v0 W1 c: i
- EXPORT_SYMBOL_GPL(can_rx_offload_add_manual);
复制代码
+ h3 ?8 I# e2 i, @; @' m
D. m& ~% Y' R+ d5 P% q03修改上一级目录spi/下的Makefile和Kconfig vi OK8MP-linux-kernel/drivers/net/can/spi/Makefile 添加: [url=]复制[/url]
) h! j* F0 `8 G, R1 Z4 a- f' g& j* c a" } o4 q
5 Q1 y! F5 n/ ~3 I3 D; [; i& X7 x" v1 X* b
vi OK8MP-linux-kernel/drivers/net/can/spi/Kconfig 添加: [url=]复制[/url] 8 ^1 F W1 K+ @4 r- y- L3 `1 j4 _
- <font color="rgb(193, 132, 1)">source</font> <font color="rgb(80, 161, 79)">"drivers/net/can/spi/mcp25xxfd/Kconfig"</font>
复制代码
0 D j7 p- }3 I6 R) E' N. X) j2 ]" R( }# t
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' A2 M% E/ H4 d
05在设备树中配置时钟 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 添加: [url=]复制[/url]
0 E2 e" m! k @+ F' ]7 T- clocks{
; ?+ c, x) F& f& n% l - mcp2518fd_clock:
$ W+ q s0 \! G! V, C1 d) }9 M% l - mcp2518fd_clock{
0 b6 `* O2 F& D5 H# Z- P$ p - compatible = "fixed-clock";
* o$ |& ^# F1 v0 P3 l+ t P" O5 B - #clock-cells = <0>;
?) t6 c2 }% \. k# v - clock-frequency = <40000000>;
% M/ }7 R2 O3 Y - };2 V1 c& P- T6 Z5 z7 S* I2 _' i3 c
- };
复制代码
0 V. A3 ^0 q2 l7 j- x! d! Q5 K& V% e$ w; Y. r, ~ D7 j
06找一个引脚用作芯片的中断引脚 此处是将GPIO4_IO21用作了中断引脚。 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 添加: [url=]复制[/url] ' K# a6 V; r! ^; k
2 f2 `) U& j7 D9 s$ }' |1 `) {
pinctrl_ecspi2_can: ecspi2can{5 `: R$ y( G3 q1 q `8 J9 @
fsl,pins = <
) m& `" |0 |- a K8 _" }4 [! c MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO21 0x40000
- y0 B! a9 H$ A' V! Q >;3 U& i! v) v h& y( C
};4 v3 _. v4 n5 ?$ J0 n* T/ g
% K" V% e9 F/ S3 |07 在设备树的ecspi2节点中进行修改 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 从: [url=]复制[/url]
% G- w2 C: J4 G; I1 l; y* E% n ]9 H) T: D. l% Y5 r
- &ecspi2{" N! Y3 V" c& v: I D" Y$ n! m
- #address-cells= <1>;
& x, O$ x& n( j5 I9 Y - #size-cells= <0>;: x+ i1 S- ^2 p) J6 s
- fsl,spi-num-chipselects= <1>;
P! a8 l' }2 X" f _. o. e1 N' {* ?1 g - pinctrl-names= "default";
h9 G, b2 C- L8 t' S5 y$ W" }2 q - pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>;; W: ^; M* V1 {9 `) O( Q: G2 ?6 X5 I
- cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;! b2 \3 X7 D0 H9 C
- status= "okay";+ e! ?7 [; W' L/ h
- 6 K4 P w- i3 u1 d8 j
- spidev1:spi<a href="home.php?mod=space&uid=2514928" target="_blank">@0</a> {
) E$ o# _! i7 A6 [' M9 u* r5 a - reg= <0>;* b# N G, \! N4 U& H
- compatible= "rohm,dh2228fv";
4 x( v0 K7 p) |3 e; F" d - spi-max-frequency= <500000>;
: @: l8 H1 G& x! n - };
+ }4 ~2 w+ ?8 M a. j8 I - };
复制代码- <span style="float: left; margin-right: 5px;"><table width="98%" class="t_table"><tbody><tr><td>
L% d0 b7 N: |$ @/ l- R
3 _. l; X: X( |# v6 k9 o- Q1 _5 Z- <p style="line-height: 24px;"><font color="rgb(77, 77, 77)">改为:</font></p><div align="center">' K2 N) K! A7 y
- <span style="float: right; margin-left: 5px;"><font color="white">[url=]复制[/url]</font></span></div>% ~/ ^# x; }- ^ n
- : |/ @( h! R) x# p
- <div class="blockcode"><blockquote>&ecspi2{
% `5 A/ C6 L& f% k) O4 e7 }% } - #address-cells= <1>;; l1 T) l1 V, }
- #size-cells= <0>;
& I5 i$ ~) K2 q/ t6 g" O5 l - fsl,spi-num-chipselects= <1>;
1 Y3 b P7 T& z) h5 X - pinctrl-names= "default";' Z4 u% k, i+ Z4 h
- pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs &pinctrl_ecspi2_can>;
! l. K/ ~7 N8 V q - cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>; d1 T$ \" l; e0 _# m; A. N$ [
- status= "okay";* v5 c6 V- i) u* o, j( q
- , @' ~5 G8 b- f1 `0 P8 T
- mcp1:mcp2518fd@0{$ h7 ]+ w' t$ c9 v4 H+ L
- compatible= "microchip,mcp2518fd";
7 f/ Y' @8 G( E2 [& M. c% C5 f - reg= <0>; g3 Y$ [& \) H) x- F( ~
- spi-max-frequency= <20000000>;
' v5 F9 U. g1 k& y3 I" A; C - clocks= <&mcp2518fd_clock2>;& m) u7 [7 {1 P/ p# M4 w' l) M
- interrupts-extended= <&gpio4 21 IRQ_TYPE_LEVEL_LOW>;
; s/ S8 Q3 Q; @# j - };
7 u b+ m Z3 i/ u, C( B; c - };
复制代码
9 ?# c3 V$ B) A* F) y4 y. a
% ?$ `: x3 s5 v完成上述修改后即可进行编译,并用新生成的镜像烧写OKMX8MP-C开发板。 ; q: X- O1 ]9 T1 ]$ d; T
08 开发板验证 将MCP2518芯片接到SPI2的接口上,启动OKMX8MP-C开发板,启动后使用ifconfig -a命令查看,即可看到多出了1个CAN节点。节点生成后,即可按照用户使用手册【4.18 FlexCAN测试】章节进行测试,验证功能是否正常。 |