The following are just a bunch of notes on getting the STM32MP1 development environment running on Ubuntu 20.04LTS. The ST wiki is horseshit (i.e. difficult to navigate topics in a coherent manner) so I’m collecting my (terse) notes here.

Anyhow, this should get you from zero to hero. (this was copied from my org-mode notes, so hopefully the formatting is ok).

install dependencies

  # packages required by OpenEmbedded/Yocto (distribution package)
  sudo apt-get update
  sudo apt-get install gawk wget git-core diffstat unzip texinfo \
       gcc-multilib build-essential chrpath socat cpio python3   \
       python3-pip python3-pexpect xz-utils debianutils          \ 
       iputils-ping python3-git python3-jinja2 libegl1-mesa      \
       libsdl1.2-dev pylint3 pylint xterm
  sudo apt-get install make xsltproc docbook-utils fop           \ 
       dblatex xmlto
  sudo apt-get install libmpc-dev libgmp-dev
  # packages required by the developer package
  sudo apt-get install libncurses5 libncurses5-dev               \
       libncursesw5-dev libssl-dev linux-headers-generic         \
       u-boot-tools device-tree-compiler bison flex g++          \
       libyaml-dev libmpc-dev libgmp-dev
  sudo apt-get install libusb-1.0-0
  # suggested tools
  sudo apt-get install coreutils bsdmainutils sed curl bc lrzsz  \
       corkscrew cvs subversion mercurial nfs-common             \
       nfs-kernel-server libarchive-zip-perl dos2unix texi2html  \
       diffstat libxml2-utils
  # personal tools
  sudo apt-get emacs minicom ssh zsh tree fortune
  # start sshd
  sudo systemctl enable ssh.service
  # change default shell to zsh
  # increase the default number of partitions on MMC devices
  echo 'options mmc_block perdev_minors=16' > /tmp/mmc_block.conf
  sudo mv /tmp/mmc_block.conf /etc/modprobe.d/mmc_block.conf

create directories, download and install ST packages

  # install the STMProgrammer app
  mkdir -p ~/STM32MPU_workspace/STM32MPU-Tools/STM32CubeProgrammer-2.8.0/
  mkdir ~/STM32MPU_workspace/tmp
  cd !$
  # * download the latest version of STMCubeProgrammer
  # install to ~/STM32MPU_workspace/STM32MPU-Tools/STM32CubeProgrammer-2.8.0/
  # copy the udev rules
  cd $HOME/STM32MPU_workspace/STM32MPU-Tools/STM32CubeProgrammer-2.8.0/Drivers/rules
  sudo cp * /etc/udev/rules.d
  # install the starter package.
  # I think this just has a bunch of prebuilt installation images.
  # anyhow...
  mkdir -p $HOME/STM32MPU_workspace/STM32MP15-Ecosystem-v3.1.0/Starter-Package
  cd !$
  # * download the starter package to the aforementioned directory
  tar xf en.FLASH-stm32mp1-openstlinux-5-10-dunfell-mp1-21-11-17_tar_v3.1.0.xz
  # OK, here we just follow the instructions on the wiki for flashing a
  # new image to the sdcard.
  # install the A7 sdk
  # * download the toolchain (the SDK not the SOURCES, though we'll want
  # * the SOURCES one later.)
  cd ~/STM32MPU_workspace/tmp
  tar xf en.SDK-x86_64-stm32mp1-openstlinux-5.10-dunfell-mp1-21-11-17.tar_v3.1.0.xz
  mkdir -p ~/STM32MPU_workspace/STM32MP15-Ecosystem-v3.1.0/Developer-Package/SDK
  chmod +x stm32mp1-openstlinux-5.10-dunfell-mp1-21-11-17/sdk/
  ./stm32mp1-openstlinux-5.10-dunfell-mp1-21-11-17/sdk/ -d ~/STM32MPU_workspace/STM32MP15-Ecosystem-v3.1.0/Developer-Package/SDK
  # now, to setup the environment (MUST BE BASH!)
  . ~/STM32MPU_workspace/STM32MP15-Ecosystem-v3.1.0/Developer-Package/SDK/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi

compile a kernel

  # install the sources
  cd ~/STM32MPU_workspace/STM32MP15-Ecosystem-v3.1.0/Developer-Package
  tar xf en.SOURCES-stm32mp1-openstlinux-5.10-dunfell-mp1-21-03-31.tar_v3.0.0.xz
  # extract the kernel sources
  cd stm32mp1-openstlinux-5.10-dunfell-mp1-21-03-31/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.10.10-r0
  tar xf linux-5.10.10.tar.xz
  # apply the ST patches
  cd linux-5.10.10
  for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
  # apply the fragments (this is the ST augmented kernel configuration)
  # (XXX it's be nice to understand exactly what is going on here)
  make ARCH=arm multi_v7_defconfig "fragment*.config"
  for f in `ls -1 ../fragment*.config`; do 
      scripts/kconfig/ -m -r .config $f
  yes '' | make ARCH=arm oldconfig
  # finally, build the kernel (XXX what are the 3 make targets?)
  make -j4 ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000040
  # build the kernel modules
  make -j4 ARCH=arm modules
  # install kernel modules to a local directory
  mkdir -p $PWD/install_artifact/
  make ARCH=arm INSTALL_MOD_PATH="$PWD/install_artifact" modules_install
  # push the kernel, device tree and modules to the board via scp
  scp arch/arm/boot/uImage root@
  scp arch/arm/boot/dts/stm32mp157*.dtb root@
  # remove the links in the artifact directory so we don't recursively copy
  rm install_artifact/lib/modules/5.10.10/build install_artifact/lib/modules/5.10.10/source
  # optionally strip the modules
  find install_artifact/ -name "*.ko" | xargs $STRIP --strip-debug --remove-section=.comment --remove-section=.note --preserve-dates
  # copy modules to the board
  scp -r install_artifact/lib/modules/* root@
  # aaaaaand on the board's console
  /sbin/depmod -a

install the IDE for the sidecar M4

  # install stm32cube ide
  # * download and extract the installer
  unzip -q
  chmod +x
  sudo ./
  # fin.

finally, enjoy beer



That is a lot of stuff to install!

Anyhow, here’s an obligatory pic of the board. As you can see, “embedded” is a misnomer in this case. Just check the specs of the STM32MP1 line.

plenty of accoutrements.