2020-10-30 08:08 AM
I would like to understand why I cannot find and enable STM32 SPI support in the Linux kernel and resolve conflicting information in the Wiki articles I am using.
When I use menuconfig, I cannot locate STM32 SPI support in the menu. If I use the search option (/) I can see the reasons are that SPI_STM32 depends on ARCH_STM32 which is set to [N]. In addition, ARCH_STM32 depends on ARM_SINGLE_ARMV7M which is also set to [N].
Are there any other parameters I should be adding to the invocation of 'make menuconfig'?
Any ideas why these variables are not set correctly and how to resolve the issue?
I suspected something about my environment. I am using the Developer Package and running the following to setup the terminal environment:
source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
I have applied the patches and fragments and not had an issue building or running the kernel or adding a device tree change from the Cube code generator.
Now, on to the Wiki conflicts.
In section 2 of the Wiki article at https://wiki.st.com/stm32mpu/wiki/Menuconfig_or_how_to_configure_kernel
it states that the CROSS_COMPILE environment should be 'arm-openstlinux_weston-linux-gnueabi-'
In section 5.1.1 of the Wiki article at https://wiki.st.com/stm32mpu/wiki/STM32MP1_Developer_Package
is states that the CROSS_COMPILE environment should be 'arm-ostl-linux-gnueabi-'.
I am getting 'arm-ostl-linux-gnueabi-'. Which article is correct?
2020-11-05 08:20 AM
Hi @Community member ,
Once fragment and patch are properly applied you should have correct state :
SPI_STM32 and ARCH_STM32 are both =y
Please double check using README.HOWTO.txt describing procedure.
For wiki "arm-ostl-linux-gnueabi" you have is the right one.
We will correct page containing 'arm-openstlinux_weston-linux-gnueabi-'
Olivier
2020-11-05 01:14 PM
Hi Olivier,
I had already checked the README.HOWTO.txt procedure. For your reference, this is how I prepared the kernel.
I have consulted the following Wiki articles but despite following the advice have not been able to activate it (no such issues getting SPI4 working on the M4):
https://wiki.st.com/stm32mpu/wiki/SPI_device_tree_configuration
https://wiki.st.com/stm32mpu/wiki/Menuconfig_or_how_to_configure_kernel
https://wiki.st.com/stm32mpu/wiki/STM32MP1_Developer_Package
https://wiki.st.com/stm32mpu/wiki/SPI_overview
I understand from the above articles I should see an 'STMicroelectronics STM32 SPI controller' listed in the 'Device Drivers->SPI Support' section of the Linux kernel configuration. This is not appearing when I invoke the config system with 'make ARCH=arm menuconfig'. Why not?
Additionally, when I boot the kernel on the target I see no SPI support:
'ls /dev' on the target shows no spidevX devices.
'ls /sys/class' on the target shows 'spi_master' and 'spidev' but no devices listed within.
My process to build the kernel was to:
1) Add SPI5 in the STM32CubeIDE and configure the PF9 for SPI5_MOSI and PF7 for SPI_SCK
2) Confirmed the appropriate device tree content was added to 'stm32mp157c-angelina-mx.dts' (see below for extracts from this file)
3) Opened a terminal and sourced the environment with:
source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
4) Extracted the kernel source code
5) Copied my 'stm32mp157c-angelina-mx.dts' to 'linux-5.4.31/arch/arm/boot/dts'
6) Modified dts Makefile to add 'stm32mp157c-angelina-mx.dtb'
7) Applied all ST patches 1 through 23:
patch -p1 < ../0001-ARM-stm32mp1-r1-MACHINE.patch
patch -p1 < ../0002-ARM-stm32mp1-r1-CPUFREQ.patch
patch -p1 < ../0003-ARM-stm32mp1-r1-CRYPTO.patch
patch -p1 < ../0004-ARM-stm32mp1-r1-RNG-DEBUG-NVMEM.patch
patch -p1 < ../0005-ARM-stm32mp1-r1-CLOCK.patch
patch -p1 < ../0006-ARM-stm32mp1-r1-DMA.patch
patch -p1 < ../0007-ARM-stm32mp1-r1-DRM.patch
patch -p1 < ../0008-ARM-stm32mp1-r1-HWSPINLOCK.patch
patch -p1 < ../0009-ARM-stm32mp1-r1-I2C-IIO-IRQCHIP.patch
patch -p1 < ../0010-ARM-stm32mp1-r1-MAILBOX-REMOTEPROC-RPMSG.patch
patch -p1 < ../0011-ARM-stm32mp1-r1-RESET-RTC-WATCHDOG.patch
patch -p1 < ../0012-ARM-stm32mp1-r1-MEDIA-SOC-THERMAL.patch
patch -p1 < ../0013-ARM-stm32mp1-r1-MFD.patch
patch -p1 < ../0014-ARM-stm32mp1-r1-MMC-NAND.patch
patch -p1 < ../0015-ARM-stm32mp1-r1-NET-TTY.patch
patch -p1 < ../0016-ARM-stm32mp1-r1-PHY-USB.patch
patch -p1 < ../0017-ARM-stm32mp1-r1-PINCTRL-REGULATOR-SPI-PWM.patch
patch -p1 < ../0018-ARM-stm32mp1-r1-SOUND.patch
patch -p1 < ../0019-ARM-stm32mp1-r1-MISC.patch
patch -p1 < ../0020-ARM-stm32mp1-r1-DEVICETREE.patch
patch -p1 < ../0021-ARM-stm32mp1-r1-CONFIG.patch
patch -p1 < ../0022-ARM-stm32mp1-r1-POWER.patch
patch -p1 < ../0023-ARM-stm32mp1-r1-PERF.patch
8) make ARCH=arm O="$PWD/../build" multi_v7_defconfig fragment*.config
9) Applied fragments 03 ot 06 with:
scripts/kconfig/merge_config.sh -m -r -O $PWD/../build $PWD/../build/.config ../fragment-03-systemd.config
scripts/kconfig/merge_config.sh -m -r -O $PWD/../build $PWD/../build/.config ../fragment-04-optee.config
scripts/kconfig/merge_config.sh -m -r -O $PWD/../build $PWD/../build/.config ../fragment-05-modules.config
scripts/kconfig/merge_config.sh -m -r -O $PWD/../build $PWD/../build/.config ../fragment-06-signature.config
10) Make ARCH=arm oldconfig O="$PWD/../build"
I accepted all default answers
11) Build kernel:
make ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000040 O="$PWD/../build"
12) Confirmed that stm32mp157c-angelina-mx.dtb was made by the build
13) Build kernel modules:
make ARCH=arm modules O="$PWD/../build"
14) Install kernel modules:
make ARCH=arm INSTALL_MOD_PATH="$PWD/../build/install_artifact" modules_install O="$PWD/../build"
mkdir -p $PWD/../build/install_artifact/boot/
cp $PWD/../build/arch/arm/boot/uImage $PWD/../build/install_artifact/boot/
cp $PWD/../build/arch/arm/boot/dts/st*.dtb $PWD/../build/install_artifact/boot/
I have consulted the kernel boot logs and confirmed that the kernel I built is being loaded.
I now enclose extracts relevant to SPI5 from the DTS file generated by the STM32CubeIDE:
spi5_pins_mx: spi5_mx-0 {
pins {
pinmux = <STM32_PINMUX('F', 7, AF5)>, /* SPI5_SCK */
<STM32_PINMUX('F', 9, AF5)>; /* SPI5_MOSI */
bias-disable;
drive-push-pull;
slew-rate = <1>;
};
};
spi5_sleep_pins_mx: spi5_sleep_mx-0 {
pins {
pinmux = <STM32_PINMUX('F', 7, ANALOG)>, /* SPI5_SCK */
<STM32_PINMUX('F', 9, ANALOG)>; /* SPI5_MOSI */
};
};
&spi5{
pinctrl-names = "default", "sleep";
pinctrl-0 = <&spi5_pins_mx>;
pinctrl-1 = <&spi5_sleep_pins_mx>;
status = "okay";
/* USER CODE BEGIN spi5 */
/* USER CODE END spi5 */
};
Do I need to add anything to the above definitions to activate SPI5? I assumed that whatever I configure in the IDE is sufficient.
2021-04-22 06:42 AM
I have this same exact problem. Why has no one from ST answered this?
In my case the boot log shows the following.
[ OK ] Started Update UTMP about System Boot/Shutdown.
[ OK ] Started udev Coldplug all Devices.
[ 13.683932] spi_stm32 4000b000.spi: clk rate = 0
[ 13.706859] spi_stm32: probe of 4000b000.spi failed with error -22
[ 13.762465] spi_stm32 44005000.spi: clk rate = 0
[ 13.778909] spi_stm32: probe of 44005000.spi failed with error -22
[ OK ] Started Network Time Synchronization.
[ OK ] Reached target System Initialization.
2021-05-24 06:07 AM
Hi @Community member
If you didn't resolved your pb yet, Check the clocks spi.