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

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

[复制链接]
STMCU小助手 发布时间:2022-10-4 15:05
基本流程" 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
20200923100437661.png 5 Q! F& ~6 T. H$ @6 @/ _

9 R3 V2 ~, J  `解压缩yocto-sdk 包
1 v' ~  K0 g* C' U' W
  1. $ 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
  1. $ cd stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sdk5 l6 v  s- ~! q: y! m4 A# u* ?8 @
  2. $ ./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* _
  1. $ 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
  1. $ arm-ostl-linux-gnueabi-gcc -v
    . J1 V( t0 d( Q5 ~( `; T: F
  2. Using build-in specs.
    8 s3 V7 b6 p& ?( p. q9 N
  3. COLLECT_GCC=arm-ostl-linux-gnueabi-gcc
    $ Q2 E7 L0 {( [$ H' S! r% M
  4. ......
    ) @" V+ L1 d( X! o+ h
  5. Thread model: posix; |" u. h) g) L& U' U1 \$ i2 N8 e. }
  6. gcc version 9.3.0(GCC)4 s* S- ~6 e7 o( ~, ~
  7. $
复制代码
# 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
20200923110320788.png 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
  1. $ tar xvf MYiR-STM32-kernel.tar.bz2 -C ~/workspace/myir3 i% L# R4 ^4 ]1 `0 A' r
  2. $ tar xvf MYiR-STM32-tf-a.tar.bz2 -C ~/workspace/myir/ s9 L( \+ }) S; a; S
  3. $ tar xvf MYiR-STM32-u-boot.tar.bz2 -C ~/workspace/myir
    ! S( E, j0 L, H
  4. $ ls
    + v* s# Q; ~4 x
  5. 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
  1. $ cd ~/workspace/myir/MYiR-stm32-tf-a/myir-ya157c-tf-a/
      {+ o* u) }, t. A
  2. $ make -f $PWD/../Makefile.sdk all2 e  u# m+ Q3 n4 {
  3. $ cd ../build/trusted/: t) D' N5 }: Y$ n( Z
  4. $ ls
    5 l7 f6 j4 [' N! U/ ]- `
  5. ......* U1 W/ [. O7 H3 w9 G0 ^
  6. tf-a-stm32mp157c-ya157c-512d-v2.bin3 C: D& |4 j' J
  7. tf-a-stm32mp157c-ya157c-512d-v2.elf
    % g: L) X# Q7 E$ C
  8. tf-a-stm32mp157c-ya157c-512d-v2.ld
    . u2 L9 D' k$ n( B
  9. tf-a-stm32mp157c-ya157c-512d-v2.map
    " O" L2 ]% ]& u" y
  10. tf-a-stm32mp157c-ya157c-512d-v2.stm32& Y8 ?) Z1 O. ~& p/ n, n
  11. tf-a-stm32mp157c-ya157c-512d-v2-trusted.stm32. ^* x6 e2 h& }! G
  12. ......- b' \! d- H4 D
  13. $
复制代码
) 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
  1. $ export KBUILD_OUTPUT=${PWD}/../build- ~3 q- p) L& h3 g  ^, {5 l9 R
  2. $ cd ~/workspace/myir/MYiR-stm32-u-boot/myir-ya157c-u-boot/
    + }( R5 v% w2 E; ~* F
  3. $ make stm32mp15_trusted_defconfig
    ( |* h! j1 x; c7 s9 y! T
  4. $ cd ../build
    . T- r% m& s+ d/ l. [/ Q
  5. $ make DEVICE_TREE=stm32mp157c-ya157c-512d-v2 all -j117 N" s1 B' J8 I+ q0 o$ w% s
  6. $ make -f ../Makefile.sdk all$ F3 E4 L" T) F5 c( `+ C1 g
  7. $ ls/ ]! A$ V7 }/ E+ ?8 n  Z8 }
  8. ...... u-boot  u-boot.bin  u-boot.stm32  ......# k1 ]- n; W6 t# E5 i* s2 b1 Y
  9. $
复制代码
/ 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
  1. $ cd ~/workspace/myir/MYiR-stm32-kernel/myir-ya157c-kernel/
    # i9 u! L" }3 h. R
  2. $ make ARCH=arm O=${PWM}/../build" myc-ya157c_defconfig& v( I# f: v! x1 P7 Z$ }
  3. $ cd ../build, G' k5 Y# _! t9 D
  4. $ make ARCH=arm LOADADDR=0xC2000040 uImage dtbs -j11) A6 t( X5 N0 n2 ^, f
  5. GEN    ./Makefile
    3 K% E2 g; y) a1 V
  6. ......
    ! G) z6 Y8 F& Z* D$ g% Y
  7. Kernel: arch/arm/boot/Image is ready
    % g. V" ^5 F/ I+ K/ `
  8. Kernel: arch/arm/boot/zImage is ready5 N& s' b5 M( E  Y, I$ \
  9. Kernel: arch/arm/boot/uImage is ready$ z: k0 }$ i7 ~# ?5 [3 r7 R, R
  10. $
复制代码
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 ~ 20200923153402164.png 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
2020092316253224.png . 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 ~
20200923163653552.png
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
20200923164638379.png
# 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
  1. $ sudo mount -o loop st-image-bootfs-openstlinux-weston-myir.ext4 /mnt: V4 V! {/ C: L  \, ?
  2. $ sudo cp ~/workspace/myir/MYiR-stm32-kernel/build/arch/arm/boot/dts/* /mnt0 Z; P+ ?# b5 a& U8 Z8 L6 J' C7 G
  3. $ sudo cp ~/workspace/myir/MYiR-stm32-kernel/build/arch/arm/boot/uImage /mnt
    7 ]5 T( R! |  y( j! e
  4. $ sudo umount /mnt
复制代码

' e( f1 k2 y+ M$ x: W9 ^# d修改tsv文件,进更新引导程序和内核及其设备树。
" L' y- }3 @9 z
5 u5 y2 _4 A; @; q5 g 20200923170534795.png * ^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 20200923153402175.png
" 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
20200923153825707.png
2 j( O1 w! r* f1 l( p" C
& M% m& o# F" ^$ M' H# `# e 20200923161109111.gif + {  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 20200923155609417.png * [" 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: }
收藏 评论0 发布时间:2022-10-4 15:05

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版