• stm32mp157系统移植 | 移植ST官方5.10内核到小熊派开发板


    Linux内核移植流程

    移植Linux内核到一个新的板子上时,需要以下步骤:

    (1)选择一个硬件设计接近的板子,基于此板相关文件开始移植
    (2)拷贝单板配置文件(arch/arm/configs)
    (3)拷贝设备树文件(arch/arm/boot/dts)
    (4)修改设备树,适配开发板

    本文中基于STM32MP157A-DK1官方开发板,移植到小熊派HM-Micro开发板。

    环境说明:

    • 内核源码:ST官方提供的Linux 5.10内核,已经打完st补丁
    • 编译环境:ST官方提供的SDK,arm-ostl-linux-gnueabi-gcc 9.3.0
    • 操作系统:ubuntu 20.04

    一、新建单板配置文件

    cp arch/arm/configs/multi_v7_patched_defconfig arch/arm/configs/bearpi_defconfig
    
    • 1

    使用新的单板编译测试:

    make distclean
    make bearpi_defconfig
    make uImage dtbs LOADADDR=0xC2000040 -j16
    
    • 1
    • 2
    • 3

    二、新建设备树

    cp arch/arm/boot/dts/stm32mp157a-dk1.dts arch/arm/boot/dts/stm32mp157a-bearpi.dts
    cp arch/arm/boot/dts/stm32mp15xx-dkx.dtsi arch/arm/boot/dts/stm32mp15xx-bearpix.dtsi
    
    • 1
    • 2

    简单修改一下stm32mp157a-bearpi.dts:

    /dts-v1/;
    
    #include "stm32mp157.dtsi"
    #include "stm32mp15xa.dtsi"
    #include "stm32mp15-pinctrl.dtsi"
    #include "stm32mp15xxac-pinctrl.dtsi"
    #include "stm32mp15xx-bearpix.dtsi"
    
    / {
    	model = "STMicroelectronics STM32MP157A Bearpi Board";
    	compatible = "st,stm32mp157a-bearpi", "st,stm32mp157";
    
    	chosen {
    		stdout-path = "serial0:115200n8";
    	};
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    修改makefile,加入编译:

    编译设备树:

    make dtbs
    
    • 1

    三、启动测试

    1. 替换emmc里的内核

    使用sd卡拷贝uImage和stm32mp157a-bearpi.dtb文件到开发板,放到emmc的bootfs分区里,写了个脚本:

    #!/bin/sh
    mkdir tmp
    mkdir bootfs
    mount /dev/mmcblk1p1 tmp
    mount /dev/mmcblk2p2 bootfs
    cp -v tmp/uImage bootfs/
    cp -v tmp/stm32mp157a-bearpi.dtb bootfs/
    umount tmp
    umount bootfs
    rm -rf tmp
    rm -rf bootfs
    echo "done!"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2. 使用新的内核和设备树启动

    进入uboot,添加下面两个新的环境变量:

    setenv boot_emmc 'ext4load mmc 1:2 c2000000 uImage;ext4load mmc 1:2 c4000000 stm32mp157a-bearpi.dtb;bootm c2000000 - c4000000'
    setenv bootargs 'console=ttySTM0,115200 root=/dev/mmcblk1p4 rootwait rw'
    saveenv
    
    • 1
    • 2
    • 3

    启动:

    run boot_emmc
    
    • 1

    可以看到,Linux内核版本信息和设备树Model信息都是对应的:

    但是这里启动挂载根文件系统失败了,卡在这里:

    接下来定位解决此问题。

    四、初步修改设备树

    1. 修改电源描述

    ST官方开发板使用了一个i2c的电源管理芯片,小熊派开发板没有,所以要去除该部分描述。

    2. 去除网口描述

    小熊派开发板没有板载网口,去除该部分描述。

    3. 添加sdmmc2接口描述

    查看开发板原理图,emmc是接到sdmmc2的:

    但是在复制过来的设备树描述中,并没有sdmmc接口的描述,添加:

    &sdmmc2 {
    	pinctrl-names = "default", "opendrain", "sleep";
    	pinctrl-0 = <&sdmmc2_b4_pins_a>;
    	pinctrl-1 = <&sdmmc2_b4_od_pins_a>;
    	pinctrl-2 = <&sdmmc2_b4_sleep_pins_a>;
    	broken-cd;
    	st,neg-edge;
    	bus-width = <4>;
    	vmmc-supply = <&v3v3>;
    	status = "okay";
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    实际emmc接了8条数据线,这里设备树描述可以只用4条,只是对性能有影响,不影响读取,后续可以优化。

    重新编译设备树:

    make dtbs
    
    • 1

    启动,成功挂载根文件系统,拉起systemd,进入到系统:

    五、内核修改

    1. 内核版本号修改

    2. 关闭模块校验

    加载模块的时候发现会提示这一堆问题:

    在配置文件中关闭该选项:

    移植好的内核仓库

  • 相关阅读:
    Linux系统编程 系统编程概念
    超高速PCIe实时运动控制卡与应用方案将亮相深圳NEPCON,正运动技术邀您前来体验!
    Mysql 中的性能调优方法
    【C++】基础,数据类型,函数,字符串,引用,输入输出,数据结构
    Git常用命令(面试+复习)
    【算法】一文带你从浅至深入门dp动态规划
    leetcode 2. 两数相加
    亚马逊API接口大全
    数据结构——快排与归并
    【Leetcode】【字符串相乘】
  • 原文地址:https://blog.csdn.net/Mculover666/article/details/126139596