实验原理
, M! q& x1 C0 s1 K- ?5 d; d& OSTM32MP157A系列SoC集成一个千兆以太网媒体访问控制器,支持RMII和MII两种标准的PHY,FS-MP1A设备上外接了一个瑞昱的千兆以太网PHY芯片RTL8211F,原理图如下:
% k* b) l4 T/ `1 L- a9 k2 `
: d7 h0 L" s) x
, r k3 I: Z4 L, Y5 F2 t2 c# m
. _$ N9 M x+ t, _+ B
查看原理图得出RTL8211F数据管脚与STM32MP157A的管脚对应关系如下:( r d0 C% A' v5 _) Y o8 Q
& Q, [% g$ ]4 u/ t) p* Y4 W7 Q$ V% N2 }. z1 ]- z8 [! X
1.网卡设备树节点+ [0 S c0 m+ Q& Q9 y
* H( R, C: {4 d. _" H$ {% e! ~, l
内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:2 S7 C. D. o9 S9 x$ w
2 w3 |0 y+ K- V6 j! ]8 ^6 M- arch/arm/boot/dts/stm32mp151.dtsi. F+ u& e1 w1 W
3 L5 k' _$ A# b1 R- stm32mp151中ethernet定义如下:$ l/ M+ O8 f6 i% ?9 Y: G; A. N% `4 c
+ G: V. B' Z: |6 z- ethernet0: ethernet@5800a000 {
" z7 Z$ R7 @" [( t
7 `$ G' }, s+ f9 c' n- compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a";
8 _$ b5 r9 h! G
O; Y. A, f4 j- reg = <0x5800a000 0x2000>;
' ~+ E2 k7 N6 g4 |5 D a - / p$ C; s! J5 M+ T0 c; z9 C( v
- reg-names = "stmmaceth";
/ @$ `9 w) p+ K- d1 E) S1 c
W$ F3 c" B9 R! ~9 _; t6 _- interrupts-extended = <&intc GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>,$ Q+ S$ B P. v. D# t
- + ]7 t8 }* _$ x! K
- <&exti 70 IRQ_TYPE_LEVEL_HIGH>;0 B, d0 [& U/ g! q( r! p
- ( Y6 E$ @. k' j2 O! p8 X" w3 n2 M
- interrupt-names = "macirq",
+ X. v @* ?9 q
( v3 b- _4 q* [2 n( `: A- "eth_wake_irq";
9 F+ o0 l: r# n4 F' B& P. L$ i - : c% n7 Q0 k3 L
- clock-names = "stmmaceth",
# I6 H. d2 l+ p# k7 u3 [ - ) `- W% b0 W9 c, l6 X' v o
- "mac-clk-tx",& t+ Y( }" P/ _" |0 P
$ k3 a9 S: v( m- "mac-clk-rx",% ]/ z: [1 ~: f6 z: b& S
- 5 i9 \- |' G# D. w% i
- "ethstp";
1 ]/ H" T) {% Y7 I @
: j3 u! h$ b0 j; R- clocks = <&rcc ETHMAC>,$ o, d p$ _; G" X
- 8 z+ z4 w3 ?1 I3 X) Z$ @) c7 |
- <&rcc ETHTX>,
. [% P N; A; J: L, D
* A/ q1 t$ X5 @. h8 r5 Z3 o- <&rcc ETHRX>,
& Q- Q4 j# C+ Y, K - - y* ?, N/ b* h3 @* D( Z, f
- <&rcc ETHSTP>;
; j7 y, y% K6 U0 D- ? - ' V. G3 ?4 \( U8 ^3 s
- st,syscon = <&syscfg 0x4>;+ b! f+ e7 W2 F) v6 ]0 x/ N
- 1 B! D: Z2 w8 X
- snps,mixed-burst;
/ ~7 i$ j2 A3 O1 Z% o, D4 G - ' M* o' i! N* n6 c2 w
- snps,pbl = <2>;) F! i' B5 ~) E( r
- & ~7 L3 _4 m0 @" q7 z1 G% U' K
- snps,en-tx-lpi-clockgating;- Y. {1 p. j* r% c% f
0 G$ ~2 W# J- d- snps,axi-config = <&stmmac_axi_config_0>;. ^3 D" M0 o( q ?: ?
6 K: h* e: N0 B# \9 J' a' ]- snps,tso;
2 E! O2 Y5 A- p' L5 }" G - ! z4 W1 {* G& y( `& v% `4 M
- power-domains = <&pd_core>;
* U; T9 o& c4 F+ q6 J+ J& r
% f7 O6 O8 E) \8 A \- status = "disabled";& B- i) w( `3 _$ Q- `! i- o& K
- 9 |. f' Y+ ], a. u. ^6 w$ _, t
- };
复制代码 A" G$ \4 E2 D. G. z8 |
上述代码只对ethernet做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。
7 `& H& F1 y! A6 U2 u& {- }4 ]# t5 S: U: H5 X
对照内核文档目录下相关文档添加补充相关信息,亦可参考内核中其他设备树文件中相关描述,比如stm32mp15xx-dkx.dtsi关于ethernet的描述符合我们的要求,内容如下:5 d! S* G' w, ~9 n0 C
' F" A& W0 {# V7 O- m$ k' Q- ðernet0 { X4 H4 \6 |/ |4 V+ A
7 V" V! ~# {+ T( f+ G9 t( {7 b9 s- status = "okay";1 |9 P, X5 Y, |, i
- 4 P O7 W& X D R( C0 q$ C' d9 h
- pinctrl-0 = <ðernet0_rgmii_pins_a>;/ K" D s# ^$ A9 T" P3 u7 ~4 S' f
8 |2 _$ j, n0 q4 T5 m, z- pinctrl-1 = <ðernet0_rgmii_pins_sleep_a>;
! o5 f" D# u, X# @$ {* x - : k( L. s0 r& z5 G4 {
- pinctrl-names = "default", "sleep";4 [/ j$ v- q( `
- : B# f6 h# f. z5 s1 w8 m
- phy-mode = "rgmii-id";
& g" {: g3 R( `9 m6 e
7 t! V1 Q% L$ e" r- max-speed = <1000>;
; i" O# k5 w4 ?/ f3 O - & k$ a6 s; R+ o
- phy-handle = <&phy0>;5 P+ @1 C; [( e% c% O" Q
+ `( Q) C6 w$ h2 z7 H8 ~ \- mdio0 {
; e# i! ~; t: h1 g
6 c8 h$ X4 ` x. f) |- #address-cells = <1>;
1 M0 K+ k) `9 [ - & m) [7 Q5 R, ~' n$ a; F$ O
- #size-cells = <0>; L0 m( i8 `" x* j* U% G
! A; m. S8 y+ ~3 j; e- compatible = "snps,dwmac-mdio";8 Q1 f! N( G' j
- $ V% L1 A* @/ u
- phy0: ethernet-phy@0 {. K) V& n+ l; j# ?9 @ C U; U' L
- , g8 X1 ]1 I$ m' f7 |, o2 r" S
- reg = <0>;+ t7 W% r3 d6 {. o" J$ R
- 5 f' K3 d/ n0 C! K; o! G
- };3 J5 H8 l9 U1 i" [3 `7 L
' q% R ?4 U8 M2 w- };
, a( c" K% P, V4 x6 n - , L( i3 |5 q$ }; D% u6 S
- };
复制代码 . V7 W e- i6 x- y- U& T
1.管脚定义* d, d) z, T6 M+ s( Q, u+ ?6 d ?& J* x
在内核中STM32MP1默认管脚定义在文件arch/arm/dts/stm32mp15-pinctrl.dtsi中,查看文件中是否有需要的管脚定义:
% X L @5 `- O) _2 T% U
0 T" q$ I! o* ` j: O- T查看后确认有ethernet的管脚定义,且与FS-MP1A硬件使用情况一致,定义如下:9 A6 A* X- o$ O: o/ D% x
5 [/ G4 ` T1 g% W5 O: K+ `- ethernet0_rgmii_pins_a: rgmii-0 {% Z' {0 L8 ~6 T6 j8 g
- & e P) X% F) @1 w* B! h
- pins1 {& Q7 B, g; I& C3 ] M
- 8 @0 F* P+ W0 j
- pinmux = <STM32_PINMUX('G', 5, AF11)>, /* ETH_RGMII_CLK125 */: L0 D& I! \, ?9 h5 b
- 5 g. I7 B) _* c) V5 l+ y* t
- <STM32_PINMUX('G', 4, AF11)>, /* ETH_RGMII_GTX_CLK */
+ c$ J R9 k7 c& s: r* C3 R' M+ R0 f
1 {( S& P4 n+ m @8 }, i/ j- <STM32_PINMUX('G', 13, AF11)>, /* ETH_RGMII_TXD0 */
- q ?# S) ^: C8 F: n; O
6 R8 d1 N; S$ N. a( A- <STM32_PINMUX('G', 14, AF11)>, /* ETH_RGMII_TXD1 */
' I3 |1 C# {. _( }$ C0 g9 ?# C
f: y1 \' Z" j i- <STM32_PINMUX('C', 2, AF11)>, /* ETH_RGMII_TXD2 */
# O7 b; }9 V4 ^3 m
& z4 O6 M2 g! O$ R9 Z$ {5 \- <STM32_PINMUX('E', 2, AF11)>, /* ETH_RGMII_TXD3 */
8 }- `4 y* K; [
7 @" t# C' N9 z- <STM32_PINMUX('B', 11, AF11)>, /* ETH_RGMII_TX_CTL */
" S2 A" S4 D, d7 [+ p3 I5 i. j - 8 v2 e ~, }7 B) a6 U7 v4 C* K. I
- <STM32_PINMUX('C', 1, AF11)>; /* ETH_MDC */
7 i) d1 _6 f$ r3 u8 L5 P0 O% F$ S$ P
7 x0 ~7 W/ ?: B3 v2 N6 I- bias-disable;
; M4 \8 w# I' U/ `3 U9 o2 U - 5 e' [$ X; ~; |/ @8 o1 [' j
- drive-push-pull;; z0 J" s$ x- _2 V: E
2 T8 M; ~0 y( q4 a4 F) b6 G, i- slew-rate = <2>;" O; m( T, A& M S
- ' q3 p% P% ^; N9 q. d9 d
- };2 ]! ?" a6 g. q, d6 c- ]+ T! W
- 3 T9 o! L4 }. N/ L$ G
- pins2 {0 h; o$ h/ O6 Y8 m5 `
- + ]. f( K% y9 [% j
- pinmux = <STM32_PINMUX('A', 2, AF11)>; /* ETH_MDIO */! D# y& }4 P8 Q9 j& T: N
- b+ Q1 o+ U. y, r( v1 B- [" w- bias-disable;
l- Y: J! Y( O9 M! p - / k/ K5 ?4 {" `. F
- drive-push-pull;
6 B- u! u* h- V' V8 n8 \
$ Q1 {, @$ n, R4 k2 z- slew-rate = <0>;
, `( p1 R# C/ R+ v$ i. @ - * ?. H; N; [5 d: x
- };% T" a# g% K+ v7 T% v
% v7 Z o1 r* r+ C" r- pins3 {
I! I" L) n! z8 D, r- I% b) ]- g - & N4 I4 l2 k4 I5 i" o- x
- pinmux = <STM32_PINMUX('C', 4, AF11)>, /* ETH_RGMII_RXD0 */
, q! X0 l; p0 G- @1 e4 u
) L/ n' L/ }8 j" B- B- <STM32_PINMUX('C', 5, AF11)>, /* ETH_RGMII_RXD1 */' i4 M& i' A. I% L0 }& N9 r5 V# x
1 A6 H3 e: p# B5 l4 x- <STM32_PINMUX('B', 0, AF11)>, /* ETH_RGMII_RXD2 */
& j- ^) r# z- I6 O4 z7 K: U! N
; ~- F6 D. n% s+ V- <STM32_PINMUX('B', 1, AF11)>, /* ETH_RGMII_RXD3 */
% |1 R9 _6 g. |3 ? - $ j/ C0 j" O" A. a
- <STM32_PINMUX('A', 1, AF11)>, /* ETH_RGMII_RX_CLK */
/ m% V! Z5 f# t- l0 N/ E - $ l6 ]8 p: Q+ v3 z" Z& O- p& _
- <STM32_PINMUX('A', 7, AF11)>; /* ETH_RGMII_RX_CTL */
5 v9 Y( ?" S3 m6 f - ( E0 z& n& R5 p# o* ]
- bias-disable;
# ~9 p$ Q3 |8 ^0 \# k - 7 l$ S8 J+ w: ^
- };
" g% a& y5 p( n7 f4 B+ w - 1 I! @. k l& a4 r& E8 v
- };
+ F! d- h4 ~" I: c. S6 P$ k! M
$ E3 W* g' T& K2 u C- ethernet0_rgmii_pins_sleep_a: rgmii-sleep-0 {
( I3 A: h+ P& j9 ?3 A0 ^ - 0 j( z1 {3 G. C, Y. S
- pins1 {% T) q' M8 @2 q
- 0 Q& r& h/ K' u* ]- S( o+ ]
- pinmux = <STM32_PINMUX('G', 5, ANALOG)>, /* ETH_RGMII_CLK125 */5 o' k9 j, C; z _
- ; }8 R" i8 W$ l
- <STM32_PINMUX('G', 4, ANALOG)>, /* ETH_RGMII_GTX_CLK */
9 ~$ a" t+ w8 Q6 y: c% @ - ! K9 w' j$ K4 Q& t$ l$ I
- <STM32_PINMUX('G', 13, ANALOG)>, /* ETH_RGMII_TXD0 */7 c. ~) i8 }! n+ i
$ [3 z4 w0 o1 l4 q- <STM32_PINMUX('G', 14, ANALOG)>, /* ETH_RGMII_TXD1 */" V& c y: U5 h" n5 Z# x
- 5 h9 M4 l8 o7 K4 I; S0 w2 K0 B0 ?$ ?
- <STM32_PINMUX('C', 2, ANALOG)>, /* ETH_RGMII_TXD2 */
5 J( ?5 Z( p& `/ @2 d* U# m2 j - ; H6 R1 ]" r# ?
- <STM32_PINMUX('E', 2, ANALOG)>, /* ETH_RGMII_TXD3 */1 o% T4 `, I3 l
- l' B5 R1 c" s
- <STM32_PINMUX('B', 11, ANALOG)>, /* ETH_RGMII_TX_CTL */
5 J+ \5 |1 T& j$ P
3 B/ D4 d+ X% ?, H* ^& W9 g6 I- <STM32_PINMUX('A', 2, ANALOG)>, /* ETH_MDIO */
4 F/ N3 e4 z8 Z( E% ~; M5 V) U; | - ) o1 i- j2 L( A' l9 j9 k4 \* O4 k
- <STM32_PINMUX('C', 1, ANALOG)>, /* ETH_MDC */2 b. _& ]$ A& m
- # k1 I5 X1 V$ S3 N
- <STM32_PINMUX('C', 4, ANALOG)>, /* ETH_RGMII_RXD0 */
x0 k' d8 l% c" U
5 H$ }0 _; c; U: s- <STM32_PINMUX('C', 5, ANALOG)>, /* ETH_RGMII_RXD1 */' n# F- p. ]9 N& G" q
( P' M& A5 i% m7 U3 B% r2 ]- <STM32_PINMUX('B', 0, ANALOG)>, /* ETH_RGMII_RXD2 */
0 H+ D) r$ l7 G5 k
6 D. B8 O6 f( ~4 O- <STM32_PINMUX('B', 1, ANALOG)>, /* ETH_RGMII_RXD3 *// E& P, E% c+ s' e! ]9 D
$ @6 q2 T7 p: g0 M+ r& o. G- <STM32_PINMUX('A', 1, ANALOG)>, /* ETH_RGMII_RX_CLK */5 V' W# N/ [0 d/ o! H& f9 z3 }& C
- + ?$ n7 G4 b5 y n- h3 |
- <STM32_PINMUX('A', 7, ANALOG)>; /* ETH_RGMII_RX_CTL */9 D6 s- Z% a( m% k/ s- U# z
3 H3 k; {, x9 p# {- };8 s) q Y; o# f/ h; p1 s
' R# W6 Z1 y9 j8 `- };
复制代码 * _4 k6 {% J& R' b. T x7 D
实验目的
* y- @3 A: M5 p$ G4 c- n2 ^熟悉基于Linux操作系统下的网卡驱动移植配置过程。0 E5 ?+ e( N+ [% x+ H% L0 l
) D. a: F) Y+ x2 ~3 p8 }/ y' `$ {
实验平台' t4 J* d' v6 [( T' g" N
FS-MP1A平台;
6 g, L2 Y& E' Y1 X- A! Z* e& s3 G0 y5 t% x* \0 o6 i: _
实验步骤! `7 X! z0 O6 R/ j- }
1.导入交叉编译工具链
0 V& R) q. y+ Q1 R, {6 Rlinux@ubuntu source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
3 u/ S3 e" ~% V5 |) Z' j1 i
& |# h9 ?- B4 s q2.添加网卡设备树配置。9 P( S6 ?5 F9 r2 h
修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件7 E8 R+ E7 `& }. g( P# {# I5 a
$ \& y, Q) o% O1 c
在文件末尾添加如下内容:5 L. F0 ?! [2 E* e2 [! }2 k
% x5 o7 e. j& _# j3 I1 o5 S
- ðernet0 {
4 H" q6 J% x- D C1 K p% Y - ' J0 D) Z p7 [7 D' k
- status = "okay";3 b- G6 u. m$ |5 u9 W
- ! `) l# ~; i6 }$ l- Z; w' b) @
- pinctrl-0 = <ðernet0_rgmii_pins_a>;
, E1 ~ z5 K% P. B" C) C3 M - ! h, `7 e. ], t3 s7 O7 x
- pinctrl-1 = <ðernet0_rgmii_pins_sleep_a>;- c8 y7 D0 _( W# u5 q
- 7 e. `/ q, E2 I# B( ]9 t
- pinctrl-names = "default", "sleep";
+ X+ p* H, A# k7 o$ \
. v, f% R8 m, T- t- phy-mode = "rgmii-id";
( Y: s/ V. S; l1 L" @' {9 _, G - . N! R! r @9 U
- max-speed = <1000>;7 @2 @2 I4 g0 u6 G* a4 @
- . V1 I3 Q& a ~( o6 I; C. M# A- y
- phy-handle = <&phy0>;( R/ ]8 q2 \) F0 L
- 2 W: a$ L$ C' h- C
- mdio0 {) ` G& I/ ~) u$ A0 W4 I- y
, E3 z. ^1 K+ ^4 `- #address-cells = <1>;, J: }; {2 v2 {5 I* |
5 u2 ?4 |2 O' O5 ]- #size-cells = <0>;# T) w2 h5 X; N
' g2 J4 s" u4 m: D- N- compatible = "snps,dwmac-mdio";% u- z" o3 m& _7 d
* H$ U) j8 t% f- ?; x' ]* J. N- phy0: ethernet-phy@0 {
5 l. s4 a4 Z) L0 c% h! p - ! I2 V( o5 M7 z0 N: i) u M8 u; {
- reg = <0>;2 ~ D8 o; J. s! N( c
- 0 y, O& c0 ]8 w
- };
7 l" Y2 o+ ^, B1 X6 t1 X - 6 o( o9 c7 k; b* L8 p o
- };
8 F9 n# ~: L- Q - % y8 U" M2 ^8 F( X1 r9 l
- };
复制代码
' e' V: U! D" Q: u, P3.配置内核
8 Q- C2 [& R/ v由于内核源码默认配置以及支持网卡,本节列出主要选项,如下:
! [5 y% d+ N. d- T+ G' ]1 \7 x1 G3 C) G% U4 W6 L
linux@ubuntu make menuconfig
- E( V, d; f! ?+ M# O6 A; N( j4 P1 Z0 O. C& [
Device Drivers --->9 |2 [# t2 i" w; N3 T. y
Network device support --->
- n( V! O" j8 M Ethernet driver support --->1 S: |7 v$ l" G1 v, o# F
/ P9 M7 p2 B: l5 {: ]
<*> STMicroelectronics Multi-Gigabit Ethernet driver
. F g9 j; Q* q, ]' S' b6 j! _6 X/ u$ u+ q# U
<*> STMMAC Platform bus support
4 H8 }1 n' [4 r* u5 y
; Y- R: G! ]3 O$ t2 W; f8 m<*> Support for snps,dwc-qos-ethernet.txt DT binding.5 u8 H5 A9 m, f
! `! ?; P$ B) o0 Z3 O<*> Generic driver for DWMAC* h# C- b6 }- o1 p+ @
6 E& f3 A( _0 f. ^
<*> STM32 DWMAC support8 y7 w" W( `/ l( _+ f E
: i+ W b& A4 l2 W9 e2 i3.编译内核及设备树:. \0 [0 W- I0 p4 {4 b _* o
linux@ubuntu make -j4 uImage dtbs LOADADDR=0xC2000040
! b$ g( ]" ^) o3 Y" v
+ j# V2 L% V7 g5 n4.重启测试; G9 n$ D/ i5 S1 v% N
将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,重启设备后可以看到如下启动信息:
) I! z7 s- i* e5 U* ?/ N# I0 l, a
) j/ L, o7 m4 U: U: ]
% z$ b. W) f# e! d/ h
( Q/ n& q7 s D B8 f, q
5 ~. l0 Q# K2 n4 t& S: L& _通过Ping 测试网卡7 E5 N y l* x& X% H" c+ V8 [
) a, m# x$ ?3 R' }$ k4 y/ E
3 |3 P( K" G% A! d) F* x7 i7 v5 [
& C* K+ J- h' T1 o {5 z如果设备不能接入以太网,可以ping主机
( K: P8 i- Z2 V! V# Z7 q7 Q————————————————
8 L. [( ?* _1 U, ^版权声明:华清远见IT开放实验室' r" Q6 G, C$ E4 E' ^
% i- o2 S) Z, g! J# n3 _# L& O5 |1 o8 t, ?* J
|