你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32MP157系列编译和烧录自定义的bootloader、linux内核及其设备树

[复制链接]
STMCU小助手 发布时间:2022-10-4 15:05
基本流程
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, ] 20200923100437661.png
! F4 @$ t& k1 h3 }' d+ M7 g" H( W
# q  c! g9 P9 s8 ^# J解压缩yocto-sdk 包# Y4 }  `9 G$ v3 y/ q& y
  1. $ 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
  1. $ cd stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sdk" k. I- I, G3 j0 o. M, ?; Q$ L
  2. $ ./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
  1. $ 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
  1. $ arm-ostl-linux-gnueabi-gcc -v
    ! y' o" r7 x1 R( V& s1 V* i
  2. Using build-in specs.
    ( y0 k  h. D2 ^$ G+ a) i) Z+ z3 l
  3. COLLECT_GCC=arm-ostl-linux-gnueabi-gcc
    ' N8 i: `5 }$ ^( G( h! ?
  4. ......; E9 u8 t# B# @
  5. Thread model: posix
    ; G6 y* x( W# |' N* N" t$ }
  6. gcc version 9.3.0(GCC)
    + O5 ~" o, b; F$ v
  7. $
复制代码

' 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
20200923110320788.png % 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
  1. $ tar xvf MYiR-STM32-kernel.tar.bz2 -C ~/workspace/myir  R% r/ w2 {, P/ L7 R" h
  2. $ tar xvf MYiR-STM32-tf-a.tar.bz2 -C ~/workspace/myir: |6 }( ~& h/ U1 x
  3. $ tar xvf MYiR-STM32-u-boot.tar.bz2 -C ~/workspace/myir
    1 M  g6 X- L; O
  4. $ ls
    $ c  o3 c, v" a, Q  Q
  5. 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
  1. $ cd ~/workspace/myir/MYiR-stm32-tf-a/myir-ya157c-tf-a/
    : W$ w! R: Z; v3 F% r+ ?
  2. $ make -f $PWD/../Makefile.sdk all
    9 o+ O& t1 o* K2 n
  3. $ cd ../build/trusted/
    * a" r* ]0 D* M! {
  4. $ ls
    ( w: g6 V8 k9 g
  5. ......' h* G* ]. F1 q" N
  6. tf-a-stm32mp157c-ya157c-512d-v2.bin# |# K/ F! I3 ^7 W/ x3 X
  7. tf-a-stm32mp157c-ya157c-512d-v2.elf
    1 D# N4 v$ M0 e' `" ~" m0 B9 X
  8. tf-a-stm32mp157c-ya157c-512d-v2.ld, ~6 N2 |5 r, i: y
  9. tf-a-stm32mp157c-ya157c-512d-v2.map
    5 v+ |. |/ o7 c: m' J! P4 T
  10. tf-a-stm32mp157c-ya157c-512d-v2.stm32
    : {: q  `4 }* W
  11. tf-a-stm32mp157c-ya157c-512d-v2-trusted.stm32
    $ W: Z* C7 e, l0 B/ Y: e  C
  12. ......
    ) t1 g/ R# l; h, `5 Z* C  F. _
  13. $
复制代码

' 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
  1. $ export KBUILD_OUTPUT=${PWD}/../build
    5 Q* |+ O6 T5 B. r3 q& t) x
  2. $ cd ~/workspace/myir/MYiR-stm32-u-boot/myir-ya157c-u-boot/
    ! l0 K: _' `/ K0 P. P. o5 \+ [
  3. $ make stm32mp15_trusted_defconfig
    3 W1 i5 f4 r% s3 y" y" c
  4. $ cd ../build
    7 P  m8 h, @  W+ {$ A
  5. $ make DEVICE_TREE=stm32mp157c-ya157c-512d-v2 all -j11
    8 @/ T( |0 f0 F# }
  6. $ make -f ../Makefile.sdk all
    % y1 W7 T" J, A6 X0 M0 G- Y
  7. $ ls% M: m% f* T5 F, K7 H
  8. ...... u-boot  u-boot.bin  u-boot.stm32  ......5 c4 e$ _" Y( ^$ b" [5 X1 ?; m
  9. $
复制代码

# 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
  1. $ cd ~/workspace/myir/MYiR-stm32-kernel/myir-ya157c-kernel/
    $ f+ |! V1 u% q* F8 [0 y3 M& X
  2. $ make ARCH=arm O=${PWM}/../build" myc-ya157c_defconfig/ D6 `1 U/ }- Z9 l* w0 r" A; E
  3. $ cd ../build' d$ d( h' n( G
  4. $ make ARCH=arm LOADADDR=0xC2000040 uImage dtbs -j11
    1 k# I  k+ @% k
  5. GEN    ./Makefile; S/ V5 P" }) ~+ y; H* N: |' [
  6. ......
    9 ~/ u+ L) ?6 d& X
  7. Kernel: arch/arm/boot/Image is ready
    , q" @. V+ X4 C6 {, v, e$ a
  8. Kernel: arch/arm/boot/zImage is ready7 G/ o, N, W* K/ b* B0 U
  9. Kernel: arch/arm/boot/uImage is ready( k9 g. O  z% i9 B( q
  10. $
复制代码

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- ` 20200923153402164.png
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 _
2020092316253224.png
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
20200923163653552.png : 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 20200923164638379.png
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
  1. $ sudo mount -o loop st-image-bootfs-openstlinux-weston-myir.ext4 /mnt2 B. j) q9 L6 K4 [0 R. D
  2. $ sudo cp ~/workspace/myir/MYiR-stm32-kernel/build/arch/arm/boot/dts/* /mnt5 ?: ?4 ]4 M. l* N# y
  3. $ sudo cp ~/workspace/myir/MYiR-stm32-kernel/build/arch/arm/boot/uImage /mnt
    8 i$ j+ Q+ d) N+ \, H1 t/ ]
  4. $ 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
20200923170534795.png / 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 20200923153402175.png & 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
20200923153825707.png
, r# h/ C& Y/ S$ I) T4 d" _
% P: q. w* H" I8 s 20200923161109111.gif * 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) [ 20200923155609417.png
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
赞 收藏 评论0 发布时间:2022-10-4 15:05

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版