- y: X+ W6 S0 b0 R! Z飞凌嵌入式OKMX8MP-C开发板有两路原生CAN总线,但用户在开发产品时可能需要用到更多的CAN,这该如何解决呢?今天小编将为大家介绍一种SPI转CAN的方法,供各位工程师小伙伴参考。 说明
/ H9 D4 R, _% U% V" m J* Z4 }7 [- L" M7 z' w3 f6 A
8 F" k$ k& A5 @8 e5 x4 D
. K2 U1 |2 g+ ^3 ?& _: L0 i3 T01移植MC2518芯片驱动 在OK8MP-linux-kernel/drivers/net/can/spi/路径下创建一个文件夹——mcp25xxfd,将相关文件(包含.c文件、.h文件、Makefile、Kconfig等)放置到此文件夹中。 , d2 ?& @2 y' l8 x# f
02补全对can_rx_offload_add_manual函数的定义 vi OK8MQ-linux-kernel/include/linux/can/rx-offload.h 添加: [url=]复制[/url]
; a9 T+ r$ v4 c. v3 h- $ a7 G' `6 G! _
- <font color="rgb(198, 120, 221)">int</font> can_rx_offload_add_manual(<font color="rgb(198, 120, 221)">struct</font> net_device *dev,
# k: [6 V# `' C; b& p - <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,, O* G) _7 [5 L6 d
- <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)
& S6 Q& {3 h9 b% C2 a" v
复制代码
9 C$ T1 ?* g' a6 p# o$ Lvi OK8MQ-linux-kernel/drivers/net/can/rx-offload.c 添加: [url=]复制[/url] ( \% O' f7 W2 X' Z9 J) U& k/ |2 k
- $ N/ C" L# ?( Q' D1 d" N
- <font color="rgb(198, 120, 221)">int</font> can_rx_offload_add_manual(<font color="rgb(198, 120, 221)">struct</font> net_device *dev,' L, C" {8 L8 e8 D
- <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,
* G: M) J% C" K/ R - <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)3 N) F6 n+ q- X1 s$ P1 B
- {4 d2 c9 F, R$ u
- <font color="rgb(198, 120, 221)">if</font> (offload->mailbox_read)
& l8 h+ _/ n: C - <font color="rgb(198, 120, 221)">return</font> -EINVAL;
2 C8 X" `% O$ d: N+ k9 D9 t/ S) E - <font color="rgb(198, 120, 221)">return</font> can_rx_offload_init_queue(dev, offload, weight);
! v, G4 c+ u+ { - }4 s# x: z$ _" ^: r4 V( M
- EXPORT_SYMBOL_GPL(can_rx_offload_add_manual);
复制代码 ! E* T8 z3 ]1 `/ J7 ]
( K1 X" ], }% x03修改上一级目录spi/下的Makefile和Kconfig vi OK8MP-linux-kernel/drivers/net/can/spi/Makefile 添加: [url=]复制[/url]
$ Y7 g/ z+ Y+ j6 q2 [0 a6 U/ F
# g# a8 P2 d( Y$ r9 {
6 E9 W7 k8 b$ L! ~2 k) z) x, p$ X t
vi OK8MP-linux-kernel/drivers/net/can/spi/Kconfig 添加: [url=]复制[/url] % ?9 `: b- j8 p+ j/ e" `% }) p
- <font color="rgb(193, 132, 1)">source</font> <font color="rgb(80, 161, 79)">"drivers/net/can/spi/mcp25xxfd/Kconfig"</font>
复制代码
; \9 g# y I" T# x1 j3 Z# T
, U# E! J% r5 L$ |, x$ ^0 H+ Q04修改驱动配置文件,将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 / k: _) ~$ I- c+ H' Q* p) c* s
05在设备树中配置时钟 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 添加: [url=]复制[/url] - 1 W$ T; e" ~ e8 t! T2 J1 J
- clocks{
@: [; a3 U- P" q - mcp2518fd_clock:
, h, N9 j9 m; H: G5 G4 u - mcp2518fd_clock{
9 a# g2 [, l! L4 Z3 y' j - compatible = "fixed-clock";! `3 ]7 `$ Y: g$ b1 A
- #clock-cells = <0>;
& ]9 ]: N1 N5 W, S' R5 W - clock-frequency = <40000000>;
6 S( M, N Q% ]7 ^. h# x - };
+ z$ k( X& Z P2 O2 ^8 H - };
复制代码
# F5 e' k8 _8 ]5 p& T: l. ]1 x2 m/ e8 R! L
06找一个引脚用作芯片的中断引脚 此处是将GPIO4_IO21用作了中断引脚。 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 添加: [url=]复制[/url]
6 D# m$ V; z2 [ D8 I* {
" Q# r: _6 Q6 R2 J! Apinctrl_ecspi2_can: ecspi2can{
1 q& C6 c5 v4 O) K4 q! p# F fsl,pins = <
g# W; S9 V: Q4 ~' c0 x$ r% p MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO21 0x40000
' G3 A3 ]7 i6 s; L+ p+ f! ^ >;2 a) |; q4 X/ I0 M6 x* P6 l
};
6 c/ B7 _; ~ o6 P9 E0 q; E
: x' }% L( ?0 `5 U) ^) g07 在设备树的ecspi2节点中进行修改 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 从: [url=]复制[/url] + n. z" C, K) [8 X/ y7 b
# W1 N& t: l' d& z# ]9 \0 F- &ecspi2{
( K4 r0 P( M4 E3 `4 Z H, h - #address-cells= <1>;
; q. g' d- C0 V2 X( M y - #size-cells= <0>;
1 A2 O) i6 ~6 n - fsl,spi-num-chipselects= <1>;0 l) n+ F( m! ~( C) x
- pinctrl-names= "default";. ?2 r4 y& D# \% i
- pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>;
2 J7 C6 C% G2 y& q2 O - cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
, x: C, ^! a3 g+ @6 I1 ?" D% ^ - status= "okay";# f7 P% {0 L3 G7 a( [
- x2 ^) {5 X2 H2 P
- spidev1:spi<a href="home.php?mod=space&uid=2514928" target="_blank">@0</a> { C6 t: \* A7 u
- reg= <0>;
$ n" @" c |: o9 _! }0 n - compatible= "rohm,dh2228fv";5 \# h) S J' M+ L4 w; m1 N
- spi-max-frequency= <500000>;
/ w, V) e) N. i C+ w - };
; u: ^% ?9 ~ j* H+ A2 Y! T& R$ ^9 B - };
复制代码- <span style="float: left; margin-right: 5px;"><table width="98%" class="t_table"><tbody><tr><td>
, h# j) n4 T8 X* R: q
, g, E3 c. a3 f1 [2 [6 C% f- <p style="line-height: 24px;"><font color="rgb(77, 77, 77)">改为:</font></p><div align="center">& @) w# O1 W8 d% E0 j* ^9 Z. e0 c
- <span style="float: right; margin-left: 5px;"><font color="white">[url=]复制[/url]</font></span></div>
, R4 C7 O$ S% r+ A* i8 d3 r
1 e4 z$ ?6 G) F; |4 n% S5 X* U- <div class="blockcode"><blockquote>&ecspi2{
& T& c9 P' O8 X2 `& _, E% }* z - #address-cells= <1>;
& { |9 P" B+ P$ _% _ - #size-cells= <0>;
' M2 y" H/ |! K" k, T9 @. r7 l - fsl,spi-num-chipselects= <1>;
. W- ]& {: N( r - pinctrl-names= "default";
5 O8 x# O# {1 i7 F Q- f a3 _6 H - pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs &pinctrl_ecspi2_can>;& n( [, o! }: b
- cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;- m; d9 w" n+ J% s
- status= "okay";# S+ i* N, i# U: t D; v
- - L( X& V7 ~2 K5 q) [
- mcp1:mcp2518fd@0{; l' O$ H3 A/ D! Z5 D8 r7 C. r# t' J
- compatible= "microchip,mcp2518fd";; V" [& R% J3 g: W, Z- F& K
- reg= <0>;8 R0 |' ^) d" Q- C& A
- spi-max-frequency= <20000000>;
( y+ o3 e* ?4 @+ }- J! e L - clocks= <&mcp2518fd_clock2>;- U& s; V+ ^1 x6 s
- interrupts-extended= <&gpio4 21 IRQ_TYPE_LEVEL_LOW>;
5 A% ?5 s2 |# @8 Y- X) M- y - };+ g# y' O* y+ x P5 {; P0 d
- };
复制代码
1 D- \ o3 C8 I5 E5 f b" L1 Y# W+ N" I ]0 A: v
完成上述修改后即可进行编译,并用新生成的镜像烧写OKMX8MP-C开发板。
' B) r F. i; f3 L- p) v3 k08 开发板验证 将MCP2518芯片接到SPI2的接口上,启动OKMX8MP-C开发板,启动后使用ifconfig -a命令查看,即可看到多出了1个CAN节点。节点生成后,即可按照用户使用手册【4.18 FlexCAN测试】章节进行测试,验证功能是否正常。 |