/ B' L6 D2 v7 ?/ ^8 ~. c飞凌嵌入式OKMX8MP-C开发板有两路原生CAN总线,但用户在开发产品时可能需要用到更多的CAN,这该如何解决呢?今天小编将为大家介绍一种SPI转CAN的方法,供各位工程师小伙伴参考。 说明 . a: ]' y; m" |% V% d
, b! T: O% s: J( p
1 ?% l9 Q- s+ q( x% G; {9 Q6 U9 D. w+ m% |1 C' Y
01移植MC2518芯片驱动 在OK8MP-linux-kernel/drivers/net/can/spi/路径下创建一个文件夹——mcp25xxfd,将相关文件(包含.c文件、.h文件、Makefile、Kconfig等)放置到此文件夹中。 3 R% m' W$ f# g) V- M2 B/ |
02补全对can_rx_offload_add_manual函数的定义 vi OK8MQ-linux-kernel/include/linux/can/rx-offload.h 添加: [url=]复制[/url]
- R& ]( u' o' O$ A& p
9 m/ v' f7 I* h% 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, o2 k0 o3 G! @: r! @: |
- <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,
* ~3 O2 \2 J* _! W - <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)' y. Q& P# n6 z
复制代码 X; X0 ]" Q y' c
vi OK8MQ-linux-kernel/drivers/net/can/rx-offload.c 添加: [url=]复制[/url]
4 F! w7 J6 ]* ~, ]7 T* l, K4 N
& S p+ r- m. ]( h9 k% B" i( 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,
9 c6 u0 I7 a# K0 L, y" v, T - <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,
# Q7 _; P# U8 _9 R; P - <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)( j6 C6 L a- F9 X9 f6 O
- {
1 ^# S5 o, M/ _( y+ S: u3 o - <font color="rgb(198, 120, 221)">if</font> (offload->mailbox_read)! H9 v" [7 i9 p& C' b1 t2 J
- <font color="rgb(198, 120, 221)">return</font> -EINVAL;
- [, ^7 F+ ]$ K* J! D - <font color="rgb(198, 120, 221)">return</font> can_rx_offload_init_queue(dev, offload, weight);
' ?) `1 g7 C1 a B& [# t/ A - }) T6 u# J( V, h2 n: w3 W1 u
- EXPORT_SYMBOL_GPL(can_rx_offload_add_manual);
复制代码 1 I2 }+ E- {/ o0 f R% N
4 N: `6 z5 `6 Y- s% G1 H& K# [
03修改上一级目录spi/下的Makefile和Kconfig vi OK8MP-linux-kernel/drivers/net/can/spi/Makefile 添加: [url=]复制[/url] 2 D, h( A1 J6 X3 h M
6 X4 F, G+ e: s5 L0 v
# ~" @) W# ^0 v8 Q1 \; K
: ~ T9 F* R5 A6 H3 Kvi OK8MP-linux-kernel/drivers/net/can/spi/Kconfig 添加: [url=]复制[/url] 4 v# H x# T4 s+ R
- <font color="rgb(193, 132, 1)">source</font> <font color="rgb(80, 161, 79)">"drivers/net/can/spi/mcp25xxfd/Kconfig"</font>
复制代码
- P4 p2 f' ~3 m7 o) [
. L7 y W4 f. O4 l1 R) 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 8 J7 D# w4 L( b1 F: ?7 w
05在设备树中配置时钟 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 添加: [url=]复制[/url] - ' |4 U- {. }/ S" C
- clocks{
% W) G, ]- C4 t0 D X - mcp2518fd_clock: 8 V: g i2 m- J3 v& i7 I
- mcp2518fd_clock{
( w" J9 y6 O j# Y' d - compatible = "fixed-clock";; z0 n4 a: }+ R+ M. s+ G' R$ ^
- #clock-cells = <0>;
+ D0 C A( n/ { - clock-frequency = <40000000>;: M! {- p5 V+ d* P4 f
- };7 h9 n/ q2 J9 D' J
- };
复制代码 4 w+ s9 ]5 E6 E4 j: T" G. [% D
2 b5 f) F. q# K2 V; c, a# D06找一个引脚用作芯片的中断引脚 此处是将GPIO4_IO21用作了中断引脚。 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 添加: [url=]复制[/url] 8 g/ [: H. [+ Z3 |- q: Z! r- i/ I+ E
}# T! u' ^3 y- i" \3 kpinctrl_ecspi2_can: ecspi2can{
( m. J4 R$ M( u& ] fsl,pins = <
% F K% t- w* I7 X$ f MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO21 0x40000
1 `2 b2 M# H$ j' E- x) Y >;1 C. F p Y5 I( Z
};& P4 o( G5 k6 G9 y- P3 c# P( M
4 t3 N, [" p F9 R5 H07 在设备树的ecspi2节点中进行修改 vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 从: [url=]复制[/url] 6 b" v1 i9 T7 e2 [ D6 ?, W
! t7 Q% ^5 D8 a4 I5 G- &ecspi2{
7 i6 x! P6 L0 ?4 G# d V1 F - #address-cells= <1>;; ]; j7 Z: e% c0 [& t
- #size-cells= <0>;
z: a( \+ D; \0 A - fsl,spi-num-chipselects= <1>;& n! M0 j3 J- q# q" d% y
- pinctrl-names= "default";
- B" }6 p! s8 m* Z" H2 D' h) n) ] - pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>;
O% U" f, S. H% v- f1 Z# m P - cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
. i4 A; L7 h7 g7 p - status= "okay";8 j. d( M$ ~" m F) n
- 7 J8 `1 S* V* b+ k0 \, H
- spidev1:spi<a href="home.php?mod=space&uid=2514928" target="_blank">@0</a> {- T2 U5 J" e7 ?7 c* n! [' U
- reg= <0>;- U# V b7 Z' N- B
- compatible= "rohm,dh2228fv";# Z. k Q) q9 o$ y! Z A3 D9 | F
- spi-max-frequency= <500000>;
; c. J$ y# ~: A, m8 R* T# x - };& v' m1 i, x" H4 s! v' \, V
- };
复制代码- <span style="float: left; margin-right: 5px;"><table width="98%" class="t_table"><tbody><tr><td>
; ~$ n: b8 C. n( X5 u
+ X) H5 M. {" N/ q, t. w, _- <p style="line-height: 24px;"><font color="rgb(77, 77, 77)">改为:</font></p><div align="center">
! `6 o! s# b0 L$ F) [/ s - <span style="float: right; margin-left: 5px;"><font color="white">[url=]复制[/url]</font></span></div>+ ^. ^5 C" N5 ~9 V9 z; n+ R: H
- ) q% `; {$ N/ h
- <div class="blockcode"><blockquote>&ecspi2{7 G3 r7 C. S2 E# Z8 T5 o- \2 l9 e
- #address-cells= <1>;/ I/ u! L2 \5 @. O% g# x
- #size-cells= <0>;
7 ~& B8 i K* ~' }' y- G - fsl,spi-num-chipselects= <1>;
5 Y& ]& }+ U# u* R - pinctrl-names= "default";
) _' a4 i5 T/ d) ? - pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs &pinctrl_ecspi2_can>;
: X+ V, Q' N ]7 | - cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
% e' o# G. L- F) t' {- { - status= "okay";6 }$ U4 |5 H! J) N! V
! \+ `6 w# t. y5 y4 ~3 ^5 c- mcp1:mcp2518fd@0{
1 L( }' n' B3 X, p0 g - compatible= "microchip,mcp2518fd"; i4 j2 R. _ Z0 F: g* C+ X1 n
- reg= <0>;
/ Y* t4 K/ L" T7 c5 r - spi-max-frequency= <20000000>;
/ A) H! o& J2 H4 A2 P0 Z - clocks= <&mcp2518fd_clock2>;- `4 ?+ y! O7 A6 z3 Y+ h; {# q
- interrupts-extended= <&gpio4 21 IRQ_TYPE_LEVEL_LOW>;8 g# j- `. \( N) s6 @! r1 A
- };
" x! i8 s5 H3 M+ Z3 J# D - };
复制代码
9 q. Q7 I6 X) `8 O }$ _! t) h( N i) w# }7 X! A
完成上述修改后即可进行编译,并用新生成的镜像烧写OKMX8MP-C开发板。 / B( q/ e8 {3 ]4 N* h5 [
08 开发板验证 将MCP2518芯片接到SPI2的接口上,启动OKMX8MP-C开发板,启动后使用ifconfig -a命令查看,即可看到多出了1个CAN节点。节点生成后,即可按照用户使用手册【4.18 FlexCAN测试】章节进行测试,验证功能是否正常。 |