Message ID | 20240924114053.127737-4-francesco@dolcini.it (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | arm64: dts: freescale: imx8mp-verdin: Add Ivy carrier | expand |
On Tue, Sep 24, 2024 at 01:40:53PM +0200, Francesco Dolcini wrote: > From: João Paulo Gonçalves <joao.goncalves@toradex.com> > > Add Toradex Verdin Ivy carrier board support. One notable feature of Ivy > is the analog inputs. These inputs are multiplexed, allowing the same > input to measure either voltage or current. For current measurements, > a GPIO switch enables or disables the shunt resistor. This process is > automatically managed by the Linux kernel using the IIO and MUX > subsystems. Voltage measurement is always enabled, but the voltage > measured by the ADC is scaled by a cascade voltage divider. In the > device tree, the equivalent gain of the voltage divider is used, which > can be calculated as follows: > > ------------ > + | > .-. > R1=30K | | > | | > '-' > |------------------- > Analog Input (AIN) | | > .-. .-. > R2=10K | | R3=30K | | > | | | | > '-' '-' > | | > | |-------- > | .-. + > | R4=10K | | > | | | ADC Input (Channels 0 and 1) > | '-' > - | | - > -----------| |-------- > === === > GND GND > > Vin = Analog Input (AIN) > Vout = ADC Input > Rth = Thevenin Equiv. Resistance > Vth = Thevenin Equiv. Voltage > RL = Load Resistor > > R1 = 30K, R2 = 10K, R3 = 30K, R4 = 10K > RL = R4 = 10K > > Rth = (R1 // R2) + R3 = 37500 Ohms > Vth = (Vin * R2) / (R1 + R2) = Vin/4; > Vout = (Vth * RL)/ (Rth + RL) = Vth/4.75 = Vin/19 > Gain = Vout/Vin = 1/19 which properties related these value? Frank > > https://www.toradex.com/products/carrier-board/ivy-carrier-board > > Signed-off-by: João Paulo Gonçalves <joao.goncalves@toradex.com> > Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com> > --- > arch/arm64/boot/dts/freescale/Makefile | 2 + > .../boot/dts/freescale/imx8mp-verdin-ivy.dtsi | 512 ++++++++++++++++++ > .../freescale/imx8mp-verdin-nonwifi-ivy.dts | 18 + > .../dts/freescale/imx8mp-verdin-wifi-ivy.dts | 18 + > 4 files changed, 550 insertions(+) > create mode 100644 arch/arm64/boot/dts/freescale/imx8mp-verdin-ivy.dtsi > create mode 100644 arch/arm64/boot/dts/freescale/imx8mp-verdin-nonwifi-ivy.dts > create mode 100644 arch/arm64/boot/dts/freescale/imx8mp-verdin-wifi-ivy.dts > > diff --git a/arch/arm64/boot/dts/freescale/Makefile b/arch/arm64/boot/dts/freescale/Makefile > index 9d3df8b218a2..349ff1af0361 100644 > --- a/arch/arm64/boot/dts/freescale/Makefile > +++ b/arch/arm64/boot/dts/freescale/Makefile > @@ -189,10 +189,12 @@ dtb-$(CONFIG_ARCH_MXC) += imx8mp-venice-gw74xx.dtb > dtb-$(CONFIG_ARCH_MXC) += imx8mp-venice-gw75xx-2x.dtb > dtb-$(CONFIG_ARCH_MXC) += imx8mp-verdin-nonwifi-dahlia.dtb > dtb-$(CONFIG_ARCH_MXC) += imx8mp-verdin-nonwifi-dev.dtb > +dtb-$(CONFIG_ARCH_MXC) += imx8mp-verdin-nonwifi-ivy.dtb > dtb-$(CONFIG_ARCH_MXC) += imx8mp-verdin-nonwifi-mallow.dtb > dtb-$(CONFIG_ARCH_MXC) += imx8mp-verdin-nonwifi-yavia.dtb > dtb-$(CONFIG_ARCH_MXC) += imx8mp-verdin-wifi-dahlia.dtb > dtb-$(CONFIG_ARCH_MXC) += imx8mp-verdin-wifi-dev.dtb > +dtb-$(CONFIG_ARCH_MXC) += imx8mp-verdin-wifi-ivy.dtb > dtb-$(CONFIG_ARCH_MXC) += imx8mp-verdin-wifi-mallow.dtb > dtb-$(CONFIG_ARCH_MXC) += imx8mp-verdin-wifi-yavia.dtb > > diff --git a/arch/arm64/boot/dts/freescale/imx8mp-verdin-ivy.dtsi b/arch/arm64/boot/dts/freescale/imx8mp-verdin-ivy.dtsi > new file mode 100644 > index 000000000000..db1b4ee7728c > --- /dev/null > +++ b/arch/arm64/boot/dts/freescale/imx8mp-verdin-ivy.dtsi > @@ -0,0 +1,512 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT > +/* > + * Copyright 2024 Toradex > + * > + * Common dtsi for Verdin IMX8MP SoM on Ivy carrier board > + * > + * https://www.toradex.com/computer-on-modules/verdin-arm-family/nxp-imx-8m-plus > + * https://www.toradex.com/products/carrier-board/ivy-carrier-board > + */ > + > +#include <dt-bindings/mux/mux.h> > +#include <dt-bindings/leds/common.h> > +#include <dt-bindings/net/ti-dp83867.h> > + > +/ { > + /* AIN1 Voltage w/o AIN1_MODE gpio control */ > + ain1_voltage_unmanaged: voltage-divider-ain1 { > + compatible = "voltage-divider"; > + #io-channel-cells = <1>; > + io-channels = <&ivy_adc1 0>; > + full-ohms = <19>; > + output-ohms = <1>; > + }; > + > + /* AIN1 Current w/o AIN1_MODE gpio control */ > + ain1_current_unmanaged: current-sense-shunt-ain1 { > + compatible = "current-sense-shunt"; > + #io-channel-cells = <0>; > + io-channels = <&ivy_adc1 1>; > + shunt-resistor-micro-ohms = <100000000>; > + }; Suggest you use https://github.com/lznuaa/dt-format to sort nodes. Any problem, let me know. Frank > + > + /* AIN1_MODE - SODIMM 216 */ > + ain1_mode_mux_ctrl: mux-controller-0 { > + compatible = "gpio-mux"; > + pinctrl-names = "default"; > + pinctrl-0 = <&pinctrl_gpio5>; > + #mux-control-cells = <0>; > + mux-gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>; > + }; > + > + ain1-voltage { > + compatible = "io-channel-mux"; > + channels = "ain1_voltage", ""; > + io-channels = <&ain1_voltage_unmanaged 0>; > + io-channel-names = "parent"; > + mux-controls = <&ain1_mode_mux_ctrl>; > + settle-time-us = <1000>; > + }; > + > + ain1-current { > + compatible = "io-channel-mux"; > + channels = "", "ain1_current"; > + io-channels = <&ain1_current_unmanaged>; > + io-channel-names = "parent"; > + mux-controls = <&ain1_mode_mux_ctrl>; > + settle-time-us = <1000>; > + }; > + > + /* AIN2 Voltage w/o AIN2_MODE gpio control */ > + ain2_voltage_unmanaged: voltage-divider-ain2 { > + compatible = "voltage-divider"; > + #io-channel-cells = <1>; > + io-channels = <&ivy_adc2 0>; > + full-ohms = <19>; > + output-ohms = <1>; > + }; > + > + /* AIN2 Current w/o AIN2_MODE gpio control */ > + ain2_current_unmanaged: current-sense-shunt-ain2 { > + compatible = "current-sense-shunt"; > + #io-channel-cells = <0>; > + io-channels = <&ivy_adc2 1>; > + shunt-resistor-micro-ohms = <100000000>; > + }; > + > + /* AIN2_MODE - SODIMM 218 */ > + ain2_mode_mux_ctrl: mux-controller-1 { > + compatible = "gpio-mux"; > + pinctrl-names = "default"; > + pinctrl-0 = <&pinctrl_gpio6>; > + #mux-control-cells = <0>; > + mux-gpios = <&gpio1 8 GPIO_ACTIVE_HIGH>; > + }; > + > + ain2-voltage { > + compatible = "io-channel-mux"; > + channels = "ain2_voltage", ""; > + io-channels = <&ain2_voltage_unmanaged 0>; > + io-channel-names = "parent"; > + mux-controls = <&ain2_mode_mux_ctrl>; > + settle-time-us = <1000>; > + }; > + > + ain2-current { > + compatible = "io-channel-mux"; > + channels = "", "ain2_current"; > + io-channels = <&ain2_current_unmanaged>; > + io-channel-names = "parent"; > + mux-controls = <&ain2_mode_mux_ctrl>; > + settle-time-us = <1000>; > + }; > + > + leds { > + compatible = "gpio-leds"; > + pinctrl-names = "default"; > + pinctrl-0 = <&pinctrl_ivy_leds>; > + > + /* D7 Blue - SODIMM 30 - LEDs.GPIO1 */ > + led-0 { > + color = <LED_COLOR_ID_BLUE>; > + default-state = "off"; > + function = LED_FUNCTION_STATUS; > + function-enumerator = <1>; > + gpios = <&gpio3 25 GPIO_ACTIVE_HIGH>; > + }; > + > + /* D7 Green - SODIMM 32 - LEDs.GPIO2 */ > + led-1 { > + color = <LED_COLOR_ID_GREEN>; > + default-state = "off"; > + function = LED_FUNCTION_STATUS; > + function-enumerator = <1>; > + gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>; > + }; > + > + /* D7 Red - SODIMM 34 - LEDs.GPIO3 */ > + led-2 { > + color = <LED_COLOR_ID_RED>; > + default-state = "off"; > + function = LED_FUNCTION_STATUS; > + function-enumerator = <1>; > + gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>; > + }; > + > + /* D8 Blue - SODIMM 36 - LEDs.GPIO4 */ > + led-3 { > + color = <LED_COLOR_ID_BLUE>; > + default-state = "off"; > + function = LED_FUNCTION_STATUS; > + function-enumerator = <2>; > + gpios = <&gpio4 2 GPIO_ACTIVE_HIGH>; > + }; > + > + /* D8 Green - SODIMM 54 - LEDs.GPIO5 */ > + led-4 { > + color = <LED_COLOR_ID_GREEN>; > + default-state = "off"; > + function = LED_FUNCTION_STATUS; > + function-enumerator = <2>; > + gpios = <&gpio3 1 GPIO_ACTIVE_HIGH>; > + }; > + > + /* D8 Red - SODIMM 44 - LEDs.GPIO6 */ > + led-5 { > + color = <LED_COLOR_ID_RED>; > + default-state = "off"; > + function = LED_FUNCTION_STATUS; > + function-enumerator = <2>; > + gpios = <&gpio4 31 GPIO_ACTIVE_HIGH>; > + }; > + > + /* D9 Blue - SODIMM 46 - LEDs.GPIO7 */ > + led-6 { > + color = <LED_COLOR_ID_BLUE>; > + default-state = "off"; > + function = LED_FUNCTION_STATUS; > + function-enumerator = <3>; > + gpios = <&gpio5 01 GPIO_ACTIVE_HIGH>; > + }; > + > + /* D9 Red - SODIMM 48 - LEDs.GPIO8 */ > + led-7 { > + color = <LED_COLOR_ID_RED>; > + default-state = "off"; > + function = LED_FUNCTION_STATUS; > + function-enumerator = <3>; > + gpios = <&gpio4 30 GPIO_ACTIVE_HIGH>; > + }; > + }; > + > + reg_3v2_ain1: regulator-3v2-ain1 { > + compatible = "regulator-fixed"; > + regulator-max-microvolt = <3200000>; > + regulator-min-microvolt = <3200000>; > + regulator-name = "+3V2_AIN1"; > + }; > + > + reg_3v2_ain2: regulator-3v2-ain2 { > + compatible = "regulator-fixed"; > + regulator-max-microvolt = <3200000>; > + regulator-min-microvolt = <3200000>; > + regulator-name = "+3V2_AIN2"; > + }; > + > + /* Ivy Power Supply Input Voltage */ > + ivy-input-voltage { > + compatible = "voltage-divider"; > + /* Verdin ADC_1 */ > + io-channels = <&verdin_som_adc 7>; > + full-ohms = <204700>; /* 200k + 4.7k */ > + output-ohms = <4700>; > + }; > + > + ivy-5v-voltage { > + compatible = "voltage-divider"; > + /* Verdin ADC_2 */ > + io-channels = <&verdin_som_adc 6>; > + full-ohms = <39000>; /* 27k + 12k */ > + output-ohms = <12000>; > + }; > + > + ivy-3v3-voltage { > + compatible = "voltage-divider"; > + /* Verdin ADC_3 */ > + io-channels = <&verdin_som_adc 5>; > + full-ohms = <54000>; /* 27k + 27k */ > + output-ohms = <27000>; > + }; > + > + ivy-1v8-voltage { > + compatible = "voltage-divider"; > + /* Verdin ADC_4 */ > + io-channels = <&verdin_som_adc 4>; > + full-ohms = <39000>; /* 12k + 27k */ > + output-ohms = <27000>; > + }; > +}; > + > +/* Verdin SPI_1 */ > +&ecspi1 { > + pinctrl-0 = <&pinctrl_ecspi1>, > + <&pinctrl_gpio1>, > + <&pinctrl_gpio4>; > + cs-gpios = <&gpio5 9 GPIO_ACTIVE_LOW>, > + <&gpio1 0 GPIO_ACTIVE_LOW>, > + <&gpio1 6 GPIO_ACTIVE_LOW>; > + status = "okay"; > + > + tpm@1 { > + compatible = "infineon,slb9670", "tcg,tpm_tis-spi"; > + reg = <1>; > + spi-max-frequency = <18500000>; > + }; > + > + fram@2 { > + compatible = "fujitsu,mb85rs256", "atmel,at25"; > + reg = <2>; > + address-width = <16>; > + size = <32768>; > + spi-max-frequency = <33000000>; > + pagesize = <1>; > + }; > +}; > + > +/* EEPROM on Ivy */ > +&eeprom_carrier_board { > + status = "okay"; > +}; > + > +/* Verdin ETH_1 */ > +&eqos { > + status = "okay"; > +}; > + > +/* Verdin ETH_2 */ > +&fec { > + phy-handle = <ðphy2>; > + phy-mode = "rgmii-id"; > + status = "okay"; > +}; > + > +&verdin_eth2_mdio { > + ethphy2: ethernet-phy@2 { > + reg = <2>; > + interrupt-parent = <&gpio4>; > + interrupts = <18 IRQ_TYPE_LEVEL_LOW>; > + ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_00_NS>; > + ti,tx-internal-delay = <DP83867_RGMIIDCTL_2_00_NS>; > + }; > +}; > + > +/* Verdin CAN_1 */ > +&flexcan1 { > + status = "okay"; > +}; > + > +/* Verdin CAN_2 */ > +&flexcan2 { > + status = "okay"; > +}; > + > +&gpio1 { > + gpio-line-names = > + "", /* 0 */ > + "GPIO2", /* Verdin GPIO_2 - SODIMM 208 */ > + "", > + "", > + "", > + "GPIO3", /* Verdin GPIO_3 - SODIMM 210 */ > + "", > + "", > + "", > + "", > + "", > + "", /* 10 */ > + "", > + "", > + "", > + "", > + "", > + "", > + "", > + "", > + "", > + "", /* 20 */ > + "", > + "", > + "", > + "", > + "", > + "", > + "", > + "", > + ""; > +}; > + > +&gpio3 { > + gpio-line-names = > + "", /* 0 */ > + "", > + "", > + "", > + "", > + "", > + "DIG_1", /* SODIMM 56 */ > + "DIG_2", /* SODIMM 58 */ > + "REL1", /* SODIMM 60 */ > + "REL2", /* SODIMM 62 */ > + "", /* 10 */ > + "", > + "", > + "", > + "REL4", /* SODIMM 66 */ > + "", > + "REL3", /* SODIMM 64 */ > + "", > + "", > + "", > + "", /* 20 */ > + "", > + "", > + "", > + "", > + "", > + "", > + "", > + "", > + ""; > +}; > + > +/* Temperature sensor on Ivy */ > +&hwmon_temp { > + compatible = "ti,tmp1075"; > + status = "okay"; > +}; > + > +/* Verdin I2C_4 CSI */ > +&i2c3 { > + status = "okay"; > + > + ivy_adc1: adc@40 { > + compatible = "ti,ads1119"; > + reg = <0x40>; > + pinctrl-names = "default"; > + pinctrl-0 = <&pinctrl_gpio7>; > + interrupt-parent = <&gpio4>; > + interrupts = <3 IRQ_TYPE_EDGE_FALLING>; > + avdd-supply = <®_3v2_ain1>; > + dvdd-supply = <®_3v2_ain1>; > + vref-supply = <®_3v2_ain1>; > + #address-cells = <1>; > + #io-channel-cells = <1>; > + #size-cells = <0>; > + > + /* AIN1 0-33V Voltage Input */ > + channel@0 { > + reg = <0>; > + diff-channels = <0 1>; > + }; > + > + /* AIN1 0-20mA Current Input */ > + channel@1 { > + reg = <1>; > + diff-channels = <2 3>; > + }; > + }; > + > + ivy_adc2: adc@41 { > + compatible = "ti,ads1119"; > + reg = <0x41>; > + pinctrl-names = "default"; > + pinctrl-0 = <&pinctrl_gpio8>; > + interrupt-parent = <&gpio4>; > + interrupts = <1 IRQ_TYPE_EDGE_FALLING>; > + avdd-supply = <®_3v2_ain2>; > + dvdd-supply = <®_3v2_ain2>; > + vref-supply = <®_3v2_ain2>; > + #address-cells = <1>; > + #io-channel-cells = <1>; > + #size-cells = <0>; > + > + /* AIN2 0-33V Voltage Input */ > + channel@0 { > + reg = <0>; > + diff-channels = <0 1>; > + }; > + > + /* AIN2 0-20mA Current Input */ > + channel@1 { > + reg = <1>; > + diff-channels = <2 3>; > + }; > + }; > +}; > + > +/* Verdin I2C_1 */ > +&i2c4 { > + status = "okay"; > +}; > + > +/* Verdin PCIE_1 */ > +&pcie { > + status = "okay"; > +}; > + > +&pcie_phy { > + status = "okay"; > +}; > + > +/* Verdin UART_1 */ > +&uart1 { > + status = "okay"; > +}; > + > +/* Verdin UART_2 */ > +&uart2 { > + linux,rs485-enabled-at-boot-time; > + rs485-rx-during-tx; > + status = "okay"; > +}; > + > +/* Verdin UART_3 */ > +&uart3 { > + status = "okay"; > +}; > + > +/* Verdin USB_1 */ > +&usb3_0 { > + status = "okay"; > +}; > + > +&usb3_phy0 { > + status = "okay"; > +}; > + > +/* Verdin USB_2 */ > +&usb3_1 { > + status = "okay"; > +}; > + > +&usb3_phy1 { > + status = "okay"; > +}; > + > +/* Verdin SD_1 */ > +&usdhc2 { > + status = "okay"; > +}; > + > +&iomuxc { > + > + pinctrl-names = "default"; > + pinctrl-0 = <&pinctrl_gpio2>, <&pinctrl_gpio3>, > + <&pinctrl_ivy_dig_inputs>, <&pinctrl_ivy_relays>; > + > + pinctrl_ivy_dig_inputs: ivydiginputsgrp { > + fsl,pins = > + <MX8MP_IOMUXC_NAND_DATA00__GPIO3_IO06 0x96>, /* SODIMM 56 */ > + <MX8MP_IOMUXC_NAND_DATA01__GPIO3_IO07 0x96>; /* SODIMM 58 */ > + }; > + > + pinctrl_ivy_leds: ivyledsgrp { > + fsl,pins = > + <MX8MP_IOMUXC_SAI5_MCLK__GPIO3_IO25 0x16>, /* SODIMM 30 */ > + <MX8MP_IOMUXC_SAI5_RXD1__GPIO3_IO22 0x16>, /* SODIMM 32 */ > + <MX8MP_IOMUXC_SAI5_RXFS__GPIO3_IO19 0x16>, /* SODIMM 34 */ > + <MX8MP_IOMUXC_SAI1_RXD0__GPIO4_IO02 0x16>, /* SODIMM 36 */ > + <MX8MP_IOMUXC_SAI3_TXFS__GPIO4_IO31 0x16>, /* SODIMM 44 */ > + <MX8MP_IOMUXC_SAI3_TXD__GPIO5_IO01 0x16>, /* SODIMM 46 */ > + <MX8MP_IOMUXC_SAI3_RXD__GPIO4_IO30 0x16>, /* SODIMM 48 */ > + <MX8MP_IOMUXC_NAND_CE0_B__GPIO3_IO01 0x16>; /* SODIMM 54 */ > + }; > + > + pinctrl_ivy_relays: ivyrelaysgrp { > + fsl,pins = > + <MX8MP_IOMUXC_NAND_DATA02__GPIO3_IO08 0x16>, /* SODIMM 60 */ > + <MX8MP_IOMUXC_NAND_DATA03__GPIO3_IO09 0x16>, /* SODIMM 62 */ > + <MX8MP_IOMUXC_NAND_READY_B__GPIO3_IO16 0x16>, /* SODIMM 64 */ > + <MX8MP_IOMUXC_NAND_DQS__GPIO3_IO14 0x16>; /* SODIMM 66 */ > + }; > +}; > diff --git a/arch/arm64/boot/dts/freescale/imx8mp-verdin-nonwifi-ivy.dts b/arch/arm64/boot/dts/freescale/imx8mp-verdin-nonwifi-ivy.dts > new file mode 100644 > index 000000000000..cb49690050ff > --- /dev/null > +++ b/arch/arm64/boot/dts/freescale/imx8mp-verdin-nonwifi-ivy.dts > @@ -0,0 +1,18 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT > +/* > + * Copyright 2024 Toradex > + */ > + > +/dts-v1/; > + > +#include "imx8mp-verdin.dtsi" > +#include "imx8mp-verdin-nonwifi.dtsi" > +#include "imx8mp-verdin-ivy.dtsi" > + > +/ { > + model = "Toradex Verdin iMX8M Plus on Ivy"; > + compatible = "toradex,verdin-imx8mp-nonwifi-ivy", > + "toradex,verdin-imx8mp-nonwifi", > + "toradex,verdin-imx8mp", > + "fsl,imx8mp"; > +}; > diff --git a/arch/arm64/boot/dts/freescale/imx8mp-verdin-wifi-ivy.dts b/arch/arm64/boot/dts/freescale/imx8mp-verdin-wifi-ivy.dts > new file mode 100644 > index 000000000000..22b8fe70b36d > --- /dev/null > +++ b/arch/arm64/boot/dts/freescale/imx8mp-verdin-wifi-ivy.dts > @@ -0,0 +1,18 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT > +/* > + * Copyright 2024 Toradex > + */ > + > +/dts-v1/; > + > +#include "imx8mp-verdin.dtsi" > +#include "imx8mp-verdin-wifi.dtsi" > +#include "imx8mp-verdin-ivy.dtsi" > + > +/ { > + model = "Toradex Verdin iMX8M Plus WB on Ivy"; > + compatible = "toradex,verdin-imx8mp-wifi-ivy", > + "toradex,verdin-imx8mp-wifi", > + "toradex,verdin-imx8mp", > + "fsl,imx8mp"; > +}; > -- > 2.39.5 >
Hi Frank, On Tue, Sep 24, 2024 at 11:09:51AM -0400, Frank Li wrote: > On Tue, Sep 24, 2024 at 01:40:53PM +0200, Francesco Dolcini wrote: > > From: João Paulo Gonçalves <joao.goncalves@toradex.com> > > > > Add Toradex Verdin Ivy carrier board support. One notable feature of Ivy > > is the analog inputs. These inputs are multiplexed, allowing the same > > input to measure either voltage or current. For current measurements, > > a GPIO switch enables or disables the shunt resistor. This process is > > automatically managed by the Linux kernel using the IIO and MUX > > subsystems. Voltage measurement is always enabled, but the voltage > > measured by the ADC is scaled by a cascade voltage divider. In the > > device tree, the equivalent gain of the voltage divider is used, which > > can be calculated as follows: > > > > ------------ > > + | > > .-. > > R1=30K | | > > | | > > '-' > > |------------------- > > Analog Input (AIN) | | > > .-. .-. > > R2=10K | | R3=30K | | > > | | | | > > '-' '-' > > | | > > | |-------- > > | .-. + > > | R4=10K | | > > | | | ADC Input (Channels 0 and 1) > > | '-' > > - | | - > > -----------| |-------- > > === === > > GND GND > > > > Vin = Analog Input (AIN) > > Vout = ADC Input > > Rth = Thevenin Equiv. Resistance > > Vth = Thevenin Equiv. Voltage > > RL = Load Resistor > > > > R1 = 30K, R2 = 10K, R3 = 30K, R4 = 10K > > RL = R4 = 10K > > > > Rth = (R1 // R2) + R3 = 37500 Ohms > > Vth = (Vin * R2) / (R1 + R2) = Vin/4; > > Vout = (Vth * RL)/ (Rth + RL) = Vth/4.75 = Vin/19 > > Gain = Vout/Vin = 1/19 > > which properties related these value? The gain value is used on the "ain1_voltage_unmanaged" node for the full-ohms and output-ohms properties. Best Regards, João Paulo Gonçalves
On Tue, Sep 24, 2024 at 01:50:21PM -0300, João Paulo Gonçalves wrote: > Hi Frank, > > On Tue, Sep 24, 2024 at 11:09:51AM -0400, Frank Li wrote: > > On Tue, Sep 24, 2024 at 01:40:53PM +0200, Francesco Dolcini wrote: > > > From: João Paulo Gonçalves <joao.goncalves@toradex.com> > > > > > > Add Toradex Verdin Ivy carrier board support. One notable feature of Ivy > > > is the analog inputs. These inputs are multiplexed, allowing the same > > > input to measure either voltage or current. For current measurements, > > > a GPIO switch enables or disables the shunt resistor. This process is > > > automatically managed by the Linux kernel using the IIO and MUX > > > subsystems. Voltage measurement is always enabled, but the voltage > > > measured by the ADC is scaled by a cascade voltage divider. In the > > > device tree, the equivalent gain of the voltage divider is used, which > > > can be calculated as follows: > > > > > > ------------ > > > + | > > > .-. > > > R1=30K | | > > > | | > > > '-' > > > |------------------- > > > Analog Input (AIN) | | > > > .-. .-. > > > R2=10K | | R3=30K | | > > > | | | | > > > '-' '-' > > > | | > > > | |-------- > > > | .-. + > > > | R4=10K | | > > > | | | ADC Input (Channels 0 and 1) > > > | '-' > > > - | | - > > > -----------| |-------- > > > === === > > > GND GND > > > > > > Vin = Analog Input (AIN) > > > Vout = ADC Input > > > Rth = Thevenin Equiv. Resistance > > > Vth = Thevenin Equiv. Voltage > > > RL = Load Resistor > > > > > > R1 = 30K, R2 = 10K, R3 = 30K, R4 = 10K > > > RL = R4 = 10K > > > > > > Rth = (R1 // R2) + R3 = 37500 Ohms > > > Vth = (Vin * R2) / (R1 + R2) = Vin/4; > > > Vout = (Vth * RL)/ (Rth + RL) = Vth/4.75 = Vin/19 > > > Gain = Vout/Vin = 1/19 > > > > which properties related these value? > > The gain value is used on the "ain1_voltage_unmanaged" node for the full-ohms > and output-ohms properties. Okay, why not define a C macros, which calculate value base on input R<n> 's number. Frank > > Best Regards, > João Paulo Gonçalves
diff --git a/arch/arm64/boot/dts/freescale/Makefile b/arch/arm64/boot/dts/freescale/Makefile index 9d3df8b218a2..349ff1af0361 100644 --- a/arch/arm64/boot/dts/freescale/Makefile +++ b/arch/arm64/boot/dts/freescale/Makefile @@ -189,10 +189,12 @@ dtb-$(CONFIG_ARCH_MXC) += imx8mp-venice-gw74xx.dtb dtb-$(CONFIG_ARCH_MXC) += imx8mp-venice-gw75xx-2x.dtb dtb-$(CONFIG_ARCH_MXC) += imx8mp-verdin-nonwifi-dahlia.dtb dtb-$(CONFIG_ARCH_MXC) += imx8mp-verdin-nonwifi-dev.dtb +dtb-$(CONFIG_ARCH_MXC) += imx8mp-verdin-nonwifi-ivy.dtb dtb-$(CONFIG_ARCH_MXC) += imx8mp-verdin-nonwifi-mallow.dtb dtb-$(CONFIG_ARCH_MXC) += imx8mp-verdin-nonwifi-yavia.dtb dtb-$(CONFIG_ARCH_MXC) += imx8mp-verdin-wifi-dahlia.dtb dtb-$(CONFIG_ARCH_MXC) += imx8mp-verdin-wifi-dev.dtb +dtb-$(CONFIG_ARCH_MXC) += imx8mp-verdin-wifi-ivy.dtb dtb-$(CONFIG_ARCH_MXC) += imx8mp-verdin-wifi-mallow.dtb dtb-$(CONFIG_ARCH_MXC) += imx8mp-verdin-wifi-yavia.dtb diff --git a/arch/arm64/boot/dts/freescale/imx8mp-verdin-ivy.dtsi b/arch/arm64/boot/dts/freescale/imx8mp-verdin-ivy.dtsi new file mode 100644 index 000000000000..db1b4ee7728c --- /dev/null +++ b/arch/arm64/boot/dts/freescale/imx8mp-verdin-ivy.dtsi @@ -0,0 +1,512 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT +/* + * Copyright 2024 Toradex + * + * Common dtsi for Verdin IMX8MP SoM on Ivy carrier board + * + * https://www.toradex.com/computer-on-modules/verdin-arm-family/nxp-imx-8m-plus + * https://www.toradex.com/products/carrier-board/ivy-carrier-board + */ + +#include <dt-bindings/mux/mux.h> +#include <dt-bindings/leds/common.h> +#include <dt-bindings/net/ti-dp83867.h> + +/ { + /* AIN1 Voltage w/o AIN1_MODE gpio control */ + ain1_voltage_unmanaged: voltage-divider-ain1 { + compatible = "voltage-divider"; + #io-channel-cells = <1>; + io-channels = <&ivy_adc1 0>; + full-ohms = <19>; + output-ohms = <1>; + }; + + /* AIN1 Current w/o AIN1_MODE gpio control */ + ain1_current_unmanaged: current-sense-shunt-ain1 { + compatible = "current-sense-shunt"; + #io-channel-cells = <0>; + io-channels = <&ivy_adc1 1>; + shunt-resistor-micro-ohms = <100000000>; + }; + + /* AIN1_MODE - SODIMM 216 */ + ain1_mode_mux_ctrl: mux-controller-0 { + compatible = "gpio-mux"; + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_gpio5>; + #mux-control-cells = <0>; + mux-gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>; + }; + + ain1-voltage { + compatible = "io-channel-mux"; + channels = "ain1_voltage", ""; + io-channels = <&ain1_voltage_unmanaged 0>; + io-channel-names = "parent"; + mux-controls = <&ain1_mode_mux_ctrl>; + settle-time-us = <1000>; + }; + + ain1-current { + compatible = "io-channel-mux"; + channels = "", "ain1_current"; + io-channels = <&ain1_current_unmanaged>; + io-channel-names = "parent"; + mux-controls = <&ain1_mode_mux_ctrl>; + settle-time-us = <1000>; + }; + + /* AIN2 Voltage w/o AIN2_MODE gpio control */ + ain2_voltage_unmanaged: voltage-divider-ain2 { + compatible = "voltage-divider"; + #io-channel-cells = <1>; + io-channels = <&ivy_adc2 0>; + full-ohms = <19>; + output-ohms = <1>; + }; + + /* AIN2 Current w/o AIN2_MODE gpio control */ + ain2_current_unmanaged: current-sense-shunt-ain2 { + compatible = "current-sense-shunt"; + #io-channel-cells = <0>; + io-channels = <&ivy_adc2 1>; + shunt-resistor-micro-ohms = <100000000>; + }; + + /* AIN2_MODE - SODIMM 218 */ + ain2_mode_mux_ctrl: mux-controller-1 { + compatible = "gpio-mux"; + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_gpio6>; + #mux-control-cells = <0>; + mux-gpios = <&gpio1 8 GPIO_ACTIVE_HIGH>; + }; + + ain2-voltage { + compatible = "io-channel-mux"; + channels = "ain2_voltage", ""; + io-channels = <&ain2_voltage_unmanaged 0>; + io-channel-names = "parent"; + mux-controls = <&ain2_mode_mux_ctrl>; + settle-time-us = <1000>; + }; + + ain2-current { + compatible = "io-channel-mux"; + channels = "", "ain2_current"; + io-channels = <&ain2_current_unmanaged>; + io-channel-names = "parent"; + mux-controls = <&ain2_mode_mux_ctrl>; + settle-time-us = <1000>; + }; + + leds { + compatible = "gpio-leds"; + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_ivy_leds>; + + /* D7 Blue - SODIMM 30 - LEDs.GPIO1 */ + led-0 { + color = <LED_COLOR_ID_BLUE>; + default-state = "off"; + function = LED_FUNCTION_STATUS; + function-enumerator = <1>; + gpios = <&gpio3 25 GPIO_ACTIVE_HIGH>; + }; + + /* D7 Green - SODIMM 32 - LEDs.GPIO2 */ + led-1 { + color = <LED_COLOR_ID_GREEN>; + default-state = "off"; + function = LED_FUNCTION_STATUS; + function-enumerator = <1>; + gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>; + }; + + /* D7 Red - SODIMM 34 - LEDs.GPIO3 */ + led-2 { + color = <LED_COLOR_ID_RED>; + default-state = "off"; + function = LED_FUNCTION_STATUS; + function-enumerator = <1>; + gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>; + }; + + /* D8 Blue - SODIMM 36 - LEDs.GPIO4 */ + led-3 { + color = <LED_COLOR_ID_BLUE>; + default-state = "off"; + function = LED_FUNCTION_STATUS; + function-enumerator = <2>; + gpios = <&gpio4 2 GPIO_ACTIVE_HIGH>; + }; + + /* D8 Green - SODIMM 54 - LEDs.GPIO5 */ + led-4 { + color = <LED_COLOR_ID_GREEN>; + default-state = "off"; + function = LED_FUNCTION_STATUS; + function-enumerator = <2>; + gpios = <&gpio3 1 GPIO_ACTIVE_HIGH>; + }; + + /* D8 Red - SODIMM 44 - LEDs.GPIO6 */ + led-5 { + color = <LED_COLOR_ID_RED>; + default-state = "off"; + function = LED_FUNCTION_STATUS; + function-enumerator = <2>; + gpios = <&gpio4 31 GPIO_ACTIVE_HIGH>; + }; + + /* D9 Blue - SODIMM 46 - LEDs.GPIO7 */ + led-6 { + color = <LED_COLOR_ID_BLUE>; + default-state = "off"; + function = LED_FUNCTION_STATUS; + function-enumerator = <3>; + gpios = <&gpio5 01 GPIO_ACTIVE_HIGH>; + }; + + /* D9 Red - SODIMM 48 - LEDs.GPIO8 */ + led-7 { + color = <LED_COLOR_ID_RED>; + default-state = "off"; + function = LED_FUNCTION_STATUS; + function-enumerator = <3>; + gpios = <&gpio4 30 GPIO_ACTIVE_HIGH>; + }; + }; + + reg_3v2_ain1: regulator-3v2-ain1 { + compatible = "regulator-fixed"; + regulator-max-microvolt = <3200000>; + regulator-min-microvolt = <3200000>; + regulator-name = "+3V2_AIN1"; + }; + + reg_3v2_ain2: regulator-3v2-ain2 { + compatible = "regulator-fixed"; + regulator-max-microvolt = <3200000>; + regulator-min-microvolt = <3200000>; + regulator-name = "+3V2_AIN2"; + }; + + /* Ivy Power Supply Input Voltage */ + ivy-input-voltage { + compatible = "voltage-divider"; + /* Verdin ADC_1 */ + io-channels = <&verdin_som_adc 7>; + full-ohms = <204700>; /* 200k + 4.7k */ + output-ohms = <4700>; + }; + + ivy-5v-voltage { + compatible = "voltage-divider"; + /* Verdin ADC_2 */ + io-channels = <&verdin_som_adc 6>; + full-ohms = <39000>; /* 27k + 12k */ + output-ohms = <12000>; + }; + + ivy-3v3-voltage { + compatible = "voltage-divider"; + /* Verdin ADC_3 */ + io-channels = <&verdin_som_adc 5>; + full-ohms = <54000>; /* 27k + 27k */ + output-ohms = <27000>; + }; + + ivy-1v8-voltage { + compatible = "voltage-divider"; + /* Verdin ADC_4 */ + io-channels = <&verdin_som_adc 4>; + full-ohms = <39000>; /* 12k + 27k */ + output-ohms = <27000>; + }; +}; + +/* Verdin SPI_1 */ +&ecspi1 { + pinctrl-0 = <&pinctrl_ecspi1>, + <&pinctrl_gpio1>, + <&pinctrl_gpio4>; + cs-gpios = <&gpio5 9 GPIO_ACTIVE_LOW>, + <&gpio1 0 GPIO_ACTIVE_LOW>, + <&gpio1 6 GPIO_ACTIVE_LOW>; + status = "okay"; + + tpm@1 { + compatible = "infineon,slb9670", "tcg,tpm_tis-spi"; + reg = <1>; + spi-max-frequency = <18500000>; + }; + + fram@2 { + compatible = "fujitsu,mb85rs256", "atmel,at25"; + reg = <2>; + address-width = <16>; + size = <32768>; + spi-max-frequency = <33000000>; + pagesize = <1>; + }; +}; + +/* EEPROM on Ivy */ +&eeprom_carrier_board { + status = "okay"; +}; + +/* Verdin ETH_1 */ +&eqos { + status = "okay"; +}; + +/* Verdin ETH_2 */ +&fec { + phy-handle = <ðphy2>; + phy-mode = "rgmii-id"; + status = "okay"; +}; + +&verdin_eth2_mdio { + ethphy2: ethernet-phy@2 { + reg = <2>; + interrupt-parent = <&gpio4>; + interrupts = <18 IRQ_TYPE_LEVEL_LOW>; + ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_00_NS>; + ti,tx-internal-delay = <DP83867_RGMIIDCTL_2_00_NS>; + }; +}; + +/* Verdin CAN_1 */ +&flexcan1 { + status = "okay"; +}; + +/* Verdin CAN_2 */ +&flexcan2 { + status = "okay"; +}; + +&gpio1 { + gpio-line-names = + "", /* 0 */ + "GPIO2", /* Verdin GPIO_2 - SODIMM 208 */ + "", + "", + "", + "GPIO3", /* Verdin GPIO_3 - SODIMM 210 */ + "", + "", + "", + "", + "", + "", /* 10 */ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", /* 20 */ + "", + "", + "", + "", + "", + "", + "", + "", + ""; +}; + +&gpio3 { + gpio-line-names = + "", /* 0 */ + "", + "", + "", + "", + "", + "DIG_1", /* SODIMM 56 */ + "DIG_2", /* SODIMM 58 */ + "REL1", /* SODIMM 60 */ + "REL2", /* SODIMM 62 */ + "", /* 10 */ + "", + "", + "", + "REL4", /* SODIMM 66 */ + "", + "REL3", /* SODIMM 64 */ + "", + "", + "", + "", /* 20 */ + "", + "", + "", + "", + "", + "", + "", + "", + ""; +}; + +/* Temperature sensor on Ivy */ +&hwmon_temp { + compatible = "ti,tmp1075"; + status = "okay"; +}; + +/* Verdin I2C_4 CSI */ +&i2c3 { + status = "okay"; + + ivy_adc1: adc@40 { + compatible = "ti,ads1119"; + reg = <0x40>; + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_gpio7>; + interrupt-parent = <&gpio4>; + interrupts = <3 IRQ_TYPE_EDGE_FALLING>; + avdd-supply = <®_3v2_ain1>; + dvdd-supply = <®_3v2_ain1>; + vref-supply = <®_3v2_ain1>; + #address-cells = <1>; + #io-channel-cells = <1>; + #size-cells = <0>; + + /* AIN1 0-33V Voltage Input */ + channel@0 { + reg = <0>; + diff-channels = <0 1>; + }; + + /* AIN1 0-20mA Current Input */ + channel@1 { + reg = <1>; + diff-channels = <2 3>; + }; + }; + + ivy_adc2: adc@41 { + compatible = "ti,ads1119"; + reg = <0x41>; + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_gpio8>; + interrupt-parent = <&gpio4>; + interrupts = <1 IRQ_TYPE_EDGE_FALLING>; + avdd-supply = <®_3v2_ain2>; + dvdd-supply = <®_3v2_ain2>; + vref-supply = <®_3v2_ain2>; + #address-cells = <1>; + #io-channel-cells = <1>; + #size-cells = <0>; + + /* AIN2 0-33V Voltage Input */ + channel@0 { + reg = <0>; + diff-channels = <0 1>; + }; + + /* AIN2 0-20mA Current Input */ + channel@1 { + reg = <1>; + diff-channels = <2 3>; + }; + }; +}; + +/* Verdin I2C_1 */ +&i2c4 { + status = "okay"; +}; + +/* Verdin PCIE_1 */ +&pcie { + status = "okay"; +}; + +&pcie_phy { + status = "okay"; +}; + +/* Verdin UART_1 */ +&uart1 { + status = "okay"; +}; + +/* Verdin UART_2 */ +&uart2 { + linux,rs485-enabled-at-boot-time; + rs485-rx-during-tx; + status = "okay"; +}; + +/* Verdin UART_3 */ +&uart3 { + status = "okay"; +}; + +/* Verdin USB_1 */ +&usb3_0 { + status = "okay"; +}; + +&usb3_phy0 { + status = "okay"; +}; + +/* Verdin USB_2 */ +&usb3_1 { + status = "okay"; +}; + +&usb3_phy1 { + status = "okay"; +}; + +/* Verdin SD_1 */ +&usdhc2 { + status = "okay"; +}; + +&iomuxc { + + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_gpio2>, <&pinctrl_gpio3>, + <&pinctrl_ivy_dig_inputs>, <&pinctrl_ivy_relays>; + + pinctrl_ivy_dig_inputs: ivydiginputsgrp { + fsl,pins = + <MX8MP_IOMUXC_NAND_DATA00__GPIO3_IO06 0x96>, /* SODIMM 56 */ + <MX8MP_IOMUXC_NAND_DATA01__GPIO3_IO07 0x96>; /* SODIMM 58 */ + }; + + pinctrl_ivy_leds: ivyledsgrp { + fsl,pins = + <MX8MP_IOMUXC_SAI5_MCLK__GPIO3_IO25 0x16>, /* SODIMM 30 */ + <MX8MP_IOMUXC_SAI5_RXD1__GPIO3_IO22 0x16>, /* SODIMM 32 */ + <MX8MP_IOMUXC_SAI5_RXFS__GPIO3_IO19 0x16>, /* SODIMM 34 */ + <MX8MP_IOMUXC_SAI1_RXD0__GPIO4_IO02 0x16>, /* SODIMM 36 */ + <MX8MP_IOMUXC_SAI3_TXFS__GPIO4_IO31 0x16>, /* SODIMM 44 */ + <MX8MP_IOMUXC_SAI3_TXD__GPIO5_IO01 0x16>, /* SODIMM 46 */ + <MX8MP_IOMUXC_SAI3_RXD__GPIO4_IO30 0x16>, /* SODIMM 48 */ + <MX8MP_IOMUXC_NAND_CE0_B__GPIO3_IO01 0x16>; /* SODIMM 54 */ + }; + + pinctrl_ivy_relays: ivyrelaysgrp { + fsl,pins = + <MX8MP_IOMUXC_NAND_DATA02__GPIO3_IO08 0x16>, /* SODIMM 60 */ + <MX8MP_IOMUXC_NAND_DATA03__GPIO3_IO09 0x16>, /* SODIMM 62 */ + <MX8MP_IOMUXC_NAND_READY_B__GPIO3_IO16 0x16>, /* SODIMM 64 */ + <MX8MP_IOMUXC_NAND_DQS__GPIO3_IO14 0x16>; /* SODIMM 66 */ + }; +}; diff --git a/arch/arm64/boot/dts/freescale/imx8mp-verdin-nonwifi-ivy.dts b/arch/arm64/boot/dts/freescale/imx8mp-verdin-nonwifi-ivy.dts new file mode 100644 index 000000000000..cb49690050ff --- /dev/null +++ b/arch/arm64/boot/dts/freescale/imx8mp-verdin-nonwifi-ivy.dts @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT +/* + * Copyright 2024 Toradex + */ + +/dts-v1/; + +#include "imx8mp-verdin.dtsi" +#include "imx8mp-verdin-nonwifi.dtsi" +#include "imx8mp-verdin-ivy.dtsi" + +/ { + model = "Toradex Verdin iMX8M Plus on Ivy"; + compatible = "toradex,verdin-imx8mp-nonwifi-ivy", + "toradex,verdin-imx8mp-nonwifi", + "toradex,verdin-imx8mp", + "fsl,imx8mp"; +}; diff --git a/arch/arm64/boot/dts/freescale/imx8mp-verdin-wifi-ivy.dts b/arch/arm64/boot/dts/freescale/imx8mp-verdin-wifi-ivy.dts new file mode 100644 index 000000000000..22b8fe70b36d --- /dev/null +++ b/arch/arm64/boot/dts/freescale/imx8mp-verdin-wifi-ivy.dts @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT +/* + * Copyright 2024 Toradex + */ + +/dts-v1/; + +#include "imx8mp-verdin.dtsi" +#include "imx8mp-verdin-wifi.dtsi" +#include "imx8mp-verdin-ivy.dtsi" + +/ { + model = "Toradex Verdin iMX8M Plus WB on Ivy"; + compatible = "toradex,verdin-imx8mp-wifi-ivy", + "toradex,verdin-imx8mp-wifi", + "toradex,verdin-imx8mp", + "fsl,imx8mp"; +};