基本流程" R7 k5 V5 j7 b& A% t
编译开发板提供的内核源码8 G3 ~& h" a J+ @! {) N) M
准备编译所需工具链0 |! h/ W2 b% [& k: K- C" `* e; n
编译tf-a9 o; n; |0 w) O l4 D. _6 l! ~
编译uboot+ T" f% ]! } @4 S
编译linux-kernel& Q1 g2 ], C6 _% s0 E
准备编译所需工具链
m9 _ ]% o2 m. v1 xubuntu环境下,下载yocto SDK
$ u9 X3 C( g q+ x v2 V+ j9 i* Z+ c, ^% m; x1 R% c
5 Q! F& ~6 T. H$ @6 @/ _
9 R3 V2 ~, J `解压缩yocto-sdk 包
1 v' ~ K0 g* C' U' W- $ tar xvf en.SDK-x86_64-stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24.tar.xz
复制代码
5 N, q* H/ W6 ]& q! N安装yocto-sdk
+ _/ y1 W; l5 G, D- $ cd stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sdk5 l6 v s- ~! q: y! m4 A# u* ?8 @
- $ ./st-image-weston-openstlinux-weston-stm32mp1-x86_64-toolchain-3.1-openstlinux-5.4-dunfell-mp1-20-06-24.sh
复制代码 ; C& f* W1 \1 j* x% A) B
设置yocto-sdk为默认环境9 Y; x) H+ L* _
- $ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
复制代码
0 M* c0 J5 q( r3 g: O4 {验证yocto-sdk开发环境7 Q O1 L+ r7 O/ D; Y. V& b! Z9 G
- $ arm-ostl-linux-gnueabi-gcc -v
. J1 V( t0 d( Q5 ~( `; T: F - Using build-in specs.
8 s3 V7 b6 p& ?( p. q9 N - COLLECT_GCC=arm-ostl-linux-gnueabi-gcc
$ Q2 E7 L0 {( [$ H' S! r% M - ......
) @" V+ L1 d( X! o+ h - Thread model: posix; |" u. h) g) L& U' U1 \$ i2 N8 e. }
- gcc version 9.3.0(GCC)4 s* S- ~6 e7 o( ~, ~
- $
复制代码 # T$ c C3 D: |) c1 h
) g/ j$ D0 Q9 E( X- U T" y% d0 v- N
所需要的tf-a、u-boot和kernel源代码在下载目录的MYD-YA157C\04-Sources目录中: V" \. }3 p# Q+ A% h$ q
$ q t* H8 X% X9 g
9 v3 m& i, v4 ?$ }* Z0 L( L
$ J7 U) ]/ N- C& d5 t解压MYiR开发板提供的源代码到工作空间' q1 b$ R; S* {9 ~6 k+ i7 J' F1 A, n
- $ tar xvf MYiR-STM32-kernel.tar.bz2 -C ~/workspace/myir3 i% L# R4 ^4 ]1 `0 A' r
- $ tar xvf MYiR-STM32-tf-a.tar.bz2 -C ~/workspace/myir/ s9 L( \+ }) S; a; S
- $ tar xvf MYiR-STM32-u-boot.tar.bz2 -C ~/workspace/myir
! S( E, j0 L, H - $ ls
+ v* s# Q; ~4 x - MYiR-stm32-kernel MYiR-stm32-tf-a MYiR-stm32-uboot
复制代码 , ~+ q0 c. K, l! A1 f! V8 q1 x
编译tf-a. z# a8 O1 J6 s1 \& c: \6 F
- $ cd ~/workspace/myir/MYiR-stm32-tf-a/myir-ya157c-tf-a/
{+ o* u) }, t. A - $ make -f $PWD/../Makefile.sdk all2 e u# m+ Q3 n4 {
- $ cd ../build/trusted/: t) D' N5 }: Y$ n( Z
- $ ls
5 l7 f6 j4 [' N! U/ ]- ` - ......* U1 W/ [. O7 H3 w9 G0 ^
- tf-a-stm32mp157c-ya157c-512d-v2.bin3 C: D& |4 j' J
- tf-a-stm32mp157c-ya157c-512d-v2.elf
% g: L) X# Q7 E$ C - tf-a-stm32mp157c-ya157c-512d-v2.ld
. u2 L9 D' k$ n( B - tf-a-stm32mp157c-ya157c-512d-v2.map
" O" L2 ]% ]& u" y - tf-a-stm32mp157c-ya157c-512d-v2.stm32& Y8 ?) Z1 O. ~& p/ n, n
- tf-a-stm32mp157c-ya157c-512d-v2-trusted.stm32. ^* x6 e2 h& }! G
- ......- b' \! d- H4 D
- $
复制代码 ) t& F' |" x9 i3 _7 @0 v' ~5 Q
最终生成所需要的tf-a-stm32mp157c-ya157c-512d-v2.stm32* r* c' ]8 C. Y
: g5 _& {% _1 `+ [# G
编译u-boot/ Q# i% V; a' P% K
在build文件夹中构建和生成u-boot
& \$ p! G% K/ v2 x+ N& r$ b# c- $ export KBUILD_OUTPUT=${PWD}/../build- ~3 q- p) L& h3 g ^, {5 l9 R
- $ cd ~/workspace/myir/MYiR-stm32-u-boot/myir-ya157c-u-boot/
+ }( R5 v% w2 E; ~* F - $ make stm32mp15_trusted_defconfig
( |* h! j1 x; c7 s9 y! T - $ cd ../build
. T- r% m& s+ d/ l. [/ Q - $ make DEVICE_TREE=stm32mp157c-ya157c-512d-v2 all -j117 N" s1 B' J8 I+ q0 o$ w% s
- $ make -f ../Makefile.sdk all$ F3 E4 L" T) F5 c( `+ C1 g
- $ ls/ ]! A$ V7 }/ E+ ?8 n Z8 }
- ...... u-boot u-boot.bin u-boot.stm32 ......# k1 ]- n; W6 t# E5 i* s2 b1 Y
- $
复制代码 / W% O# Q9 U7 m* E, B
生成所需要的 u-boot.stm32文件
8 S8 ~6 S% x+ D6 u v N" x3 w1 D+ J2 Z. P. ~
编译linux-kernel! d+ L; d) u! P5 |
在build文件夹中构建和生成linux内核
/ p3 ]& e3 M8 r8 G3 \& t; Q3 { |0 E
- $ cd ~/workspace/myir/MYiR-stm32-kernel/myir-ya157c-kernel/
# i9 u! L" }3 h. R - $ make ARCH=arm O=${PWM}/../build" myc-ya157c_defconfig& v( I# f: v! x1 P7 Z$ }
- $ cd ../build, G' k5 Y# _! t9 D
- $ make ARCH=arm LOADADDR=0xC2000040 uImage dtbs -j11) A6 t( X5 N0 n2 ^, f
- GEN ./Makefile
3 K% E2 g; y) a1 V - ......
! G) z6 Y8 F& Z* D$ g% Y - Kernel: arch/arm/boot/Image is ready
% g. V" ^5 F/ I+ K/ ` - Kernel: arch/arm/boot/zImage is ready5 N& s' b5 M( E Y, I$ \
- Kernel: arch/arm/boot/uImage is ready$ z: k0 }$ i7 ~# ?5 [3 r7 R, R
- $
复制代码 1 ~6 P8 e, {7 p, e2 [
根据MYiR开发板硬件资源的预设文件myc-ya157c_defconfig,将内核配置完成。
+ ~6 v2 B" _- Z, \' k! N6 X8 W9 I备注:myc-ya157c_defconfig预设配置文件位于kernel目录的arch/arm/configs/目录下1 [+ Y$ H" g) V' k9 p. E
) c) H6 ^& ]! A2 S! k" v. J, `准备镜像用于烧录
9 q; x4 Z7 N- _# i) j关于烧录工具- L5 l4 c4 s/ I) z0 o8 p
烧录内核所使用的工具是STM32CubeProgrammer
) R( y& m7 b0 s/ p4 k! z5 P1 p+ B
8 S3 W% S. n8 F0 ~* x9 ~
2 N/ z- u c6 k/ B' R9 ] @3 I
9 J* z# O% { r: h8 W( _准备烧录镜像列表文件(tsv)。这里推荐基于开发板提供的修改。tsv格式文件通过excel打开,如下图所示。
3 l, {4 `4 x f+ Q4 E$ V$ p; T* z9 e$ m# W2 V
. J9 u% z ~: i) o( m" ]
/ z: w0 J8 t v" y4 N/ i. T: D4 T/ U一般的,对于需要更新的分区,#Opt一列设置为P,如上图所示,第一阶段引导TF-A固件,第二阶段引导程序U-Boot以及包含内核在内的根文件系统都是需要分别更新到emmc存储设备的各个分区中。3 x) d" Q A% K0 n6 E: }
! U% x5 Y5 m8 n
只更新内核
! s( s( X6 j. n" s; Y F8 `6 v只需要保留包含内核文件系统分区的#Opt为P而其他分区为PE
+ G) F+ a) K* m I0 {% i8 P9 X! M2 a8 I# p, }0 ~
0 j4 Y% n" p7 t% ?
* P6 O% |) N# s; h9 t1 Z% T0 ^注意:如果想要保留原本分区的内容,必须将#Opt内容设置为PE,而不能设置成为-, g+ I( u3 C8 O) {+ d4 S
9 l% k7 \. D* G. j2 U% ~
准备镜像用于更新引导程序和内核' `9 [* S$ l; o" r/ B! W
以MYiR-YA157C-V2-weston发布版本为模板,创建一个副本命名为my-weston
* [3 J1 p& e# R5 d3 ]- |" I! o& N1 O) r
# v6 p, D0 U. G# G; w% U: }. }) q% v) m, w) c% J, _& Z
拷贝之前生成的tf-a镜像文件,u-boot镜像文件到my-weston中4 M5 P3 J: b$ \
将更新后的ext4文件拷贝到my-weston文件夹
* k5 d# b. A5 v; c G7 U) c" N5 ^拷贝st-image-bootfs-openstlinux-weston-myir.ext4到linux环境中。12 Q! I/ \4 c$ O* H4 g$ F
- $ sudo mount -o loop st-image-bootfs-openstlinux-weston-myir.ext4 /mnt: V4 V! {/ C: L \, ?
- $ sudo cp ~/workspace/myir/MYiR-stm32-kernel/build/arch/arm/boot/dts/* /mnt0 Z; P+ ?# b5 a& U8 Z8 L6 J' C7 G
- $ sudo cp ~/workspace/myir/MYiR-stm32-kernel/build/arch/arm/boot/uImage /mnt
7 ]5 T( R! | y( j! e - $ sudo umount /mnt
复制代码
' e( f1 k2 y+ M$ x: W9 ^# d修改tsv文件,进更新引导程序和内核及其设备树。
" L' y- }3 @9 z
5 u5 y2 _4 A; @; q5 g
* ^9 s- S. e7 \0 m) }
3 r( U) h7 }0 q5 p8 X2 A
烧录5 X7 I" M' ~4 I# V3 \4 q
+ i% c3 x' g+ z$ {- W+ R% e2 c7 S
" y" c) j8 W+ J2 s% U% u
: Q+ R# g A) @0 H4 A5 D) I通过拨动开发板的Boot引脚,使开发板以USB DFU更新固件模式启动。
' p; J- n* M- e' g* u$ F7 H) R4 c% m* E. f1 h" n! A6 J y0 p9 z4 {: N
2 j( O1 w! r* f1 l( p" C
& M% m& o# F" ^$ M' H# `# e
+ { H0 T( N/ E- |* q$ g j
. K' l* t6 d, b* X, x+ k
烧录成功显示如下界面
# A7 d' `$ T: S0 v* B
+ i( |% z, T* q: Q, i
* [" X# ~3 C$ \* I) b
- L0 K, A7 g6 ~* f
对于linux内核,uboot和TFA的编译以及EXT4文件的更新都在linux操作系统下进行的,5 [! f f, X$ _+ w$ K" \* `+ J
而烧录开发板则使在windows环境下进行。
: _' ^+ |( i: s2 f' T+ x/ V2 U' x中间的文件传输使用的使samba服务器实现。; i+ n) W; e" p; e% P. G
————————————————9 k' x! Y" M3 v$ K5 |
版权声明:AgileTortoise }( F$ h' z$ E. W* R
- ^6 L+ g& p+ Z' ^" x9 h5 ~$ a& ]) H$ u) Y0 [3 N n- d& q: }
|