Linux内核配置及编译7 M5 Q) V- b5 Z* A1 u& s
解压内核1 l) C4 y4 c& q r9 P
建立源码目录$ p; O( T& q& ~8 p1 L( o
7 X/ T( J& V" X/ f/ 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
; I: A8 g& [ x5 J
2 J+ W. r( \3 j h
1 O r2 [! J0 s: L* A( t
* ~" b4 A; v0 `+ @该目录下以patch结尾的文件为ST官方提供的补丁文件,linux-5.4.31.tar.xz为标准linux源码包。2 x4 m# c: d' r/ n C
4 L3 v! _9 s6 [# x+ k
解压标准内核源码包
7 N( l( ^) T5 a" ~: W' N% E9 S# C& r- D* F5 o+ k
linux@ubuntu:$ tar -xvf linux-5.4.31.tar.xz, J! v" v4 {. O8 N$ W& Q8 R
3 R/ C/ ]; O3 j0 o; c6 y
& {5 O1 x( \/ f, @0 r, ]2 o1 ?3 Q
进入内核源码目录下
' o$ v- B3 i# t1 d# x+ i4 ~# p& E! ~; R8 G9 g
linux@ubuntu:$ cd linux-5.4.31
/ b: V9 O5 G G& A9 E
: u5 B# }. G" L! J, L
( _" [5 O7 X! w3 B( b; e( T
4 e; f {8 H! h% Z. E/ {
添加STMicroelectronics官方补丁7 Q. |% i8 H, T& u8 I0 y/ A8 Z
解压linux内核源码后得到的是Linux社区的标准内核源码,接下来需要将ST官方提供的源码补丁添加到标准内核中。5 V3 I9 W) Z, \, X" z, N H: k
! x4 P' b# b8 R8 r; X1 H; d
linux@ubuntu:$ for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
% u$ n7 s7 ~4 d6 H$ U4 _! s: d2 z% ~9 a, m8 ?/ n3 `6 ~
该命令会将上层目录下所有的patch补丁文件应用到当前的内核中。# F Z6 f- A, b6 z. s6 |, s
7 ]9 w& N- X0 I7 }" n% {
生成标准板配置文件
# v: G# Q+ }! Z- ?生成multi_v7_defconfig默认配置
" b0 w$ l! ?9 \/ h2 l
/ j6 a" f7 i( F5 ^7 Clinux@ubuntu:$ make ARCH=arm multi_v7_defconfig "fragment*.config"
( U* _4 H4 h* }9 K+ f! P$ e( ]9 ?" n6 S5 O) E
在默认multi_v7_defconfig配置中加入ST官方提供的fragment config7 B5 P7 |0 x9 B9 ~! P( d
8 p# [% f$ @- a; U' w
linux@ubuntu:$ for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done
/ a8 [6 A: c% s! P* {6 x0 r% U- @4 j/ V3 Q/ J
linux@ubuntu:$ yes '' | make ARCH=arm oldconfig
" D. F. P& S1 l' v8 ]. T1 ^/ G- S* y- ?5 b. U& ?+ M
生成自己的默认配置文件
8 ^! X k9 t# k k4 |1 `! O" v m+ ^- l: a, O
linux@ubuntu:$ cp .config arch/arm/configs/stm32_fsmp1a_defconfig# L# Y. Z% ?/ \$ a1 Q
9 I9 r& x1 S. E; k' }/ g# b取消git中的SHA1: P3 S1 L5 X3 k" t" ^8 K o$ K
1 a) D6 i6 y* Xlinux@ubuntu:$ echo "" > .scmversion }8 w; e, s2 G5 G7 T3 Z
: n' u0 `$ s2 w6 y配置内核
5 E! v' Q" [9 d2 O5 e导入交叉编译工具链(如果还未安装SDK可参考《SDK工具链安装》章节进行安装)2 f% M4 ^, m- l/ @- \$ g# v
0 {$ b8 D8 {0 d, C, j
linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi3 N, L F* }6 Z+ m9 [/ F
/ Y. `( v2 e% X3 t) H' `
验证开发工具是否安装正确,显示版本信息如下图所示。% a! U- ]1 l1 C7 j! H
4 E* q5 f" f+ k
linux@ubuntu:$ $CC --version* D7 A" Z/ @( u5 ~1 v. S( X
5 Q4 }# Z* V2 Y* {) S X
* H* W8 k2 x, \. m/ {# r9 ]
" ^0 Y% s: c: w8 s& S在编译前如果需要编译额外的功能或者驱动,可以使用meunconfig来对内核进行配置。' X8 Q- z1 @, L7 R( \- v; w
2 Q" f! h: X) g% z8 y: ^
linux@ubuntu:$ make menuconfig9 `& V' n( i! N5 |. ^* k' X) \
, l0 z% S" d& w/ ^3 y- |' g
* W8 P# F2 |- G8 j: L" A& [$ v* p
可以在如上菜单中对内核进行详细的配置。* l' f P ] d; U5 z" _
, r% T8 m% y$ r0 a0 [编译内核
2 ^3 n7 U) n, I7 D& O j7 s/ e9 q1 |linux@ubuntu:$ make -j4 ARCH=arm uImage vmlinux LOADADDR=0xC2000040
/ S, E( ^" e2 a, ]* L7 U+ ?4 B+ m5 x* h' k
& t2 x; S: B! U
Y' h4 |5 \; d
编译后在内核源码目录下,能够在生成一个vmlinux文件,该文件是没有经过压缩的内核镜像,这个镜像导出了所有的内核符号可以用作仿真调试。6 d) a2 U& q3 w2 I
: [5 v9 }! }0 m) n$ s
' `% v7 e% E5 D0 ?% @
$ l5 t2 ^4 I; `( k9 B1 V/ O此外在arch/arm/boot目录下还生成了一个uImage文件,这就是经过压缩的内核镜像。可以用作系统启动。* o/ l* j3 o+ }% G& }
$ a6 q5 E* z9 l' t" q8 p, [
4 ]0 Q1 s- ~3 {; X7 h! [8 {
1 V* ]" Y+ d: F$ O编译内核模块
$ l+ u& E8 v' t6 m! ?0 B0 w0 hlinux@ubuntu:$ make ARCH=arm modules/ e. z- e8 j& ~7 j8 J) ]6 ]
5 j/ e: s1 i& s5 A% x L! }
该操作会将内核中配置为模块的源码进行编译,最终得到ko文件。! A3 L) [2 j" U( H& d4 ~
5 q* E! s6 Z( o3 w
& r5 B- P$ @. L) X' {
1 d( W' s5 C" i! l7 u$ \5 ]生成设备树+ Q/ C& Y4 B. }$ |) a
以参考板DK1设备树文件stm32mp15xx-dkx.dtsi和stm32mp157a-dk1.dts为参考,增加stm32mp15xx-fsmp1x.dtsi和stm32mp157a-fsmp1a.dts:; x5 M- l) a9 `" p+ K4 Q* w; I/ V, |
( p/ _& b! ^5 ]- \" m, C
对stm32mp15xx-fsmp1x.dtsi内容进行整理,去掉没有被使用的节点信息和明显与FS-MP1A的硬件没有关系的节点信息。下文内容是删掉了所有暂不使用的节点信息,整理出一个相对简单的设备树文件,确保内核可以正常启动。后续各个外设移植时会陆续增加文件的相关内容。& {( m. h# h: f+ X# ~( \. ~
8 H) s: W6 P: \2 l5 q/ ?在arch/arm/boot/dts/ 目录下新建4 Q2 ^1 H$ S# P/ _" z+ _6 I5 T
, z; V+ z0 D" G/ T; m8 X3 @
stm32mp15xx-fsmp1x.dtsi:- #include "stm32mp157-m4-srm.dtsi"
6 B5 D' a( W% b" M0 z9 y - #include "stm32mp157-m4-srm-pinctrl.dtsi"
1 {' @7 r. q) f" D* ` - #include <dt-bindings/mfd/st,stpmic1.h>
$ ]5 e8 ~% P' a0 R: D4 x - / {! y4 t8 x3 N/ j B6 U& k" ~
- memory@c0000000 {" ^- | t6 r* y3 Q! _5 e
- device_type = "memory";
1 ^/ j* c r, H- _ - reg = <0xc0000000 0x20000000>;& H( d' \8 T. }; ^/ | m
- };
* v8 T& m6 L* G! z" o - reserved-memory {6 j3 f8 @3 a" m1 D# @& O
- #address-cells = <1>;
/ n3 z5 u+ O. _. W. g) r - #size-cells = <1>;; A4 G' w4 L' C7 j
- ranges;1 d6 T1 x4 G6 ` P, @
- mcuram2: mcuram2@10000000 {
* h6 |/ A9 o" R1 S3 N - compatible = "shared-dma-pool";
' C% A$ G+ m6 X$ J( @ - reg = <0x10000000 0x40000>;
. K& G+ x, K# w8 D - no-map;6 ^: |! t7 v' b/ m b8 ]
- };2 o- [+ b1 N' p" l7 H7 q
- vdev0vring0: vdev0vring0@10040000 {. `/ ^ z7 u4 s2 v. s
- compatible = "shared-dma-pool";. f; R( x$ v, \# E- H. k
- reg = <0x10040000 0x1000>;' {* c) R# ^/ g& j$ ^
- no-map;, o& L0 y; D$ [6 E. j( @% U# u9 S
- };5 Y; H/ e8 L6 I
- vdev0vring1: vdev0vring1@10041000 {
6 i7 P1 b( a/ a& @6 A: \/ w - compatible = "shared-dma-pool";0 N0 V1 `1 C8 m$ o
- reg = <0x10041000 0x1000>;
7 B3 t. m. _8 W( i - no-map;
7 U) X8 v- @, G; C L* ] - };0 S V; `5 ?4 A" L' x$ W
- vdev0buffer: vdev0buffer@10042000 {
! Y K3 f) @ r# n5 @4 n6 v; k - compatible = "shared-dma-pool";1 T7 Y8 N8 N! `
- reg = <0x10042000 0x4000>;
! e5 Z& ~2 q2 p+ {6 f' q3 G - no-map;
8 L2 m5 N3 ` Z7 N4 M% ]' l+ F - };
5 D" p! D* _( R# U+ @% J4 I- o - mcuram: mcuram@30000000 {! F% H; J/ E# S! |, x9 y
- compatible = "shared-dma-pool";5 r3 H- p; F ]" {
- reg = <0x30000000 0x40000>;+ Z9 C9 p. e9 @0 T. y
- no-map;
, X& u2 P3 [$ L8 O1 m" Y% g& i - };' } ~! }8 q/ ] z6 ?, A
- retram: retram@38000000 {
5 H& i+ I' Q& z. K2 L. Z - compatible = "shared-dma-pool";4 J# d) @" M! X6 g- n* i7 r
- reg = <0x38000000 0x10000>;$ R# M+ C: e9 {4 N$ k
- no-map;
8 _' H' O. _% @/ \+ F+ o0 A2 t - };
( [3 O9 i: o3 R- y - };
* n; q, l0 y6 Z - vin: vin {
# g o" K; @, x) `+ Q1 S4 I. _' h - compatible = "regulator-fixed";3 ? x2 p1 `& |! H5 r
- regulator-name = "vin";$ F! M) ~4 B3 n% e
- regulator-min-microvolt = <5000000>;' v0 q7 n0 W( M4 Z- n
- regulator-max-microvolt = <5000000>;
2 N, H4 [" y, C4 k. a, ]9 B - regulator-always-on;
+ s' l* v( h: @9 K) g Y - };. \# `3 u9 \: h
- v3v3: regulator-3p3v {
" r/ K( k$ v/ N! Q( ]% u - compatible = "regulator-fixed";
% s/ D" G0 ?) h9 @& s5 \ - regulator-name = "v3v3";; j3 v$ g+ Q( v( d
- regulator-min-microvolt = <3300000>;' v8 N: T' |5 E7 l( m: R
- regulator-max-microvolt = <3300000>;7 I7 s& A+ ?) ^- i6 T( I3 @2 I$ i
- regulator-always-on;
2 [6 V- S4 X. u3 g5 W9 ] - regulator-boot-on;+ X. s$ F! }* V; F5 T
- };2 v( N3 u! O( R8 p7 V
- vdd: regulator-vdd {
/ S& a7 d- n" {) M - compatible = "regulator-fixed";3 c' N, G' j' S) S* _
- regulator-name = "vdd";
, j, S% u: J- ?, G& K9 s - regulator-min-microvolt = <3300000>;4 f4 u3 R, c8 I
- regulator-max-microvolt = <3300000>;5 `6 w) R$ ]$ y( z7 Q$ C% T
- regulator-always-on;$ Y9 L- K5 ^" a: ?
- regulator-boot-on;% l9 x! v2 m* X% I+ g' ~
- };
" G2 W2 j M' G' V7 }! N - };
" C8 i. X7 u' r* r: j0 i' A- C# O - /*HDMI CEC控制器*/8 Q) L: R' b0 d2 ~, e! }
- &cec {
# R( C' s m+ `: m - pinctrl-names = "default", "sleep";
4 J3 p6 |7 l. ?* Y - pinctrl-0 = <&cec_pins_b>;
+ C( V- N, ?0 ^- W5 K; L& H u% H2 F8 y - pinctrl-1 = <&cec_pins_sleep_b>;
4 t" H1 ] Q6 M3 k7 _ - status = "okay";9 d8 r! v9 ?7 u2 M
- };- r* E# c" p: v$ X5 I2 w* z
- /*循环冗余校验计算单元*// p/ m9 _/ Q8 r/ `) t. o9 N5 W
- &crc1 {6 s! m1 z1 t0 |3 Y
- status = "okay";
3 d1 O) }( V; S; d0 ` - };
" v) \9 ~8 V, c$ A. i - &dma1 {
2 _& {- u N3 R% S, C4 k, ? w$ k - sram = <&dma_pool>;
$ D, m H. m' Y7 a4 z# Y- D - };5 B {% O2 o7 p
- &dma2 {
# K) @; u/ k: y$ `' g - sram = <&dma_pool>;
8 e. l, } i# M; A - };
/ z6 S# X6 T; |# Q- S - /*数字钟温度传感器*/* O4 P: ^- E7 j: U. x
- &dts {
. p3 g* k+ U& l7 i - status = "okay";
8 H+ |7 ^7 ?1 `7 @: s6 M - };$ t3 e: X( V- O
- /*图像处理单元*/6 i+ y: W# F7 d8 B
- &gpu {
$ d! Y5 K! {+ k+ |$ i" c; @4 q - contiguous-area = <&gpu_reserved>;
& l7 @1 f c& W/ }' h - status = "okay";3 H; @0 S+ T9 K! e+ o8 x
- };
' g- n8 ?( f0 I8 W, Y+ H5 x9 [1 }9 J - /*哈希处理器*/! d- F M" q) M& h% {0 c
- &hash1 {
! X+ C; y. V" D2 k/ I% t3 S/ h - status = "okay";8 m* P: j8 ]" [+ p
- };! d6 Y/ q! h' Y- D9 R
- /*处理器间通信控制器*/
; ]1 |' ~. B. ^* q8 Y. r; k' @8 [ - &ipcc { I S( e! l, C7 p
- status = "okay";
) g' t6 T2 G0 h4 I* i - };) k" o1 @$ r; I( B3 o* \; L
- /*看门狗*// T# `+ P( G; H- J# q8 `4 i
- &iwdg2 {
6 m& o2 X. G5 |9 W- _* t& x5 c - timeout-sec = <32>;
6 L2 t4 O! B# C: s; }, L - status = "okay";
. @& U, m* Y4 d7 b& ~* ] - };
4 t0 j3 L- ]" @3 p9 O U - /*随机数发生器*/- O& w2 B. F% ^
- &rng1 {: t7 t, N6 J. c1 G5 U/ t; X/ y
- status = "okay";; m5 O- W) [* L# f9 y' z
- };
# e5 E% N- x& z, a* S! V - /*实时时钟*/0 Y" L6 V1 t( E' D; p% O
- &rtc {
2 |9 e; l5 {' [; s3 ~" t9 K1 L - status = "okay";
, [1 ~. v) J4 H2 |) E - };
- k) F+ ^& b. f3 g+ ?( I; T1 E7 P - /*sdmmc1 TF卡*/
. r; _0 h' d6 ~ - &sdmmc1 {
A% M/ W# ?& ~! n7 j$ v - pinctrl-names = "default", "opendrain", "sleep";
/ H5 p+ p% E1 u! g4 g0 v - pinctrl-0 = <&sdmmc1_b4_pins_a>;
- u* V0 Z6 _, z! C, u* S - pinctrl-1 = <&sdmmc1_b4_od_pins_a>;
6 ] G7 K: Y# _% r - pinctrl-2 = <&sdmmc1_b4_sleep_pins_a>;
. O e0 v7 A; T9 v - cd-gpios = <&gpioh 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
9 C) j- q- L6 E( @ - disable-wp;; L" l0 ?/ Q& L6 s: [0 ?) i* H! ~9 r
- st,neg-edge;
! T$ x3 W- m2 Z9 P4 T0 } - bus-width = <4>;
5 i, `* ?8 M- ?% p5 y - vmmc-supply = <&v3v3>;2 G3 j! p- T5 R( n
- status = "okay";
7 R+ `! J) X9 N" W, B K - };- c) w: a# U0 u* I
- &sram {" ~) a$ D. y$ {# m. \, i
- dma_pool: dma_pool@0 { M, ?& @. r. k: e4 l5 l9 n
- reg = <0x50000 0x10000>;* q7 P8 Q3 E; f# S3 @# e! |
- pool;) U; H3 v# h5 i$ z
- };
9 K {9 P7 j0 | - };
# n6 [. d) r- }$ m' D - /*命令行终端*/
' ]* k( ^ {$ T! ?1 q) D: |( h/ ^ - &uart4 {4 r1 z( f. e. h6 A2 V8 u7 o7 z) J
- pinctrl-names = "default", "sleep", "idle";
# C6 X" P4 k" J3 u; t6 ] - pinctrl-0 = <&uart4_pins_a>;
5 q1 _0 p) w$ `' M8 [8 A& z - pinctrl-1 = <&uart4_sleep_pins_a>;% U! C! R8 [' C. M: |
- pinctrl-2 = <&uart4_idle_pins_a>;5 _0 w! S3 p9 p) M, s G
- pinctrl-3 = <&uart4_pins_a>;
" p8 ^: u) p. G - /delete-property/dmas;
2 d5 \& C5 M+ W' E* y! a - /delete-property/dma-names;
8 g# l& ^9 R) v% W; x - status = "okay";7 F; t; g; y& _( @$ a ?0 Q
- };
6 B8 R3 M5 V6 o& D+ T; y - /*电源基准缓冲器*/
0 n( O! W: N. [" Z/ X, k - &vrefbuf {
% Q" V2 M, r: P2 p; i1 U! i - regulator-min-microvolt = <2500000>;' E+ v* m, C- }$ f
- regulator-max-microvolt = <2500000>;
' Q4 J4 N) K- W - vdda-supply = <&vdd>;
; s0 {$ O/ V8 ]( S. v+ ~8 W, `* Y" q - status = "okay";
5 M% K! n/ o9 y% J# r - };) q! p- x" _! M- P: N( S
- ————————————————' z1 x8 N( F+ S4 V5 m" i- z6 U: z
- 版权声明:本文为CSDN博主「华清远见IT开放实验室」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
: S- Q$ |. \5 h9 C- Q - 原文链接:https://blog.csdn.net/u014170843/article/details/119593172
复制代码 % n4 Z: Y0 G* J. Y& e( g2 ]
! R" J) z# p5 D; z在arch/arm/boot/dts/ 目录下新建6 B. Z, T6 S& Z- |7 a% L3 o* e
7 I+ W4 @; c: f
stm32mp157a-fsmp1a.dts:3 y& y' F, E. [0 v$ Q6 T/ ?7 U
' ?3 d& i- ~7 k6 ?, |$ V
- /dts-v1/;* S- C+ o) q) @+ L
- #include "stm32mp157.dtsi"/ ]& V. `4 g+ Z, F, S
- #include "stm32mp15xa.dtsi"
0 s3 m5 p( U& {6 h( @ - #include "stm32mp15-pinctrl.dtsi"2 O! f" X' E& Y/ C* m! f
- #include "stm32mp15xxac-pinctrl.dtsi"2 [0 ~, {8 s) @, U N
- #include "stm32mp15xx-fsmp1x.dtsi"
4 m% K: o' R2 q# {2 Z; y - / {9 C- e7 d8 g4 z7 U& p0 N- w2 @+ |( A
- model = "HQYJ STM32MP157 FSMP1A Discovery Board";7 K3 P2 G) \3 F( p
- compatible = "st,stm32mp157a-dk1", "st,stm32mp157";
& R0 Z, b3 F2 c8 ?0 |8 j' j - aliases {
! P- W4 c8 [( h; G2 ~2 f6 d - serial0 = &uart4;
8 }! I( {) n" S/ j# |$ \& \ - };
: _! ^2 O9 U, @) S- E - chosen {6 S- V9 q1 |" k& O
- stdout-path = "serial0:115200n8";
$ k- E3 a$ I" d1 t7 t8 z: n. O - };" W4 n" c, }; @7 `& |
- reserved-memory {
! a! B W7 r- ^. F! {# {6 L - gpu_reserved: gpu@da000000 {
& A; M. c2 B; J1 z* d! @ - reg = <0xda000000 0x4000000>;' F9 ?$ K- D% h
- no-map;& ^! c# [9 p+ W) }8 m2 Z8 Y, B0 d
- };
; _- W0 q0 }9 Y# ]! | r+ Z - optee_memory: optee@0xde000000 {% q+ _) ]: u0 E. k$ n8 b, L
- reg = <0xde000000 0x02000000>;
7 B2 K; o! z7 L+ C, } - no-map;& \" s/ b" a7 z3 u5 C5 A. l
- };
* e- Z$ U5 K& o3 | - };3 }" O1 ], j' G8 {! a& b3 a, q3 q; d
- };7 E3 G- N1 `, P c& @- \
- &optee {# I1 r8 ]- m0 x+ B1 b- H
- status = "okay";; N3 O l7 k, k" u
- };
复制代码 4 M" K; l+ }& l# \$ ~+ x
( B3 \0 H$ D( [由于添加了新文件需修改Makefile才能编译,修改
: o5 z j& ^! f* Q2 Harch/arm/boot/dts/Makefile,添加stm32mp157a-fsmp1a.dts的编译选项(红色字体部分为添加内容6 O- c5 t$ [$ |- \0 t
2 _' `& b' w. l: c- dtb-$(CONFIG_ARCH_STM32) += \
% p4 c' F, c: d, ~5 D. ` - " N. H$ R5 h/ N: V& a
- stm32f429-disco.dtb \9 a" W% D& s* Y* b
- ' x. R; A# U" U
- …….
# H0 i5 @* q; x6 ]
1 J8 k9 o7 q: R2 d( h- stm32h743i-disco.dtb \
0 q$ T. c+ I% ?$ b- \ - 4 |1 }! f# w: \2 M: ?
- stm32mp157a-avenger96.dtb \# Y& y1 u0 P; [2 y5 ^+ Y& w- ~
- # K0 N; g. N. r3 `' ~
- stm32mp157a-dk1.dtb \+ N7 \9 V0 |* @, F( J% p
$ z. f6 M/ W1 E; @! J+ Q4 H9 a- stm32mp157a-fsmp1a.dtb \/ i8 E1 ^& X6 T' N. t" q X7 ]3 @6 p
1 E& s8 ^+ y4 ~5 @- stm32mp157d-dk1.dtb \
复制代码 + U" C; v8 J" F% h
O: c$ Q3 Z& e3 J* u重新编译设备树文件3 d4 [: S. K6 _/ }8 ^4 k
9 Z6 k4 T& o- D6 @# h% |! G3 E4 T y
linux@ubuntu:$ make ARCH=arm dtbs
* {, ^. E! D1 q8 T4 @* W
9 b5 }. ~ e+ g6 {0 w0 @! w" P编译完成后会在arch/arm/boot/dts/目录下生成stm32mp157a-fsmp1a.dtb文件2 Q+ }9 B& G7 S; S" r. O" |1 `
+ [' @. B9 X; M% o- A
" ]1 s* Q9 J" a: h* |& P
2 @; R2 D5 I# D/ U
将编译好的设备树文件与内核的uImage文件,复制到ubuntu主机的/tftpboot文件夹下,当使用tftp方式下载内核与设备树文件时会用到。
% B$ N) T2 H! T+ J# F
# ?6 a* @9 F! x0 x( b7 Plinux@ubuntu:$ cp arch/arm/boot/uImage /tftpboot/! d( |$ E5 z$ f$ W
4 T7 g3 `& Z. b% v" Slinux@ubuntu:$ cp arch/arm/boot/dts/stm32mp157a-fsmp1a.dtb /tftpboot/. Y" |2 |3 K- @! P' J5 j6 }
y: G% b4 \1 L# z5 m* N8 Y配置tftp
! M" {/ A1 s! |8 M& g, l! p在linux系统移植中,我们使用tftp下载的方式来验证结果。使用tftp下载需要构建pxelinux相关的目录。此部分可参考《通过tftp方式下载linux内核及设备树》章节进行搭建。+ g( L* s# f2 V+ _, Q" Y9 h
8 ~) O# f6 o3 v+ m+ w
如果环境搭建已经搭建完成,需要将ubuntu主机中的$ z! F7 b5 l s8 R" b/ K
/tftpboot/pxelinux.cfg/01-00-80-e1-42-60-17文件内容,暂时替换为如下内容,在后续的移植过程中会根据不同的需求进行修改。
1 l* q# T5 H. R' `/ T# a: D" x# W' z8 I* [: j
/tftpboot/pxelinux.cfg/01-00-80-e1-42-60-17
; K( C$ Z6 I; N3 ^5 k* [+ d) u$ Y
9 n& S! i5 y& }9 T1 a% h' Y9 k- # Generic Distro Configuration file generated by OpenEmbedded* M) @$ ^% t9 ?+ |& n
- menu title Select the boot mode9 e, @& V0 T% M' v7 J
- TIMEOUT 20& L: S" c c G/ `
- DEFAULT stm32mp157a-fsmp1a-emmc
! j0 P+ M! {$ ]' m7 V! @8 F: \ i8 E - LABEL stm32mp157a-fsmp1a-emmc5 U) N+ s: s- o1 a: Y* F1 U
- KERNEL /uImage: G, T6 O- Y) Z2 s2 S3 K7 [
- FDT /stm32mp157a-fsmp1a.dtb/ }' c7 o' V8 J$ p, s* D
- APPEND root=/dev/mmcblk1p4 rootwait rw console=ttySTM0,115200
复制代码 ( e: y3 x, Z# K6 j8 f" E, c c
修改01-00-80-e1-42-60-17文件后,继续按照《通过tftp方式下载linux内核及设备树》章节中的描述进行启动。
P4 p0 b, O& P7 A1 M% p8 |
" y" \5 i. I; y8 i5 V c由于目前还未对源码进行任何修改,在内核启动过程中会停留在如下地方。
. g7 O- _! {1 f" s6 N4 a" I2 F! o6 t- T" p1 h& B
5 r9 r, {6 g5 a9 \1 q
1 J8 w, \: X& G" J, r/ R后续会通过对系统源码的修改,逐渐完成整个系统的启动和对外围设备的驱动。
# ~6 E% ~+ J) O4 F& S————————————————
9 I, r1 I/ M; U- z; ^( e8 a2 }7 J版权声明:华清远见IT开放实验室
8 A0 l& j* G2 q0 f2 D; K; w/ X
8 Z. R7 [" B! T- c) g( W0 d* k' ^, z5 ?" g
|