第 1 章 Linux内核配置及编译9 \; x8 k+ Q, f8 F n$ W% E
# e1 e2 ]- o3 o2 n
1.1 解压内核
8 n+ L0 t" U; P建立源码目录5 ?' s2 s v$ S
( z4 G1 C/ m. [( B
- linux@ubuntu:$ cd ~/FS-MP1A/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.4.31-r0( F1 x. F: I3 f9 u; g
复制代码
@7 V! i/ ~% A% j6 H3 G6 O
3 [- B- b' a' B$ N
: b3 h+ [7 g6 [* R
该目录下以patch结尾的文件为ST官方提供的补丁文件,linux-5.4.31.tar.xz为标准linux源码包。
8 M' ^' K3 x8 Z2 g& N解压标准内核源码- linux@ubuntu:$ tar -xvf linux-5.4.31.tar.xz
复制代码
; O( n6 p8 n9 a$ i- D; z& i
. \% w8 C* V V% ?: b1 t" k( [" K; @4 K$ {1 o9 Y& f
进入内核源码目录下
" U4 N) a! Z/ a8 ^; D& J) P& ]; r: k" ], |( U
- linux@ubuntu:$ cd linux-5.4.31
复制代码
& K' T+ G: O2 m' S+ R
3 |2 Z6 s1 X6 Q0 |3 L( ?
7 p2 _/ y' ]/ D4 Y& N% J( z1.2 添加STMicroelectronics官方补丁
0 h! }) L! z( L: L" W$ @3 j: w7 x" }7 V- u$ Z
解压linux内核源码后得到的是Linux社区的标准内核源码,接下来需要将ST官方提供的源码补丁添加到标准内核中。
8 ^$ B% K5 i( m5 ^
0 d$ p: A O5 _' k8 P# B- linux@ubuntu:$ for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
复制代码 0 R p: y' c0 V9 E# L- I* p
该命令会将上层目录下所有的patch补丁文件应用到当前的内核中。
) u2 j3 j2 N% F5 J0 E4 E
0 D0 X# W& N$ Z7 n ~0 ^2 N1.3 生成标准板配置文件
: ?1 I b* q5 C# A0 @8 w生成multi_v7_defconfig默认配置
* s1 C8 ^0 n0 e
. p3 e9 L. i+ s- linux@ubuntu:$ make ARCH=arm multi_v7_defconfig "fragment*.config"
复制代码 & N7 i l" ?! Y# Q- \1 S
在默认multi_v7_defconfig配置中加入ST官方提供的fragment config
0 y! l7 J/ k6 i' D: C, W( t
5 K% r1 N8 l# T. q) h' ~) `- linux@ubuntu:$ for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done9 m, n& u2 q( j2 z& N
- linux@ubuntu:$ yes '' | make ARCH=arm oldconfig
复制代码
$ S" g4 X7 i; b4 ]3 H生成自己的默认配置文件
5 Z4 ~0 N) @6 b4 N
) E+ k) `8 m, e0 P- S: {) n- linux@ubuntu:$ cp .config arch/arm/configs/stm32_fsmp1a_defconfig
复制代码
) u5 ]$ ^8 ?! W1 J取消git中的SHA10 \! G7 z: F7 @5 {" C8 B
* f- x7 D# w9 z0 z1 [6 E
- linux@ubuntu:$ echo "" > .scmversion
复制代码 + a! W+ Q0 {. ?/ W
1.4 配置内核
! Y% n4 {8 b9 W9 f导入交叉编译工具链(如果还未安装SDK可参考《SDK工具链安装》章节进行安装)# ?5 e" ?4 a7 a, h1 H- j: ?
7 M/ C3 e$ B- r! Z) @, K* t1 N
- linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
复制代码 * l p( Y# B5 Q2 c5 ]1 j
验证开发工具是否安装正确,显示版本信息如下图所示。
7 d8 m$ Z2 p" }; _3 v h4 U' D$ ~3 `: F, D
- linux@ubuntu:$ $CC --version
复制代码
) o% ^7 @9 a. M+ G B$ P
J* p0 X. p+ r1 K, R/ b" k! Q* f! M+ [
在编译前如果需要编译额外的功能或者驱动,可以使用meunconfig来对内核进行配置。
& Q5 }5 C, {; s; S
; K: q9 h1 F6 A/ S5 S* |- linux@ubuntu:$ make menuconfig
复制代码 / p; ]' Y& ?' E% E+ h, ?
) ^) N, H9 z8 z8 {% \8 b, Y
+ J' w8 o6 Y4 v可以在如上菜单中对内核进行详细的配置。
# d' k! @) q3 q( D4 Q1.5 编译内核( |. Q) c; Z& P' I" @1 w
6 z3 Y$ a4 R. p. Z) A) [' H" u2 r; }- linux@ubuntu:$ make -j4 ARCH=arm uImage vmlinux LOADADDR=0xC2000040
复制代码
4 C' Y- O V4 q3 e
8 t+ e! u2 W3 o. K7 L
3 X8 f0 H2 h8 e6 m5 I& n
编译后在内核源码目录下,能够在生成一个vmlinux文件,该文件是没有经过压缩的内核镜像,这个镜像导出了所有的内核符号可以用作仿真调试。% {. L3 P, N8 E. ?' e
, G M, t% [& X7 w7 |) G% @7 a6 O( O W% l0 v8 ?. l2 q' T9 o
此外在arch/arm/boot目录下还生成了一个uImage文件,这就是经过压缩的内核镜像。可以用作系统启动。1 z% j; _1 F ?
; Q& k9 ~! M1 C) ]6 E
7 g8 _: i) V9 a+ _: ^, d' d
% \3 e8 w5 M. `3 D1 X3 C1.6 编译内核模块( U6 F; Z( V$ }, p. y& u
! i4 `2 e0 [8 K/ D. k, n# M2 t- z$ s9 }
- linux@ubuntu:$ make ARCH=arm modules
复制代码 % ~, \$ M) I4 B0 S+ v7 n" h" \, }3 ~
该操作会将内核中配置为模块的源码进行编译,最终得到ko文件。4 f/ }$ x! H+ x0 S& A; N
8 p- u$ i* p& c: K4 K- C6 c' O
2 Y( B; B4 P+ o" ~# i0 n" H7 G
2 ~ z6 Z' G. g( k4 H- |/ M$ [; p9 `
1.7 生成设备树) X' L. f1 K- @0 E
* s9 N0 y9 j% ^$ {5 Z5 z3 L
以参考板DK1设备树文件stm32mp15xx-dkx.dtsi和stm32mp157a-dk1.dts为参考,增加stm32mp15xx-fsmp1x.dtsi和stm32mp157a-fsmp1a.dts:; G) ~8 o( C3 x6 S0 z
# e3 o' F1 r9 L% z- u8 `对stm32mp15xx-fsmp1x.dtsi内容进行整理,去掉没有被使用的节点信息和明显与FS-MP1A的硬件没有关系的节点信息。下文内容是删掉了所有暂不使用的节点信息,整理出一个相对简单的设备树文件,确保内核可以正常启动。后续各个外设移植时会陆续增加文件的相关内容。( ~0 d4 C/ f" _+ m3 z
# N3 Q3 ]/ |% g4 X+ } [. c在arch/arm/boot/dts/ 目录下新建" E' U, g9 o) Z& q9 R7 @
stm32mp15xx-fsmp1x.dtsi:
% X3 t5 X7 U# Z( I$ s- c2 p( {0 u
- #include "stm32mp157-m4-srm.dtsi"
$ v9 o+ j: @3 y: }* | - #include "stm32mp157-m4-srm-pinctrl.dtsi"- V+ o$ l% n$ a( X& ~! m
- #include <dt-bindings/mfd/st,stpmic1.h>2 j5 ~4 ]8 |) I _6 t
1 Z, D: K5 r0 A2 f1 o- / {
) G3 Z$ q* M V( W* F, ~ - memory@c0000000 {* E6 ~+ E$ H* E" }
- device_type = "memory";/ v4 f2 c$ K9 A2 u/ A
- reg = <0xc0000000 0x20000000>;
$ H/ x$ t& ?7 _8 n9 A" Q - };
* P; n/ A$ X: u9 Z% `. r" |
{. N M: b0 @. U- reserved-memory {
4 r9 s/ T. N- e1 G7 }# V% x( b7 I - #address-cells = <1>;
, u1 h& {6 H( |* s - #size-cells = <1>;. t2 W$ j1 m, B4 q4 d$ v
- ranges;
% F3 X0 h1 h9 I0 [. H
! G* W/ Q) E5 D& [( K& r- mcuram2: mcuram2@10000000 {9 D8 {$ x2 r; g
- compatible = "shared-dma-pool";
& [9 j6 [. Y9 H( q - reg = <0x10000000 0x40000>;
7 g/ H3 ]) F! ]4 D - no-map;. t* C! j: C0 M! r
- };& B- u. P- ], d; B) I9 B
. d4 [) ^! j- p! G- vdev0vring0: vdev0vring0@10040000 {- H3 u2 L' M" r& g& I, l
- compatible = "shared-dma-pool";
$ C: O8 b, t+ H7 m; F7 v - reg = <0x10040000 0x1000>;
' W3 u/ V0 D2 ]1 u7 a - no-map;9 r. O* r& Z6 q4 Z2 I
- };( W$ H8 M5 Y% [. _; ~6 y! B1 U
5 r! j; ?; l( j H- vdev0vring1: vdev0vring1@10041000 {
( O' I+ w. U2 P/ e/ l - compatible = "shared-dma-pool";
* f8 {: i: N# }* [. _. @- A3 A - reg = <0x10041000 0x1000>;/ G; q" ^# l) ? f: ~
- no-map;
; d* T. y% M: ]6 r - };
4 A1 t" q6 q# V% f9 B
6 R" ` D# A) a% L9 d$ `- vdev0buffer: vdev0buffer@10042000 {5 f7 _9 K' F2 U+ O
- compatible = "shared-dma-pool";
- x, r+ [9 N* d# k - reg = <0x10042000 0x4000>;
7 X- R2 v1 O$ O - no-map;6 p3 c( Y8 U3 ]" D6 e6 ^' h
- };
' W# Y4 n: ^. {3 \
7 M5 D' v9 v* o$ P9 T: o- mcuram: mcuram@30000000 {
/ L' _$ K& L. [$ {3 a. ^ - compatible = "shared-dma-pool";
( |# b0 J6 {9 Z" }: o - reg = <0x30000000 0x40000>;8 F7 N* `; s# R
- no-map;
9 u; a" s1 t# r - };" b# O' |: r8 J5 I" @4 M; l3 v/ T
3 N& s* j1 F- p7 M- retram: retram@38000000 {( W, E3 }, I% h" y2 Y/ m
- compatible = "shared-dma-pool";/ i ^0 O; U0 l3 q1 f1 [4 f
- reg = <0x38000000 0x10000>;4 V2 E2 Q: E: v- Y8 e
- no-map;+ [) v- K2 c3 j& g+ v# M
- };+ c1 c! U8 g. B; y, w
- };
. D% E9 k. I$ N* X; m2 r f - ! U' R/ n: E* g v% p
- vin: vin {
- k* p! b1 g% c9 q/ O - compatible = "regulator-fixed";
$ l+ @6 v3 _& M; v1 ?8 c - regulator-name = "vin";
7 e- p) p4 U T* F, S" k - regulator-min-microvolt = <5000000>;
# }# f7 x7 x+ D* q8 W - regulator-max-microvolt = <5000000>;7 q4 o3 H8 i, F0 `( N$ F& \
- regulator-always-on;' S; w# x! a7 b: D$ q- z9 R
- };
! {% t+ r' c+ ?1 P4 { c) Z - * b$ N$ l; P! y
- v3v3: regulator-3p3v {
. A/ t4 ?# Z* b6 s f - compatible = "regulator-fixed";
3 g) N# `- l: \" t' m& _) _2 ? - regulator-name = "v3v3";
9 z6 m# F* N: n# ^& Y - regulator-min-microvolt = <3300000>;8 S2 A% N. v6 C( ~: i
- regulator-max-microvolt = <3300000>;
6 n& J7 P# C9 `7 T - regulator-always-on;0 J& e# q6 o! t% R: n
- regulator-boot-on;% u+ F2 O( E: ]* _- D
- };1 v. ~8 o Y( A) T. @1 t# E
n8 J4 @5 i: ]' K8 i1 m- vdd: regulator-vdd {
% L) x) n# E" d - compatible = "regulator-fixed";
5 `. H, h, X! t0 P; f H K# ? - regulator-name = "vdd";, D0 S7 r" L! b0 Y) T3 D! a+ }
- regulator-min-microvolt = <3300000>;1 Q3 Q4 {- Y" y0 R/ e/ B
- regulator-max-microvolt = <3300000>;% H0 w& G3 Q) q b$ \# J9 A
- regulator-always-on;# l8 B" l4 }( |% o4 B6 m. b3 H2 j
- regulator-boot-on;
/ k6 t9 R ~! G8 Q" V6 v - };* D/ z& U; C# q- k. b% a- C
- ) V( z3 C* c k' q, B2 A
- };
- k! L3 i- |6 L. t! s0 s
& F) b( ]( Y" _; [$ \$ K, r- /*HDMI CEC控制器*/
2 `" M( i# e/ M - &cec {) I2 d5 f4 s; H( Z1 W/ ~6 p% N
- pinctrl-names = "default", "sleep";' S( C" W: Q7 I9 w, _# t& n
- pinctrl-0 = <&cec_pins_b>;
4 t& g; r) h( o ~ - pinctrl-1 = <&cec_pins_sleep_b>;, D/ o0 a2 M0 h! a0 t
- status = "okay";, I7 q4 e2 Q: ^9 I$ \; u
- };
1 |4 R% q2 u1 l! }% [! v0 X
/ C% }! }2 V4 E& b- /*循环冗余校验计算单元*/" ~" e/ |( ]2 B9 ~. X) a$ }
- &crc1 {
& ^# j5 d1 U) ]6 R( L: |. u% G - status = "okay";. I# Z: c8 Z- U4 E8 G
- };$ x: ?4 n& t& B( H6 E, N; {
- ' H0 M, s1 R- w+ O
- &dma1 {$ h5 L1 M, B1 o! V6 ]
- sram = <&dma_pool>;9 l4 c# R8 ?- J- X8 P
- };" Z, C$ t2 c4 v; l
- 2 ~0 Y5 n' s* G; F
- &dma2 {; C* n7 u" [" _5 x8 I8 j
- sram = <&dma_pool>;
1 @4 \' f& p! @. {0 u( z1 S - };
: j. O0 b% ] U+ L! a8 B7 F& _; g - /*数字钟温度传感器*/
- M& s4 L7 [5 u5 G - &dts {
8 o' y* l. |9 V8 d" h! | - status = "okay";+ I2 E% ?" X* H5 ~1 i3 z! e. V* k7 _% V
- };
7 d' F7 o; c( s0 s. W! b5 o8 v - /*图像处理单元*/
" u7 D& n3 X: O6 l - &gpu {
& r& r6 ?+ X' T' {* |: i - contiguous-area = <&gpu_reserved>;
) A# ~! `+ k9 v; \ - status = "okay";
9 L' w* r2 ?- p- f$ T6 r, }, j3 {+ N - };
Z+ a1 L9 A( ^ - /*哈希处理器*/3 |" `; h* `% |2 k' I+ _
- &hash1 {" k( a! B! U% U
- status = "okay";
7 V8 H! ]0 Q# Z* T1 o" E7 r - };, Z0 s6 U5 f" T* Q" `
- , Q' \4 y1 `6 e. v0 j
- /*处理器间通信控制器*/
9 W' D: ]' x" w5 ` - &ipcc {
( ^& c# Z' a0 d, ^; ] - status = "okay";
2 ~9 G4 S3 Y) Z1 x - };
- U Y% ]" q" k1 Y: R" t
! q3 f' b' E- W& Z8 g4 w' e- /*看门狗*/
4 L# e! v U9 z/ Y7 W) P8 | - &iwdg2 {$ P$ \2 o# U r5 k0 A5 v, ]
- timeout-sec = <32>;# B9 x' n$ C/ G% C& ~5 M" b
- status = "okay";
8 d3 J9 J- o' C: z4 B - };
5 V8 i# ^! |# p
' Y* I( \# K B, T9 V( P- S" u5 H- }- /*随机数发生器*/) N0 M* K+ } F# ?' J4 n0 v, Y
- &rng1 {9 X7 T( i8 S/ J
- status = "okay";# D: j+ n3 k) z% _9 @5 i! y
- };
7 w/ p9 Q) u; R7 G - 4 f" I2 Y* C0 X3 h
- /*实时时钟*/0 f7 G. S2 e) V. ]# J
- &rtc {
3 [: Z4 d* M. ^. b - status = "okay";
3 \) {/ w$ f- G5 [$ D- { - };7 q! g/ o1 @- {% e
- ) q6 X: m" O$ h
- /*sdmmc1 TF卡*/
2 V0 g' y4 O' D$ y1 ~ - &sdmmc1 {
: H; [& Y' W) z. z- y: } - pinctrl-names = "default", "opendrain", "sleep";# g" k" b) P8 f6 f
- pinctrl-0 = <&sdmmc1_b4_pins_a>;
6 K& g$ }/ m# w' S6 A+ g - pinctrl-1 = <&sdmmc1_b4_od_pins_a>;
! T9 \1 O+ y; o# R* A l4 T - pinctrl-2 = <&sdmmc1_b4_sleep_pins_a>;
; f k, M; w' @/ `' g/ j' I* ` - cd-gpios = <&gpioh 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;. K1 T; V+ j( @( O) e
- disable-wp;
7 q' ?5 _9 {# j" J& E - st,neg-edge;+ g3 u% e, _( D$ N1 L
- bus-width = <4>; c# p+ n; I/ R7 p, B( x" J
- vmmc-supply = <&v3v3>;
$ q3 H' _) U' V. Y - status = "okay";
0 m/ g; S( O# m+ B( C0 E9 Q+ Z - };0 V9 D$ b9 D5 j1 |* a+ M: p4 ~( Y3 Z
& S# i" g2 G# Y8 D+ k: U" Y- &sram {
H! [' \/ C/ m: F8 o( i* D - dma_pool: dma_pool@0 {( w. F- Z, }! r; c# M
- reg = <0x50000 0x10000>;
' z0 C: D& \! k! K- ] - pool;$ L* x& O6 j) p
- };
+ ~3 ^" h" q1 G' S# j' g& ?( r - };
# y! q) M" M& v ?
5 ]9 x; X" [3 \3 x' s- /*命令行终端*/- D" W- T0 G6 t; s0 {7 ^
- &uart4 {* |) b* a$ `) o$ ?
- pinctrl-names = "default", "sleep", "idle";) ~; k4 L# B0 f4 f
- pinctrl-0 = <&uart4_pins_a>;
9 c# y3 B* ]$ c - pinctrl-1 = <&uart4_sleep_pins_a>;
' E; ?$ l3 G9 B - pinctrl-2 = <&uart4_idle_pins_a>;) V8 A, l6 i- k$ N( D* A
- pinctrl-3 = <&uart4_pins_a>;( l7 Y( o4 m; ~
- /delete-property/dmas;
9 G$ X% {: I' m0 d2 ^6 l - /delete-property/dma-names;
3 S& Y. z; O+ n) N9 q6 @4 I - status = "okay";7 R1 m ?$ c: E s" X: \
- };
: }- F9 \$ t& m) r7 K* I( R - ' Y- C7 B9 }( l1 ^
- /*电源基准缓冲器*/2 B( V- U9 V9 _# W- A+ b2 W/ t
- &vrefbuf {
/ \( N: W# S+ s: X7 [7 G! P6 m - regulator-min-microvolt = <2500000>;$ }$ `3 @# E! P) d, S$ L3 ~, a; L
- regulator-max-microvolt = <2500000>;, o& h4 Z* M5 B8 [3 ~7 [/ T
- vdda-supply = <&vdd>;6 C4 L/ J5 @% F; s6 M
- status = "okay";& q0 E& }! j9 w+ m8 J; M' J
- };
! J) f d1 ]3 c. K; z5 {, |
复制代码 9 i3 y7 F. L8 _* ^! z
在arch/arm/boot/dts/ 目录下新建2 u' t# w) o+ T8 ?( p4 j" ?
stm32mp157a-fsmp1a.dts:8 p- g' ]' w% d9 R0 P
' E @! y: L' y; l1 _) J# g; c! k& g- /dts-v1/;- X3 o1 W, x& b" ^6 }' N
- #include "stm32mp157.dtsi". e+ V& {& X+ u9 o
- #include "stm32mp15xa.dtsi"( s3 A# o! b7 v9 l2 U
- #include "stm32mp15-pinctrl.dtsi"( _/ l8 `, O/ m% M& ]4 x. b
- #include "stm32mp15xxac-pinctrl.dtsi", R8 ?# M( u# x9 {7 \5 A% w/ B
- #include "stm32mp15xx-fsmp1x.dtsi"
" V: z" R6 {9 E5 x( _ - / {
) l' `/ l: n! R2 R - model = "HQYJ STM32MP157 FSMP1A Discovery Board";$ p; L2 Y; I/ y% J# {% J
- compatible = "st,stm32mp157a-dk1", "st,stm32mp157";
! B8 _. ` M. Q2 W9 V3 q, H2 G - ) v$ m; n, _ [. z
- aliases {. u* {/ A* @) z1 j/ u# l7 g5 E1 w
- serial0 = &uart4;6 l g/ [0 L( Z8 H( ~
- };0 p" k. T* Z# Q/ e. E
6 z6 J: y$ n2 E# z, Y, |/ v; }- chosen {* F% A4 n, }7 S9 R: o/ L+ v4 I
- stdout-path = "serial0:115200n8";& f/ b9 H5 z/ H$ Q
- };; L% Z* x. w' B, D
! ]: B2 g% a M: U- O- reserved-memory {( L* \" Q8 y& P% u M
- gpu_reserved: gpu@da000000 {
1 S! L3 w2 H1 @6 G0 {* n - reg = <0xda000000 0x4000000>;) s4 X* y3 w. O8 i- ]* J: b- z
- no-map;
; \$ f4 |* M" d5 Y& r& ? - };4 ~. \$ i, T/ t3 ?0 w
9 B8 C0 q2 {+ Q! o0 _8 D1 l! q- optee_memory: optee@0xde000000 {% u& V# D0 q, |8 T2 r- X
- reg = <0xde000000 0x02000000>;- p) i% [: k% S% k7 U
- no-map;" _- z2 H, ] d: P5 u. P- l
- };
- z3 l: p5 ]' `& Z- [+ s - };
8 t7 ]) X# ]9 H; t, C - };$ O8 t% ?3 r# n5 O5 \# @
8 {# P4 }- S3 J$ T9 B6 }: } J$ r2 e) J- &optee {
4 x+ f! \+ N8 `! Q" s$ T - status = "okay";% B1 i+ e' x, D, [5 Y
- };
复制代码 添加了新文件需修改Makefile才能编译,修改arch/arm/boot/dts/Makefile,添加stm32mp157a-fsmp1a.dts的编译选项(红色字体部分为添加内容. A+ n1 c( ?8 [
, G8 M$ g8 S7 p6 o/ V5 B- dtb-$(CONFIG_ARCH_STM32) += \
7 y% `7 K: P- b9 C Y) R6 `/ T - stm32f429-disco.dtb \
0 [9 `* {0 W( @ - …….
. n) r4 L" ]5 B% S - stm32h743i-disco.dtb \
5 D( s! A) Z; F# {. i% }) ] - stm32mp157a-avenger96.dtb \
* r! Q6 \) o4 L" [0 e7 V - stm32mp157a-dk1.dtb \
- a, s, E: ]( g% [ - stm32mp157a-fsmp1a.dtb \
3 r, t# S) A, R - stm32mp157d-dk1.dtb \
复制代码
3 I% p: Y; e- {' d重新编译设备树文件4 m2 y* x) D" r/ f3 \. F2 C
9 Z5 R5 t! U5 O% M) q; A3 Y
- linux@ubuntu:$ make ARCH=arm dtbs
复制代码 . K0 q S/ x; \8 W7 k
编译完成后会在arch/arm/boot/dts/目录下生成stm32mp157a-fsmp1a.dtb文件$ @& X; y6 B: c
/ Y X% k$ Y2 A+ p
8 x' @+ h$ a: z
3 Q0 M8 r+ Q6 u7 F% B将编译好的设备树文件与内核的uImage文件,复制到ubuntu主机的/tftpboot文件夹下,当使用tftp方式下载内核与设备树文件时会用到。/ S- v1 n, j1 f# v, t
5 h, y: O, u# }5 r$ C0 w3 x$ H- linux@ubuntu:$ cp arch/arm/boot/uImage /tftpboot// Z4 C& F7 M8 G; h; b" `
- linux@ubuntu:$ cp arch/arm/boot/dts/stm32mp157a-fsmp1a.dtb /tftpboot/
复制代码 1 f3 h9 I R; j5 V9 B: ?' q/ L
1.8 配置tftp
; w+ G8 i! O* |' I0 k' G, u' G在linux系统移植中,我们使用tftp下载的方式来验证结果。使用tftp下载需要构建pxelinux相关的目录。此部分可参考《通过tftp方式下载linux内核及设备树》章节进行搭建。
* t6 J$ B& r8 E: A2 W* e, e
4 `0 `& o" E$ V# j- L" {如果环境搭建已经搭建完成,需要将ubuntu主机中的/tftpboot/pxelinux.cfg/01-00-80-e1-42-60-17文件内容,暂时替换为如下内容,在后续的移植过程中会根据不同的需求进行修改。
% d! Q& L' S5 {2 G, }0 }5 l* e9 g; F0 v3 y9 i! H T& P$ H6 j
- /tftpboot/pxelinux.cfg/01-00-80-e1-42-60-17
( n! {0 W# e! D. X: e4 I K: ]* B
7 \' H6 P F9 J) o( Y% J7 X$ a- # Generic Distro Configuration file generated by OpenEmbedded
6 y" u/ Z( d, T" ? - menu title Select the boot mode3 v% K& l& ?& m' g, i$ p
- TIMEOUT 20
5 P. k" g' a! q9 W, `% R$ _9 B - DEFAULT stm32mp157a-fsmp1a-emmc
1 u0 d% W$ p q* `8 q - LABEL stm32mp157a-fsmp1a-emmc
& G; S2 z) W& q1 X+ I6 h* X - KERNEL /uImage& j7 h, Z2 u. X# o0 `' T
- FDT /stm32mp157a-fsmp1a.dtb
- r( Z- ]9 @, \1 R0 M8 h - APPEND root=/dev/mmcblk1p4 rootwait rw console=ttySTM0,115200
复制代码
8 }7 D1 b% h( W# }. i, ~修改01-00-80-e1-42-60-17文件后,继续按照《通过tftp方式下载linux内核及设备树》章节中的描述进行启动。
7 k/ k7 Q8 Q8 f( p: n, _5 G7 t
由于目前还未对源码进行任何修改,在内核启动过程中会停留在如下地方。
^& x ~/ Q# o. |& I- S; I, h9 q; h' F
& ?, T K4 ]- W4 H
# n; v w7 Z8 K* L9 |$ L: S ^9 |
后续会通过对系统源码的修改,逐渐完成整个系统的启动和对外围设备的驱动。4 r2 ]- T8 I7 O; g" j
————————————————
. |* z+ T5 C* A3 ~" x7 l K. {版权声明:左月先生8 G- p6 o6 _+ j) o, J
4 @; y' Y3 p T# j: [
. _2 X) `8 O- ?$ N1 ^/ }8 o
|