野火 STM32MP157 开发板内核和设备树的编译烧写

2022-12-12,,,,

一、环境

编译环境:Ubuntu 版本:18.4.6

交叉编译工具:arm-linux-gnueabihf-gcc 版本:7.4.1

开发板:STM32MP157 pro

烧写方式:STM32CubeProgrammer、TFTP、在线烧写

安装工具

gcc-arm-linux-gnueabihf 交叉编译器
bison 语法分析器
flex 词法分析器
libssl-dev OpenSSL通用库
lzop LZO压缩库的压缩软件

sudo apt install make gcc-arm-linux-gnueabihf gcc bison flex libssl-dev dpkg-dev lzop

下图是我当前使用的工具版本,仅供参考

二、下载内核源码

GitHub仓库:https://github.com/Embedfire/ebf_linux_kernel

git clone -b ebf_4.19_star  https://github.com/Embedfire/ebf_linux_kernel.git

注意: STM32MP157 内核源码对应的是 ebf_4.19_star 分支,因为网络原因有时下载会很慢,也可以通过其他仓库路径进行下载,不过可能出现下载不完整现象,导致无法编译。

三、编译内核

    清理项目工程

    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean

    设置默认配置文件

    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- stm32mp157_ebf_defconfig

    编译 zImage 或 .dtb 文件

    # 默认编译内核和设备
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
    # 编译内核
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage
    # 编译设备树
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs

    编译生成deb

    也可以直接通过软件包的形式,直接安装内核

    直接执行 make_deb.sh 文件进行编译

    ./make_deb.sh

    生成文件的路径

    zImage:/arch/arm/boot/目录下

    dtb:/arch/arm/boot/dts目录下

四、烧写内核与设备树

方式一、通过TFTp烧写zImage与.dtb文件

    将zImage和.dtb文件放入tftp服务器中,不会的朋友可以看Linux安装配置 tftp 服务器

    进入uboot中配置网络

    setenv ipaddr 192.168.30.156
    setenv gatewayip 192.168.30.1
    setenv netmask 255.255.255.0
    setenv serverip 192.168.30.99
    setenv ethaddr 00:01:12:13:14:15
    saveenv

    ** 配置完成后可以通过 ping命令查看网络是否连接,下图中表示连接成功

    下载zImage文件

    tftp 80800000 zImage

    下载.dtb文件

    tftp 83000000 stm32mp157a-basic.dtb

    启动加载zImage和dtb文件

    bootz 80800000 - 83000000

    验证是否成功

    毫无疑问,验证失败,提示错误 Bad Linux ARM zImage magic!,这个应该是STM32MP157这块开发板的分区问题导致的,目前只能尝试后面几种方式烧写,后续我研究明白了在更新,有知道的大佬可以给个解决思路

方式二、通过安装包烧写内核

    内核安装包的执行过程,直接查看 make_deb.sh 文件

    vim make_deb.sh

    如下图所示:

    第 4 行:指定编译好的内核放置位置
    第 5 行:编译出来的目标是针对 ARM 体系结构的内核
    第 6 行:对于 deb-pkg 目标,允许覆盖 deb-pkg 部署的常规启发式
    第 7 行:使用内核配置选项“LOCALVERSION”为常规内核版本附加一个唯一的后缀。
    第 10 行:指定交叉编译器
    第 12 行:生成配置文件
    第 15 行:编译文件进行打包

    编译

    ./make_deb.sh

    查看当前内核

    dpkg -l | grep stm-r1

    卸载当前内核

    sudo dpkg -r linux-image-4.19.94-stm-r1

    安装内核

    将编译生成的内核通过TFTP拷贝到开发板下,内核安装包位于 ebf_linux_kernel/build_image/linux-image-4.19.94-stm-r1_1stable_armhf.deb

    sudo dpkg -i linux-image-4.19.94-stm-r1_1stable_armhf.deb

    注意:若使用 dpkg 安装内核 deb 包提示错误,删除 boot/kernel 目录下所有文件 sudo rm boot/kernel/*

    验证

    重启开发板,使用 cat /proc/version 命令查看内核是否安装成功,如下图所示

方式三、直接替换内核文件

    替换文件

    将编译出来的 ebf_linux_kernel/arch/arm/boot/zImage 拷到板子上,替换/boot/kernel/vmlinuz-4.19.94-stm-r1 文件

    注意:这里需要将zImage 文件重命名为vmlinuz-4.19.94-stm-r1 ,也可能会涉及到权限问题。

    添加软链接

    ln -s /lib/modules/4.19.94-stm-r1 /lib/modules/4.19.94+

    重启验证

    sudo reboot
    cat /proc/version

野火 STM32MP157 开发板内核和设备树的编译烧写的相关教程结束。

《野火 STM32MP157 开发板内核和设备树的编译烧写.doc》

下载本文的Word格式文档,以方便收藏与打印。