STM32MP157PRO 环境部署#

接线规则#

  • 网口 net1:使用以太网转换器连接到电脑上,用于和电脑和虚拟机通信;

  • 网口 net2:使用网线直接连接到路由器上;

  • Type-C 口 OTG:用于向开发板烧写程序(对应通用串行总线设备中的 DFU);

  • Type-C 口 Serial:用于串口连接开发板,使用 115200 波特率。

网络配置#

串口登录开发板:使用 root 用户,没有密码。

cat <<EOF | sudo tee /etc/systemd/network/50-static.network
[Match]
Name=eth0
[Network]
Address=192.168.5.9/24
Gateway=192.168.5.1
EOF

sudo systemctl enable systemd-networkd

备注

开发板上网:接上网线后执行 udhcpc -i eth1

配置虚拟机桥接网卡(用于和开发板互相通信)

虚拟机 - 设置 - 添加 - 网络适配器 - 桥接模式 - 复制物理网络连接状态
编辑 - 虚拟网络编辑器 - 添加网络 - VMnet0 - 桥接模式选择 AXIC 网络适配器
cat <<EOF | sudo tee /etc/netplan/99_config.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    ens33: # NAT 网卡
      addresses:
        - 192.168.183.128/24
      routes:
        - to: default
          via: 192.168.183.2
      nameservers:
        search: [localdomain, localhost]
        addresses: [114.114.114.114, 8.8.8.8]
    ens37: # 桥接网卡
      addresses:
        - 192.168.5.11/24
      routes:
        - to: 192.168.0.0/24
          via: 192.168.5.1
EOF

sudo netplan apply

配置电脑端 AXIC 网络适配器的 IPv4 和网关(用于和开发板和虚拟机通信)

更改 AXIC 网络适配器属性

IPv4    : 192.168.5.10
Netmask : 255.255.255.0
Gateway : 192.168.5.1

关闭 Windows 公用网络防火墙

源代码下载#

上层应用源代码

git clone https://e.coding.net/weidongshan/01_all_series_quickstart.git

下载 BSP

git clone https://e.coding.net/codebug8/repo.git
mkdir -p 100ask_stm32mp157_pro-sdk && cd 100ask_stm32mp157_pro-sdk
../repo/repo init -u https://gitee.com/weidongshan/manifests.git -b linux-sdk -m stm32mp1/100ask_stm32mp157_pro_release-v2.0.xml --no-repo-verify
../repo/repo sync -j4

配置交叉编译环境#

export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin

设置开发板启动方式#

拨码开关

1

2

3

EMMC(默认)

OFF

ON

OFF

SD

ON

OFF

ON

USB

OFF

OFF

OFF

M4(调试)

OFF

OFF

ON

挂载 NFS 目录#

在开发板上执行

mount -t nfs -o nolock,vers=3 192.168.5.11:~/nfs_rootfs /mnt

挂载完成后,在开发板 /mnt 目录,可以直接访问虚拟机上 nfs_rootfs 文件。

编译和安装内核#

编译 Linux 内核

cd 100ask_stm32mp157_pro-sdk/Linux-5.4/
make 100ask_stm32mp157_pro_defconfig
make uImage LOADADDR=0xC2000040
make dtbs
cp arch/arm/boot/uImage ~/nfs_rootfs/

编译和安装内核模块

cd 100ask_stm32mp157_pro-sdk/Linux-5.4/
make ARCH=arm CROSS_COMPILE=arm-buildroot-linux-gnueabihf- modules -j8
make ARCH=arm INSTALL_MOD_PATH=/home/book/nfs_rootfs INSTALL_MOD_STRIP=1 modules_install

将内核模块安装到开发板

mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
mount /dev/mmcblk2p2 /boot
cp /mnt/uImage /boot
cp /mnt/*.dtb /boot
cp /mnt/lib/modules /lib -rfd
sync
reboot

编译和安装驱动#

cd 01_all_series_quickstart/05_嵌入式 Linux 驱动开发基础知识/source/01_hello_drv/
make
cp led_drv.ko ledtest ~/nfs_rootfs/
mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
cp /mnt/led_drv.ko ./
cp /mnt/ledtest ./
insmod led_drv.ko
lsmod
echo none > /sys/class/leds/heartbeat/trigger # 关掉 led0 的默认呼吸效果
chmod +x ./ledtest
./ledtest /dev/myled on # 打开 led0 灯

烧写系统#

烧写工具:STM32CubeProgrammer(不能有中文路径)

更新整个系统的烧写方式:

  • 关闭电源,设置 USB 启动方式,打开电源;

  • 连接 OTG 线;

  • 在 STM32CubeProgrammer 中选择 USB > connect > 刷新 Port 选择 USB1

  • 选择分区配置文件:Buildroot_Emmc_Systemall.tsv

  • 开始烧写;

  • 烧写成功,关闭电源,设置 EMMC 启动方式,打开电源。

单独更新 Trust Boot 的烧写方式:

  • 关闭电源,设置 USB 启动方式,打开电源;

  • 连接 OTG 线;

  • 在 STM32CubeProgrammer 中选择 USB > connect > 刷新 Port 选择 USB1

  • 选择分区配置文件:Buildroot_Emmc_TrustUbootBootloader.tsv

  • 开始烧写;

  • 烧写成功,关闭电源,设置 EMMC 启动方式,打开电源。

编译生成 SDK 和工具链#

一个完整的嵌入式操作系统应该包含以下几部分:

  • 内核(Kernel)

  • Bootloader

  • 文件系统(fs)

  • TFA(受信任固件)

  • 交叉编译工具链

所有这些环境都可以通过 Buildroot 来完成构建:

1、准备环境

sudo apt install -y build-essential make 

2、下载并解压源代码:

cd sdk/buildroot/
wget https://buildroot.org/downloads/buildroot-2023.02.9.tar.gz
tar xf buildroot-2023.02.9.tar.gz

3、生成编译所需的配置文件:

# cd /home/book/100ask_stm32mp157_pro-sdk/Buildroot_2020.02.x
#  make 100ask_stm32mp157_pro_ddr512m_systemD_qt5_defconfig
cd buildroot-2023.02.9 && make stm32mp157c_dk2_defconfig

4、编译和生成 kernel、u-boot、fs 等:

make all -j4

tree output/images/

output/images/
├── rootfs.ext2                 # 文件系统分区镜像
├── rootfs.ext4 -> rootfs.ext2
├── sdcard.img
├── stm32mp157c-dk2.dtb         # 设备树文件
├── tf-a-stm32mp157c-dk2.stm32  # 完整的系统镜像
├── u-boot.stm32                # u-boot 镜像文件
└── zImage                      # 内核镜像文件

编译 TFA(可选)#

仅适用于 STM32MP157PRO 开发板

编译 TFA

cd /home/book/100ask_stm32mp157_pro-sdk/Tfa-v2.2
make -f $PWD/./Makefile.sdk all
cp tf-a-stm32mp157c-100ask-512d-v1.stm32 ~/nfs_rootfs/

更新 TFA

echo 0 > /sys/class/block/mmcblk2boot0/force_ro
echo 0 > /sys/class/block/mmcblk2boot1/force_ro
dd if=tf-a-stm32mp157c-100ask-512d-v1.stm32 of=/dev/mmcblk2/boot0 conv=fsync > /dev/null 2>&1
dd if=tf-a-stm32mp157c-100ask-512d-v1.stm32 of=/dev/mmcblk2/boot1 conv=fsync > /dev/null 2>&1
echo 1 > /sys/class/block/mmcblk2boot0/force_ro
echo 1 > /sys/class/block/mmcblk2boot1/force_ro

编译 Bootloader(可选)#

编译 Bootloader

cd /home/book/100ask_stm32mp157_pro-sdk/Uboot-2020.02
make stm32mp15_trusted_defconfig
make DEVICE_TREE=stm32mp157c-100ask-512d-v1 all -j4
cp u-boot.stm32 ~/nfs_rootfs/

更新 u-boot 镜像

dd if=u-boot.stm32 of=/dev/mmcblk2p1 conv=fsync > /dev/null 2>&1
sync