: |$ Q( Q9 z( Y) A0 r7 f飞凌嵌入式OKMX8MP-C开发板有两路原生CAN总线,但用户在开发产品时可能需要用到更多的CAN,这该如何解决呢?今天小编将为大家介绍一种SPI转CAN的方法,供各位工程师小伙伴参考。 说明 % C3 f- {7 L! O' j8 k
: l% j/ y. I, r% V" I, ~6 R$ o$ ]$ H$ s3 |8 F) Q
C6 E' r; W/ {6 s; R6 @$ z
01移植MC2518芯片驱动 在OK8MP-linux-kernel/drivers/net/can/spi/路径下创建一个文件夹——mcp25xxfd,将相关文件(包含.c文件、.h文件、Makefile、Kconfig等)放置到此文件夹中。
/ g: W+ r1 A. X. b: P) t! m7 N02补全对can_rx_offload_add_manual函数的定义 vi OK8MQ-linux-kernel/include/linux/can/rx-offload.h 添加: [url=]复制[/url]
8 O. U) M9 _2 F$ k3 n; s3 ~
% G1 {% l0 L! j& Y, z- <font color="rgb(198, 120, 221)">int</font> can_rx_offload_add_manual(<font color="rgb(198, 120, 221)">struct</font> net_device *dev," l1 M6 X9 t6 `' A1 N; y
- <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,
( {7 n4 ~# c! V; i8 M - <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)2 m2 _' ^4 j! O @. r
复制代码
% f. d9 I/ H1 @( G1 G$ wvi OK8MQ-linux-kernel/drivers/net/can/rx-offload.c 添加: [url=]复制[/url]
& u: o: P U( T- * Y5 s, F7 e8 s. V& K
- <font color="rgb(198, 120, 221)">int</font> can_rx_offload_add_manual(<font color="rgb(198, 120, 221)">struct</font> net_device *dev,
' Z- E! L3 U- u- D. i9 Y7 m) a, ` - <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,
" A/ C/ y% o e - <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)$ b6 [. I# q$ p% [. j
- {2 _! Q' Z( J' ?! o
- <font color="rgb(198, 120, 221)">if</font> (offload->mailbox_read)$ N6 ?& J- h7 l/ g1 G K& i. @" q5 I' }
- <font color="rgb(198, 120, 221)">return</font> -EINVAL;
" w1 x) b! \. m$ B+ w8 Y3 V9 h - <font color="rgb(198, 120, 221)">return</font> can_rx_offload_init_queue(dev, offload, weight);
8 f4 W9 @; g* @/ B5 R' O - }( Q: W; D- n8 D( v1 R7 W U9 j
- EXPORT_SYMBOL_GPL(can_rx_offload_add_manual);
复制代码 7 o. f- z5 X4 E4 m) K
$ G' z' ~$ ?% _: h0 ~03修改上一级目录spi/下的Makefile和Kconfig vi OK8MP-linux-kernel/drivers/net/can/spi/Makefile 添加: [url=]复制[/url] 7 o K' F) D2 s* u/ s# D
7 r) H) s9 i+ _; ~$ g( [, O" \
& ^" C5 G' D3 c( T
- e: E8 M1 z- y& g3 V* F: Pvi OK8MP-linux-kernel/drivers/net/can/spi/Kconfig 添加: [url=]复制[/url] , P0 g# f2 ~$ r
- <font color="rgb(193, 132, 1)">source</font> <font color="rgb(80, 161, 79)">"drivers/net/can/spi/mcp25xxfd/Kconfig"</font>
复制代码
+ B1 \- n# d. D
0 V; ]) n8 M, d r04修改驱动配置文件,将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 1 L, ?" o" Z9 F2 P" v% ]
05在设备树中配置时钟 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 添加: [url=]复制[/url] - 8 t4 Z) k0 n0 L0 @) g! i8 c
- clocks{8 d: T+ d3 ? t4 p% V
- mcp2518fd_clock:
& o( D! Z3 `+ U ?# \) V) T. I - mcp2518fd_clock{
1 q( z9 m: t4 A ]* i9 R" J - compatible = "fixed-clock";
. t) Z& X1 Y# @/ c1 v. u0 G. S: T - #clock-cells = <0>;& p3 X9 x' v2 G- F
- clock-frequency = <40000000>;. R% Z) D: r6 n4 ?
- };
% s% V; t. `% P5 Q& O' w- p t - };
复制代码
/ ~ i1 @. m( l2 M. T0 @
1 Q* S1 }3 ^* @06找一个引脚用作芯片的中断引脚 此处是将GPIO4_IO21用作了中断引脚。 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 添加: [url=]复制[/url] * K' Z& s/ v7 `$ R" [' ]6 N; {
# N n4 L8 R$ ~4 z0 ~: c) n
pinctrl_ecspi2_can: ecspi2can{
2 E# [) o4 I9 t) q e fsl,pins = <
8 ?/ u1 i g" Q% H MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO21 0x40000
5 ]( [; L( o1 O% H( U. P9 w >;1 R9 o6 f% ^) q
};9 n: z. |+ Z* Q# O' U& B
" V7 j A( C- v
07 在设备树的ecspi2节点中进行修改 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 从: [url=]复制[/url] . Q. K4 A, [$ y) z0 _7 q6 p6 q6 q# ]
4 [2 \ ]+ y( e- P# R) }
- &ecspi2{
* S) p9 O/ d0 v - #address-cells= <1>;
9 d' Z( N D% q( ~ - #size-cells= <0>;- T2 ]% h+ q# G$ U5 \; B: }
- fsl,spi-num-chipselects= <1>;! ]3 c; d' Z7 D/ k4 @! r9 v! d
- pinctrl-names= "default";. a% S( d" e% Y& N) F6 a: M
- pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>;
: S6 F. o" C0 t+ R' `2 ^) `! y - cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
( r2 O, L. T) P6 A - status= "okay";! n9 U8 w, l" I
/ E4 O' Q1 i" [6 _+ F2 p- spidev1:spi<a href="home.php?mod=space&uid=2514928" target="_blank">@0</a> {, o+ G% g4 }9 |: n+ J9 R5 ]( q; ^# o
- reg= <0>;
% ? E) c! r$ G) r9 D+ u- W. Y. P - compatible= "rohm,dh2228fv";" Y, G7 N' F+ T3 F7 m
- spi-max-frequency= <500000>;. E( O9 j9 e1 }% A* \
- };
) q2 ~9 ]& Y: D7 d2 A/ i - };
复制代码- <span style="float: left; margin-right: 5px;"><table width="98%" class="t_table"><tbody><tr><td>3 h. e) K+ f3 W3 K& _2 s
- 5 I# Y& ]6 I0 E% x1 f+ X
- <p style="line-height: 24px;"><font color="rgb(77, 77, 77)">改为:</font></p><div align="center">9 ~9 [; H3 Y/ f2 V# z$ B1 I
- <span style="float: right; margin-left: 5px;"><font color="white">[url=]复制[/url]</font></span></div>* _' B& b( h& ?3 J2 j& _: w
, L, ]+ t3 Y$ J3 W- <div class="blockcode"><blockquote>&ecspi2{
* A d0 a3 R, E2 Z3 i( U - #address-cells= <1>;
0 q1 p% F! P# L4 c! N - #size-cells= <0>;
' \8 y. D/ M! `2 J( s% @) O, n' R9 _4 i - fsl,spi-num-chipselects= <1>;7 i3 \1 `( j2 j
- pinctrl-names= "default";
& [2 K; x6 f+ s" e7 q* D* o1 ?( _' J. o - pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs &pinctrl_ecspi2_can>;0 I; a: x. Z7 H
- cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
( H" Q# r5 x# k* @, D7 \ - status= "okay";
4 |6 ~7 S4 N! D% E
+ K/ V1 c/ C# g. z& e$ J- mcp1:mcp2518fd@0{
! _8 M- b' t5 n* H/ h - compatible= "microchip,mcp2518fd";: @9 d% _, I. Q2 n/ s+ |
- reg= <0>;
; o# t( C. X# N& S - spi-max-frequency= <20000000>;
) f2 L8 P+ A, P+ g5 D4 A' K - clocks= <&mcp2518fd_clock2>;
/ Q- P: o$ S8 \# l. J - interrupts-extended= <&gpio4 21 IRQ_TYPE_LEVEL_LOW>;
; d" W% q4 ~& c2 { - };
+ [* F9 h7 m9 ] - };
复制代码 Z* F) {. L* T2 i
6 [1 P$ U' \2 D, ]2 }9 A( b1 Y o; z
完成上述修改后即可进行编译,并用新生成的镜像烧写OKMX8MP-C开发板。
" d; A) X* r% q/ r8 K& t- e08 开发板验证 将MCP2518芯片接到SPI2的接口上,启动OKMX8MP-C开发板,启动后使用ifconfig -a命令查看,即可看到多出了1个CAN节点。节点生成后,即可按照用户使用手册【4.18 FlexCAN测试】章节进行测试,验证功能是否正常。 |