STM32MP157系列编译和烧录自定义的bootloader、linux内核及其设备树
本文操作步骤基于米尔开发板MYD-YA157C-V2,
目录
基本流程
编译开发板提供的内核源码
- 准备编译所需工具链
- 编译tf-a
- 编译uboot
- 编译linux-kernel
准备编译所需工具链
- ubuntu环境下,下载yocto SDK
- 解压缩yocto-sdk 包
$ tar xvf en.SDK-x86_64-stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24.tar.xz
- 安装yocto-sdk
$ cd stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sdk
$ ./st-image-weston-openstlinux-weston-stm32mp1-x86_64-toolchain-3.1-openstlinux-5.4-dunfell-mp1-20-06-24.sh
- 设置yocto-sdk为默认环境
$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
- 验证yocto-sdk开发环境
$ arm-ostl-linux-gnueabi-gcc -v
Using build-in specs.
COLLECT_GCC=arm-ostl-linux-gnueabi-gcc
......
Thread model: posix
gcc version 9.3.0(GCC)
$
- 从MYiR官方资料链接下载开发板源代码
所需要的tf-a、u-boot和kernel源代码在下载目录的MYD-YA157C\04-Sources
目录中
- 解压MYiR开发板提供的源代码到工作空间
$ tar xvf MYiR-STM32-kernel.tar.bz2 -C ~/workspace/myir
$ tar xvf MYiR-STM32-tf-a.tar.bz2 -C ~/workspace/myir
$ tar xvf MYiR-STM32-u-boot.tar.bz2 -C ~/workspace/myir
$ ls
MYiR-stm32-kernel MYiR-stm32-tf-a MYiR-stm32-uboot
编译tf-a
$ cd ~/workspace/myir/MYiR-stm32-tf-a/myir-ya157c-tf-a/
$ make -f $PWD/../Makefile.sdk all
$ cd ../build/trusted/
$ ls
......
tf-a-stm32mp157c-ya157c-512d-v2.bin
tf-a-stm32mp157c-ya157c-512d-v2.elf
tf-a-stm32mp157c-ya157c-512d-v2.ld
tf-a-stm32mp157c-ya157c-512d-v2.map
tf-a-stm32mp157c-ya157c-512d-v2.stm32
tf-a-stm32mp157c-ya157c-512d-v2-trusted.stm32
......
$
最终生成所需要的tf-a-stm32mp157c-ya157c-512d-v2.stm32
编译u-boot
- 在build文件夹中构建和生成u-boot
$ export KBUILD_OUTPUT=${PWD}/../build
$ cd ~/workspace/myir/MYiR-stm32-u-boot/myir-ya157c-u-boot/
$ make stm32mp15_trusted_defconfig
$ cd ../build
$ make DEVICE_TREE=stm32mp157c-ya157c-512d-v2 all -j11
$ make -f ../Makefile.sdk all
$ ls
...... u-boot u-boot.bin u-boot.stm32 ......
$
生成所需要的 u-boot.stm32
文件
编译linux-kernel
在build文件夹中构建和生成linux内核
$ cd ~/workspace/myir/MYiR-stm32-kernel/myir-ya157c-kernel/
$ make ARCH=arm O=${PWM}/../build" myc-ya157c_defconfig
$ cd ../build
$ make ARCH=arm LOADADDR=0xC2000040 uImage dtbs -j11
GEN ./Makefile
......
Kernel: arch/arm/boot/Image is ready
Kernel: arch/arm/boot/zImage is ready
Kernel: arch/arm/boot/uImage is ready
$
根据MYiR开发板硬件资源的预设文件myc-ya157c_defconfig
,将内核配置完成。
备注:myc-ya157c_defconfig预设配置文件位于kernel目录的arch/arm/configs/目录下
准备镜像用于烧录
关于烧录工具
- 烧录内核所使用的工具是STM32CubeProgrammer
- 准备烧录镜像列表文件(tsv)。这里推荐基于开发板提供的修改。tsv格式文件通过excel打开,如下图所示。
一般的,对于需要更新的分区,#Opt
一列设置为P
,如上图所示,第一阶段引导TF-A固件,第二阶段引导程序U-Boot以及包含内核在内的根文件系统都是需要分别更新到emmc存储设备的各个分区中。 - 只更新内核
只需要保留包含内核文件系统分区的#Opt
为P
而其他分区为PE
注意:如果想要保留原本分区的内容,必须将#Opt
内容设置为PE
,而不能设置成为-
准备镜像用于更新引导程序和内核
- 以MYiR-YA157C-V2-weston发布版本为模板,创建一个副本命名为my-weston
- 拷贝之前生成的tf-a镜像文件,u-boot镜像文件到my-weston中
- 将更新后的ext4文件拷贝到my-weston文件夹
拷贝st-image-bootfs-openstlinux-weston-myir.ext4到linux环境中。1
$ sudo mount -o loop st-image-bootfs-openstlinux-weston-myir.ext4 /mnt
$ sudo cp ~/workspace/myir/MYiR-stm32-kernel/build/arch/arm/boot/dts/* /mnt
$ sudo cp ~/workspace/myir/MYiR-stm32-kernel/build/arch/arm/boot/uImage /mnt
$ sudo umount /mnt
- 修改tsv文件,进更新引导程序和内核及其设备树。
烧录
通过拨动开发板的Boot引脚,使开发板以USB DFU更新固件模式启动。
- 烧录成功显示如下界面
对于linux内核,uboot和TFA的编译以及EXT4文件的更新都在linux操作系统下进行的,
而烧录开发板则使在windows环境下进行。
中间的文件传输使用的使samba服务器实现。 ↩︎