<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.mediawiki.compulab.com/w/index.php?action=history&amp;feed=atom&amp;title=Yocto%3A_I%2FO_Configuration_and_Device_Tree_Customization</id>
	<title>Yocto: I/O Configuration and Device Tree Customization - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.mediawiki.compulab.com/w/index.php?action=history&amp;feed=atom&amp;title=Yocto%3A_I%2FO_Configuration_and_Device_Tree_Customization"/>
	<link rel="alternate" type="text/html" href="https://www.mediawiki.compulab.com/w/index.php?title=Yocto:_I/O_Configuration_and_Device_Tree_Customization&amp;action=history"/>
	<updated>2026-04-17T20:05:00Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://www.mediawiki.compulab.com/w/index.php?title=Yocto:_I/O_Configuration_and_Device_Tree_Customization&amp;diff=5217&amp;oldid=prev</id>
		<title>Igor at 14:52, 28 August 2023</title>
		<link rel="alternate" type="text/html" href="https://www.mediawiki.compulab.com/w/index.php?title=Yocto:_I/O_Configuration_and_Device_Tree_Customization&amp;diff=5217&amp;oldid=prev"/>
		<updated>2023-08-28T14:52:05Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 14:52, 28 August 2023&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l364&quot; &gt;Line 364:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 364:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;};&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;};&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Yocto]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Igor</name></author>
		
	</entry>
	<entry>
		<id>https://www.mediawiki.compulab.com/w/index.php?title=Yocto:_I/O_Configuration_and_Device_Tree_Customization&amp;diff=5214&amp;oldid=prev</id>
		<title>Igor: Created page with &quot;= Overview = Hardware devices (SoC modules, on-board peripherals etc.) and their interconnections are described in Linux O/S using data structures called Device Trees.&lt;/br&gt; Co...&quot;</title>
		<link rel="alternate" type="text/html" href="https://www.mediawiki.compulab.com/w/index.php?title=Yocto:_I/O_Configuration_and_Device_Tree_Customization&amp;diff=5214&amp;oldid=prev"/>
		<updated>2023-08-28T14:50:07Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;= Overview = Hardware devices (SoC modules, on-board peripherals etc.) and their interconnections are described in Linux O/S using data structures called Device Trees.&amp;lt;/br&amp;gt; Co...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Overview =&lt;br /&gt;
Hardware devices (SoC modules, on-board peripherals etc.) and their interconnections are described in Linux O/S using data structures called Device Trees.&amp;lt;/br&amp;gt;&lt;br /&gt;
Compulab provides default Device Trees that match the I/O interconnections and peripheral devices implemented on the Compulab System-on-Module and on the reference carrier-board.&amp;lt;/br&amp;gt;&lt;br /&gt;
Customers designing a custom carrier-board will often need to make changes to the device tree in order to describe the I/O interconnections and peripheral devices specific to their design.&amp;lt;/br&amp;gt;&lt;br /&gt;
This article outlines the process of Device Tree customization required for making I/O configuration changes.&lt;br /&gt;
== Board Functionality Configuration Process ==&lt;br /&gt;
Board functionality configuration will usually involve the following steps:&lt;br /&gt;
# Identifying configuration requirements&lt;br /&gt;
# Configuring required device nodes in device tree&lt;br /&gt;
# Configuring required pin multiplexing in device tree&lt;br /&gt;
&lt;br /&gt;
= Identifying Configuration Requirements =&lt;br /&gt;
The first step in device tree customization is to identify the specific configuration or modification required in your design. This could include enabling or disabling peripherals, modifying pin assignments or configuring specific hardware-specific functionalities.&lt;br /&gt;
To determine the customization scope, refer to the documentation of your hardware components, including the System-on-Chip (SoC), System on Module (SoM), and carrier board schematics.&lt;br /&gt;
It is recommended to use the following Compulab resources:&lt;br /&gt;
* SOM technical reference manual&lt;br /&gt;
* Pin-mux configuration tools&lt;br /&gt;
* Default reference device tree&lt;br /&gt;
&lt;br /&gt;
= Defaut reference device tree =&lt;br /&gt;
Compulab default reference device tree files are named according to '''som-name.dts''' template and can be found in /arch/arm64/boot/dts/compulab/ folder of BSP source.&lt;br /&gt;
For example, default device tree file for UCM-iMX8PLUS is named '''ucm-imx8m-plus.dts'''.&lt;br /&gt;
The default device tree file is derived from the SoC pin-multiplexing header file which is part of the SoC BSP.&lt;br /&gt;
Pin multiplexing configuration is controlled by SoC registers. These registers are documented in detail in the SoC technical reference manual.&lt;br /&gt;
&lt;br /&gt;
= Configuring Device Tree Nodes =&lt;br /&gt;
&lt;br /&gt;
Device tree nodes are segments of the device tree that contain information about a specific hardware device. The contents of each node are dictated by the driver that is responsible for handling the hardware component.&amp;lt;/br&amp;gt;&lt;br /&gt;
Device tree nodes need to be modified or added when new hardware devices are added or functionality is changed.&lt;br /&gt;
&lt;br /&gt;
The following documents contain detailed information about the Linux device tree and its structure:&lt;br /&gt;
&lt;br /&gt;
* [https://www.kernel.org/doc/html/next/devicetree/usage-model.html#linux-and-the-devicetree Linux and the Devicetree]&lt;br /&gt;
* [https://www.devicetree.org/specifications/ Device Tree Specification]&lt;br /&gt;
&lt;br /&gt;
= Configuring Pin Multiplexing =&lt;br /&gt;
== Pin Selection and Allocation ==&lt;br /&gt;
The majority of ARM-based SoC pins are multi-functional and multiplexed allowing to use a single physical pin for one of several functions.&amp;lt;/br&amp;gt;&lt;br /&gt;
Certain functions may be available on more than one pin. Using a specific pin for a certain function will preclude using it for another peripheral module.&lt;br /&gt;
Carrier-board designers must select and allocate interface pins per the requirements of their design taking into account pin availability and multiplexing constraints.&lt;br /&gt;
Pin availability and multiplexing of Compulab System-on-Modules are described in detail in the &amp;quot;Signal Multiplexing Characteristics&amp;quot; reference manual chapter of each SOM. In addition, pin multiplexing tools can be used to simplify pin allocation process.&lt;br /&gt;
&amp;lt;!--To learn more please refer to [[Selection and Allocation of Multiplexed Pins in Compulab System-on-Modules]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modifying the device tree ==&lt;br /&gt;
The device tree segment that controls pin multiplexing will typically look as shown below:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;amp;iomuxc {&lt;br /&gt;
	pinctrl-names = &amp;quot;default&amp;quot;;&lt;br /&gt;
	pinctrl-0 = &amp;lt;&amp;amp;pinctrl_hog&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
	pinctrl_hog: hoggrp {&lt;br /&gt;
		fsl,pins = &amp;lt;&lt;br /&gt;
			MX8MP_IOMUXC_HDMI_DDC_SCL__HDMIMIX_HDMI_SCL	0x400001c3&lt;br /&gt;
			MX8MP_IOMUXC_HDMI_DDC_SDA__HDMIMIX_HDMI_SDA	0x400001c3&lt;br /&gt;
			MX8MP_IOMUXC_HDMI_HPD__HDMIMIX_HDMI_HPD		0x40000019&lt;br /&gt;
			MX8MP_IOMUXC_HDMI_CEC__HDMIMIX_HDMI_CEC		0x40000019&lt;br /&gt;
		&amp;gt;;&lt;br /&gt;
	};&lt;br /&gt;
...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each pin has up to 8 multiplexed functions. To simplify selecting the pin function, NXP provides macros for each SOC with the following naming convention: '''&amp;lt;SOC&amp;gt;_&amp;lt;PIN NAME&amp;gt;_&amp;lt;PIN FUNCTION&amp;gt;'''.&amp;lt;/br&amp;gt;&lt;br /&gt;
For example: '''MX8MP_IOMUXC_NAND_READY_B__GPIO3_IO16''' in which SOC = MX8MP, PIN NAME = IOMUXC_NAND_READY_B_, PIN FUNCTION = GPIO3_IO16.&amp;lt;/br&amp;gt;&lt;br /&gt;
Pin multiplexing registers and settings are documented in detail in each SoC reference manual that can be downloaded from the NXP website.&lt;br /&gt;
&lt;br /&gt;
Each i.MX SoC has a pin config file with pin function macro definitions as well as documentation in the device tree bindings directory.&amp;lt;/br&amp;gt;&lt;br /&gt;
For the i.MX family, the pinfunc files are located at ''arch/arm64/boot/dts/freescale/'' and the documentation is located at ''Documentation/devicetree/bindings/pinctrl/''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot; width=40%&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''Header file''' &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''Documentation''' &lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;&amp;quot; | imx8mp-pinfunc.h&lt;br /&gt;
| align=&amp;quot;&amp;quot; | fsl,imx8mp-pinctrl.yaml&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;&amp;quot; | imx8mq-pinfunc.h&lt;br /&gt;
| align=&amp;quot;&amp;quot; | fsl,imx8mq-pinctrl.yaml&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;&amp;quot; | imx8mm-pinfunc.h&lt;br /&gt;
| align=&amp;quot;&amp;quot; | fsl,imx8mm-pinctrl.yaml&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;&amp;quot; | imx93-pinfunc.h&lt;br /&gt;
| align=&amp;quot;&amp;quot; | fsl,imx93-pinctrl.yaml&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pin mux-mode and function ===&lt;br /&gt;
Each device tree pinmux entry has the following structure:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot; width=40%&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''SW_MUX_CTRL''' &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ''' SW_PAD_CTRL''' &lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;&amp;quot; | MX8MP_IOMUXC_NAND_READY_B__GPIO3_IO16&lt;br /&gt;
| align=&amp;quot;&amp;quot; | 0x19&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SW_MUX_CTRL''' register sets the multiplexing mode of the pin. Example:&lt;br /&gt;
&lt;br /&gt;
[[File:Imx8mp_sw_mux_ctrl.png|800px]]&lt;br /&gt;
&lt;br /&gt;
'''SW_PAD_CTRL''' register sets the specific operating setting of the pin. Example:&lt;br /&gt;
&lt;br /&gt;
[[File:Imx8mp_sw_pad_ctrl.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Example: adding a gpio_led node ===&lt;br /&gt;
In this example, the '''fsl,pins''' has one pin entry: pin '''MX8MP_IOMUXC_NAND_READY_B''' is configured for function '''GPIO3_IO16'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;amp;iomuxc {&lt;br /&gt;
	pinctrl-names = &amp;quot;default&amp;quot;;&lt;br /&gt;
	pinctrl-0 = &amp;lt;&amp;amp;pinctrl_hog&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
	pinctrl_hog: hoggrp {&lt;br /&gt;
		fsl,pins = &amp;lt;&lt;br /&gt;
			MX8MP_IOMUXC_HDMI_DDC_SCL__HDMIMIX_HDMI_SCL	0x400001c3&lt;br /&gt;
			MX8MP_IOMUXC_HDMI_DDC_SDA__HDMIMIX_HDMI_SDA	0x400001c3&lt;br /&gt;
			MX8MP_IOMUXC_HDMI_HPD__HDMIMIX_HDMI_HPD		0x40000019&lt;br /&gt;
			MX8MP_IOMUXC_HDMI_CEC__HDMIMIX_HDMI_CEC		0x40000019&lt;br /&gt;
		&amp;gt;;&lt;br /&gt;
	};&lt;br /&gt;
	pinctrl_gpio_led: gpioledgrp {&lt;br /&gt;
		fsl,pins = &amp;lt;&lt;br /&gt;
			MX8MP_IOMUXC_NAND_READY_B__GPIO3_IO16	0x19&lt;br /&gt;
		&amp;gt;;&lt;br /&gt;
	};&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interface Configuration Examples =&lt;br /&gt;
== UART ==&lt;br /&gt;
'''Pinmux'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pinctrl_uart2: uart2grp {&lt;br /&gt;
	fsl,pins = &amp;lt;&lt;br /&gt;
		MX8MP_IOMUXC_UART2_RXD__UART2_DCE_RX	0x49&lt;br /&gt;
		MX8MP_IOMUXC_UART2_TXD__UART2_DCE_TX	0x49&lt;br /&gt;
	&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Device Node'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;amp;uart2 {&lt;br /&gt;
	/* console */&lt;br /&gt;
	pinctrl-names = &amp;quot;default&amp;quot;;&lt;br /&gt;
	pinctrl-0 = &amp;lt;&amp;amp;pinctrl_uart2&amp;gt;;&lt;br /&gt;
	assigned-clocks = &amp;lt;&amp;amp;clk IMX8MP_CLK_UART2&amp;gt;;&lt;br /&gt;
	assigned-clock-parents = &amp;lt;&amp;amp;clk IMX8MP_SYS_PLL1_80M&amp;gt;;&lt;br /&gt;
	status = &amp;quot;okay&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPIO ==&lt;br /&gt;
For GPIOs to be used directly by user space applications:&lt;br /&gt;
&lt;br /&gt;
'''Pinmux'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pinctrl_uart3: uart3grp {&lt;br /&gt;
	fsl,pins = &amp;lt;&lt;br /&gt;
		MX8MP_IOMUXC_UART3_RXD__GPIO5_IO26	0x49 /* GPIO=(5-1)*32+26=154 */&lt;br /&gt;
		MX8MP_IOMUXC_UART3_TXD__GPIO5_IO27	0x49 /* GPIO=(5-1)*32+27=155 */&lt;br /&gt;
	&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{note| These pinmux group must be configured by iomux driver.}}&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;amp;iomuxc {&lt;br /&gt;
	pinctrl-names = &amp;quot;default&amp;quot;;&lt;br /&gt;
	pinctrl-0 = &amp;lt;&amp;amp;pinctrl_hog&amp;gt; &amp;lt;&amp;amp;pinctrl_uart3&amp;gt;;&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For GPIOs to be used as peripheral control signals (reset, interrupt, power control etc.)&amp;lt;/br&amp;gt;&lt;br /&gt;
'''Pinmux'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pinctrl_flexcan1_reg: flexcan1reggrp {&lt;br /&gt;
	fsl,pins = &amp;lt;&lt;br /&gt;
		MX8MP_IOMUXC_GPIO1_IO00__GPIO1_IO00	0x154	/* CAN1_STBY */&lt;br /&gt;
	&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
pinctrl_flexcan2_reg: flexcan2reggrp {&lt;br /&gt;
	fsl,pins = &amp;lt;&lt;br /&gt;
		MX8MP_IOMUXC_GPIO1_IO01__GPIO1_IO01	0x154	/* CAN1_STBY */&lt;br /&gt;
	&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Device nodes'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	reg_can1_stby: regulator-can1-stby {&lt;br /&gt;
		compatible = &amp;quot;regulator-fixed&amp;quot;;&lt;br /&gt;
		regulator-name = &amp;quot;can1-stby&amp;quot;;&lt;br /&gt;
		pinctrl-names = &amp;quot;default&amp;quot;;&lt;br /&gt;
		pinctrl-0 = &amp;lt;&amp;amp;pinctrl_flexcan1_reg&amp;gt;;&lt;br /&gt;
		regulator-min-microvolt = &amp;lt;3300000&amp;gt;;&lt;br /&gt;
		regulator-max-microvolt = &amp;lt;3300000&amp;gt;;&lt;br /&gt;
		gpio = &amp;lt;&amp;amp;gpio1 0 GPIO_ACTIVE_HIGH&amp;gt;;&lt;br /&gt;
		enable-active-high;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	reg_can2_stby: regulator-can2-stby {&lt;br /&gt;
		compatible = &amp;quot;regulator-fixed&amp;quot;;&lt;br /&gt;
		regulator-name = &amp;quot;can2-stby&amp;quot;;&lt;br /&gt;
		pinctrl-names = &amp;quot;default&amp;quot;;&lt;br /&gt;
		pinctrl-0 = &amp;lt;&amp;amp;pinctrl_flexcan2_reg&amp;gt;;&lt;br /&gt;
		regulator-min-microvolt = &amp;lt;3300000&amp;gt;;&lt;br /&gt;
		regulator-max-microvolt = &amp;lt;3300000&amp;gt;;&lt;br /&gt;
		gpio = &amp;lt;&amp;amp;gpio1 1 GPIO_ACTIVE_HIGH&amp;gt;;&lt;br /&gt;
		enable-active-high;&lt;br /&gt;
	};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Linux gpio tools/methods ===&lt;br /&gt;
==== sysfs ====&lt;br /&gt;
* List of defined and exported gpios&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 0-31, parent: platform/30200000.gpio, 30200000.gpio:&lt;br /&gt;
 gpio-0   (                    |regulator-can1-stby ) out lo&lt;br /&gt;
 gpio-1   (                    |regulator-can2-stby ) out lo&lt;br /&gt;
 gpio-154 (                    |sysfs               ) out hi&lt;br /&gt;
 gpio-155 (                    |sysfs               ) out hi&lt;br /&gt;
&lt;br /&gt;
......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* List of available gpio controllers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /sys/class/gpio&lt;br /&gt;
ls -al&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Aug 20 14:25 .&lt;br /&gt;
drwxr-xr-x 86 root root    0 Aug 20 14:25 ..&lt;br /&gt;
--w-------  1 root root 4096 Aug 20 14:25 export&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Aug 20 14:25 gpiochip0 -&amp;gt; ../../devices/platform/soc@0/30000000.bus/30200000.gpio/gpio/gpiochip0&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Aug 20 14:25 gpiochip128 -&amp;gt; ../../devices/platform/soc@0/30000000.bus/30240000.gpio/gpio/gpiochip128&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Aug 20 14:25 gpiochip32 -&amp;gt; ../../devices/platform/soc@0/30000000.bus/30210000.gpio/gpio/gpiochip32&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Aug 20 14:25 gpiochip496 -&amp;gt; ../../devices/platform/soc@0/30800000.bus/30a30000.i2c/i2c-1/1-0020/gpio/gpiochip496&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Aug 20 14:25 gpiochip64 -&amp;gt; ../../devices/platform/soc@0/30000000.bus/30220000.gpio/gpio/gpiochip64&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Aug 20 14:25 gpiochip96 -&amp;gt; ../../devices/platform/soc@0/30000000.bus/30230000.gpio/gpio/gpiochip96&lt;br /&gt;
--w-------  1 root root 4096 Aug 20 14:25 unexport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Export unassigned gpios&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 154 &amp;gt; export; cd gpio154&lt;br /&gt;
ls -al&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 21 06:27 .&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 21 06:27 ..&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 21 06:29 active_low&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Aug 21 06:29 device -&amp;gt; ../../../gpiochip4&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 21 06:29 direction&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 21 06:29 edge&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 21 06:29 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Aug 21 06:29 subsystem -&amp;gt; ../../../../../../../../class/gpio&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 21 06:27 uevent&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 21 06:29 value&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Change direction in/out&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo out &amp;gt; direction; cat direction&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Set/get value&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 1 &amp;gt; value ; cat value&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== gpiolib ====&lt;br /&gt;
* gpiodetect&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gpiochip0 [30200000.gpio] (32 lines)&lt;br /&gt;
gpiochip1 [30210000.gpio] (32 lines)&lt;br /&gt;
gpiochip2 [30220000.gpio] (32 lines)&lt;br /&gt;
gpiochip3 [30230000.gpio] (32 lines)&lt;br /&gt;
gpiochip4 [30240000.gpio] (32 lines)&lt;br /&gt;
gpiochip5 [1-0020] (16 lines)&lt;br /&gt;
gpioinfo gpiochip0&lt;br /&gt;
gpiochip0 - 32 lines:&lt;br /&gt;
      line   0:      unnamed &amp;quot;regulator-can1-stby&amp;quot; output active-high [used]&lt;br /&gt;
      line   1:      unnamed &amp;quot;regulator-can2-stby&amp;quot; output active-high [used]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SPI ==&lt;br /&gt;
'''Pinmux'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pinctrl_ecspi2: ecspi2grp {&lt;br /&gt;
	fsl,pins = &amp;lt;&lt;br /&gt;
		MX8MP_IOMUXC_ECSPI2_SCLK__ECSPI2_SCLK		0x82&lt;br /&gt;
		MX8MP_IOMUXC_ECSPI2_MOSI__ECSPI2_MOSI		0x82&lt;br /&gt;
		MX8MP_IOMUXC_ECSPI2_MISO__ECSPI2_MISO		0x82&lt;br /&gt;
	&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
pinctrl_ecspi2_cs: ecspi2cs {&lt;br /&gt;
	fsl,pins = &amp;lt;&lt;br /&gt;
		MX8MP_IOMUXC_ECSPI2_SS0__GPIO5_IO13		0x40000&lt;br /&gt;
	&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Device Node'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;amp;ecspi2 {&lt;br /&gt;
	#address-cells = &amp;lt;1&amp;gt;;&lt;br /&gt;
	#size-cells = &amp;lt;0&amp;gt;;&lt;br /&gt;
	fsl,spi-num-chipselects = &amp;lt;1&amp;gt;;&lt;br /&gt;
	pinctrl-names = &amp;quot;default&amp;quot;;&lt;br /&gt;
	pinctrl-0 = &amp;lt;&amp;amp;pinctrl_ecspi2 &amp;amp;pinctrl_ecspi2_cs&amp;gt;;&lt;br /&gt;
	cs-gpios = &amp;lt;&amp;amp;gpio5 13 GPIO_ACTIVE_LOW&amp;gt;;&lt;br /&gt;
	status = &amp;quot;okay&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	spidev1: spi@0 {&lt;br /&gt;
		reg = &amp;lt;0&amp;gt;;&lt;br /&gt;
		compatible = &amp;quot;rohm,dh2228fv&amp;quot;;&lt;br /&gt;
		spi-max-frequency = &amp;lt;500000&amp;gt;;&lt;br /&gt;
	};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== I2C ==&lt;br /&gt;
This example shows three I2C devices configured on I2C bus #2.&amp;lt;/br&amp;gt;&lt;br /&gt;
'''Pinmux'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pinctrl_i2c2: i2c2grp {&lt;br /&gt;
	fsl,pins = &amp;lt;&lt;br /&gt;
		MX8MP_IOMUXC_I2C2_SCL__I2C2_SCL			0x400001c3&lt;br /&gt;
		MX8MP_IOMUXC_I2C2_SDA__I2C2_SDA			0x400001c3&lt;br /&gt;
	&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Device Node'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;amp;i2c2 {&lt;br /&gt;
	clock-frequency = &amp;lt;400000&amp;gt;;&lt;br /&gt;
	pinctrl-names = &amp;quot;default&amp;quot;;&lt;br /&gt;
	pinctrl-0 = &amp;lt;&amp;amp;pinctrl_i2c2&amp;gt;;&lt;br /&gt;
	status = &amp;quot;okay&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	eeprom@50 {&lt;br /&gt;
		compatible = &amp;quot;atmel,24c08&amp;quot;;&lt;br /&gt;
		reg = &amp;lt;0x50&amp;gt;;&lt;br /&gt;
		pagesize = &amp;lt;16&amp;gt;;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	eeprom@54 {&lt;br /&gt;
		compatible = &amp;quot;atmel,24c08&amp;quot;;&lt;br /&gt;
		reg = &amp;lt;0x54&amp;gt;;&lt;br /&gt;
		pagesize = &amp;lt;16&amp;gt;;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	rtc@69 {&lt;br /&gt;
		compatible = &amp;quot;ab1805&amp;quot;;&lt;br /&gt;
		reg = &amp;lt;0x69&amp;gt;;&lt;br /&gt;
		pagesize = &amp;lt;16&amp;gt;;&lt;br /&gt;
		status = &amp;quot;okay&amp;quot;;&lt;br /&gt;
	};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Igor</name></author>
		
	</entry>
</feed>