DHCOM STM32MP1 Linux: Difference between revisions
Ageisreiter (talk | contribs) |
Ageisreiter (talk | contribs) |
||
Line 329: | Line 329: | ||
==== How to enable WiFi/BT support, if missing? How to configure RSI mode (WiFi alone, Bluetooth, ...)? ==== | ==== How to enable WiFi/BT support, if missing? How to configure RSI mode (WiFi alone, Bluetooth, ...)? ==== | ||
The needed sdmmc3 interface will be activated by the stm32mp15xx-dhcom-som.dtsi file. This is included by default with picoITX, PDK2 and DRC02 configuration. | :The needed sdmmc3 interface will be activated by the stm32mp15xx-dhcom-som.dtsi file. This is included by default with picoITX, PDK2 and DRC02 configuration. | ||
Next to this the kernel module is needed. The Yocto build instructions can be found at the following file: | :Next to this the kernel module is needed. The Yocto build instructions can be found at the following file: | ||
https://github.com/dh-electronics/meta-dhsom-stm32-bsp/blob/dunfell-3.1/conf/machine/dh-stm32mp1-dhcom-picoitx.conf | :https://github.com/dh-electronics/meta-dhsom-stm32-bsp/blob/dunfell-3.1/conf/machine/dh-stm32mp1-dhcom-picoitx.conf | ||
# Ship kernel modules | # Ship kernel modules | ||
Line 340: | Line 340: | ||
module_conf_rsi_sdio = "options rsi_sdio dev_oper_mode=1" | module_conf_rsi_sdio = "options rsi_sdio dev_oper_mode=1" | ||
If you are using a different root filesystem (compared to our Yocto configuration) please ensure, that the firmware files and the rsi_sdio.conf file are included in the filesystem: | :If you are using a different root filesystem (compared to our Yocto configuration) please ensure, that the firmware files and the rsi_sdio.conf file are included in the filesystem: | ||
:[[media:rsi_firmware.zip|rsi_firmware.zip]] | :[[media:rsi_firmware.zip|rsi_firmware.zip]] | ||
:* Copy the directory rsi to /lib/firmware/ | :* Copy the directory rsi to /lib/firmware/ | ||
:* Copy the file rsi_sdio.conf to /etc/modprobe.d/ | :* Copy the file rsi_sdio.conf to /etc/modprobe.d/ | ||
'''Note to DRC02:''' | :'''Note to DRC02:''' | ||
DRC02 default images with date Oct. 2021 or newer support WiFi/BT by an additional device tree overlay. | :DRC02 default images with date Oct. 2021 or newer support WiFi/BT by an additional device tree overlay. | ||
To use the DTO, please add it to the U-Boot environment: | :To use the DTO, please add it to the U-Boot environment: | ||
:{| class="wikitable" | |||
|<tt>setenv loaddtos '#conf-stm32mp153c-dhcom-drc02.dtb#conf-stm32mp15xx-dhcom-drc02-overlay-wifi-rsi.dtbo'</tt> | |||
|} | |||
:'''RSI mode:''' | |||
:By default, the RSI module is configured to WiFi alone mode with our Yocto image. The mode can be configured by rsi_sdio.conf file: | |||
By default, the RSI module is configured to WiFi alone mode with our Yocto image. The mode can be configured by rsi_sdio.conf file: | |||
According to Linux kernel source, the dev_oper_mode has the following meaning: | According to Linux kernel source, the dev_oper_mode has the following meaning: | ||
linux-2.6$ git grep -n DEV_OPMODE_ drivers/net/wireless/rsi/ [...] | linux-2.6$ git grep -n DEV_OPMODE_ drivers/net/wireless/rsi/ [...] | ||
Line 367: | Line 369: | ||
drivers/net/wireless/rsi/rsi_hal.h:29:#define DEV_OPMODE_AP_BT_DUAL 14 | drivers/net/wireless/rsi/rsi_hal.h:29:#define DEV_OPMODE_AP_BT_DUAL 14 | ||
If you like to use Bluetooth alone mode, change dev_oper_mode to 12. Then you can use the standard hci commands. Start with 'hciconfig hci0 up' to activate the interface. | :If you like to use Bluetooth alone mode, change dev_oper_mode to 12. Then you can use the standard hci commands. Start with 'hciconfig hci0 up' to activate the interface. | ||
==== USB 1.1 problems: Custom board without USB 2.0 hub inbetween the MP1 USB host port? ==== | ==== USB 1.1 problems: Custom board without USB 2.0 hub inbetween the MP1 USB host port? ==== |
Revision as of 09:27, 5 October 2021
Linux virtual machine for development
- Please have a look at: Virtual Machine for Application Development
Linux Kernel
How to build a Kernel
Get sources from Github
Configure and build the Device Tree + Kernel
Create the FIT-image with our script (Download link)
|
Kernel Userspace Interfaces to Access Hardware
Control GPIOs
- Show gpio definition in Linux
gpioinfo
- Note:
- gpiochip0 = STM port-A, gpiochip1 = STM port-B, ...
DHCOM Name: alt. DHCOM Name: SO-DIMM Pin# CPU Pad Name gpiod label: GPIO A 154 PF3 DHCOM-A GPIO B 156 PD6 DHCOM-B GPIO C 162 PG0 DHCOM-C GPIO D 163 PD12 DHCOM-D GPIO E 164 PC6 DHCOM-E GPIO F 165 PD11 DHCOM-F GPIO G 167 PI0 DHCOM-G GPIO H 173 PI2 DHCOM-H GPIO I 175 PI3 DHCOM-I GPIO J CIF HSYNC 74 PH8 DHCOM-J GPIO K CIF PCLK 72 PA6 DHCOM-K GPIO L CIF MCLK 70 PG8 DHCOM-L GPIO M CIF VSYNC 68 PI5 DHCOM-M GPIO N CIF D9 66 PH7 DHCOM-N GPIO O CIF D8 64 PI1 DHCOM-O GPIO P CIF D7 62 PE6 DHCOM-P GPIO Q CIF D6 60 PB8 DHCOM-Q GPIO R CIF D5 58 PI4 DHCOM-R GPIO S CIF D4 56 PH14 DHCOM-S GPIO T CIF D3 54 PH12 DHCOM-T GPIO U CIF D2 52 PH11 DHCOM-U GPIO V CIF D1 50 PH10 DHCOM-V GPIO W CIF D0 48 PH9 DHCOM-W INT HIGHEST PRIORITY 151 PI8 DHCOM-INT
- Set state
gpioset $(gpiofind DHCOM-<#>)=0 gpioset $(gpiofind DHCOM-<#>)=1
- or
gpioset gpiochip<port#> <pin#>=0 gpioset gpiochip<port#> <pin#>=1
- Get state
gpioget $(gpiofind DHCOM-<#>)
- or
gpioget gpiochip<port#> <pin#>
RS-485 (only picoITX or DRC02)
- RS-485 device
DHCOM UART 2 /dev/ttySTM2
- Compilation on target
gcc tty_rs485_test_v1.1.c -o tty_rs485_test gcc tty_rs485_flags_v1.0.c -o tty_rs485_flags
- Show UART flags
./tty_rs485_flags /dev/ttySTM2
- Set tty device to raw mode
stty -F /dev/ttySTM2 115200 raw -echo -echoe
- Send data with demo program
echo -n -e "\n\rHallo RS485 Welt!" ¦ ./tty_rs485_test /dev/ttySTM2
- Receive data with demo program
./tty_rs485_test /dev/ttySTM2
- Download example source code
CAN interface
- Setup CAN interface with baudrate 500kbit/sec.
ip link set can0 up type can bitrate 500000
- Start to listen on CAN port
candump can0
- Send test message
cansend can0 100#11.2233.44556677.88
- Deinitialize CAN port
ip link set can0 down
UART Interfaces
DHCOM UART 1 /dev/ttySTM0 DHCOM UART 2 /dev/ttySTM2 DHCOM UART 3 /dev/ttySTM1
I2C Interfaces
DHCOM I2C 1 /dev/i2c-1 DHCOM I2C 2 /dev/i2c-0 On Module Devices /dev/i2c-2
ADC/DAC Interfaces
DHCOM Name SO-DIMM Pin# PDK2 Header Linux device sysfs in/out name STM32MP1 pin AD0 8 X18 Pin 8 iio:device2 in_voltage0_* ANA0 AD1 6 X18 Pin 6 iio:device3 in_voltage1_* ANA1 AD2 4 X18 Pin 4 iio:device0 out_voltage1_* PA4_DAC_OUT1 AD3 2 X18 Pin 2 iio:device1 out_voltage2_* PA5_DAC_OUT2
ADC inputs
- sysfs path
/sys/bus/iio/devices/iio:device*
- Show offset and voltage scale
cat in_voltage_scale cat in_voltage_offset
- Notes:
- Voltage = (RAW + OFFSET) * SCALE
- Maximum input voltage = 2.9V (VDDA is connected to PMIC LDO1)
- Read analog value
cat in_voltage*_raw
DAC outputs
- sysfs path
/sys/bus/iio/devices/iio:device*
- Show output voltage scale
cat out_voltage*_scale
- Enable DAC
echo 0 > out_voltage*_powerdown
- Notes:
- Voltage = RAW * SCALE
- Maximum output voltage = 2.9V (VDDA is connected to PMIC LDO1)
- Set analog output value
echo xxxx > out_voltage*_raw
FAQ
How to connect to WiFi network with WPA2 PSK?
- Establish connection
wpa_passphrase "SSID" >/etc/wpa_supplicant.conf
- -> In the next step, please enter the password
ip link set wlan0 up wpa_supplicant -i wlan0 -c /etc/wpa_supplicant.conf & udhcpc -i wlan0
- Disconnect
fg
- -> Moves a background process wpa_supplicant on your current Linux shell to the foreground. Then Press "Strg + C" to end the process.
ip link set wlan0 down
How to set up WiFi AP?
- Create new AP configuration file
nano /etc/hostapd_myAP.conf
- Insert the following to the file: (SSID = rsiwifi and default password = rsiTest1)
ctrl_interface=/var/run/hostapd ctrl_interface_group=0 interface=wlan0 ssid=rsiwifi hw_mode=g channel=6 wpa=2 wpa_passphrase=rsiTest1 wpa_key_mgmt=WPA-PSK
- Configure the AP wlan0 interface or start DHCP server on it etc.
nano /etc/systemd/network/80-wlan0.network
- Insert the following to the file:
[Match] Path=platform-soc [Network] Address=11.11.11.11/24 DHCPServer=yes
- -> Reboot the system
- Start hostapd to start the AP:
hostapd -d hostapd_DRC02.conf >/dev/null &
- Stop AP
fg
- -> Moves a background process hostapd on your current Linux shell to the foreground. Then Press "Strg + C" to end the process.
ip link set wlan0 down
How to enable WiFi/BT support, if missing? How to configure RSI mode (WiFi alone, Bluetooth, ...)?
- The needed sdmmc3 interface will be activated by the stm32mp15xx-dhcom-som.dtsi file. This is included by default with picoITX, PDK2 and DRC02 configuration.
- Next to this the kernel module is needed. The Yocto build instructions can be found at the following file:
- https://github.com/dh-electronics/meta-dhsom-stm32-bsp/blob/dunfell-3.1/conf/machine/dh-stm32mp1-dhcom-picoitx.conf
# Ship kernel modules MACHINE_ESSENTIAL_EXTRA_RDEPENDS += " linux-firmware-rs9116 " KERNEL_MODULE_AUTOLOAD += " rsi_sdio " KERNEL_MODULE_PROBECONF += " rsi_sdio " module_conf_rsi_sdio = "options rsi_sdio dev_oper_mode=1"
- If you are using a different root filesystem (compared to our Yocto configuration) please ensure, that the firmware files and the rsi_sdio.conf file are included in the filesystem:
- rsi_firmware.zip
- Copy the directory rsi to /lib/firmware/
- Copy the file rsi_sdio.conf to /etc/modprobe.d/
- Note to DRC02:
- DRC02 default images with date Oct. 2021 or newer support WiFi/BT by an additional device tree overlay.
- To use the DTO, please add it to the U-Boot environment:
setenv loaddtos '#conf-stm32mp153c-dhcom-drc02.dtb#conf-stm32mp15xx-dhcom-drc02-overlay-wifi-rsi.dtbo'
- RSI mode:
- By default, the RSI module is configured to WiFi alone mode with our Yocto image. The mode can be configured by rsi_sdio.conf file:
According to Linux kernel source, the dev_oper_mode has the following meaning: linux-2.6$ git grep -n DEV_OPMODE_ drivers/net/wireless/rsi/ [...] drivers/net/wireless/rsi/rsi_hal.h:21:#define DEV_OPMODE_WIFI_ALONE 1 drivers/net/wireless/rsi/rsi_hal.h:22:#define DEV_OPMODE_BT_ALONE 4 drivers/net/wireless/rsi/rsi_hal.h:23:#define DEV_OPMODE_BT_LE_ALONE 8 drivers/net/wireless/rsi/rsi_hal.h:24:#define DEV_OPMODE_BT_DUAL 12 drivers/net/wireless/rsi/rsi_hal.h:25:#define DEV_OPMODE_STA_BT 5 drivers/net/wireless/rsi/rsi_hal.h:26:#define DEV_OPMODE_STA_BT_LE 9 drivers/net/wireless/rsi/rsi_hal.h:27:#define DEV_OPMODE_STA_BT_DUAL 13 drivers/net/wireless/rsi/rsi_hal.h:28:#define DEV_OPMODE_AP_BT 6 drivers/net/wireless/rsi/rsi_hal.h:29:#define DEV_OPMODE_AP_BT_DUAL 14
- If you like to use Bluetooth alone mode, change dev_oper_mode to 12. Then you can use the standard hci commands. Start with 'hciconfig hci0 up' to activate the interface.
USB 1.1 problems: Custom board without USB 2.0 hub inbetween the MP1 USB host port?
And in that case, have a look at arch/arm/boot/dts/stm32mp15xx-dhcom-picoitx.dtsi and how the OHCI (!) is enabled there. And of course, make sure the kernel config options are enabled accordingly (like for the PicoITX machine)
meta-dhsom-stm32-bsp$ git grep OHCI |
recipes-kernel/linux/linux-stable/5.10/dh-stm32mp1-common/dh-stm32mp1-dhsom-common.cfg:CONFIG_USB_OHCI_HCD=y |
arch/arm/boot/dts/stm32mp15xx-dhcom-picoitx.dtsi snippet:
&usbh_ehci { phys = <&usbphyc_port0>; status = "okay"; }; &usbh_ohci { // <---------------- HERE phys = <&usbphyc_port0>; status = "okay"; }; &usbotg_hs { dr_mode = "otg"; pinctrl-0 = <&usbotg_hs_pins_a>; pinctrl-names = "default"; phy-names = "usb2-phy"; phys = <&usbphyc_port1 0>; vbus-supply = <&vbus_otg>; status = "okay"; }; &usbphyc { status = "okay"; }; &usbphyc_port0 { phy-supply = <&vdd_usb>; vdda1v1-supply = <®11>; vdda1v8-supply = <®18>; }; &usbphyc_port1 { phy-supply = <&vdd_usb>; vdda1v1-supply = <®11>; vdda1v8-supply = <®18>; };
System stability or USB Host problems?
If a display with higher resolution and pixel clock > 48 MHz is used, then this can case USB host and/or system stability problems.
Workaround: The OSPEEDR must be set to OSPEEDR = 1 for LCD_CLK and OSPEEDR = 0 for all other LTDC signals.
&pinctrl { ltdc_pins_ customhmi: ltdc-dh-1 { pins1 { pinmux = <STM32_PINMUX('I', 14, AF14)>; /* LCD_CLK */ bias-disable; drive-push-pull; slew-rate = <1>; }; pins2 { pinmux = <STM32_PINMUX('I', 12, AF14)>, /* LCD_HSYNC */ <STM32_PINMUX('I', 13, AF14)>, /* LCD_VSYNC */ ... <STM32_PINMUX('K', 6, AF14)>; /* LCD_B7 */ bias-disable; drive-push-pull; slew-rate = <0>; }; }; ltdc_sleep_pins_ customhmi: ltdc-sleep-dh-1 { pins { pinmux = <STM32_PINMUX('I', 14, ANALOG)>, /* LCD_CLK */ ... <STM32_PINMUX('K', 6, ANALOG)>; /* LCD_B7 */ }; }; };
USB OTG: Custom board where the USB-OTG port is only used as host?
On the DHCOM standard, the second USB port of the STM32MP1 is usually an USB-OTG port. If you have a custom board where you want to use the USB-OTG port in host mode only, you should consider the following:
The USB-OTG controller on the STM32MP1, DWC2, does support host mode but is rather inefficient (in comparison to a dedicated USB host controller). The following block diagram shows, that it is possible on the STM32MP1 to alter the pinmuxing, so that the USB-OTG port is used with the USB Host controller of the STM32MP1 (instead of using the DWC2 OTG controller):
Host port#1: EHCI/OHCI controller _________ HS PHY port #1 (SoC balls D+/D- #1) Host port#2: EHCI/OHCI controller __ \ |_____ HS PHY port #2 (SoC balls D+/D- #2) DWC2 OTG controller_________________/| | UTIM switch__________________|
This change can be made in the device tree with disabling the DWC2 controller and adding the second usb_phyc port to the nodes of usbh_ehci and (if applicable) usbh_ohci. These nodes are usually in the .dtsi file of the board (e.g. for the PicoITX: arch/arm/boot/dts/stm32mp15xx-dhcom-picoitx.dtsi). Here a is snippet how this could look like:
&usbh_ehci { phys = <&usbphyc_port0>, <&usbphyc_port1 1>; // <-------- HERE status = "okay"; }; &usbh_ohci { phys = <&usbphyc_port0>, <&usbphyc_port1 1>; // <-------- HERE status = "okay"; }; &usbotg_hs { status = "disabled"; // <-------- HERE }; &usbphyc { status = "okay"; }; &usbphyc_port0 { phy-supply = <&vdd_usb>; vdda1v1-supply = <®11>; vdda1v8-supply = <®18>; }; &usbphyc_port1 { phy-supply = <&vdd_usb>; vdda1v1-supply = <®11>; vdda1v8-supply = <®18>; };
How to try QtWebengine
The QtWebengine is part of the DH default images. Please stop the Weston desktop, before the start of the Browser.
Older images: "systemctl stop weston@root.service" Newer images: "systemctl stop weston.service"
How to start the Browser:
QT_QPA_PLATFORM=eglfs QT_QPA_EGLFS_ALWAYS_SET_MODE=1 QT_QPA_EGLFS_KMS_CONFIG=/etc/default/qt5-eglfs-kms.json qtwebengine-minimal http://YOUR-TEST-PAGE/ --no-sandbox