移植OpenStLinux到Stm32Mp157上
Posted 17岁boy想当攻城狮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了移植OpenStLinux到Stm32Mp157上相关的知识,希望对你有一定的参考价值。
OpenstLinux是st官方提供的基于Yocto和Debian构建的发行版Linux操作系统,专门为Stm32Mp1系列研发的操作系统,这里解释一下为什么OpenstLinux使用了两种构建方式,OpenstLinux使用了Yocto的Bitbake工具来进行编译方面的构建,在运行阶段使用了Debian项目下的开源应用例如apt-get
Github地址:https://github.com/STMicroelectronics/oe-manifest
官方Wiki地址:https://wiki.st.com/stm32mpu/index.php/OpenSTLinux_distribution
它与普通的Github项目不一样,它是使用tags来存放源代码的,可以在Github下看到有许多tags:
可以使用repo来对它们进行拉取,这里我使用的tags是openstlinux-5.4-dunfell-mp1-22-05-20
注意后面的dunfell是Yocto里的分支名称
在拉取之前下载最新版本的repo,建议不要从ubuntu官方源里下载,有可能会导致拉取不了code
curl https://storage.googleapis.com/git-repo-downloads/repo > ./repo
chmod +x ./repo
sudo mv ./repo /usr/bin
初始化仓库
mkdir openstlinux-5.4-dunfell-mp1-22-05-20
cd openstlinux-5.4-dunfell-mp1-22-05-20
repo init -u https://github.com/STMicroelectronics/oe-manifest.git -b refs/tags/openstlinux-5.4-dunfell-mp1-21-12-22
初始化成功的话会输出以下内容:
Downloading Repo source from https://gerrit.googlesource.com/git-repo
Your identity is: Bonanza <bonanza@example.com>
If you want to change this, please re-run 'repo init' with --config-name
repo has been initialized in /media/sda_2TB/zhihao_work/train/openstlinux-5.4-dunfell-mp1-22-05-20
接着同步仓库:
repo sync -j4
在同步时可能会出现错误:
可以先忽略这个错误,等同步完成之后执行如下命令:
repo sync -j4 --fail-fast
执行完成之后输出如下内容就代表同步成功了
Fetching: 100% (9/9), done in 2m27.334s
repo sync has finished successfully.
同步完成之后我们设置一下DISTRO、MACHINE
这两个值可以在Stm32官方的Wiki文档里找到:
MACHINE:
DISTRON:
你还可以找到关于IMAGES的支持值:
这里构建了一个没有任何UI界面的OpenstLinux
export DISTRO=openstlinux-eglfs
export MACHINE=stm32mp1
source layers/meta-st/scripts/envsetup.sh
执行source layers/meta-st/scripts/envsetup.sh命令时可能会出现警告
这意味着我们缺少某些安装包,按照提示输入y按下回车,然后把提示缺失的软件安装上
sudo apt-get install python3-git
重新执行之后会让你接受许可,因为OpenstLinux是受到开源协议保护的,接受之后会输出如下内容
接下来构建一个镜像文件,还是和Yocto一样,确保你的网络是科学上网的同时要保证磁盘可用空间大于100GB
bitbake st-image-core
在构建过程中可能会有错误:
这个原因可能是因为网络不稳定导致的,当构建完成之后再次构建一次就可以了
构建完成之后会自动生成build目录并且进入到build目录中,在build目录里有有一个tmp-glibc的文件夹,这个文件夹其实就对应了Yocto里的tmp文件,文件体系是一样的这里就不做过多介绍了
镜像文件就存在于:deploy/images/stm32mp1文件夹中
上述的编译过程是基础的编译过程,还不足以让openstlinux运行到板子上,因为缺少u-boot,默认的编译不会去编译这些需要我们自己去提供同时还要定制化tf-a安全固件校验服务,当然在Yocto上这些是非常简单的
接下来我们需要对tf-a、u-boot进行修改,openstlinux已经为我们提供好了适配的tf-a、u-boot,使用devtool工具来检索一下:
devtool search tf-a*
可以看到检索到了许多适配的tf-a源码
根据你板子的信息来找到适合你板子的recipe,我的板子是a系列的stm32mp1,所以这里使用的是tf-a-stm32mp Trusted Firmware-A for STM32MP1这个recipe
Yocto的好处就在于你可以不用修改源代码就可以直接进行适配,但是有个前提你的板子必须是已经完成适配的,如果是定制板则需要自己来完成适配
使用如下命令即可开始自动完成源码修改
devtool modify tf-a-stm32mp
修改完成之后会在build目录下生成workspace目录,在这个目录下的source子目录里存放了修改后的tf-a源代码,如果你的是定制板,例如是基于stm32mp1系列定制的板子比如韦东山,正电原子这些,你可能需要向这些厂商索要支持固件或者自己到源代码目录进行修改以确保你的板子是支持的,同时你也可以向这些厂商索要源代码替换到source目录下然后在进行build也是可以的
将修改后的tf-a进行编译
devtool build tf-a-stm32mp
编译完成之后会输出到workspace/sources/tf-a-stm32mp/oe-workdir/deploy-tf-a-stm32mp目录下
最后我们要在进行部署到deploy
bitbake tf-a-stm32mp -c deploy
部署之后会输出到:tmp-glibc/deploy/images/stm32mp1/arm-trusted-firmware目录下
紧接着在对tf-a-stm32mp-serialboot进行修改,步骤与上面一直,下述就不做详细介绍,给出代码一步到位
devtool modify tf-a-stm32mp-serialboot
devtool build tf-a-stm32mp-serialboot
bitbake tf-a-stm32mp-serialboot -c deploy
修改u-boot查找一下是否有适配好的u-boot
看起来openstlinux官方已经为我们做好了所有的适配
u-boot-stm32mp-splash Universal Boot Loader Splash Screen for stm32mp embedded devices
u-boot-stm32mp Universal Boot Loader for embedded devices for stm32mp
u-boot-stm32mp-extlinux Provide 'extlinux.conf' file for U-Boot
u-boot-fw-config-stm32mp U-Boot bootloader fw_printenv/setenv utilities
libubootenv U-Boot libraries and tools to access environment
libubootenv-native U-Boot libraries and tools to access environment
nativesdk-u-boot-tools U-Boot bootloader tools
u-boot-tools U-Boot bootloader tools
u-boot-tools-native U-Boot bootloader tools
直接使用devtool进行修改就可以了
同理如果是定制板可能需要到workspace/source目录下对u-boot源代码进行修改
devtool modify u-boot-stm32mp
devtool build u-boot-stm32mp
bitbake u-boot-stm32mp -c deploy
部署完成之后固件会输出到tmp-glibc/deploy/images/stm32mp1/bootloader目录下
最后就是修改Linux内核
devtool modify virtual/kernel
devtool build linux-stm32mp
bitbake linux-stm32mp -c deploy
如果你需要进行裁剪可以使用bitbake virtual/kernel -c menuconfig进入内核配置菜单
在这一切都做好了以后在tmp-glibc/deploy/images目录下就是可以烧录的固件文件了
以上是关于移植OpenStLinux到Stm32Mp157上的主要内容,如果未能解决你的问题,请参考以下文章
STM32MP157使用记录:OpenSTLinux试用与开发体验
STM32MP157开发笔记 | 02 - uboot和linux内核编译
STM32MP157开发笔记 | 04 - TF-Aubootlinux内核源码获取编译烧写
STM32MP157开发笔记 | 04 - TF-Aubootlinux内核源码获取编译烧写