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