Linux内核配置及编译
" \, E- G7 A n4 x% `3 e解压内核8 K P' T9 V, a, ~# ]
建立源码目录
- g# a6 G' C9 c+ O
* \2 H1 B+ P1 Ulinux@ubuntu:$ cd ~/FS-MP1A/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.4.31-r0
8 @+ D) p" Z' U' q* k; V* v. w& ^0 n6 D" {. j& |
0 L' @. ? }- E$ G/ _7 ~4 g( G) r m
# A4 f- B1 m& T$ U
该目录下以patch结尾的文件为ST官方提供的补丁文件,linux-5.4.31.tar.xz为标准linux源码包。7 C: [8 F" D; Z$ e- ?) `5 k3 ?
2 _7 A6 x r/ y4 w: \
解压标准内核源码包
1 v3 B2 C9 k: n
. W: h: a$ z. U' Plinux@ubuntu:$ tar -xvf linux-5.4.31.tar.xz
) \' e* u" e! W5 P& }2 [' ^( p/ U3 R5 X# R, j3 ^ H# n9 J& ?# ^
" u+ s: F/ Z# b1 m) F
3 R1 H9 a0 N6 m; s2 s; U6 G
进入内核源码目录下
/ B P/ p" g9 [5 v" Y u+ y
: }& {9 s z% o$ p" i# Y5 ]linux@ubuntu:$ cd linux-5.4.31% W/ [* ~2 t9 ]
$ O5 `5 e$ N6 t8 P
! ?; s. L; Y" g2 Z z B
) J6 a4 b1 [4 e0 N9 \0 |添加STMicroelectronics官方补丁
" t# w4 Z# d" @ A解压linux内核源码后得到的是Linux社区的标准内核源码,接下来需要将ST官方提供的源码补丁添加到标准内核中。; S5 X0 B$ p* V m7 i' {8 X) r
2 d5 l$ ]4 ?: c7 {- n7 p
linux@ubuntu:$ for p in `ls -1 ../*.patch`; do patch -p1 < $p; done) l# L4 \4 ]8 y H3 |% I
* k8 H6 l" I$ g% V该命令会将上层目录下所有的patch补丁文件应用到当前的内核中。7 p' o# R4 t1 r$ Q$ {
" d2 g* L; G$ t
生成标准板配置文件
1 L3 U' t! C. i2 Z8 B/ @生成multi_v7_defconfig默认配置
- }1 M+ {0 o- ]' d. P) q7 }
& E/ @ s& x3 P4 \! Z8 O" llinux@ubuntu:$ make ARCH=arm multi_v7_defconfig "fragment*.config"
5 z" g' H, c4 n- T5 H2 `5 C& O4 h2 O/ O% h+ M* {
在默认multi_v7_defconfig配置中加入ST官方提供的fragment config4 Q3 l! R F6 k+ j$ j! a6 d
& |' l$ G! D, _& ?
linux@ubuntu:$ for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done9 j+ k2 q2 B, ]6 u% s" N4 ~' J
% d1 w3 H0 J* }( ^) hlinux@ubuntu:$ yes '' | make ARCH=arm oldconfig9 k4 f) S' l, e3 Q+ x
, h2 F" w& d# V* `" |生成自己的默认配置文件8 `6 d* g; V1 Y0 e/ l
; V% c8 Z* M2 X! {0 @
linux@ubuntu:$ cp .config arch/arm/configs/stm32_fsmp1a_defconfig7 m/ K( u5 H0 H7 Z" j
( D+ Z8 J. Q) _! O) ^2 Z! [ L取消git中的SHA1
% W! c6 U0 @8 ~$ B- U1 L0 f# p( ?3 |2 N, R' u: e
linux@ubuntu:$ echo "" > .scmversion
6 f! ~5 L7 P4 H! s5 H2 m
% V/ y/ C$ s- ^! @# H' x/ j" K配置内核* }8 @3 H4 i: o
导入交叉编译工具链(如果还未安装SDK可参考《SDK工具链安装》章节进行安装)
- t3 p) R& y, M6 S( d$ f7 S6 _% q3 N! k& h2 g- p3 \
linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi% t! u5 i3 k' z3 X5 s
: ?" `$ s. n1 h# @
验证开发工具是否安装正确,显示版本信息如下图所示。" ?5 x7 R" z5 c1 K z, D
5 K9 I. V" ?! a P& I2 O
linux@ubuntu:$ $CC --version' ?0 | U4 ]& j$ p, l4 ^' ^4 y
) q2 W" x% t8 U
5 C) t- s* o) s# i4 H3 V3 V0 S3 k9 V0 v, p7 a( Z
在编译前如果需要编译额外的功能或者驱动,可以使用meunconfig来对内核进行配置。7 X" y: {7 N0 i. o
1 D& d: w# h" X% n/ t
linux@ubuntu:$ make menuconfig8 k4 a+ W! B( Z
" N) p/ D! a% q& i+ ]$ T
" f) C8 K- @( K) O. n6 c
% P7 T& @* |) d3 `% Q, n
可以在如上菜单中对内核进行详细的配置。! M4 f0 g* M, k8 t
2 s3 C" G7 i: a5 }, L' Y3 c
编译内核
6 L0 ~& y6 m3 X2 c# X- ^, y& elinux@ubuntu:$ make -j4 ARCH=arm uImage vmlinux LOADADDR=0xC2000040
5 a% V$ e5 D7 z# k0 }" E$ g. U. K4 C( _# t+ ?' x0 I
6 [3 I+ s# @4 h1 N7 H8 ]5 b- G7 u+ n
编译后在内核源码目录下,能够在生成一个vmlinux文件,该文件是没有经过压缩的内核镜像,这个镜像导出了所有的内核符号可以用作仿真调试。
6 E6 A# p+ E% O% a# C+ |0 f0 Q9 q" @
( G7 v% a1 F2 @3 b, U* v8 c
8 {, W# C& i" O. u9 I0 l( k% V
此外在arch/arm/boot目录下还生成了一个uImage文件,这就是经过压缩的内核镜像。可以用作系统启动。7 ^( M- g% q h) O. ^/ y2 @8 L
8 N2 J4 g3 T! u/ n1 |/ O8 `9 A9 T/ i
' i! b4 U; z/ ^ z1 l+ |' Z5 M
7 ?' }3 q' U3 U: d0 Y! W
编译内核模块
# M& w- T$ q) D- Y, Z; `: Ilinux@ubuntu:$ make ARCH=arm modules1 _: @& B' d. L$ B% x1 M
: p8 L0 F# c/ Q* \7 ~
该操作会将内核中配置为模块的源码进行编译,最终得到ko文件。
0 R. ]- B+ e% T% A; d7 W& W# J( W" R( G, D) _: n
) A7 W1 d w7 ^" Z: I
& P7 i* c7 M, m+ M# Q( y生成设备树
- s8 @3 C2 S7 f6 M v- b以参考板DK1设备树文件stm32mp15xx-dkx.dtsi和stm32mp157a-dk1.dts为参考,增加stm32mp15xx-fsmp1x.dtsi和stm32mp157a-fsmp1a.dts:
& Y& w1 ?' ?7 |7 U
3 P/ h$ B6 s! T# Q% n' _ J对stm32mp15xx-fsmp1x.dtsi内容进行整理,去掉没有被使用的节点信息和明显与FS-MP1A的硬件没有关系的节点信息。下文内容是删掉了所有暂不使用的节点信息,整理出一个相对简单的设备树文件,确保内核可以正常启动。后续各个外设移植时会陆续增加文件的相关内容。7 Y* i% K) k/ y) ^
3 P6 ?3 ^( P7 J% j, u6 S在arch/arm/boot/dts/ 目录下新建8 W n3 s6 F& N3 n
7 h, O# h1 s w2 X. ?
stm32mp15xx-fsmp1x.dtsi:- #include "stm32mp157-m4-srm.dtsi"
; c, [) _$ m( H; I - #include "stm32mp157-m4-srm-pinctrl.dtsi"
' E3 S. {' J. ~/ }7 g( T$ O - #include <dt-bindings/mfd/st,stpmic1.h>+ J# I8 z( _ Y9 j/ v
- / {& p$ T4 I: M# g
- memory@c0000000 {: O0 g: } S4 i; X
- device_type = "memory";
8 c: t7 t- W c B! O - reg = <0xc0000000 0x20000000>;
0 x+ ^, J- m" S; B6 W - };
) g1 @: A& E! D+ ^* o2 e' y' G! [ - reserved-memory {* ]% l+ s2 j/ N1 {; u. [
- #address-cells = <1>;2 k& Y; z+ M6 k4 v0 [ r
- #size-cells = <1>;
2 Y+ R$ D) u2 U- A0 M - ranges;
9 _7 M5 C( {/ F: q2 V+ r - mcuram2: mcuram2@10000000 {, k* U4 [5 n' W+ h' \9 w
- compatible = "shared-dma-pool";
4 s+ ?4 W. k. J9 [6 ? - reg = <0x10000000 0x40000>;& f- `0 q# t% ~* p
- no-map;
' }; {6 O; A( x - };- S% D' P' X& y6 k* l/ u: ^, R! X
- vdev0vring0: vdev0vring0@10040000 {
9 O- X' ^, E( l+ {' {# v) y - compatible = "shared-dma-pool";
$ P* q7 P0 i1 @) o2 ?* z" H. F - reg = <0x10040000 0x1000>;
1 k* f9 ^) P' h* |) v - no-map;
; \, I9 y8 |, u: l - };
- |( V4 Q% x) t9 s - vdev0vring1: vdev0vring1@10041000 {
( n$ J* Z. G: Z4 o - compatible = "shared-dma-pool";
" D1 i9 b" M1 w - reg = <0x10041000 0x1000>;$ R/ M* k) W6 y T$ [; }
- no-map;- V3 }# K Q1 {; O4 I/ @. p
- };
4 y) R) n; A4 F' I! i - vdev0buffer: vdev0buffer@10042000 {; a; ^* {7 E" g3 [- B
- compatible = "shared-dma-pool";! I( w9 d0 P, y- C3 s r6 v
- reg = <0x10042000 0x4000>;
& k- A3 l( G( K! V - no-map;( [# w. W1 ^3 O3 C' M* P
- };6 k# Q. q" K9 R9 E3 U
- mcuram: mcuram@30000000 {9 H# M! \ A5 [+ q( q
- compatible = "shared-dma-pool";
! V9 h8 y" K+ n- [3 Q/ q - reg = <0x30000000 0x40000>;
0 @: B* ~/ W3 s. Q4 T9 u* ~ - no-map;% [: h/ I. |6 x' ^0 F2 ^% t( a. h
- };' n+ Y: J# G2 _2 r6 {9 B
- retram: retram@38000000 {
" q9 z; C1 B2 U: G. h: A - compatible = "shared-dma-pool";
( w, N% C9 S; S0 P# c+ ^ - reg = <0x38000000 0x10000>;
% c% @9 Y5 g8 f8 p) |5 h: S' j - no-map;; {7 ?6 ]6 M% k' t9 H* e, I1 s
- };
' c/ ]4 |$ Z& ~- _5 \. ~ - };
4 \' |0 E9 }) `0 t* L7 d8 C1 } - vin: vin {
& n. z! \+ N) D# i7 ?2 c4 q+ R - compatible = "regulator-fixed";' F/ F: {2 ~3 L/ v2 q
- regulator-name = "vin";
5 z0 n/ l+ ]( I- a: t% X; a G - regulator-min-microvolt = <5000000>;4 G: ?% H# o1 c! e, Z I, Z
- regulator-max-microvolt = <5000000>;
1 q( L3 E6 [4 w6 p( Y% j* L u - regulator-always-on;
* h# o) g5 @( s. j - };
- r& z: p+ S( R* P8 a2 R1 ^ - v3v3: regulator-3p3v {& ~4 P$ n9 l" b' I/ L
- compatible = "regulator-fixed";( ^$ D( y( k j, j8 Q
- regulator-name = "v3v3";3 S) Q5 q+ K/ x2 C, n
- regulator-min-microvolt = <3300000>;( y+ ]% G; C3 G
- regulator-max-microvolt = <3300000>;# k" o1 {( f) r
- regulator-always-on;
! O {9 w' W9 \6 J/ `& k" J: _4 ^ - regulator-boot-on;
8 f, l5 U u2 Q7 s; B# i7 P - };1 ?% H0 `; }: t4 `+ w' K9 c# Y
- vdd: regulator-vdd {6 y) g( U, _& N! p% C* u: F
- compatible = "regulator-fixed";
. w: i2 n7 l2 Q& V# ? - regulator-name = "vdd";* ~) |+ m' d, \+ l
- regulator-min-microvolt = <3300000>;
& O! x0 G4 S& D - regulator-max-microvolt = <3300000>;
/ p3 V( a2 b1 r& ]+ h: k- D - regulator-always-on;
; J2 }: n( n2 I- h$ d - regulator-boot-on;+ d( u8 t ^( H" M6 a) L
- };
+ Q8 {& K' N$ {4 W3 R) x - };7 g c* }# z, q, N% Q
- /*HDMI CEC控制器*/2 g' m7 a9 O5 D I1 H4 T
- &cec {" ^5 @2 B5 c5 H6 T1 k" z
- pinctrl-names = "default", "sleep";5 d- N. W6 r# N Y! g
- pinctrl-0 = <&cec_pins_b>;
4 R- M; Y2 {! P - pinctrl-1 = <&cec_pins_sleep_b>;( z. } q1 E9 u0 j( \" v
- status = "okay";
$ y: P& g# ^& I9 ` - };7 \; ^5 M- q( F, z! [
- /*循环冗余校验计算单元*/
" ]. v! L* w6 Q/ W - &crc1 {/ E3 B4 g$ g. `) n1 X+ |4 V
- status = "okay";
0 z, _% A: |# s8 E+ ]4 Q8 s! S - };7 W; |- ~9 p, _" J4 W- }4 r
- &dma1 {& E2 o6 |6 W7 U. B+ l+ X
- sram = <&dma_pool>;
2 m5 d5 h/ D5 `# q - };
( J; I" X- z1 o( X - &dma2 {
$ \7 ?$ K2 Y2 o" A, Q1 v - sram = <&dma_pool>;1 {& Q; |( H* q) }3 E/ H6 B4 k
- };
: x8 l ?$ s: M2 F7 u - /*数字钟温度传感器*/2 z' m9 k9 h- ]0 w( v
- &dts {( R9 e# _0 C M
- status = "okay";
; D/ k" F4 N+ l* u - }; L8 V& ?+ L# q# D9 S0 g, m6 A
- /*图像处理单元*/
( ]" u0 g8 f4 a* c8 Q0 P - &gpu {
_- s$ Z. Y9 ~/ l) n G - contiguous-area = <&gpu_reserved>;. Q3 ~* r/ v( U7 N5 f
- status = "okay";
; P5 X/ V2 V- F9 n) F - };
- I: m6 l6 ^3 `" B W; W - /*哈希处理器*/
) D( F# {8 M4 g) F' b! x - &hash1 {
9 i/ _" I, }" r: J$ ~, h9 d# D - status = "okay";+ W! Z8 Z8 X- M$ ?9 @& [
- };/ i7 }; b* a9 f& |# N" b4 W
- /*处理器间通信控制器*/
7 E. i8 ^( }; _# W) A8 Z5 Q - &ipcc {" L; r& ?0 h1 ~, {6 `
- status = "okay";
, u) T8 R8 t, w$ V4 D5 {/ c$ t" v - };& e3 b8 r( y/ D' v( w8 q. h
- /*看门狗*/
, b. {5 O7 W6 D" g) k9 B6 X - &iwdg2 {( M9 D/ R" P; P( o4 H: T) D: N( s1 B
- timeout-sec = <32>;) W9 ?0 I3 t' I k1 v5 K
- status = "okay";
; H8 T X8 q4 ?5 E( A. E. a - };" s7 F* Q+ J- i1 f! f& N e
- /*随机数发生器*/$ s8 K2 G) M4 G5 E8 b) k
- &rng1 {" C- j2 f" y& H f) r1 l3 s5 u
- status = "okay";
# |8 s" r9 G3 C* c, u- ?/ w - };
1 r) ]- X' {: y' B p% w' V! @ - /*实时时钟*/! V4 w8 f$ E) k6 C
- &rtc {
, d! i* G" [* b7 h! N: p5 i! m/ S - status = "okay";
' O2 O2 B; Z" t2 { - };5 F3 o4 l/ Q ?5 u& @
- /*sdmmc1 TF卡*/
% Z2 w4 D5 t0 _) V6 `+ j - &sdmmc1 {( h; c% Z8 t8 ?# a9 `
- pinctrl-names = "default", "opendrain", "sleep";( Z: Z. N9 N p# ~8 c
- pinctrl-0 = <&sdmmc1_b4_pins_a>;
/ }* n! N3 P s4 @2 R7 V - pinctrl-1 = <&sdmmc1_b4_od_pins_a>;8 q) S' v6 w# J, O! c2 U" v
- pinctrl-2 = <&sdmmc1_b4_sleep_pins_a>;
4 H- V! L3 |: R6 s5 z* J - cd-gpios = <&gpioh 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;/ o* N& F# }4 s
- disable-wp;: i7 P& I6 R; A! d$ M6 T
- st,neg-edge;
4 f' A- F! S" ], M1 @# k1 }0 Q - bus-width = <4>;; T5 `! R" S! H
- vmmc-supply = <&v3v3>;) b0 F& U" G% W: ]
- status = "okay";
3 s/ B" w& [4 D8 u - };. O5 ?5 P+ F( r1 L# r* w8 N! c6 s
- &sram {7 s, y$ v5 y8 E1 |
- dma_pool: dma_pool@0 {
- J+ r3 z8 u' L* m - reg = <0x50000 0x10000>;
- \4 q3 e; M8 a! A - pool;
" L) ~: K7 |" l1 T5 C2 r - }; @( t! g# t" V4 R
- };
" B1 X1 l0 p2 B+ n1 f - /*命令行终端*/
# }- O9 x l* I3 n) I3 O2 w - &uart4 {6 I9 A4 n) e4 h: u. H
- pinctrl-names = "default", "sleep", "idle";7 B/ ^. l% c8 y) T; O4 S6 d: |) G
- pinctrl-0 = <&uart4_pins_a>;9 V. y0 ?' n( L! Q G" d
- pinctrl-1 = <&uart4_sleep_pins_a>;7 U U8 a* t8 V+ m8 G
- pinctrl-2 = <&uart4_idle_pins_a>;' N5 U6 l; @8 J+ `
- pinctrl-3 = <&uart4_pins_a>;- \* }' B5 X, W/ F( x
- /delete-property/dmas;
5 \6 q* q, ~' L n: ?4 x& V - /delete-property/dma-names;
, k: W6 `( Y; Y+ `( o% J" H# @ - status = "okay";
6 L: d, C! e* D# O* ]& f: t - };
R# d6 {( H7 m; n - /*电源基准缓冲器*/9 M+ F4 |4 _: g l( ?
- &vrefbuf {
" t H0 }# R* Q6 J - regulator-min-microvolt = <2500000>;& K" z5 r! N! Z
- regulator-max-microvolt = <2500000>;# f) C1 L: ]) t. u5 w* C
- vdda-supply = <&vdd>;
! s% G% p# n* `+ A - status = "okay";" I# X/ _1 G" ?7 b7 s
- };. p4 @" p+ H7 }1 ^
- ————————————————
+ y W+ n" B5 \$ _4 B! I8 B; I - 版权声明:本文为CSDN博主「华清远见IT开放实验室」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
+ W* o2 H5 E0 A6 | - 原文链接:https://blog.csdn.net/u014170843/article/details/119593172
复制代码
! E2 r8 I1 p+ o6 @/ s* w/ D- k7 p0 T# h. R% m: u" j. m+ ]. u, \
在arch/arm/boot/dts/ 目录下新建: ]! m/ b. }- E8 h! ?9 z6 D& Y
; j- x$ l3 G$ z. T$ p
stm32mp157a-fsmp1a.dts:
2 D+ ]( w1 i& B* O7 T- |# O' r: L( a* p6 q' w
- /dts-v1/;
+ j; ~' ]: a) D2 L% T - #include "stm32mp157.dtsi"
$ x d# s7 q0 o - #include "stm32mp15xa.dtsi"6 d6 G1 w. k" M. K
- #include "stm32mp15-pinctrl.dtsi"
+ z, Q0 ` _% h( X- Z# ~. o - #include "stm32mp15xxac-pinctrl.dtsi"
0 A; U" W- \9 f# V6 E8 [1 h - #include "stm32mp15xx-fsmp1x.dtsi"" g0 R- _, l3 K& \, G3 m
- / {. M9 v5 j5 q/ `; Y* E
- model = "HQYJ STM32MP157 FSMP1A Discovery Board";8 L4 ]1 e6 n8 s
- compatible = "st,stm32mp157a-dk1", "st,stm32mp157";; X; E8 ~% K/ L& x6 A
- aliases {7 \4 h" _+ t. }7 \$ ~7 t4 ^ T
- serial0 = &uart4; B0 @% H3 F7 ]) h1 N8 T! `
- };6 M& p+ `# i; m" g
- chosen {" A3 u+ g& A) c8 I- f
- stdout-path = "serial0:115200n8";# B! T5 T- ?2 ~% b8 Z% I' A
- };
2 ]: \( Z4 ]# K4 K1 w9 h4 |, R - reserved-memory {" x" B: J8 w) h8 {
- gpu_reserved: gpu@da000000 {, i' P% A3 u5 y9 u8 d* P) ?/ P" p
- reg = <0xda000000 0x4000000>;( H% e6 t& M8 {' R6 z* x% J
- no-map;$ S0 y* b6 z- m l& y* G
- };- I4 {9 n2 A& L( z: G5 l) H. k9 |
- optee_memory: optee@0xde000000 {7 J$ }5 c% i0 _) B, w+ c0 i5 ^4 c
- reg = <0xde000000 0x02000000>;
z. `1 o" B s - no-map;
# ? G6 V+ S) L9 L l - };
/ c6 W' v7 n. L' _ - };
( A% ]. ~7 Z% j; [ - };
! r+ J) d+ v: x0 h8 l% W - &optee {5 m9 |2 f" m1 G7 t( d8 m
- status = "okay";) X( E" c- P& Z/ i! g d! m6 i
- };
复制代码
. [5 I6 v" j5 N! u; J
5 b6 ^* r4 j# U5 c由于添加了新文件需修改Makefile才能编译,修改: p' H- D# g1 q' w& h- Y( g" W
arch/arm/boot/dts/Makefile,添加stm32mp157a-fsmp1a.dts的编译选项(红色字体部分为添加内容
% \; u) Y. |) A5 x' I0 e, h
% G2 n$ l# k- {: ~- dtb-$(CONFIG_ARCH_STM32) += \5 R1 n Z4 A) O2 j7 M
* w; ?, J9 x: |- stm32f429-disco.dtb \
3 W; ]0 z# ]* W& L: f ]
5 E5 }" s! Y* ?& c# G- …….
% E }. h- s' R% p, r9 A* C - - P6 f% o8 }8 C0 a" X& T1 Q
- stm32h743i-disco.dtb \
& g; k) b. j* O7 b& M+ ^4 j% b
3 ?4 I, K1 ~: B- stm32mp157a-avenger96.dtb \) }9 ^. r9 \7 j- B7 W
- 1 k# G: C5 }* F/ ~4 ]) @1 Q+ u
- stm32mp157a-dk1.dtb \
1 J' p; s! @8 z# v7 j8 E: ~# M7 g
" D8 N' y) \3 V/ Q2 o0 i2 C! b- stm32mp157a-fsmp1a.dtb \
- \$ l7 }2 Y$ J' U - " f& v6 s1 S |, J8 f
- stm32mp157d-dk1.dtb \
复制代码 , f% y9 t2 l( {: e. c
8 s4 D! |3 \/ s" ` I- e
重新编译设备树文件
- k( d# Q* I5 H* M7 R) A2 F5 i8 i5 i; e
linux@ubuntu:$ make ARCH=arm dtbs
9 [ E. Q! h/ R! n, T t3 a3 I' y; W8 Q9 r
编译完成后会在arch/arm/boot/dts/目录下生成stm32mp157a-fsmp1a.dtb文件
\/ W3 l, `4 k- Q7 M9 q
: |- F6 y" d$ j
' Y- y$ w- l3 U9 k5 E+ m9 G# h
0 O6 z* x' X& u$ L# T
将编译好的设备树文件与内核的uImage文件,复制到ubuntu主机的/tftpboot文件夹下,当使用tftp方式下载内核与设备树文件时会用到。
% g( L8 T8 j& b3 Y9 M x) L
/ U9 L' x1 l6 p! T- @, l; V# F8 Plinux@ubuntu:$ cp arch/arm/boot/uImage /tftpboot/0 }' d c2 n$ |
! z5 c8 y0 e" \3 P( Ilinux@ubuntu:$ cp arch/arm/boot/dts/stm32mp157a-fsmp1a.dtb /tftpboot/
. h0 x# a! o6 P6 p0 |" K' I* I" C k
配置tftp7 A- b& ]- y+ u
在linux系统移植中,我们使用tftp下载的方式来验证结果。使用tftp下载需要构建pxelinux相关的目录。此部分可参考《通过tftp方式下载linux内核及设备树》章节进行搭建。8 Y2 v9 X; Z) l9 g% p
( |6 ~/ ]: i- A6 j0 ?* g% R- z如果环境搭建已经搭建完成,需要将ubuntu主机中的1 Y% e9 c R$ ~6 i2 J. Y
/tftpboot/pxelinux.cfg/01-00-80-e1-42-60-17文件内容,暂时替换为如下内容,在后续的移植过程中会根据不同的需求进行修改。
! O# I. P" H4 C. [3 v9 z7 s- [3 _2 h# T s7 C8 V
/tftpboot/pxelinux.cfg/01-00-80-e1-42-60-17
" ~& E r; j0 {' J! {+ A- h7 v/ ^: A' N
- # Generic Distro Configuration file generated by OpenEmbedded- W* a3 w" q t7 h+ T
- menu title Select the boot mode
0 ~1 a4 W4 l# @: g+ y - TIMEOUT 20
9 o+ Z$ l5 F2 x! M - DEFAULT stm32mp157a-fsmp1a-emmc1 o! V! E: }3 G$ ]3 r
- LABEL stm32mp157a-fsmp1a-emmc
) \. Y* o1 V e: G - KERNEL /uImage
# m" i- _7 R6 F6 G# F" h @0 v/ G& {7 U - FDT /stm32mp157a-fsmp1a.dtb" I( q. y& X& {6 F1 E9 |9 `
- APPEND root=/dev/mmcblk1p4 rootwait rw console=ttySTM0,115200
复制代码
8 Q. f+ V; g+ B( u修改01-00-80-e1-42-60-17文件后,继续按照《通过tftp方式下载linux内核及设备树》章节中的描述进行启动。4 y0 N) U+ M V" a0 \$ i
# J, r+ A8 n6 a+ e4 ^) p9 W8 ?
由于目前还未对源码进行任何修改,在内核启动过程中会停留在如下地方。+ l; S. ^9 T, t; ^+ R9 L- E
$ d3 a& T* n* S& x$ I. P
! x: U( o1 k' r; z% h, u: }) n. i- t3 G6 b2 h8 U' b G# P" ?& V
后续会通过对系统源码的修改,逐渐完成整个系统的启动和对外围设备的驱动。
! N, U6 c0 X7 n9 w/ E# v& a5 ~————————————————
1 a; @ Q* N% l" Y4 J- n4 E3 K版权声明:华清远见IT开放实验室8 H9 @8 z5 p5 Y& C- }* Q
) T, i, w6 L7 K+ v8 z0 u) Y- t. p! {9 S/ t4 m! I
|