6 N. Z# Y! ~9 ~' [# H/ p9 P0 n
飞凌嵌入式OKMX8MP-C开发板有两路原生CAN总线,但用户在开发产品时可能需要用到更多的CAN,这该如何解决呢?今天小编将为大家介绍一种SPI转CAN的方法,供各位工程师小伙伴参考。 说明 ( y* ~. F5 i0 J) n
& M2 b' `+ H I, W2 R# B" u* D8 T3 u: A
( B: O; G# |+ ~7 c* h( O01移植MC2518芯片驱动 在OK8MP-linux-kernel/drivers/net/can/spi/路径下创建一个文件夹——mcp25xxfd,将相关文件(包含.c文件、.h文件、Makefile、Kconfig等)放置到此文件夹中。 0 o' x1 k: u8 d5 j
02补全对can_rx_offload_add_manual函数的定义 vi OK8MQ-linux-kernel/include/linux/can/rx-offload.h 添加: [url=]复制[/url] " ^" T/ S! N6 a9 e5 ~ j
- # O+ U7 q @. e9 L( R% Z) f: L
- <font color="rgb(198, 120, 221)">int</font> can_rx_offload_add_manual(<font color="rgb(198, 120, 221)">struct</font> net_device *dev,
6 f2 s9 T: I: ^4 l% ? - <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,. j$ H$ e" {6 n; u! Q
- <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight): [: z% ]; X3 I
复制代码 ; c( A2 X/ ]0 z6 L5 Z
vi OK8MQ-linux-kernel/drivers/net/can/rx-offload.c 添加: [url=]复制[/url] . _- D. t" [% p {) H0 i/ j7 \
- ) o0 H" t# b, V) _" \1 V2 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,
, P* g4 W5 m' |" H" [3 q9 |, J; I - <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,
8 G6 o& X& G2 B5 y) | - <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)* ^6 i& x4 M$ h( I8 M C+ N$ t& ^
- {
6 w i b+ o3 y1 W V - <font color="rgb(198, 120, 221)">if</font> (offload->mailbox_read)5 s- C4 ]! w% x1 X C+ Z
- <font color="rgb(198, 120, 221)">return</font> -EINVAL;
$ }2 J' k* Z# B) R5 j - <font color="rgb(198, 120, 221)">return</font> can_rx_offload_init_queue(dev, offload, weight);
. q$ r7 {3 l% O8 _: C - }
! W& n9 o D' ~( |. C - EXPORT_SYMBOL_GPL(can_rx_offload_add_manual);
复制代码
0 ]+ E6 d! k: F6 K' J) N9 n( J7 w7 }* @/ |
03修改上一级目录spi/下的Makefile和Kconfig vi OK8MP-linux-kernel/drivers/net/can/spi/Makefile 添加: [url=]复制[/url]
7 q" x7 C H5 S- E5 L- Y1 H+ ^* O5 v( x, o+ m
1 |' N0 o' L$ z, ~7 R8 S
: `' f4 \1 q8 R5 R8 P+ tvi OK8MP-linux-kernel/drivers/net/can/spi/Kconfig 添加: [url=]复制[/url] * x% K; R! | t7 x$ D5 A- r2 C
- <font color="rgb(193, 132, 1)">source</font> <font color="rgb(80, 161, 79)">"drivers/net/can/spi/mcp25xxfd/Kconfig"</font>
复制代码
! d; |3 h. d4 W/ S
4 V& P7 i4 |2 L8 v; ]. S04修改驱动配置文件,将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 & ]$ w- `0 J8 A$ h# P, E6 c
05在设备树中配置时钟 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 添加: [url=]复制[/url] - 2 [* L% E5 M$ R! N
- clocks{- C6 W: f! n0 @0 ?$ l) n
- mcp2518fd_clock: ! Q6 L- f: s5 c0 [% u4 o: Z* ^
- mcp2518fd_clock{4 n$ p7 @) a( v& ]. p
- compatible = "fixed-clock";. K( r' p# a7 s* @% T3 u
- #clock-cells = <0>;
$ D. M0 q L4 i/ _+ X - clock-frequency = <40000000>;
1 C% C3 N! }( I( r6 w* G - };% n1 s& e# D! s3 Y
- };
复制代码 6 d& ^; t, x* H. A4 L- [: d U' F4 _
* [/ a- W7 d9 K# ~# J% @5 d' S J
06找一个引脚用作芯片的中断引脚 此处是将GPIO4_IO21用作了中断引脚。 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 添加: [url=]复制[/url]
8 B; V0 T E7 P5 G2 d$ Z" Y0 m& \# R4 z+ F, M( K
pinctrl_ecspi2_can: ecspi2can{
/ H% t" m" i( a4 L2 J* p fsl,pins = <5 W3 y- x3 Q. Z7 n% ^" S
MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO21 0x40000
: `* }; _7 z& h- ^& e >;
" W' M2 x- d- n! c: r3 y8 w! f R};2 j; [$ w; i- |; I. E0 B/ j
$ {- u1 V$ Y- ?1 Z07 在设备树的ecspi2节点中进行修改 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 从: [url=]复制[/url] ( u* U5 X; N( K) p* |& A3 n
; D. @! G9 M' L4 O3 a6 m' b
- &ecspi2{
- _6 |5 F! `1 S3 ~ - #address-cells= <1>;0 E9 k# w: Q+ } ?
- #size-cells= <0>;+ t' N# W5 X7 V$ E+ f
- fsl,spi-num-chipselects= <1>;
! {; O' C; u) ^ - pinctrl-names= "default";
- U: l0 r2 J5 P - pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>;
0 F$ Z) k2 a& r8 ^9 j - cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;7 W' P0 x. ^: T n9 O0 D
- status= "okay";) K ^7 W0 s3 ^. C& \; K
+ V7 g: b- Y- }7 Z' |% ?- spidev1:spi<a href="home.php?mod=space&uid=2514928" target="_blank">@0</a> {8 g( w6 B! w7 P
- reg= <0>;
# A! N/ m$ m* l' S0 W - compatible= "rohm,dh2228fv";& M$ H7 V$ r9 \3 H3 Z) n# \
- spi-max-frequency= <500000>;
' n8 q8 s/ T* N/ p# _0 b* x( ~ - };
! q) t# W7 G# g P4 W - };
复制代码- <span style="float: left; margin-right: 5px;"><table width="98%" class="t_table"><tbody><tr><td>
& Z( f* Q+ i" W; w- i& F" p+ r - 9 j' K6 z4 N8 r) B4 A
- <p style="line-height: 24px;"><font color="rgb(77, 77, 77)">改为:</font></p><div align="center">
" n1 C8 _6 `2 e- ?9 b. Z, ]$ ` - <span style="float: right; margin-left: 5px;"><font color="white">[url=]复制[/url]</font></span></div>
. D$ j2 `9 b5 \9 F - 8 [$ Z* F, p- }: @4 O. K
- <div class="blockcode"><blockquote>&ecspi2{
: R0 D! q& k+ v) B3 w- u8 y! w - #address-cells= <1>;
' L) r# I! u. E x& n0 c' Z - #size-cells= <0>;9 u- j8 o5 f# N+ D; g
- fsl,spi-num-chipselects= <1>;
$ X5 q7 ~+ l7 v* p* j( N/ o# f, X - pinctrl-names= "default";& f g" Y* r2 u, ]" r' E C
- pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs &pinctrl_ecspi2_can>;
: i; q& }3 _6 D% V* L7 N8 k - cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
* g7 S; F3 ~3 w; @& s2 L - status= "okay";9 ^! Y% [+ t' O# |4 C2 `6 n
. c( i+ u8 y7 H2 g3 k+ A& R+ z ]- mcp1:mcp2518fd@0{
3 a$ e1 C2 f7 z9 w) G - compatible= "microchip,mcp2518fd";; k( D# ~- R0 l
- reg= <0>;2 W, C9 [$ i" x
- spi-max-frequency= <20000000>;
% `, |+ {6 I( R; { {9 f- ` [ - clocks= <&mcp2518fd_clock2>;8 I, S& P& W- F* k6 f
- interrupts-extended= <&gpio4 21 IRQ_TYPE_LEVEL_LOW>;
: \0 q7 e; t$ H0 L* L q - };
$ l8 y4 ?' S6 h8 W# J - };
复制代码 ; r F% J" ~2 s& z! x: S% R' X3 p
! L! [' w' w; t完成上述修改后即可进行编译,并用新生成的镜像烧写OKMX8MP-C开发板。 0 ^' p2 e) q# t3 s% Z( n* S
08 开发板验证 将MCP2518芯片接到SPI2的接口上,启动OKMX8MP-C开发板,启动后使用ifconfig -a命令查看,即可看到多出了1个CAN节点。节点生成后,即可按照用户使用手册【4.18 FlexCAN测试】章节进行测试,验证功能是否正常。 |