基本流程
5 X& g* {5 b( ^6 ]( J1 n9 {0 G8 z编译开发板提供的内核源码
3 [1 [6 p0 E! |' v* |& o# b* F准备编译所需工具链' u+ j6 N! i2 T4 h4 r
编译tf-a
. U/ ]3 `' T8 c) L8 c- K8 [" D8 i编译uboot: s8 t' r( K+ v, k' |
编译linux-kernel9 | H& w: c# Y/ ^- ?
准备编译所需工具链. X8 R5 \0 D: b( }
ubuntu环境下,下载yocto SDK4 p& j( I2 u. k; C W9 V" w- O% b
7 j' u- }3 L, ]
! F4 @$ t& k1 h3 }' d+ M7 g" H( W
# q c! g9 P9 s8 ^# J解压缩yocto-sdk 包# Y4 } `9 G$ v3 y/ q& y
- $ tar xvf en.SDK-x86_64-stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24.tar.xz
复制代码 t$ B, F3 J2 b) Y8 K& ^
安装yocto-sdk
( d8 s$ r9 A! i, ^; j; {! `& g- $ cd stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sdk" k. I- I, G3 j0 o. M, ?; Q$ L
- $ ./st-image-weston-openstlinux-weston-stm32mp1-x86_64-toolchain-3.1-openstlinux-5.4-dunfell-mp1-20-06-24.sh
复制代码 9 o8 `" K+ c4 M, c Y. O
设置yocto-sdk为默认环境- |3 p" e' w6 n' O
- $ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
复制代码
# [6 l- H2 P% C% p8 E% x验证yocto-sdk开发环境
# @8 i' o9 }+ r3 |, U- $ arm-ostl-linux-gnueabi-gcc -v
! y' o" r7 x1 R( V& s1 V* i - Using build-in specs.
( y0 k h. D2 ^$ G+ a) i) Z+ z3 l - COLLECT_GCC=arm-ostl-linux-gnueabi-gcc
' N8 i: `5 }$ ^( G( h! ? - ......; E9 u8 t# B# @
- Thread model: posix
; G6 y* x( W# |' N* N" t$ } - gcc version 9.3.0(GCC)
+ O5 ~" o, b; F$ v - $
复制代码
' Z( x5 m# d8 G) X
2 A. q; m+ V! ^+ o k1 t所需要的tf-a、u-boot和kernel源代码在下载目录的MYD-YA157C\04-Sources目录中4 G: H- m0 g3 m' R
. N4 |& u. O) u" Y
% L0 M% b$ h) H9 R, {2 W, C: `
. P: ?/ f9 F, D8 _% Y3 O2 Q
解压MYiR开发板提供的源代码到工作空间
8 @0 ^4 o8 m, }) A1 j) B- W7 y- $ tar xvf MYiR-STM32-kernel.tar.bz2 -C ~/workspace/myir R% r/ w2 {, P/ L7 R" h
- $ tar xvf MYiR-STM32-tf-a.tar.bz2 -C ~/workspace/myir: |6 }( ~& h/ U1 x
- $ tar xvf MYiR-STM32-u-boot.tar.bz2 -C ~/workspace/myir
1 M g6 X- L; O - $ ls
$ c o3 c, v" a, Q Q - MYiR-stm32-kernel MYiR-stm32-tf-a MYiR-stm32-uboot
复制代码
% z* u4 [' z$ l' u% w* [: u- `8 R编译tf-a8 m1 K. o, X3 d" d) ^5 M6 V
- $ cd ~/workspace/myir/MYiR-stm32-tf-a/myir-ya157c-tf-a/
: W$ w! R: Z; v3 F% r+ ? - $ make -f $PWD/../Makefile.sdk all
9 o+ O& t1 o* K2 n - $ cd ../build/trusted/
* a" r* ]0 D* M! { - $ ls
( w: g6 V8 k9 g - ......' h* G* ]. F1 q" N
- tf-a-stm32mp157c-ya157c-512d-v2.bin# |# K/ F! I3 ^7 W/ x3 X
- tf-a-stm32mp157c-ya157c-512d-v2.elf
1 D# N4 v$ M0 e' `" ~" m0 B9 X - tf-a-stm32mp157c-ya157c-512d-v2.ld, ~6 N2 |5 r, i: y
- tf-a-stm32mp157c-ya157c-512d-v2.map
5 v+ |. |/ o7 c: m' J! P4 T - tf-a-stm32mp157c-ya157c-512d-v2.stm32
: {: q `4 }* W - tf-a-stm32mp157c-ya157c-512d-v2-trusted.stm32
$ W: Z* C7 e, l0 B/ Y: e C - ......
) t1 g/ R# l; h, `5 Z* C F. _ - $
复制代码
' s& f" f% y( A0 Q. \+ o最终生成所需要的tf-a-stm32mp157c-ya157c-512d-v2.stm32
% a: @3 b" j. d. A, ^7 V
4 y% p0 r( w) n4 W编译u-boot0 t) W1 L/ ^/ u3 K5 t
在build文件夹中构建和生成u-boot
* G! P0 _! G& D' f" z6 d. v# G+ Z- $ export KBUILD_OUTPUT=${PWD}/../build
5 Q* |+ O6 T5 B. r3 q& t) x - $ cd ~/workspace/myir/MYiR-stm32-u-boot/myir-ya157c-u-boot/
! l0 K: _' `/ K0 P. P. o5 \+ [ - $ make stm32mp15_trusted_defconfig
3 W1 i5 f4 r% s3 y" y" c - $ cd ../build
7 P m8 h, @ W+ {$ A - $ make DEVICE_TREE=stm32mp157c-ya157c-512d-v2 all -j11
8 @/ T( |0 f0 F# } - $ make -f ../Makefile.sdk all
% y1 W7 T" J, A6 X0 M0 G- Y - $ ls% M: m% f* T5 F, K7 H
- ...... u-boot u-boot.bin u-boot.stm32 ......5 c4 e$ _" Y( ^$ b" [5 X1 ?; m
- $
复制代码
# v- I" x( \1 L% d生成所需要的 u-boot.stm32文件' r ]( W2 C+ R$ ^0 U
, h6 `3 Q" W7 T( C编译linux-kernel
2 q- B/ {( }# F2 r7 @# B在build文件夹中构建和生成linux内核
- |, V* v0 o% w1 ~2 R/ R. d6 x4 p. M5 m1 Q* F& P
- $ cd ~/workspace/myir/MYiR-stm32-kernel/myir-ya157c-kernel/
$ f+ |! V1 u% q* F8 [0 y3 M& X - $ make ARCH=arm O=${PWM}/../build" myc-ya157c_defconfig/ D6 `1 U/ }- Z9 l* w0 r" A; E
- $ cd ../build' d$ d( h' n( G
- $ make ARCH=arm LOADADDR=0xC2000040 uImage dtbs -j11
1 k# I k+ @% k - GEN ./Makefile; S/ V5 P" }) ~+ y; H* N: |' [
- ......
9 ~/ u+ L) ?6 d& X - Kernel: arch/arm/boot/Image is ready
, q" @. V+ X4 C6 {, v, e$ a - Kernel: arch/arm/boot/zImage is ready7 G/ o, N, W* K/ b* B0 U
- Kernel: arch/arm/boot/uImage is ready( k9 g. O z% i9 B( q
- $
复制代码
9 ?& Z- i) y: e" v0 u W! v根据MYiR开发板硬件资源的预设文件myc-ya157c_defconfig,将内核配置完成。
: Z% a4 P' d7 f, S. t( a备注:myc-ya157c_defconfig预设配置文件位于kernel目录的arch/arm/configs/目录下5 w* g3 l3 l2 u2 X# ^; A) H( f
! W2 [, ]! M0 I3 P$ Y准备镜像用于烧录
, u& c z5 _. V) z9 M关于烧录工具
$ w! q( p6 Q, ]7 p6 h烧录内核所使用的工具是STM32CubeProgrammer
- j0 G: ?$ p7 }( B, x
- H6 T0 I! n1 w- `
8 s5 K( z& j1 ?) m* r" Y0 u8 r# p$ Q# o( @$ j) f! d
准备烧录镜像列表文件(tsv)。这里推荐基于开发板提供的修改。tsv格式文件通过excel打开,如下图所示。& F% H5 t, A! M
8 I5 b/ H' L8 _
7 o V) r# y" f' w3 T
; @' C% }" v/ i$ y8 A# X; w. N一般的,对于需要更新的分区,#Opt一列设置为P,如上图所示,第一阶段引导TF-A固件,第二阶段引导程序U-Boot以及包含内核在内的根文件系统都是需要分别更新到emmc存储设备的各个分区中。
& W: x* R4 N4 n: Z7 E
; a4 S% c4 G9 ?) a5 R" [/ A: M只更新内核
$ M5 f2 B5 o+ I8 Z0 p) c* I% }% q8 D) u只需要保留包含内核文件系统分区的#Opt为P而其他分区为PE
5 K8 C. M8 T$ l* F/ H/ L8 W! B |3 A, p
: Z/ Q* _ y6 B: f2 j. Z
+ {) g7 M; @5 a% E) Y
注意:如果想要保留原本分区的内容,必须将#Opt内容设置为PE,而不能设置成为-5 l* X; j8 D) W, }( F
# _- l- s5 w5 U准备镜像用于更新引导程序和内核! I$ F, d" w: y/ A
以MYiR-YA157C-V2-weston发布版本为模板,创建一个副本命名为my-weston
% k* w" X( a5 K( m, V
. Y @. W+ t; g1 B
1 W: y- J6 z9 y; e# j1 Z% e) Y- q
1 H7 F; |' o- o/ A! J5 l4 z拷贝之前生成的tf-a镜像文件,u-boot镜像文件到my-weston中
% L9 N! Y* F) }7 t: w6 ~; Y将更新后的ext4文件拷贝到my-weston文件夹
3 e i/ y4 T3 J) U* n4 T拷贝st-image-bootfs-openstlinux-weston-myir.ext4到linux环境中。1
) U, u& J2 D) H- D5 S- $ sudo mount -o loop st-image-bootfs-openstlinux-weston-myir.ext4 /mnt2 B. j) q9 L6 K4 [0 R. D
- $ sudo cp ~/workspace/myir/MYiR-stm32-kernel/build/arch/arm/boot/dts/* /mnt5 ?: ?4 ]4 M. l* N# y
- $ sudo cp ~/workspace/myir/MYiR-stm32-kernel/build/arch/arm/boot/uImage /mnt
8 i$ j+ Q+ d) N+ \, H1 t/ ] - $ sudo umount /mnt
复制代码 + Z) k! r% R) { K
修改tsv文件,进更新引导程序和内核及其设备树。# f& F, {( W* f9 Z5 _6 U0 Q0 M$ G
1 T: f. I e& F5 f
/ p3 L: L/ Y' j2 S% _7 Y# F( `4 G [
G* g0 X3 H2 t- T O
烧录" ^- _. n9 o$ Q% \! `% N% V
" j% u0 z( z. B- M
& i" Q# L; _5 p( v
$ L$ g4 V$ U; N q' U通过拨动开发板的Boot引脚,使开发板以USB DFU更新固件模式启动。
; d3 g S2 ~ I Q3 V) G4 g4 }4 Y: L9 X( T) X, D5 E% z
, r# h/ C& Y/ S$ I) T4 d" _
% P: q. w* H" I8 s
* H9 U% c. J9 V, N Q$ A2 Q! {3 s b
2 I9 H4 W9 F5 Q- ^2 S$ p" f烧录成功显示如下界面
# Y, d4 Z/ F' U( w; g. E J4 d
7 d5 T7 d+ ^4 t) [
2 _. ?- ^, A+ |0 [) N# v9 H9 @; N
对于linux内核,uboot和TFA的编译以及EXT4文件的更新都在linux操作系统下进行的,0 U% N/ V1 H& Y- l' d7 m( [$ l
而烧录开发板则使在windows环境下进行。/ E6 a0 i N+ M+ Q& @7 w8 @1 E
中间的文件传输使用的使samba服务器实现。
. B' G9 M+ u+ \2 E( l V————————————————
7 V1 O/ A# N. B- P+ L版权声明:AgileTortoise
( v& L1 {/ b5 O+ h" m& N+ @ G6 |! a2 ~# V* x! F
0 p7 P& e, F% g, @8 w$ y |