实验原理4 w6 |; z) o3 f0 a5 e
STM32MP157A系列SoC集成一个千兆以太网媒体访问控制器,支持RMII和MII两种标准的PHY,FS-MP1A设备上外接了一个瑞昱的千兆以太网PHY芯片RTL8211F,原理图如下:% T* r; T8 P+ f; E4 e2 r
+ T9 |/ M: \# S- w% ^; ^( N
% a3 x- O3 q5 z$ A9 M4 ?) N5 u7 |
. A& d2 ~8 W5 Z. S! K1 z6 X9 \, Y查看原理图得出RTL8211F数据管脚与STM32MP157A的管脚对应关系如下:5 B3 D( ?1 [# n. ^! A
C( I; ^4 o, a
1 z% [+ z# p" O5 e2 S
1.网卡设备树节点2 f' s; W+ }4 e) m8 h0 c# r, G) c
3 n2 Q {! O1 C6 A5 V5 p
内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:
0 h) V$ `! D( b0 L: n& w
. H% s% A' n. w" [( ^- arch/arm/boot/dts/stm32mp151.dtsi
1 Y( G+ h( _- e! @- v - ! ~/ a9 E3 N% N: C
- stm32mp151中ethernet定义如下:
5 l5 @6 p& Z/ f" _6 I4 C3 { - $ D+ S2 e5 k+ T
- ethernet0: ethernet@5800a000 {
/ ]& G. h# ]6 g. y2 p/ \ - 1 r7 V. ^' J& y* N" M0 x& A
- compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a";
% |8 f7 b0 o% R) z* S1 z
' L3 A: [9 T L) k. Y- reg = <0x5800a000 0x2000>;
7 c/ @/ b; V* H1 L
. l* J+ h x1 m0 y# i8 X$ _7 V- j- reg-names = "stmmaceth";
/ q' X' Z( a( B1 X& p - 2 r! H0 h- J) I5 N$ x/ M
- interrupts-extended = <&intc GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>,1 u, k' x! ]* [9 H3 `& x
- : u( [6 Q& t$ {2 v
- <&exti 70 IRQ_TYPE_LEVEL_HIGH>;
, w2 w2 J- F1 R: _9 w) ~' J* }2 J - 7 L, R+ V3 z' a* l! @4 e
- interrupt-names = "macirq",
6 G8 K$ g; W* d+ l
! Z! ^! k* P2 _ G$ W- "eth_wake_irq";9 ~( x1 k' ]8 w. K: \0 v: w
- % R/ _1 W8 a6 U# X3 j$ b, G( d- u
- clock-names = "stmmaceth",
: L6 i$ a$ H/ D: C8 x1 ]
9 H. J3 h, L6 r; ^; E, L6 U K3 a- "mac-clk-tx",1 [- S+ g) U% ^6 ^/ q
- $ V+ h l0 J5 ^* s7 ^0 M& i! t( h
- "mac-clk-rx",/ `$ l% j- s$ p4 c
- 7 V$ K$ n4 U, t; a! Q
- "ethstp";: `, S+ M9 l& K' l
- $ S% Y8 U+ P( v- }1 X
- clocks = <&rcc ETHMAC>,
& R5 a' P$ N+ C& e
7 P+ Z& `4 X7 `2 ~# C: M- <&rcc ETHTX>,: q K3 r$ v2 U; ]# r% r' K1 C
4 h, B( B( E2 d4 Y# F- <&rcc ETHRX>,
9 }- y, K) l2 z; |8 ?/ [* {
' Z, m8 c1 Z8 _( N r! ] z- <&rcc ETHSTP>;6 Y4 t# d$ \7 H Q. b+ \) L
- 7 Q1 Z0 h% {: L
- st,syscon = <&syscfg 0x4>;9 @( E: R- k" F
: `- k* Q: y- v+ K- L- snps,mixed-burst;
- ~: p' U$ X& @3 H9 Y
' w3 C5 r; r* _- snps,pbl = <2>;
- S0 I9 U& O* z7 [
' o7 w9 ]8 u; m5 X7 m- snps,en-tx-lpi-clockgating;0 I5 `7 \4 |7 x6 H) ^
4 H5 d$ [6 Y* |( y% O; B7 ^- snps,axi-config = <&stmmac_axi_config_0>;
( V; ]- ^3 F9 j: O
* W8 r; ~, i) j+ U- snps,tso;0 A0 z$ @8 d; f3 m0 K1 Y$ @ ^
2 I/ w2 q$ h" X3 C9 C, X7 a' { V" B- power-domains = <&pd_core>;
, f+ ^! N, m9 C9 U# v2 Q" V8 b - ) B; W( [: `3 h/ X0 K9 [+ x
- status = "disabled";
& q+ J9 ~' C1 ^8 x6 C) V+ A) }
: G0 D, t# z8 d: |5 \- };
复制代码 # s- [5 Q' L' N% G( o2 d. c) t9 I
上述代码只对ethernet做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。" t' N8 e8 Z" r% S
3 p# @" [+ F6 ~* G7 X% b
对照内核文档目录下相关文档添加补充相关信息,亦可参考内核中其他设备树文件中相关描述,比如stm32mp15xx-dkx.dtsi关于ethernet的描述符合我们的要求,内容如下:, R+ q0 ^: i# [& Q* a
! s' s( J7 s8 q( F
- ðernet0 {3 }+ j8 ?* H* q( K
- ' n( g: N m" Z" Y0 g2 c7 { T$ W
- status = "okay";
! f% n# R' M- ]/ ~. q - # `$ \* o9 J- V/ ]0 U7 M) |, f+ t+ ]
- pinctrl-0 = <ðernet0_rgmii_pins_a>;
% Z f1 u6 Y/ a
# c0 d5 ]; d6 k$ P, p- pinctrl-1 = <ðernet0_rgmii_pins_sleep_a>;. S, b6 R# K" U/ L! p& a
# Q _2 A/ C ~5 D; U- pinctrl-names = "default", "sleep";
2 P3 C" a4 f' Z% Q& P) J
\2 ^% U4 \( n# v- phy-mode = "rgmii-id";; a3 @% Q; E5 ]! C
- & h) p, | O" C" Y e
- max-speed = <1000>;
! e. O5 z$ i$ W: W: V
7 s, l( b% J" @# B7 \" l9 @( B$ V* Q- phy-handle = <&phy0>;8 d0 y# Y$ O, c1 f; {! ]8 R
) o* i3 P8 v0 u# u" X: }: A- mdio0 {
9 ~! ? r, O; a" h - ' D; v% m8 [; Y8 c
- #address-cells = <1>;7 z3 m8 |: q5 e" A
$ \8 R# [; r5 e7 p- #size-cells = <0>;' A5 ]7 j2 _$ E' v: ]
- / G( `, b3 N3 ]7 L2 l6 \: }! d
- compatible = "snps,dwmac-mdio"; e( }6 \& |1 X+ m0 Y+ \
' X! r: E8 P' m7 x. l% D1 P& U$ ~- phy0: ethernet-phy@0 {
4 X" O' b5 J' b/ D2 I$ `7 m - 6 \$ I' I6 E. h2 v, [8 L" |" V
- reg = <0>;
) r' i& ^' A, Y! V
2 M8 v2 l3 e' [2 V, b- };4 a w. }, g* A h4 }# l
- 9 b: J, g( `# Y$ ]. J+ b& s2 g4 T6 C
- };
+ t) e" e. u6 ?& o( @/ l0 H
: b/ G3 V! I" S) N8 T9 f7 P- };
复制代码
1 b# v' C2 D1 J' t1.管脚定义& a0 m' h8 M+ I% I$ s
在内核中STM32MP1默认管脚定义在文件arch/arm/dts/stm32mp15-pinctrl.dtsi中,查看文件中是否有需要的管脚定义:; h" A: P# G3 J' }, I- Y
& \! B$ z. G. }2 \; G( C- D
查看后确认有ethernet的管脚定义,且与FS-MP1A硬件使用情况一致,定义如下:8 P# ^9 U0 N& G. [% l
C5 Y& y( U; o9 O8 X5 }
- ethernet0_rgmii_pins_a: rgmii-0 {
e0 B Q) s7 O5 e0 j - % x$ P7 y: \# T5 @# t I8 I
- pins1 {
1 `8 F3 o1 x) O' f$ z
" k2 z* p3 K* E- pinmux = <STM32_PINMUX('G', 5, AF11)>, /* ETH_RGMII_CLK125 */: F O& ?, i/ y2 P* D4 w& ]
. M8 r/ h$ s% u/ i- <STM32_PINMUX('G', 4, AF11)>, /* ETH_RGMII_GTX_CLK */
, H8 { S" _- J8 h
' i* c. d' u( T) T2 f; e3 f- V- <STM32_PINMUX('G', 13, AF11)>, /* ETH_RGMII_TXD0 */
- n* y+ c/ s; }" I! r! ]
7 H- s* k! m+ Y; d$ Y- <STM32_PINMUX('G', 14, AF11)>, /* ETH_RGMII_TXD1 */
1 X4 j [: M: x5 I - / Q1 h, k0 @% a" _2 s' X1 a
- <STM32_PINMUX('C', 2, AF11)>, /* ETH_RGMII_TXD2 */. {& \/ K" }3 Q5 X
8 |' k" A$ o, I7 R' u- <STM32_PINMUX('E', 2, AF11)>, /* ETH_RGMII_TXD3 */
2 L5 h3 W$ S4 h; r' l
) Q" v1 O {- ?+ V$ n6 e- <STM32_PINMUX('B', 11, AF11)>, /* ETH_RGMII_TX_CTL */$ \9 X/ ~ e5 x( G' `' V1 A
- ' d& l8 o' R% p+ ?) m
- <STM32_PINMUX('C', 1, AF11)>; /* ETH_MDC */, P+ ~/ B. m7 |( e: z
! |' Q% X* {7 n% ~+ ~, j- bias-disable;, J: r+ }+ k$ ~" l0 {% ]9 h4 k
- 1 c! E! M* t! s$ W& [+ S: _
- drive-push-pull;
@% t1 b' d3 m
$ ~; l! z% l3 e9 K1 z: K- slew-rate = <2>; y- y) V* x% ^ s0 }9 P
/ B; L6 B s1 c {0 d- };' Q; E4 A, X( J5 c. `, G
- 6 I' Q! ~" R" h: X9 R# h. [+ K
- pins2 {; C& G; ?2 M6 H7 x# M
- 3 M" A. o: W5 I, v% f9 M, _) b X3 w
- pinmux = <STM32_PINMUX('A', 2, AF11)>; /* ETH_MDIO */
% v+ F" s2 ?; n+ M3 E
% ]9 V% K. r# P# T- b6 P. O- bias-disable;8 p( k H' R( ^- y
- ( r8 z* q& C! t, j: f7 q0 Y( W
- drive-push-pull;
- q4 _. I2 e: V9 x
1 v) w# ]0 R4 j: y, q5 `/ x4 ]- slew-rate = <0>;
6 s; h" r& c8 E* e - 0 v9 m+ [1 I- A
- };
4 X, Z( C2 M# U! n- W9 j% _9 p
$ \1 O& e: b& ^0 N6 L! e$ @) i0 o, k- pins3 {' H" B, A( A8 R' _
- / w: c/ A# Q. H1 v6 X
- pinmux = <STM32_PINMUX('C', 4, AF11)>, /* ETH_RGMII_RXD0 */7 Y: q/ Z9 ?; e$ j* C* n v; H
. v, {3 \; F) L% p* Q- <STM32_PINMUX('C', 5, AF11)>, /* ETH_RGMII_RXD1 */
/ m* e7 `3 x3 F! w( o - . V2 h; J7 @/ Q% Q, Y
- <STM32_PINMUX('B', 0, AF11)>, /* ETH_RGMII_RXD2 */
, }0 }" W' I9 U- E
# r+ U# V! @ |- <STM32_PINMUX('B', 1, AF11)>, /* ETH_RGMII_RXD3 */
) a( D2 v0 ` z* ]$ X6 r5 A. ?
2 ^8 h; _' E7 N* G5 g: N- <STM32_PINMUX('A', 1, AF11)>, /* ETH_RGMII_RX_CLK */
/ o$ |1 g3 B; ^9 o0 p
( | G9 {. z! N- H- <STM32_PINMUX('A', 7, AF11)>; /* ETH_RGMII_RX_CTL */
" A/ a! ^2 p+ v/ V8 n( X& O0 w - + s$ y! ~1 K1 X. `6 @" L) r
- bias-disable;
/ u& G8 b( z7 I
! f# O2 |. A: n7 S2 b+ ~* O) a- O- };3 [8 e1 ~/ ?( `5 d5 U6 h
& Q* y% P b6 l! b- W- };
% A+ W) g6 v6 O; L" q - 2 d7 a0 _2 K! h% y
- ethernet0_rgmii_pins_sleep_a: rgmii-sleep-0 {* w, |& I5 h: A
! j! W+ l* \2 q' n% V! Q- pins1 {
c0 M1 R% }: \7 o, |0 O$ n6 M
8 m, p) f& |: q- pinmux = <STM32_PINMUX('G', 5, ANALOG)>, /* ETH_RGMII_CLK125 */- ~5 X. s) u% I) K# I5 u* T
8 T |8 z; A, }6 u- <STM32_PINMUX('G', 4, ANALOG)>, /* ETH_RGMII_GTX_CLK */
2 W% F7 E* r5 I - : E: p8 G/ r" B% e. Q" T5 @# J( h
- <STM32_PINMUX('G', 13, ANALOG)>, /* ETH_RGMII_TXD0 */8 x$ k1 D \4 P
- 6 D/ c# s5 I& B0 X3 V
- <STM32_PINMUX('G', 14, ANALOG)>, /* ETH_RGMII_TXD1 */9 G+ W/ n! _9 m' w& l+ @* Q8 w9 G# l: ^
3 n, [5 ^; U, G* l; z: P- <STM32_PINMUX('C', 2, ANALOG)>, /* ETH_RGMII_TXD2 */
. p7 M6 s) I- z# x - 7 |7 D, G/ @9 Z- x
- <STM32_PINMUX('E', 2, ANALOG)>, /* ETH_RGMII_TXD3 */
) M2 T( c$ g2 U& D* r; C0 `
& R# }+ F9 v# R9 e- <STM32_PINMUX('B', 11, ANALOG)>, /* ETH_RGMII_TX_CTL */
7 L5 `: M4 t( U5 W% X% I; ` - 9 e3 r: c& n* V7 P) p; _5 y) `
- <STM32_PINMUX('A', 2, ANALOG)>, /* ETH_MDIO */' y* M, ], ]; Z4 ?) v# V
- f4 d, G: n. @9 L) f- a
- <STM32_PINMUX('C', 1, ANALOG)>, /* ETH_MDC */5 V: P8 B8 D" _7 ] v6 G! b
9 Z. z9 {& g# Z& s- <STM32_PINMUX('C', 4, ANALOG)>, /* ETH_RGMII_RXD0 */: X, {) M' b- i( b
- 5 u6 U: x \$ h0 I6 e% r
- <STM32_PINMUX('C', 5, ANALOG)>, /* ETH_RGMII_RXD1 */% e/ g: C4 N2 x7 F8 M7 e' {! w
- " B! ~8 U/ q: L# j( ~2 E8 Q
- <STM32_PINMUX('B', 0, ANALOG)>, /* ETH_RGMII_RXD2 */
$ \( t7 e3 d% f6 H4 U( n/ ]
5 e4 f7 G! M1 ~: A# l {, r7 j- <STM32_PINMUX('B', 1, ANALOG)>, /* ETH_RGMII_RXD3 */" f; D% p y% Q4 ~
9 q( g0 U1 `$ o3 v# F- <STM32_PINMUX('A', 1, ANALOG)>, /* ETH_RGMII_RX_CLK */: N7 ?% n: X# y2 h2 r4 J5 V
6 e3 w' O3 v# x6 j9 a: c% g @ U- <STM32_PINMUX('A', 7, ANALOG)>; /* ETH_RGMII_RX_CTL */
+ S# L" U1 [% `
' s- m. h8 v) y7 K0 S+ J- R& M- };* R( _1 [7 n4 N) x9 x
- . r- C# @/ E3 d* y! y6 s$ e1 o
- };
复制代码
- p4 y. N* u5 x& U& f实验目的, o$ ]4 t2 q) G' T0 u
熟悉基于Linux操作系统下的网卡驱动移植配置过程。
( x6 M) S3 L; ]0 [9 P y% g% j6 H# A# k3 S+ k3 v8 n
实验平台
" r: m* ?. f! u# @FS-MP1A平台;. i+ {+ b% R+ q2 I- e9 b" Y! R
- Q b! w1 Y, L+ ?3 j
实验步骤( R+ K1 P X+ [3 O, t' Y5 A
1.导入交叉编译工具链
; u& K( ?8 L6 M6 E' V* H3 Flinux@ubuntu source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi& r# H( b. L( K0 _
, r" K L, ]; C, R: ?2 b2.添加网卡设备树配置。1 k5 d5 @" h' P
修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件
% P7 \% L$ @; n: n' { V
' p4 ]7 B2 U# r在文件末尾添加如下内容:7 i+ `- G9 A, j! n+ L8 [8 y
# t1 V7 y. ^( L. R5 n' j
- ðernet0 {% L& @3 a' W/ j2 [4 l' U
2 U! D5 x1 D2 x- status = "okay";, o3 f$ b. X. Y3 f7 d! J. j
0 \ N% D& r: o- ]: l3 t8 v: O& l- pinctrl-0 = <ðernet0_rgmii_pins_a>;7 j0 P, l( Z& \6 T9 Y2 R$ @
- : E! U5 Q5 y& p" x* {
- pinctrl-1 = <ðernet0_rgmii_pins_sleep_a>;
" t/ w$ P8 }2 h% }0 I. i5 k7 t1 C0 i* p - ) I1 ^( u- g; v8 S
- pinctrl-names = "default", "sleep";$ Z' `! Z$ O9 w- S0 q* c7 d8 V' E+ }
( J7 X) V9 i- a# N6 m" h- phy-mode = "rgmii-id";
: V- `% [2 R& h0 @9 p i
3 Z6 |( [4 ~8 r% v2 b- max-speed = <1000>;
7 P8 R! o: {. [2 S% K) W% g- e - ! o3 l8 S R5 I* f: N, L
- phy-handle = <&phy0>;
5 r( @3 |8 V9 V - " c1 A: E+ V4 S' U. k
- mdio0 {' P2 R ]9 v. n' p( V: c
& h/ ?) g% _& p, z- #address-cells = <1>;
0 r+ c/ X2 [& y* a, L
8 Y% \3 A" u1 u9 |- #size-cells = <0>;$ U- o, y1 V, @" i6 _4 k* m( t: W
- & s$ i Q$ w: `+ @# I& Z' ]/ d& Z1 h% e/ ]
- compatible = "snps,dwmac-mdio";5 o# n; c( R+ [# u4 U6 P
- 5 U: A% I, R( C8 v3 o- k
- phy0: ethernet-phy@0 {
! x3 n5 k; K: @5 h; L - ) W5 C4 n5 S" b* ^2 ~& O
- reg = <0>;
$ B. v$ S' ~# K* d( ]
# p0 h; \- ^" ~2 A }$ P, B" @8 M- };
* h4 ?% _4 B3 Y7 e
3 m2 ?' l9 b2 W; N; v8 G& M; L8 W- };9 o2 h. ?* X# B, e0 t2 l
+ V6 R- p% f6 o% g+ w; V; |* L- };
复制代码 9 m# O; R4 ~$ w1 n, h
3.配置内核
! Q( O- N' r) n由于内核源码默认配置以及支持网卡,本节列出主要选项,如下:5 h v- _+ `7 D
6 J; u' N/ {" f. Y3 ilinux@ubuntu make menuconfig
2 `+ F1 e( ?4 E. f" ~! b
g8 Z8 `2 A% u, ]5 WDevice Drivers --->
% n' [1 \9 ]3 o. l2 ^: V* g" L Network device support --->' \9 r0 g( Y/ P
Ethernet driver support --->9 m) p; g( W$ N( l
0 m+ B$ o3 I; I1 c. K) ^; P& @" t* Y<*> STMicroelectronics Multi-Gigabit Ethernet driver
" V& _. X2 D, B$ b
9 b6 [' g( u& ~- L" p<*> STMMAC Platform bus support0 [0 Y7 S+ ^0 F* n3 T5 s6 @% i
0 |0 q5 }9 L) @$ w4 \<*> Support for snps,dwc-qos-ethernet.txt DT binding.
5 B0 S, U& _3 e7 X6 @/ }# i, y7 L. r0 D# W3 e. \
<*> Generic driver for DWMAC
# b( Y9 @: n& L3 ?) v$ V. r* h* i" o7 \
<*> STM32 DWMAC support+ m* U* o: { ?* J' [) J
8 w" {! X: _0 e: Z. s- X3.编译内核及设备树:
7 o# m$ c1 H1 B9 {6 flinux@ubuntu make -j4 uImage dtbs LOADADDR=0xC2000040
/ }$ \+ I/ Q/ E) @& D, C2 m' h+ \- D0 Z) q0 H8 S
4.重启测试
4 `& Z6 X8 d" ]+ n; l' E2 V% y h, w将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,重启设备后可以看到如下启动信息:
% ^' l6 u3 I/ a* [
h L9 c; n3 o/ E2 V+ r
8 @) n: v8 F! h; h' \. |, h7 [
7 l' S* F5 C, N, N, C: ^
! D" w& C4 P8 ?
0 p) J W0 f# g" N2 p
通过Ping 测试网卡8 p0 o6 U$ q/ O+ u
4 d7 W# \% h( E( m5 F
' [1 Z* d) Y+ R( q& I. o
. q) j$ Y- G" }& C# E) i
如果设备不能接入以太网,可以ping主机 ^) M+ d( k Z5 x0 r S
————————————————
1 O1 Q. D, z9 O9 S版权声明:华清远见IT开放实验室
! P3 ?' f4 s! j1 R, d) e9 f
9 U+ P* U6 j' X3 s9 D5 S R1 {
# a* d- {. [1 N0 r |