This repo for build Ubuntu/Debian on stm32mp1xx CPU
Availability
Boards:
- EV-STM32MP157-SODIMM
- Discovery kit with STM32MP157D MPU 88 at Digi-Key
- Discovery kit with STM32MP157F MPU 47 at Digi-Key
- Evaluation board with STM32MP157D MPU 43 at Digi-Key
- Evaluation board with STM32MP157F MPU 32 at Digi-Key
Running a recent supported release of Debian, Fedora or Ubuntu on a x86 64bit based PC; without OS Virtualization Software.
Many of the listed commands assume /bin/bash as the default shell.
ARM Cross Compiler – GCC:
- ARM Linux GCC Toolchain Binaries: https://mirrors.edge.kernel.org/pub/tools/crosstool/files/bin/x86_64/
Bootloader
- Das U-Boot – the Universal Boot Loader: http://www.denx.de/wiki/U-Boot
- Source: https://github.com/STMicroelectronics/u-boot
ATF
- arm trusted firmware - https://trustedfirmware-a.readthedocs.io/en/latest/
- Source: https://github.com/STMicroelectronics/arm-trusted-firmware
Linux Kernel
- ST Mainline tree: https://github.com/STMicroelectronics/linux
ARM based rootfs
- Debian: https://www.debian.org
- Ubuntu: https://www.ubuntu.com
For full automatic build run:
./build.sh NOTE: Default build Ubuntu 22.04 Choosing a distribution to build in development.
New contributors are welcome in development!
For separate build, uboot, kernel and rootfs
./build-uboot.sh
./build-linux.shFor make sdcard.img image
./rootfs.sh # for get base rootfs sceleton
./create-rootfs.sh # make sd card image*update in progress build scripts
For manual build, follow these steps.
sudo apt install flex bison ncurses-base build-essential qemu-user-static device-tree-compiler git libssl-dev libncurses-dev libgmp-dev libmpc-dev
This is a pre-built (64bit) version of GCC that runs on generic linux, sorry (32bit) x86 users, it’s time to upgrade… Download/Extract:
#user@localhost:~$
wget -c https://mirrors.edge.kernel.org/pub/tools/crosstool/files/bin/x86_64/10.3.0/x86_64-gcc-10.3.0-nolibc-arm-linux-gnueabi.tar.gz
tar xf x86_64-gcc-10.3.0-nolibc-arm-linux-gnueabi.tar.gz
export CC=`pwd`/gcc-10.3.0-nolibc/arm-linux-gnueabi/bin/arm-linux-gnueabi-Test Cross Compiler:
#user@localhost:~$
${CC}gcc --version#Test Output:
arm-linux-gnueabi-gcc (GCC) 10.3.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.Das U-Boot – the Universal Boot Loader: http://www.denx.de/wiki/U-Boot
Depending on your Linux Distrubution, you will also need a host gcc and other tools, so with Debian/Ubuntu start with installing the build-essential meta package.
Download:
#user@localhost:~$
git clone -b v2020.10-stm32mp https://github.com/STMicroelectronics/u-boot
cd u-bootConfigure and Build:
stm32mp157a-sodimm2-mx
#user@localhost:~/u-boot$
make ARCH=arm CROSS_COMPILE=${CC} distclean
make ARCH=arm CROSS_COMPILE=${CC} stm32mp15_trusted_defconfig
make ARCH=arm CROSS_COMPILE=${CC} DEVICE_TREE=stm32mp157a-sodimm2-mx allstm32mp157c-ev1
#user@localhost:~/u-boot$
make ARCH=arm CROSS_COMPILE=${CC} distclean
make ARCH=arm CROSS_COMPILE=${CC} stm32mp15_trusted_defconfig
make ARCH=arm CROSS_COMPILE=${CC} DEVICE_TREE=stm32mp157c-ev1 allstm32mp157c-ed1
#user@localhost:~/u-boot$
make ARCH=arm CROSS_COMPILE=${CC} distclean
make ARCH=arm CROSS_COMPILE=${CC} stm32mp15_trusted_defconfig
make ARCH=arm CROSS_COMPILE=${CC} DEVICE_TREE=stm32mp157c-ed1 allstm32mp157a-dk1
#user@localhost:~/u-boot$
make ARCH=arm CROSS_COMPILE=${CC} distclean
make ARCH=arm CROSS_COMPILE=${CC} stm32mp15_trusted_defconfig
make ARCH=arm CROSS_COMPILE=${CC} DEVICE_TREE=stm32mp157a-dk1 allstm32mp157c-dk2
#user@localhost:~/u-boot$
make ARCH=arm CROSS_COMPILE=${CC} distclean
make ARCH=arm CROSS_COMPILE=${CC} stm32mp15_trusted_defconfig
make ARCH=arm CROSS_COMPILE=${CC} DEVICE_TREE=stm32mp157c-dk2 allcd ..
git clone -b v2.4-stm32mp https://github.com/STMicroelectronics/arm-trusted-firmware
cd arm-trusted-firmwarestm32mp157a-sodimm2-mx
make CROSS_COMPILE=${CC} \
PLAT=stm32mp1 \
ARCH=aarch32 \
ARM_ARCH_MAJOR=7 \
STM32MP_SDMMC=1 \
STM32MP_EMMC=1 \
AARCH32_SP=sp_min \
DTB_FILE_NAME=stm32mp157a-sodimm2-mx.dtb \
BL33_CFG=../u-boot/u-boot.dtb \
BL33=../u-boot/u-boot-nodtb.bin \
all fipstm32mp157c-ev1
make CROSS_COMPILE=${CC} \
PLAT=stm32mp1 \
ARCH=aarch32 \
ARM_ARCH_MAJOR=7 \
STM32MP_SDMMC=1 \
STM32MP_EMMC=1 \
AARCH32_SP=sp_min \
DTB_FILE_NAME=stm32mp157c-ev1.dtb \
BL33_CFG=../u-boot/u-boot.dtb \
BL33=../u-boot/u-boot-nodtb.bin \
all fipstm32mp157c-ed1
make CROSS_COMPILE=${CC} \
PLAT=stm32mp1 \
ARCH=aarch32 \
ARM_ARCH_MAJOR=7 \
STM32MP_SDMMC=1 \
STM32MP_EMMC=1 \
AARCH32_SP=sp_min \
DTB_FILE_NAME=stm32mp157c-ed1.dtb \
BL33_CFG=../u-boot/u-boot.dtb \
BL33=../u-boot/u-boot-nodtb.bin \
all fipstm32mp157a-dk1
make CROSS_COMPILE=${CC} \
PLAT=stm32mp1 \
ARCH=aarch32 \
ARM_ARCH_MAJOR=7 \
STM32MP_SDMMC=1 \
STM32MP_EMMC=1 \
AARCH32_SP=sp_min \
DTB_FILE_NAME=stm32mp157a-dk1.dtb \
BL33_CFG=../u-boot/u-boot.dtb \
BL33=../u-boot/u-boot-nodtb.bin \
all fipstm32mp157c-dk2
make CROSS_COMPILE=${CC} \
PLAT=stm32mp1 \
ARCH=aarch32 \
ARM_ARCH_MAJOR=7 \
STM32MP_SDMMC=1 \
STM32MP_EMMC=1 \
AARCH32_SP=sp_min \
DTB_FILE_NAME=stm32mp157c-dk2.dtb \
BL33_CFG=../u-boot/u-boot.dtb \
BL33=../u-boot/u-boot-nodtb.bin \
all fipThis script will build the kernel, modules, device tree binaries and copy them to the deploy directory.
Download:
#user@localhost:~$
cd ..
git clone -b v5.10-stm32mp https://github.com/STMicroelectronics/linux
cd linuxBuild:
# ST defconfig
make ARCH=arm CROSS_COMPILE=${CC} multi_v7_defconfig fragment-01-multiv7_cleanup.config fragment-02-multiv7_addons.config
# Choose the kernel modules you need
make ARCH=arm CROSS_COMPILE=${CC} menuconfig
make ARCH=arm CROSS_COMPILE=${CC} zImage modules -j16
# build dts
make ARCH=arm CROSS_COMPILE=${CC} dtbs
# install kernel modules to pach
mkdir -p ../deploy
cp -v arch/arm/boot/zImage ../deploy
mkdir -p ../deploy/modules
make ARCH=arm CROSS_COMPILE=${CC} modules_install INSTALL_MOD_PATH="../deploy/modules"
# install dtsb files to pach
mkdir -p ../deploy/dtsb
make ARCH=arm CROSS_COMPILE=${CC} dtbs_install INSTALL_DTBS_PATH=../deploy/dtsb
# export kernel version
export kernel_ver=$(cat "include/generated/utsrelease.h" | awk '{print $3}' | sed 's/\"//g' )
echo ${kernel_ver}
cd ..Debian 11
User and password: debian temppwd root root
Download:
#user@localhost:~$
wget -c https://rcn-ee.com/rootfs/eewiki/minfs/debian-11.1-minimal-armhf-2021-11-02.tar.xzExtract:
#user@localhost:~$
tar xf debian-11.1-minimal-armhf-2021-11-02.tar.xzUser and password: ubuntu temppwd root root
Download:
#user@localhost:~$
wget -c https://rcn-ee.com/rootfs/eewiki/minfs/ubuntu-20.04.3-minimal-armhf-2021-11-02.tar.xzExtract:
#user@localhost:~$
tar xf ubuntu-20.04.3-minimal-armhf-2021-11-02.tar.xzUser and password: ubuntu temppwd root root
Download:
#user@localhost:~$
wget -c https://rcn-ee.com/rootfs/eewiki/minfs/ubuntu-18.04.6-minimal-armhf-2021-11-02.tar.xzExtract:
#user@localhost:~$
tar xf ubuntu-18.04.6-minimal-armhf-2021-11-02.tar.xzSetup image for flash to microSD card
Create image and Partition Layout:
export DIR=$(pwd)
export IMAGE_FILENAME="sdcard-stm32mp157.img"
dd if=/dev/zero of=${DIR}/deploy/${IMAGE_FILENAME} bs=4096M count=2
sgdisk --resize-table=128 -a 1 \
-n 1:34:545 -c 1:fsbl1 \
-n 2:546:1057 -c 2:fsbl2 \
-n 3:1058:5153 -c 3:fip \
-n 4:5154: -c 4:rootfs \
-p ./deploy/${IMAGE_FILENAME}
check output sgdisk:
#
# Disk /home/vitaliy/sdcard.img: 8388592 sectors, 4.0 GiB
# Sector size (logical): 512 bytes
# Disk identifier (GUID): 6473AC10-6A3A-4A4B-B3BF-59BD7982185D
# Partition table holds up to 128 entries
# Main partition table begins at sector 2 and ends at sector 33
# First usable sector is 34, last usable sector is 8388558
# Partitions will be aligned on 1-sector boundaries
# Total free space is 0 sectors (0 bytes)
Number Start (sector) End (sector) Size Code Name
1 34 545 256.0 KiB 8300 fsbl1
2 546 1057 256.0 KiB 8300 fsbl2
3 1058 5153 2.0 MiB 8300 ssbl
4 5154 8388558 4.0 GiB 8300 rootfsSet legacy BIOS partition:
sgdisk -A 4:set:2 ./deploy/${IMAGE_FILENAME}Create loop device
LOOP_DEVICE=$(sudo losetup --partscan --show --find ./deploy/${IMAGE_FILENAME})Check mounted partition:
ls -l ${LOOP_DEVICE}*
#user@localhost:~$ ls -l /dev/loop0*
brw-rw---- 1 root disk 7, 0 лис 7 13:31 /dev/loop0
brw-rw---- 1 root disk 259, 7 лис 7 13:31 /dev/loop0p1
brw-rw---- 1 root disk 259, 8 лис 7 13:31 /dev/loop0p2
brw-rw---- 1 root disk 259, 9 лис 7 13:31 /dev/loop0p3
brw-rw---- 1 root disk 259, 10 лис 7 13:31 /dev/loop0p4Install U-Boot bootloader:
stm32mp157a-sodimm2-mx
#user@localhost:~$
sudo dd if=./arm-trusted-firmware/build/stm32mp1/release/tf-a-stm32mp157a-sodimm2-mx.stm32 of=${LOOP_DEVICE}p1
sudo dd if=./arm-trusted-firmware/build/stm32mp1/release/tf-a-stm32mp157a-sodimm2-mx.stm32 of=${LOOP_DEVICE}p2
sudo dd if=./arm-trusted-firmware/build/stm32mp1/release/fip.bin of=${LOOP_DEVICE}p3stm32mp157c-ev1
#user@localhost:~$
sudo dd if=./arm-trusted-firmware/build/stm32mp1/release/tf-a-stm32mp157c-ev1.stm32 of=${LOOP_DEVICE}p1
sudo dd if=./arm-trusted-firmware/build/stm32mp1/release/tf-a-stm32mp157c-ev1.stm32 of=${LOOP_DEVICE}p2
sudo dd if=./arm-trusted-firmware/build/stm32mp1/release/fip.bin of=${LOOP_DEVICE}p3stm32mp157c-ed1
#user@localhost:~$
sudo dd if=./arm-trusted-firmware/build/stm32mp1/release/tf-a-stm32mp157c-ed1.stm32 of=${LOOP_DEVICE}p1
sudo dd if=./arm-trusted-firmware/build/stm32mp1/release/tf-a-stm32mp157c-ed1.stm32 of=${LOOP_DEVICE}p2
sudo dd if=./arm-trusted-firmware/build/stm32mp1/release/fip.bin of=${LOOP_DEVICE}p3stm32mp157a-dk1
#user@localhost:~$
sudo dd if=./arm-trusted-firmware/build/stm32mp1/release/tf-a-stm32mp157a-dk1.stm32 of=${LOOP_DEVICE}p1
sudo dd if=./arm-trusted-firmware/build/stm32mp1/release/tf-a-stm32mp157a-dk1.stm32 of=${LOOP_DEVICE}p2
sudo dd if=./arm-trusted-firmware/build/stm32mp1/release/fip.bin of=${LOOP_DEVICE}p3stm32mp157c-dk2
#user@localhost:~$
sudo dd if=./arm-trusted-firmware/build/stm32mp1/release/tf-a-stm32mp157c-dk2.stm32 of=${LOOP_DEVICE}p1
sudo dd if=./arm-trusted-firmware/build/stm32mp1/release/tf-a-stm32mp157c-dk2.stm32 of=${LOOP_DEVICE}p2
sudo dd if=./arm-trusted-firmware/build/stm32mp1/release/fip.bin of=${LOOP_DEVICE}p3Format RootFS Partition:
sudo mkfs.ext4 -L rootfs ${LOOP_DEVICE}p4Mount rootfs file system
sudo mkdir -p deploy/rootfs
MOUNT_PATH=deploy/rootfs
sudo mount ${LOOP_DEVICE}p4 ${MOUNT_PATH}Copy Root File System
#Debian; Root File System: user@localhost:~$
sudo tar xfvp ./debian-*-*-armhf-rootfs-*.tar -C ${MOUNT_PATH}
sync#Ubuntu; Root File System: user@localhost:~$
sudo tar xfvp ./ubuntu-base-XX.XX-base-armhf.tar.gz -C ${MOUNT_PATH}
syncSetup extlinux.conf
#user@localhost:~$
sudo mkdir -p ${MOUNT_PATH}/boot/extlinux/
sudo sh -c "echo 'label Linux ${kernel_ver}' > ${MOUNT_PATH}/boot/extlinux/extlinux.conf"
sudo sh -c "echo ' kernel /boot/vmlinuz-${kernel_ver}' >> ${MOUNT_PATH}/boot/extlinux/extlinux.conf"
sudo sh -c "echo ' append console=ttySTM0,115200 console=tty1,115200 root=/dev/mmcblk\${boot_instance}p4 ro rootwait ' >> ${MOUNT_PATH}/boot/extlinux/extlinux.conf"
sudo sh -c "echo ' fdtdir /boot/dtbs/${kernel_ver}/' >> ${MOUNT_PATH}/boot/extlinux/extlinux.conf"Copy Kernel Image
#user@localhost:~$
sudo cp -v ./deploy/zImage ${MOUNT_PATH}/boot/vmlinuz-${kernel_ver}Copy Kernel Device Tree Binaries
#user@localhost:~$
sudo mkdir -p ${MOUNT_PATH}/boot/dtbs/${kernel_ver}/
sudo cp -r ./deploy/dtsb/* ${MOUNT_PATH}/boot/dtbs/${kernel_ver}/Copy Kernel Modules
#user@localhost:~$
sudo cp -r ./deploy/modules/. ${MOUNT_PATH}/usr/File Systems Table (/etc/fstab)
#user@localhost:~/$
sudo sh -c "echo '/dev/mmcblk0p4 / auto errors=remount-ro 0 1' >> ${MOUNT_PATH}/etc/fstab"For DK2 board. WiFi bin and config files
#user@localhost:~/$
mkdir wifi
wget -P wifi https://github.com/cvetaevvitaliy/stm32mp1-ubuntu/raw/master/wifi_firmware/cyfmac43430-sdio.bin
wget -P wifi https://github.com/cvetaevvitaliy/stm32mp1-ubuntu/raw/master/wifi_firmware/cyfmac43430-sdio.1DX.clm_blob
wget -P wifi https://github.com/cvetaevvitaliy/stm32mp1-ubuntu/raw/master/wifi_firmware/brcmfmac43430-sdio.txt
sudo mkdir -p ${MOUNT_PATH}/lib/firmware/brcm/
sudo cp -v ./wifi/brcmfmac43430-sdio.txt ${MOUNT_PATH}/lib/firmware/brcm/brcmfmac43430-sdio.st,stm32mp157c-dk2.txt
sudo cp -v ./wifi/cyfmac43430-sdio.bin ${MOUNT_PATH}/lib/firmware/brcm/brcmfmac43430-sdio.bin
sudo cp -v ./wifi/cyfmac43430-sdio.1DX.clm_blob ${MOUNT_PATH}/lib/firmware/brcm/brcmfmac43430-sdio.clm_blob
Finish:
sync
sudo umount ${MOUNT_PATH}
sudo losetup -DAfter successfully completing these steps, you will get .img image for writing to SD card
For safe and easy writing to SD card download balenaEtcher
Steps:
- Insert SD card to card reader
- Openn balenaEtcher
- Select
sdcard.img - Select connected SD card
- Push button FLash
- Done
After flash remove sd card from PC and insert to STM32MP157 board
If you do not want to go through all the steps, you can download the finished SD card image, just write it to the SD card
*update in progress