烧录OpenStLinux到Stm32mp157上

Posted 17岁boy想当攻城狮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了烧录OpenStLinux到Stm32mp157上相关的知识,希望对你有一定的参考价值。

STM32CubeProgrammer是ST官方专门为Corex-A stm32mp157这样高端系列开发的烧录工具

你需要到ST官方网站上下载STM32CubeProgrammer

ST官方下载地址:https://www.st.com/zh/development-tools/stm32cubeprog.html

注意下载的系统版本,下载完成之后默认安装就可以了

本文使用的Linux版本的STM32CubeProgrammer

在你生成镜像的文件夹tmp-glibc/deploy/images/stm32mp1中会生成一个flashlayout_你生成的镜像名,例如我生成的镜像名是st-image-core,那么对应的文件夹就是flashlayout_st-image-core

这个文件夹下有四个文件夹:

  1. deleteall

  1. extensible

  1. optee

  1. trusted

这几个都是flashlayout文件存放目录,每个目录里flashlayout布局使用的固件都不同,这些是ST根据不同的信息生成的不同固件的配置方法,其中optee和trusted是我们常用的,flashlayout以tsv文件格式作为存储,可以看到trusted目录下的内容

FlashLayout_emmc_stm32mp157a-ev1-trusted.tsv        FlashLayout_nor-sdcard_stm32mp157d-ev1-trusted.tsv
FlashLayout_emmc_stm32mp157c-ed1-trusted.tsv        FlashLayout_nor-sdcard_stm32mp157f-ev1-trusted.tsv
FlashLayout_emmc_stm32mp157c-ev1-trusted.tsv        FlashLayout_sdcard_stm32mp157a-dk1-trusted.tsv
FlashLayout_emmc_stm32mp157d-ev1-trusted.tsv        FlashLayout_sdcard_stm32mp157a-ev1-trusted.tsv
FlashLayout_emmc_stm32mp157f-ed1-trusted.tsv        FlashLayout_sdcard_stm32mp157c-dk2-trusted.tsv
FlashLayout_emmc_stm32mp157f-ev1-trusted.tsv        FlashLayout_sdcard_stm32mp157c-ed1-trusted.tsv
FlashLayout_nand-4-256_stm32mp157a-ev1-trusted.tsv  FlashLayout_sdcard_stm32mp157c-ev1-trusted.tsv
FlashLayout_nand-4-256_stm32mp157c-ev1-trusted.tsv  FlashLayout_sdcard_stm32mp157d-dk1-trusted.tsv
FlashLayout_nand-4-256_stm32mp157d-ev1-trusted.tsv  FlashLayout_sdcard_stm32mp157d-ev1-trusted.tsv
FlashLayout_nand-4-256_stm32mp157f-ev1-trusted.tsv  FlashLayout_sdcard_stm32mp157f-dk2-trusted.tsv
FlashLayout_nor-sdcard_stm32mp157a-ev1-trusted.tsv  FlashLayout_sdcard_stm32mp157f-ed1-trusted.tsv
FlashLayout_nor-sdcard_stm32mp157c-ev1-trusted.tsv  FlashLayout_sdcard_stm32mp157f-ev1-trusted.tsv

这些文件就是STM32CubeProgrammer烧写文件,STM32CubeProgrammer会读取文件里的内容进行烧写,这里emmc、nand这些是flash的型号

在刷写之前根据你的板子拨码开关拨码到指定位置,这里我使用的是usb下载模式

我的flash是emmc的,所以我使用的是flash_emmc*的配置文件,这里打开配置文件看一下,如果你的是定制板那么可以向厂商索要这个文件

可以看到内容如下:

#Opt   Id      Name    Type    IP      Offset  Binary
-       0x01    fsbl1-boot      Binary  none    0x0     arm-trusted-firmware/tf-a-stm32mp157f-ev1-serialboot.stm32
-       0x03    ssbl-boot       Binary  none    0x0     bootloader/u-boot-stm32mp157f-ev1-trusted.stm32
P       0x04    fsbl1   Binary  mmc1    boot1   arm-trusted-firmware/tf-a-stm32mp157f-ed1-trusted.stm32
P       0x05    fsbl2   Binary  mmc1    boot2   arm-trusted-firmware/tf-a-stm32mp157f-ed1-trusted.stm32
PD      0x06    ssbl    Binary  mmc1    0x00080000      bootloader/u-boot-stm32mp157f-ed1-trusted.stm32
P       0x21    boot    System  mmc1    0x00280000      st-image-bootfs-openstlinux-eglfs-stm32mp1.ext4
P       0x22    vendorfs        FileSystem      mmc1    0x04280000      st-image-vendorfs-openstlinux-eglfs-stm32mp1.ext4
P       0x23    rootfs  FileSystem      mmc1    0x05280000      st-image-core-openstlinux-eglfs-stm32mp1.ext4
P       0x24    userfs  FileSystem      mmc1    0x33C80000      st-image-userfs-openstlinux-eglfs-stm32mp1.ext4

意义:

Opt:烧写状态标识符

Id:烧写ID

Name:分区名称

Type:分区类型

IP:那个存储设备

Offset:烧写到磁盘那个位置

Binary:烧写的文件

其中FileSystem里存储的就是具有根文件系统的内核文件

ST官方参考wiki:https://wiki.st.com/stm32mpu/wiki/STM32CubeProgrammer_flashlayout

将你的下载线插入到Host主机上并确保拨码开关正确,使用lsusb查看设备

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 008: ID 8087:0aaa Intel Corp.
Bus 001 Device 006: ID 048d:5702 Integrated Technology Express, Inc. ITE Device
Bus 001 Device 004: ID 05e3:0608 Genesys Logic, Inc. Hub
Bus 001 Device 020: ID 0483:df11 STMicroelectronics STM Device in DFU Mode
Bus 001 Device 003: ID 05e3:0608 Genesys Logic, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

可以看到Bus 001 Device 020: ID 0483:df11 STMicroelectronics STM Device in DFU Mode的字样,这个就是STM32的otg usb下载设备

接下来就可以进行烧录了,使用STM32_Programmer_CLI这个工具进行烧录,在STM32CubeProgrammer安装目录下的bin文件夹下,这个是CUI工具你也可以使用STM32CubeProgrammer是GUI工具,需要Java的支持

注意需要使用sudo,因为要访问usb设备

sudo STM32_Programmer_CLI -c port=usb1 -w ./flashlayout_st-image-core/trusted/FlashLayout_emmc_stm32mp157c-ed1-trusted.tsv

这里解释一下命令:-c是指定usb设备,-w是指定flash_layout文件路径

第一次烧录卡在了这里:

Memory Programming ...
Opening and parsing file: tf-a-stm32mp157d-ev1-serialboot.stm32
  File          : tf-a-stm32mp157d-ev1-serialboot.stm32
  Size          : 232.32 KB
  Partition ID  : 0x01
 
Download in Progress:
[==================================================] 100%
 
File download complete
Time elapsed during download operation: 00:00:01.033
 
RUNNING Program ...
  PartID:      :0x01
Error: Start operation failed at partition 0x01
Error: TSV flashing service failed

这个原因是因为我的板子是定制板,我联系了厂商获得了tf-a-serialboot的固件文件替换后就可以了,替换之后烧录u-boot卡在了这个地方:

File download complete
Time elapsed during download operation: 00:00:01.007
 
RUNNING Program ...
  PartID:      :0x01
Start operation done successfully at partition 0x01
 
Flashlayout Programming ...
[==================================================] 100%
Running Flashlayout Partition ...
Flashlayout partition started successfully
 
 
Memory Programming ...
Opening and parsing file: u-boot-stm32mp157d-ev1-trusted.stm32
  File          : u-boot-stm32mp157d-ev1-trusted.stm32
  Size          : 888.06 KB
  Partition ID  : 0x03
 
Download in Progress:
[==================================================] 100%
 
File download complete
Time elapsed during download operation: 00:00:00.964
 
RUNNING Program ...
  PartID:      :0x03
 
Reconnecting the device ...

一直卡在Reconnecting the device,最后过一会就失败了,联系厂商之后换了新的u-boot固件仍然如此,这个问题产生的原因是因为STM32CubeProgrammer使用u-boot来初始化emmc_flash和下载内核与根文件系统到flash里

下图为stm32 corx-a7系列的启动过程

可以通过ROM方面的启动流程发现它做的事情只有初始化DDR、网络、USB等基础设施,并不会去初始化flash与启动内核

所以烧录内核方面的工作就要由u-boot来完成

你可以在u-boot的源代码里看到如下的code:

static int abortboot_normal(int bootdelay)

int abort = 0;
unsigned long ts;
 
#ifdef CONFIG_MENUPROMPT
printf(CONFIG_MENUPROMPT);
#else
if (bootdelay >= 0)
printf("Hit any key to stop autoboot: %2d ", bootdelay);
#endif
 
#if defined CONFIG_ZERO_BOOTDELAY_CHECK
/*
* Check if key already pressed
* Don't check if bootdelay < 0
*/
if (bootdelay >= 0) 
if (tstc())  /* we got a key press */
(void) getc(); /* consume input */
puts("\\b\\b\\b 0");
abort = 1; /* don't auto boot */


#endif
 
while ((bootdelay > 0) && (!abort)) 
--bootdelay;
/* delay 1000 ms */
ts = get_timer(0);
do 
if (tstc())  /* we got a key press */
abort = 1; /* don't auto boot */
bootdelay = 0; /* no more delay */
# ifdef CONFIG_MENUKEY
menukey = getc();
# else
(void) getc(); /* consume input */
# endif
break;

udelay(10000);
 while (!abort && get_timer(ts) < 1000);
 
printf("\\b\\b\\b%2d ", bootdelay);

 
putc('\\n');
 
#ifdef CONFIG_SILENT_CONSOLE
if (abort)
gd->flags &= ~GD_FLG_SILENT;
#endif
 
return abort;

这段code位于u-boot/common/autoboot.c文件之中,它的作用就是u-boot启动时等待1000毫秒,在这个过程中如果串口有任意输入则进入命令模式

STM32CubeProgrammer就是利用u-boot命令功能来下载内核与根文件系统的,所以你的开发板需要接入串口到PC上才能完成下载,当我将串口接入以后就可以正常下载了,下图为正常下载的过程:

等待几分钟刷写完成之后会输出如下内容:

随后将拨码开关拨到EMMC启动并板子

重启后串口输出:

以上是关于烧录OpenStLinux到Stm32mp157上的主要内容,如果未能解决你的问题,请参考以下文章

移植OpenStLinux到Stm32Mp157上

STM32MP157开发笔记 | 02 - uboot和linux内核编译

STM32MP157开发笔记 | 04 - TF-Aubootlinux内核源码获取编译烧写

STM32MP157开发笔记 | 04 - TF-Aubootlinux内核源码获取编译烧写

STM32MP157开发笔记 | 04 - TF-Aubootlinux内核源码获取编译烧写

使用 DWT CYCCNT 在 STM32MP1 中进行精确时间测量