Skip to main content

ODYSSEY – STM32MP135D 入门指南

ODYSSEY STM32MP135D 是一款基于 STM32 MPU 的紧凑型单板计算机,提供强大的硬件性能,采用小巧的外形设计,适用于从智能家居到自动售货机、IP 摄像头等多种用途。它提供了广泛的连接选项,旨在简化原型设计。硬件有两种不同的版本:

目前,仅支持 Buildroot 作为操作系统。

硬件

  • SoC: STM32MP135D
    • 32 位 Arm® Cortex®-A7
      • L1 32-Kbyte 指令缓存 / 32-Kbyte 数据缓存
      • 128-Kbyte 统一二级缓存
      • Arm® NEON™ 和 Arm® TrustZone®
  • 支持 Buildroot 操作系统。
  • 连接选项:
    • 2 个 10/100 Mbit/s 以太网端口,
      • eth1 支持 PoE 和 WOL。
    • 1 个 USB-A 端口,
    • 1 个 CSI 30p FPC 接口,
    • 1 个 LCD 40p FPC 接口,
    • 40 个 GPIO 引脚,采用与 Raspberry Pi 兼容的引脚布局。
  • 存储 / 内存:
    • 4 Gbits DRAM,
    • 256 Kbits EEPROM,页面大小为 64 字节,
    • Micro SD 卡插槽,支持 SD、SDHC 和 SDXC 卡,
    • 4 GBytes eMMC(仅限带 eMMC 存储的版本)
  • 电源选项:
    • 通过 eth1 端口的 PoE,
    • 通过 USB-C 接口的 5V 输入。
  • 裸板尺寸:85x56x17mm
  • 裸板重量:36g

入门指南

硬件

要开始使用硬件,您需要以下物品:

  • 1 个 ODYSSEY STM32MP135D,
  • 1 根 USB-C 到 USB-A 数据线或 USB-C 到 USB-C 数据线,
  • 1 根以太网线,
  • 1 根 USB 到 UART 数据线,例如 这个

首先,仔细连接 USB 到 UART 数据线,以便访问串行控制台。请参考以下图片以正确连接引脚。 STM32MP135D ODYSSEY 板的俯视图,调试引脚位于启动跳线旁边并被圈出。引脚按靠近启动跳线的顺序列出:WAKE、GND、TX、RX

在本指南中,我们将使用 USB-C 供电。将 USB-C 数据线的一端连接到开发板,另一端连接到您的计算机。将以太网线插入 ODYSSEY 的 eth1 端口,另一端插入您的路由器或网络交换机。

注意:如果您想使用预编译包,请点击此 链接

软件

本指南将使用以下软件组件:

注意:请按照 Snagboot 仓库中的说明正确设置,这超出了本指南的范围。

功能

外部树提供以下功能:

  • 一个单一的 stm32mp135d_odyssey_defconfig,用于构建一个包含 TF-A、OP-TEE、U-Boot 和 Linux 内核的最小通用系统,用于启动链。用户空间是最小的,仅包含一个简单的 BusyBox 初始化系统和 Shell。
    • 此系统可以通过以下方式使用:
      • 从 eMMC 写入并启动(如果您的硬件支持 eMMC)
      • 从 Micro SD 卡写入并启动。
      • 通过 NFS 启动。
  • 使用后构建脚本提供一个易于写入的 eMMC 引导加载程序镜像。它将 TF-A 和 FIP 镜像组合成一个单一文件,旨在通过 DFU 写入到 eMMC 的引导区域。
  • Genimage 配置生成两个磁盘镜像:
    • emmc.img 包含一个 U-Boot 环境分区,用于轻松存储 U-Boot 环境,以及根文件系统。预计引导加载程序通过 DFU 存储到 eMMC 引导区域。
    • sdcard.img 包括两个 TF-A 副本,分别位于 FSBL1 和 FSBL2 分区,以及一个包含 FIP 镜像的单一 FIP 分区。还有一个与 emmc.img 中相同的 U-Boot 环境分区,以及一个根文件系统。
  • 外部树提供一个空的 external.mk、Config.in 和 packages 目录,以供您添加额外选项和内容。请参考 Buildroot 手册中的相应部分以了解更多信息。

获取软件

以下示例演示如何获取 Buildroot 和所需的外部树,然后设置它们以供使用:

首先安装 Buildroot 所需的依赖项。请参阅: Buildroot 用户手册,第 2 章:系统要求。然后,设置源代码:

wget https://buildroot.org/downloads/buildroot-2023.02.5.tar.gz
tar -xf buildroot-2023.02.5.tar.gz
mv buildroot-2023.02.5 buildroot
git clone https://github.com/xogium/buildroot-stm32mp135d-odyssey

构建

一旦正确设置了源代码,您可以继续构建:

cd buildroot
make BR2_EXTERNAL=/absolute/path/to/buildroot-stm32mp135d-odyssey stm32mp135d_odyssey_defconfig
make

如果一切顺利,您现在应该在 Buildroot 树的 output/images 目录中拥有一个成功构建的系统。

ls -1 output/images
combined-tf-a-and-fip.img
emmc.img
fip.bin
rootfs.ext2
rootfs.ext4
rootfs.tar
sdcard.img
stm32mp135d-odyssey.dtb
tee.bin
tee-header_v2.bin
tee-pageable_v2.bin
tee-pager_v2.bin
tf-a-stm32mp135d-odyssey.stm32
u-boot.dtb
u-boot-nodtb.bin
zImage

如何使用系统

eMMC 启动

移除板上的中间启动跳线以确保 DFU 模式处于激活状态。请确保使用 minicom 或其他类似程序打开串口控制台,因为您将需要它。

以下是使用 gnu screen 访问名为 ttyUSB0 的串口控制台的示例。波特率应设置为 115200n8。

sudo screen /dev/ttyUSB0 115200n8

然后,从 snagboot 包中执行以下命令,并在进入 u-boot 时准备通过在串口控制台窗口中按任意键来中断启动序列:

cd output/images
snagrecover -s stm32mp13 -f ../../board/stm32mp135d-odyssey/utilities/stm32mp1-stm32mp135d-odyssey.yaml

在 u-boot 提示符下,输入以下命令以启用 eMMC 启动分区:mmc partconf 1 1 1 1。这将启用第一个 eMMC 启动分区,并通过修改 ext csd 寄存器 179 确保可以从中启动。然后,输入 dfu 0 将所有 DFU alt 设置暴露给主机,包括 eMMC 启动区域。可以使用 dfu-util 命令列出它们:

dfu-util -l
Found DFU: [0483:df11] ver=0200, devnum=7, cfg=1, intf=0, path="3-3", alt=4, name="mmc1_boot2", serial="0021001A3232510937393835"
Found DFU: [0483:df11] ver=0200, devnum=7, cfg=1, intf=0, path="3-3", alt=3, name="mmc1_boot1", serial="0021001A3232510937393835"
...

然后,使用 snagflash 工具将组合的引导加载程序镜像写入两个启动区域:

snagflash -P dfu -p 0483:df11 --dfu-keep -D 3:combined-tf-a-and-fip.img
snagflash -P dfu -p 0483:df11 -D 4:combined-tf-a-and-fip.img

完成后,重置板子并通过将中间启动跳线重新放回板上确认 eMMC 启动是否正常工作。由于用户区域为空,它将在从 mmc1 分区 0 启动时出错,但这是正常的。

当您再次回到 u-boot 提示符时,输入 ums 0 1 将 eMMC 的用户区域作为 USB 大容量存储设备暴露给主机。使用 lsblk 确定分配的设备节点,并在以下命令中用适当的设备节点替换 sdX。请仔细检查以确保您将写入正确的设备,因为它将被完全擦除!

snagflash -P ums -s emmc.img -b /dev/sdX

写入完成后,在 u-boot 提示符下按 ctrl+c 终止 USB 大容量存储模式。然后,再次重置板子,并确认它现在正在启动 Linux,并且您获得了登录提示。使用 root 用户登录,无需密码。

Micro SD 卡启动

如果您希望将系统烧录到 Micro SD 卡,请按以下步骤操作,并用适当的设备节点替换 sdX:

sudo dd if=output/images/sdcard.img of=/dev/sdX bs=4M conv=fsync

其中 sdX 对应于 Micro SD 卡的设备节点。请参考 lsblk 命令的输出以确保您获得正确的设备节点!否则会导致数据丢失,因为这会擦除目标设备的全部内容。

请使用 minicom 或类似程序连接到板子的串口控制台。以下是使用 gnu screen 访问名为 ttyUSB0 的串口控制台的示例。波特率应设置为 115200n8。

sudo screen /dev/ttyUSB0 115200n8

当 Micro SD 卡成功写入后,将其插入 STM32MP135D ODYSSEY 板的 Micro SD 插槽,并调整启动跳线以从 Micro SD 启动(移除所有跳线)。如果需要,请重置板子。一旦您获得 buildroot 登录提示,请使用 root 用户登录,无需密码。

NFS 启动

要通过 NFS 启动系统,请确保按照以下示例设置您的 /etc/exports,必要时替换子网/允许的 IP 地址,并对导出的路径执行相同操作:

/srv/nfs 192.168.1.0/24(rw,sync,crossmnt,fsid=0)
/srv/nfs/stm32mp135d 192.168.1.0/24(rw,nohide,insecure,no_subtree_check,async,no_root_squash)

还要确保您的 NFS 服务器配置启用了 UDP 模式,如下所示:

/etc/nfs.conf
[nfsd]
...
udp=y

将生成的 rootfs tarball 解压到适当的目录中,在本例中为 /srv/nfs/stm32mp135d:

cd output/images
sudo mkdir srv/nfs/stm32mp135d
sudo bsdtar -xpf rootfs.tar -C /srv/nfs/stm32mp135d

移除中间启动跳线以确保 DFU 模式处于激活状态。请确保使用 minicom 或其他类似程序打开串口控制台,因为您将需要它。以下是使用 gnu screen 访问名为 ttyUSB0 的串口控制台的示例。波特率应设置为 115200n8。

sudo screen /dev/ttyUSB0 115200n8

然后,从 snagboot 包中执行以下命令,并在进入 u-boot 时准备通过在串口控制台窗口中按任意键来中断启动序列:

cd output/images
snagrecover -s stm32mp13 -f ../../board/stm32mp135d-odyssey/utilities/stm32mp1-stm32mp135d-odyssey.yaml

一旦进入 u-boot 提示符,您可以通过以下操作通过 NFS 启动:

setenv eth1addr 2c:f7:f1:30:2b:62
setenv ethaddr 2c:f7:f1:30:2b:62
dhcp
nfs ${kernel_addr_r} 192.168.1.92:/srv/nfs/stm32mp135d/boot/zImage
nfs ${fdt_addr_r} 192.168.1.92:/srv/nfs/stm32mp135d/boot/stm32mp135d-odyssey.dtb
setenv bootargs root=/dev/nfs rootfstype=nfs ip=dhcp nfsroot=192.168.1.92:/srv/nfs/stm32mp135d,tcp,v3 rw quiet console=ttySTM0,115200n8 earlycon
bootz ${kernel_addr_r} - ${fdt_addr_r}

其中,192.168.1.92 是托管 NFS 服务器的机器。在此示例中设置的 MAC 地址也是示例,不应在实际环境中使用。由于板子的 OTP 中未定义 MAC 地址,因此需要设置,但可以半永久性地存储在 EEPROM 中(见下文)。使用 root 用户登录,无需密码。

EEPROM

布局

当前从 EEPROM 读取 MAC 地址的实现要求第一个地址从偏移量 0 开始,长度为 6 字节。第二个 MAC 地址必须存储在偏移量 0x10 处,长度同样为 6 字节。

  • 提示:要生成随机 MAC 地址,可以使用类似 这个 的生成器。

如果您希望将 u-boot 环境存储到 EEPROM 中,请确保环境从新的页面边界开始。页面大小为 64 字节。例如,您可以将环境偏移量设置为 0x40,大小保持为 0x2000,冗余偏移量设置为 0x2080。以下是一个 u-boot 配置片段示例:

CONFIG_ENV_IS_IN_EEPROM=y
CONFIG_ENV_OFFSET=0x40
CONFIG_ENV_OFFSET_REDUND=0x2080
CONFIG_I2C_EEPROM=y
CONFIG_SYS_I2C_EEPROM_ADDR=0x50
CONFIG_NVMEM=y

要应用此配置,请在顶层 buildroot 目录中运行 make menuconfig。进入 bootloaders 菜单,向下滚动到 u-boot 并修改附加配置片段路径,例如输入: $(BR2_EXTERNAL_STM32MP135D_ODYSSEY_PATH)/board/stm32mp135d-odyssey/configs/uboot.config

然后,请通过运行 make clean && make 进行重新构建。

最终,布局是自由的,您可以根据需要使用,除了 MAC 地址的位置和长度。

如何使用 EEPROM

要在您的板子上使用 EEPROM,可以在 u-boot 和 Linux 中将其作为 nvmem 设备访问。例如,写入一个 MAC 地址:

printf '\x2c\xf7\xf1\30\x2b\x62'|dd of=/sys/bus/nvmem/devices/0-00501/nvmem bs=1

要存储第二个 MAC 地址,可以这样操作:

printf '\x2c\xf7\xf1\30\x2b\x63'|dd of=/sys/bus/nvmem/devices/0-00501/nvmem bs=1 seek=16

如何连接和使用 Grove 传感器

待办

✨ 贡献者项目

资源

Loading Comments...