context

The following are just a bunch of notes on getting the STM32MP1 development environment running on Arch Linux.

ST’s documentation target Ubuntu and WSL2. I might have run Ubuntu in a full VM, but that is kind of a pain in that I don’t have the entirety of my working environment available.

Another option is containerizing all of this into Docker. The only caveat with that is there are a number of GUI applications and running GUI apps in Docker is also kind of a PITA.

I’ve built a kernel and some simple demos and all the dependencies appear to be present as everything works as expected. I’m sure if I get to the point of generating a full linux distribution that I may run into dependency issues. shrug.

install dependencies for Arch Linux

# gcc-multilib (not sure what the equivalent Arch package is for this Ubuntu package.)
yay -S gawk wget git diffstat unzip texinfo chrpath socat cpio python3 python-pip python-pexpect \
  xz debianutils iputils python-git python-jinja mesa sdl2 sdl12-compat python-pylint \
  xterm bsdmainutils openssl gmp libmpc lz4 zstd ncurses libyaml
  
echo 'options mmc_block perdev_minors=16' > /tmp/mmc_block.conf
doas mv /tmp/mmc_block.conf /etc/modprobe.d/mmc_block.conf

create directories, download and install ST packages

  #
  # install the STMProgrammer app
  #
  # *** download the latest version of STMCubeProgrammer
  #

  # create some directories to keep things organized
  export STMHOME="/home/jlynch/projects/codeposse/stm32"

  mkdir -p $STMHOME/tools/programmer-2.15.0/
  mkdir $STMHOME/tmp
  cd !$

  unzip en.stm32cubeprg-lin-v2.15.0.zip
  
  # install to $STMHOME/tools/programmer-2.15.0/
  ./SetupSTM32CubeProgrammer-2.15.0.linux

  # copy the udev rules
  doas cp $STMHOME/tools/programmer-2.15.0/Drivers/rules/*.rules /etc/udev/rules.d


  #
  # grab the OS base images (so called "starter package")
  #
  # *** download the starter package to $STMHOME/tmp
  #
  
  mkdir -p $STMHOME/ecosystem-5.0.0/starter-package
  tar xf en.FLASH-stm32mp1-openstlinux-5-10-dunfell-mp1-21-11-17_tar.xz -C \
      $STMHOME/ecosystem-5.0.0/starter-package


  # Flash an OS onto the sdcard.
  #
  # We just follow the instructions on the wiki for flashing a
  # new image to the sdcard. THIS TAKES HOURS.
  #    
  # https://wiki.st.com/stm32mpu/wiki/Getting_started/STM32MP1_boards/STM32MP157x-EV1/Let%27s_start/Populate_the_target_and_boot_the_image#Populate_the_SDCard
  #

  
  # Check if everything flashed properly and we have a working system.
  cu -s 115200 -l /dev/ttyACM0


  # install the A7 SDK
  #
  # *** download the toolchain, the SDK and the sources. We'll use the sources later.
  #

  tar xf en.SDK-x86_64-stm32mp1-openstlinux-6.1-yocto-mickledore-mp1-v23.06.21.tar.gz

  mkdir -p $STMHOME/ecosystem-5.0.0/developer-package/SDK

  # SDK install script
  ./stm32mp1-openstlinux-6.1-yocto-mickledore-mp1-v23.06.21/sdk/st-image-weston-openstlinux-weston-stm32mp1-x86_64-toolchain-4.2.1-openstlinux-6.1-yocto-mickledore-mp1-v23.06.21.sh -d $STMHOME/ecosystem-5.0.0/developer-package/SDK

  # now, mangle my environment..er..setup the sdk paths (MUST BE BASH!)
  . $STMHOME/ecosystem-5.0.0/developer-package/SDK/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
  
  # verify installation
  echo $ARCH
  echo $CROSS_COMPILE
  $CC --version
  echo $OECORE_SDK_VERSION

setup the network via built-in USB OTG ethernet interface

# the following commands should be run on the development machine.
# enp10s0 is the development machine's main NIC.
# emp104s0u3 is the USB OTG ethernet interface provided by the MP1.

ip addr add 192.168.7.2 dev enp104s0u3
ip link set enp104s0u3 up
ip route add 192.168.7.0/24 via 192.168.7.2
sysctl -w net.ipv4.ip_forward=1
iptables -A FORWARD -i enp10s0 -j ACCEPT
iptables -A FORWARD -i enp104s0u3 -j ACCEPT
iptables -t nat -A POSTROUTING -o enp10s0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp104s0u3 -j MASQUERADE

# the following are to be run on the MP1
route add -net default gw 192.168.7.2
# (probably some nameserver shit too)

install the linux sources

  #
  # install the source, finally.
  #
  # *** the source should have been downloaded with the SDK
  #

  cd $STMHOME/tmp
  tar xf en.sources-stm32mp1-openstlinux-6.1-yocto-mickledore-mp1-v23.06.21.tar.gz -C \
      $STMHOME/ecosystem-5.0.0/developer-package
      
  # extract the kernel sources
  cd !$/stm32mp1-openstlinux-6.1-yocto-mickledore-mp1-v23.06.21/sources/arm-ostl-linux-gnueabi/linux-stm32mp-6.1.28-stm32mp-r1-r0
  
  tar xf linux-6.1.28.tar.xz

  # apply the ST patches
  cd linux-6.1.28
  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/merge_config.sh -m -r .config $f
  done

build a kernel

  # configure
  yes '' | make ARCH=arm oldconfig
  
  # build
  make -j32 ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000040

  # build modules
  make -j32 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

  # copy the kernel, device tree to the board via scp
  scp arch/arm/boot/uImage root@192.168.7.1:/boot
  scp arch/arm/boot/dts/stm32mp157*.dtb root@192.168.7.1:/boot

  ## copy the modules to the board
  
  # 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@192.168.7.1:/lib/modules

  # aaaaaand on the board's console
  /sbin/depmod -a
  sync
  reboot

install the IDE for the sidecar M4

  #
  # install stm32cube ide
  #
  # *** download and extract the installer
  #
  
  unzip -q en.st-stm32cubeide_1.14.0_19471_20231121_1200_amd64.sh.zip

  doas bash ./st-stm32cubeide_1.14.0_19471_20231121_1200_amd64.sh

  # fin.

finally, enjoy beer


boddingtons

phew!

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.


STM32MP157D-EV1
plenty of accoutrements.