COM iMX6 Linux: Difference between revisions
Pzimmermann (talk | contribs) Added Subpage for calibration of resistive touchscreens |
|||
(119 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
==<br/> | == Storage Layout == | ||
<br/> | |||
::[[Image:DHCM_Boot_Storage_imx6.jpg|500px|DHCOM Boot Storage i.MX6]] | |||
<br/> | |||
:[[Image:DHCM_Storage_Layout_imx6.jpg|1000px|DHCOM Storage Layout i.MX6]] | |||
=== | == Linux virtual machine for development == | ||
:* Please have a look at: '''[[Virtual Machine for Application Development]]''' | |||
|< | == Linux Kernel == | ||
=== Sources: Look at page [[DHCOM iMX6-D2#BSP Sources|i.MX6 BSP Sources]] === | |||
=== How to build a Kernel === | |||
{| class="wikitable" align="center" | style="width: 98%; background: #f3f3f3;" valign="top" | | |||
| | |||
Get sources from Github | |||
{| class="wikitable" style="width: 100%; color: #000000; background: #ffffff;" | | |||
| | |||
1. Start the Console on Linux<br/> | |||
2. <tt>''git clone https://github.com/dh-electronics/linux-imx6qdl.git --branch dev/4.4.60_dhcom''</tt><br/> | |||
3. <tt>''cd linux-imx6qdl''</tt> | |||
|} | |} | ||
:''' | Configure and build the Device Tree + Kernel | ||
{| class="wikitable" style="width: 100%; color: #000000; background: #ffffff;" | | |||
== | | | ||
4. <tt>''ARCH=arm CROSS_COMPILE=/opt/gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- make imx6_dhcom_defconfig''</tt><br/> | |||
5. <tt>''ARCH=arm CROSS_COMPILE=/opt/gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- make menuconfig''</tt> (optional: If you want to add/remove Kernel features)<br/> | |||
6. <tt>''ARCH=arm CROSS_COMPILE=/opt/gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- make dtbs''</tt><br/> | |||
7. <tt>''ARCH=arm CROSS_COMPILE=/opt/gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- make zImage</tt> | |||
|} | |} | ||
*The built <font size=5><tt>imx6<font color="#B8A71A">x</font>-dhcom<font color="#0000FF">#</font><font color="#0EC3C1">Y</font>-<font color="#C90646">BOARD</font>.dtb</tt></font> devicetree files are available in <tt>arch/arm/boot/dts</tt> | |||
=== | **<font color="#B8A71A">x = s, dl, d, q</font> | ||
**<font color="#0000FF"># = 2 for HW200, 3 for HW300, 4 for HW400</font> | |||
**<font color="#0EC3C1">Y = B for Base, H for Hi-Speed-Interfaces</font> | |||
**<font color="#C90646">BOARD = pdk1, pdk2, ...</font> | |||
*The built <tt>zImage</tt> kernel file will you find in <tt>arch/arm/boot</tt> | |||
|} | |} | ||
== | === Update the Kernel and Device Tree with U-Boot === | ||
:Please refere to the [[DHCOM Update Mechanism|DHCOM Update Mechanism for i.MX6]]. | |||
==<br/> | === Update Kernel and Device Tree on a running Linux === | ||
{| class="wikitable" align="center" | style="width: 98%; background: #f3f3f3;" valign="top" | | |||
| | |||
==== Kernel ==== | |||
{| class="wikitable" style="width: 100%; color: #000000; background: #ffffff;" | | |||
| | |||
'''1.''' Copy the kernel '''zImage''' file to the path '''/boot''' (You can rename it after the Kernel version '''zImage_X.Y.Z''')<br/> | |||
'''2.''' Check '''zImage_file''' variable in '''/boot/uLinuxEnv.txt''' (e.g. <tt>'''zImage_file=zImage_4.4.60'''</tt>)<br/> | |||
|} | |||
==== Device Tree ==== | |||
{| class="wikitable" style="width: 100%; color: #000000; background: #ffffff;" | | |||
| | |||
'''3.''' Copy the Device Tree '''*.dtb''' file to the path '''/boot/dtbs_X.Y.Z'''<br/> | |||
'''4.''' Check '''fdt_file''' variable in '''/boot/uLinuxEnv.txt''' (e.g. <tt>'''fdtfile=/dtbs_4.4.60/imx6dl-dhcom4B-pdk2.dtb'''</tt>) <br/> | |||
|} | |||
==== Reboot System ==== | |||
{| class="wikitable" style="width: 100%; color: #000000; background: #ffffff;" | | |||
| | |||
'''5.''' Restart the system (e.g. <tt>'''reboot'''</tt>) | |||
|} | |||
|} | |||
=== | === Make your own Device Tree for your board === | ||
:The recommended proceeding for making your our Device Tree should be the following: | |||
: | :1. Clone the DH Device Tree Board file and change it to fit for your board | ||
::- Based on i.MX6 and PDK1 (works with i.MX6 HW200) | |||
:::<code>imx6qdl-dh_pdk1.dtsi --> imx6qdl-COMPANY_BOARDNAME.dtsi</code> | |||
::- Based on i.MX6 and PDK2 (works with i.MX6 HW300) | |||
:::<code>imx6qdl-dh_pdk2.dtsi --> imx6qdl-COMPANY_BOARDNAME.dtsi</code> | |||
:2. Clone the main Device Tree file and change the included boad file to yours | |||
:: E.g. based on i.MX6DL HW300 with PDK2 | |||
:::<code>imx6dl-dhcom3B-pdk2.dts --> imx6dl-dhcom3B-BOARDNAME.dts</code> | |||
: | :3. Add your new main Device Tree file to <code>Makefile</code> (located in the same folder) | ||
<br/> | |||
:'''DH Device Tree pattern (Kernel 4.4.x)''': | |||
:[[Image:DHCM_Device_Tree_pattern.jpg|1200px|DHCOM Device Tree pattern]] | |||
: | |||
== | == Rootfilesystem == | ||
: | === Available Rootfilesystems === | ||
:Please have a look at the [[DHCOM_iMX6-D2#Download binaries/images | iMX6 Images]] section. | |||
==<br/> | === Login === | ||
:{| class="wikitable" align="center" | style="width: 400px; color: #000000; background: #FFFFFF;" valign="top" | | |||
|| | |||
<tt> | |||
dhcom login: '''root'''<br/> | |||
Password: '''foo''' | |||
</tt> | |||
|} | |||
:{| class="wikitable" | === Reboot === | ||
| | :{| class="wikitable" align="center" | style="width: 400px; color: #000000; background: #FFFFFF;" valign="top" | | ||
| | |<tt># reboot</tt> | ||
| | |} | ||
| | :or | ||
| | :{| class="wikitable" align="center" | style="width: 400px; color: #000000; background: #FFFFFF;" valign="top" | | ||
|<tt># shutdown -r now</tt> | |||
|} | |} | ||
== | === Shutdown === | ||
:{| class="wikitable" align="center" | style="width: 400px; color: #000000; background: #FFFFFF;" valign="top" | | |||
|<tt># poweroff</tt> | |||
|} | |||
:or | |||
:{| class="wikitable" align="center" | style="width: 400px; color: #000000; background: #FFFFFF;" valign="top" | | |||
|<tt># shutdown -h now</tt> | |||
|} | |||
:Note: If the watchdog is active, the system will be reset. | |||
=== | === Calibrating the touchscreen (only on Debian 6.0) === | ||
:{| class="wikitable" align="center" | style="width: 400px; color: #000000; background: #FFFFFF;" valign="top" | | |||
|<tt># ts_calibrate</tt> | |||
| | |||
| | |||
| | |||
|} | |} | ||
:Check the enviroment variable "TSLIB_TSDEVICE=/dev/input/event0" with <tt> printenv </tt> if an error occurs. | |||
=== How to calibrate resistive touchscreens (only on Yocto images) === | |||
: | {{:Calibration of resistive touchscreens}} | ||
== Kernel Userspace Interfaces to Access Hardware == | |||
=== | === Ethernet Interfaces === | ||
:{| class="wikitable" style="width: | :{| class="wikitable" style="width: 400px" | ||
|| | ||DHCOM ENET 1||<tt>ethsom0</tt> | ||
|- | |- | ||
|| | ||DHCOM ENET 2||<tt>ethsom1</tt> | ||
|} | |} | ||
=== Serial (UART) Interfaces === | === Serial (UART) Interfaces === | ||
:{| class="wikitable" style="width: 400px" | :{| class="wikitable" style="width: 400px" | ||
||DHCOM (FF) UART 1||< | ||DHCOM (FF) UART 1||<tt>/dev/ttymxc0</tt> | ||
|- | |- | ||
||DHCOM (BT) UART 2 ||< | ||DHCOM (BT) UART 2 ||<tt>/dev/ttymxc4</tt> | ||
|- | |- | ||
||DHCOM (STD) UART 3 ||< | ||DHCOM (STD) UART 3 ||<tt>/dev/ttymxc3</tt> | ||
|} | |} | ||
=== I2C Interfaces === | === I2C Interfaces === | ||
:Hardware revision '''300''' and '''newer''' (dhcom3.., dhcom4.., ...) | |||
:{| class="wikitable" style="width: 400px" | :{| class="wikitable" style="width: 400px" | ||
||DHCOM I2C 1||< | ||DHCOM I2C 1||<tt>/dev/i2c-1</tt> | ||
|- | |- | ||
||DHCOM I2C 2 ||< | ||DHCOM I2C 2 ||<tt>/dev/i2c-0</tt> | ||
|- | |- | ||
||On Module Devices ||< | ||On Module Devices ||<tt>/dev/i2c-2</tt> | ||
|} | |||
:Hardware revision '''100 / 200''' (dhcom1.. / dhcom2..) | |||
:{| class="wikitable" style="width: 400px" | |||
||DHCOM I2C 1||<tt>/dev/i2c-0</tt> | |||
|- | |||
||DHCOM I2C 2 ||<tt>/dev/i2c-1</tt> | |||
|- | |||
||On Module Devices ||<tt>/dev/i2c-2</tt> | |||
|} | |} | ||
=== SPI Interfaces === | === SPI Interfaces === | ||
:{| class="wikitable" style="width: 400px" | :{| class="wikitable" style="width: 400px" | ||
|| | ||<b>Device</b>||<b>Kernel <= 5.4.xxx</b>||<b>Kernel >= 5.10.xxx</b> | ||
|- | |- | ||
||DHCOM SPI 2 ||< | ||DHCOM SPI 1||<tt>/dev/spidev0.2</tt>||<tt>/dev/spidev0.1</tt> | ||
|- | |||
||DHCOM SPI 2 ||<tt>/dev/spidev1.0</tt>||<tt>/dev/spidev1.0</tt> | |||
|} | |} | ||
:: '''Remark:''' DHCOM SPI1 interface doesn‘t work with DHCOM Premium Developer Kit (HD00013). | |||
::Reason: At DHCOM Premium Developer Kit SPI 1 isn‘t connected, because otherwise i.MX6 doesn‘t boot with the current schematic. | |||
=== MMC/SD/eMMC Interfaces === | === MMC/SD/eMMC Interfaces === | ||
:{| class="wikitable" style="width: 400px" | :{| class="wikitable" style="width: 400px" | ||
||DHCOM SD-Interface ||< | ||DHCOM SD-Interface ||<tt>/dev/mmcblk0pX</tt> | ||
|- | |- | ||
||on module µSD Card ||< | ||on module µSD Card ||<tt>/dev/mmcblk1pX</tt> | ||
|- | |- | ||
||on module eMMC ||< | ||on module eMMC ||<tt>/dev/mmcblk2pX</tt> | ||
|} | |} | ||
Line 154: | Line 183: | ||
=== Control the display brightness === | === Control the display brightness === | ||
: | :Set brightness level (X = 0...10) | ||
:{| class="wikitable" | |||
|<tt>''echo X >/sys/class/backlight/display/brightness''</tt> | |||
|} | |||
=== Control GPIOs === | === Control GPIOs === | ||
:{|class="wikitable" style="text-align: center; width: | :See which gpio is already used by the system | ||
:{| class="wikitable" | |||
|<tt>''cat /sys/kernel/debug/gpio | grep -v "gpio-... ( "''</tt> <br>or<br> <tt>''gpioinfo | grep -v unnamed''</tt> | |||
|} | |||
:{|class="wikitable" style="text-align: center; width: 1000px" | |||
|- | |- | ||
! DHCOM Name: !! alt. DHCOM Name: !! SO-DIMM Pin# !! Linux <GPIO#> | ! DHCOM Name: !! alt. DHCOM Name: !! SO-DIMM Pin# !! CPU Pad Name !! Linux <GPIO#> * !! gpiod label (deprecated): !! gpiod label: | ||
|- | |- | ||
| GPIO A || || 154 || 2 | | GPIO A || || 154 || PAD_GPIO_2 || 2 || A || DHCOM-A | ||
|- | |- | ||
| GPIO B || || 156 || 4 | | GPIO B || || 156 || PAD_GPIO_4 || 4 || B || DHCOM-B | ||
|- | |- | ||
| GPIO C || || 162 || 5 | | GPIO C || || 162 || PAD_GPIO_5 || 5 || C || DHCOM-C | ||
|- | |- | ||
| GPIO D || || 163 || 163 | | GPIO D || || 163 || PAD_CSI0_DAT17 || 163 || D || DHCOM-D | ||
|- | |- | ||
| GPIO E || || 164 || 101 | | GPIO E || || 164 || PAD_GPIO_19 || 101 || E || DHCOM-E | ||
|- | |- | ||
| GPIO F || || 165 || 116 | | GPIO F || || 165 || PAD_DI0_PIN4 || 116 || F || DHCOM-F | ||
|- | |- | ||
| GPIO G || || 167 || 91 | | GPIO G || || 167 || PAD_EIM_D27 || 91 || G || DHCOM-G | ||
|- | |- | ||
| GPIO H || || 173 || 103 | | GPIO H || || 173 || PAD_KEY_ROW0 || 103 || H || DHCOM-H | ||
|- | |- | ||
| GPIO I || || 175 || 104 | | GPIO I || || 175 || PAD_KEY_COL1 || 104 || I || DHCOM-I | ||
|- | |- | ||
| CIF HSYNC || | | GPIO J || CIF HSYNC || 74 || PAD_NANDF_CS1 || 174 || J || DHCOM-J | ||
|- | |- | ||
| CIF PCLK || | | GPIO K || CIF PCLK || 72 || PAD_NANDF_CS2 || 175 || K || DHCOM-K | ||
|- | |- | ||
| CIF MCLK || | | GPIO L || CIF MCLK || 70 || PAD_KEY_ROW1 || 105 || L || DHCOM-L | ||
|- | |- | ||
| CIF VSYNC || | | GPIO M || CIF VSYNC || 68 || PAD_SD3_DAT5 || 192 || M || DHCOM-M | ||
|- | |- | ||
| CIF D9 || | | GPIO N || CIF D9 || 66 || PAD_SD3_DAT4 || 193 || N || DHCOM-N | ||
|- | |- | ||
| CIF D8 || | | GPIO O || CIF D8 || 64 || PAD_CSI0_VSYNC || 149 || O || DHCOM-O | ||
|- | |- | ||
| CIF D7 || | | GPIO P || CIF D7 || 62 || PAD_GPIO_18 || 205 || P || DHCOM-P | ||
|- | |- | ||
| CIF D6 || | | GPIO Q || CIF D6 || 60 || PAD_SD1_CMD || 18 || Q || DHCOM-Q | ||
|- | |- | ||
| CIF D5 || | | GPIO R || CIF D5 || 58 || PAD_SD1_DAT0 || 16 || R || DHCOM-R | ||
|- | |- | ||
| CIF D4 || | | GPIO S || CIF D4 || 56 || PAD_SD1_DAT1 || 17 || S || DHCOM-S | ||
|- | |- | ||
| CIF D3 || | | GPIO T || CIF D3 || 54 || PAD_SD1_DAT2 || 19 || T || DHCOM-T | ||
|- | |- | ||
| CIF D2 || | | GPIO U || CIF D2 || 52 || PAD_SD1_CLK || 20 || U || DHCOM-U | ||
|- | |- | ||
| CIF D1 || | | GPIO V || CIF D1 || 50 || PAD_CSI0_PIXCLK || 146 || V || DHCOM-V | ||
|- | |- | ||
| CIF D0 || | | GPIO W || CIF D0 || 48 || PAD_CSI0_MCLK || 147 || W || DHCOM-W | ||
|- | |||
| INT HIGHEST PRIORITY || || 151 || PAD_KEY_COL0|| 102 || INT || DHCOM-INT | |||
|} | |} | ||
:: * = Valid if you didn't change the CONFIG_ARCH_NR_GPIO value in kernel config '''AND''' if your kernel doesn't probe another GPIO controller before the imx6 GPIO controller | |||
:: '''Remark:''' Depending on your board configuration some of the additional gpios shared with the camera interface are not available on your system. | :: '''Remark:''' Depending on your board configuration some of the additional gpios shared with the camera interface are not available on your system. | ||
:Export | |||
:{| class="wikitable" | :'''GPIO pin configuration''' | ||
|< | :: The default Linux Device Tree pin configurarion of the DHCOM GPIOs A - W is <code>0x400120b0</code> | ||
::{| class="wikitable" | |||
| | |||
Pad Mux Register (0x020E_xxxx) = 0x0000_0015 | |||
SION: 1 Enabled (Force input path of pad) | |||
MUX_MODE: 0101 ALT5 | |||
Pad Control Register (0x020E_xxxx) = 0x0001_20B0 | |||
HYS: 1 Hysteresis enabled (Schmitt trigger input) | |||
============== | |||
PUS: 00 100k Pull Down | |||
PUE: 1 PULL (Pull enabled) | |||
PKE: 0 Disable (Pull/Keeper disabled) | |||
ODE: 0 Disable (Output is CMOS) | |||
RESERVED: 000 | |||
-------------- | |||
SPEED: 10 imx6: 100MHz (medium) | |||
imx6ull: 100MHz (medium) | |||
DSE: 110 Drive strength imx6: 40 Ohm | |||
imx6ull: 43 Ohm @ 3.3V | |||
RESERVED 00 | |||
SRE: 0 SLOW (Slow Slew Rate) | |||
|} | |||
:'''Controlled by gpiod tools (need Kernel v4.7 or higher)''' | |||
::Set state | |||
::{| class="wikitable" | |||
|<tt>''gpioset $(gpiofind GPIO_LABEL)=0''</tt> | |||
|- | |||
|<tt>''gpioset $(gpiofind GPIO_LABEL)=1''</tt> | |||
|} | |||
::Get state | |||
::{| class="wikitable" | |||
|<tt>''gpioget $(gpiofind GPIO_LABEL)''</tt> | |||
|- | |||
|<tt>''gpioget $(gpiofind GPIO_LABEL)''</tt> | |||
|} | |||
:: '''Remark:''' GPIO_LABEL could be DHCOM-A, DHCOM-B, DHCOM-C, ... see table above | |||
:'''Controlled by sysfs (since Kernel v4.8 deprecated)''' | |||
::Export | |||
::{| class="wikitable" | |||
|<tt>''echo <GPIO#> >/sys/class/gpio/export''</tt> | |||
|} | |} | ||
:: '''Remark:''' Have a look into < | :: '''Remark:''' Have a look into <tt> /sys/class/gpio/ </tt> for already configured gpios. | ||
:Set direction | ::Set direction | ||
:{| class="wikitable" | ::{| class="wikitable" | ||
|< | |<tt>''echo in >/sys/class/gpio/gpio<GPIO#>/direction''</tt> | ||
|- | |- | ||
|< | |<tt>''echo out >/sys/class/gpio/gpio<GPIO#>/direction''</tt> | ||
|} | |} | ||
:Set state | ::Set state | ||
:{| class="wikitable" | ::{| class="wikitable" | ||
|< | |<tt>''echo 0 >/sys/class/gpio/gpio<GPIO#>/value''</tt> | ||
|- | |- | ||
|< | |<tt>''echo 1 >/sys/class/gpio/gpio<GPIO#>/value''</tt> | ||
|} | |||
::Get state | |||
::{| class="wikitable" | |||
|<tt>''cat /sys/class/gpio/gpio<GPIO#>/value''</tt> | |||
|} | |} | ||
Line 231: | Line 319: | ||
:Initialize: | :Initialize: | ||
:{| class="wikitable" | :{| class="wikitable" | ||
|< | |<tt>''ip link set can0 up type can bitrate 500000''</tt> | ||
|} | |} | ||
:Send test message via cansend (part of can-utils): | :Send test message via cansend (part of can-utils): | ||
:{| class="wikitable" | :{| class="wikitable" | ||
|< | |<tt>''cansend can0 100#11.2233.44556677.88''</tt> | ||
|} | |} | ||
:Receive can messages (part of can-utils): | :Receive can messages (part of can-utils): | ||
:{| class="wikitable" | :{| class="wikitable" | ||
|< | |<tt>''candump can0''</tt> | ||
|} | |} | ||
:Get can-utils: | :Get can-utils: | ||
:* [[ | :{| class="wikitable" | ||
|<tt>''apt-get install can-utils''</tt> | |||
|} | |||
=== Parallel Address- / Databus === | |||
:To use the 16-bit address / databus from Linux userspace you can use the UIO driver interface. To enable and configure the interface it is necessary to setup the WEIM controller with the device tree. See the documentation of the device tree bindings of weim [https://github.com/dh-electronics/linux-imx6qdl/blob/dev/4.4.60_dhcom/Documentation/devicetree/bindings/bus/imx-weim.txt here]. | |||
:Here is an example code which demonstrates how to do enable and configure the WEIM interface (parallel address- / databus): | |||
:{| | |||
|<tt> | |||
&weim { | |||
pinctrl-names = "default"; | |||
pinctrl-0 = <&pinctrl_dhcom_weim &pinctrl_dhcom_weim_cs0 &pinctrl_dhcom_weim_cs1>; | |||
#address-cells = <2>; | |||
#size-cells = <1>; | |||
/* it is necessary to setup 2x 64MB otherwise setting gpr fails */ | |||
ranges = <0 0 0x08000000 0x04000000>, // Chip select 0 == DHCOM CS A | |||
<1 0 0x0c000000 0x04000000>; // Chip select 1 == DHCOM CS B | |||
fsl,weim-cs-gpr = <&gpr>; | |||
status = "okay"; | |||
uiomap_cs0@0,0 { | |||
compatible = "generic-uio"; | |||
reg = <0 0x00000000 0x04000000>; | |||
reg-names = "uio_cs0"; | |||
interrupt-parent = <&gpio1>; | |||
interrupts = <2 2>; // Add gpio A == interrupt | |||
#address-cells = <1>; | |||
#size-cells = <1>; | |||
fsl,weim-cs-timing = <0x00610089 0x00001002 0x0F011061 | |||
0x00000000 0x0F068A31 0x00000000>; | |||
status = "okay"; | |||
}; | |||
uiomap_cs1@0,1 { | |||
compatible = "generic-uio"; | |||
reg = <1 0x00000000 0x04000000>; | |||
reg-names = "uio_cs1"; | |||
interrupt-parent = <&gpio1>; | |||
interrupts = <4 2>; // Add gpio B == interrupt | |||
#address-cells = <1>; | |||
#size-cells = <1>; | |||
fsl,weim-cs-timing = <0x00610089 0x00001002 0x0F011061 | |||
0x00000000 0x0F068A31 0x00000000>; | |||
status = "disabled"; | |||
}; | |||
}; | |||
</tt> | |||
|} | |||
: We have already written some demo code at [https://github.com/dh-electronics/linux-imx6qdl/blob/dev/4.4.60_dhcom/arch/arm/boot/dts/imx6qdl-dhcom_cfg-weim.dtsi /arch/arm/boot/dts/imx6qdl-dhcom_cfg-weim.dtsi]. It is easy to enable in the matching device-tree file: | |||
::*[https://github.com/dh-electronics/linux-imx6qdl/blob/dev/4.4.60_dhcom/arch/arm/boot/dts/imx6s-dhcom3B-pdk2.dts /arch/arm/boot/dts/imx6s-dhcom3B-pdk2.dts] | |||
::*[https://github.com/dh-electronics/linux-imx6qdl/blob/dev/4.4.60_dhcom/arch/arm/boot/dts/imx6dl-dhcom3B-pdk2.dts /arch/arm/boot/dts/imx6dl-dhcom3B-pdk2.dts] | |||
::*[https://github.com/dh-electronics/linux-imx6qdl/blob/dev/4.4.60_dhcom/arch/arm/boot/dts/imx6d-dhcom3B-pdk2.dts /arch/arm/boot/dts/imx6d-dhcom3B-pdk2.dts] | |||
::*[https://github.com/dh-electronics/linux-imx6qdl/blob/dev/4.4.60_dhcom/arch/arm/boot/dts/imx6q-dhcom3B-pdk2.dts /arch/arm/boot/dts/imx6q-dhcom3B-pdk2.dts] | |||
:{| | |||
| <tt> | |||
<font color="#FF1010">- // #include "imx6qdl-dhcom_cfg-weim.dtsi</font> | |||
<font color="#00FF10">+ #include "imx6qdl-dhcom_cfg-weim.dtsi </font> | |||
</tt> | |||
|} | |||
:To use the generic uio driver it has to be enabled in the kernel configuration (<code>[[#Linux Kernel|make menuconfig]]</code>) | |||
::*Device Drivers -> Userspace I/O Drivers -> Userspace I/O platform driver with generic IRQ handling | |||
: The device-tree of_id of the uio driver has to be set via kernel command line | |||
::*Add "optargs='uio_pdrv_genirq.of_id=generic-uio'" to uLinuxEnv.txt | |||
:Example for a UIO userspace driver: | |||
:* [[media:uio_access.zip| uio_access.cpp]] | |||
:* for further information have a look at the paper [https://www.osadl.org/fileadmin/dam/rtlws/12/Koch.pdf Userspace I/O drivers in a realtime context] | |||
=== Configure your own display === | |||
:To configure your own display you have to do the following steps: | |||
:1. Configure your display and build a settings file by our tool DHCOMSettingsGenerator ([[media:DHCOMSettingsGeneratorV2_V2.0.0.2.zip|Download v2.0.0.2]]) | |||
:2. Place generated file into the first partition (label: "boot") | |||
:3. Create a symbolic link to the file settings.bin ($ ln -s YourSettingsFile.bin settings.bin) | |||
:Remake: It is still possible to config the display via Device Tree e.g. <code>[https://github.com/dh-electronics/linux-imx6qdl/blob/dev/4.4.60_dhcom/arch/arm/boot/dts/imx6qdl-dh_pdk2.dtsi dev/4.4.60_dhcom/arch/arm/boot/dts/imx6qdl-dh_pdk2.dtsi]</code> (not recommended by DH) | |||
<br/> | |||
:'''The following picture showing the sequence and priorities:''' | |||
:[[Image:DHCM_Display_Settings.jpg|1300px|DHCOM Display Settings]] | |||
<br/> | |||
For detailed description of the '''display boot args''' please have a look at [[DHCOM iMX6 Bootloader U-Boot#Display and Hardware settings|Display and Hardware settings]] of the iMX6 Bootloader. | |||
==[[ELBE Overview| Embedded Linux Build Environment (ELBE)]] | == Additional Information == | ||
:*[[Linux Kernel Features | Linux Kernel Features ]] | |||
:*[[ELBE Overview| Embedded Linux Build Environment (ELBE)]] |
Latest revision as of 07:45, 20 October 2023
Storage Layout
Linux virtual machine for development
- Please have a look at: Virtual Machine for Application Development
Linux Kernel
Sources: Look at page i.MX6 BSP Sources
How to build a Kernel
Get sources from Github
Configure and build the Device Tree + Kernel
|
Update the Kernel and Device Tree with U-Boot
- Please refere to the DHCOM Update Mechanism for i.MX6.
Update Kernel and Device Tree on a running Linux
Kernel
Device Tree
Reboot System
|
Make your own Device Tree for your board
- The recommended proceeding for making your our Device Tree should be the following:
- 1. Clone the DH Device Tree Board file and change it to fit for your board
- - Based on i.MX6 and PDK1 (works with i.MX6 HW200)
imx6qdl-dh_pdk1.dtsi --> imx6qdl-COMPANY_BOARDNAME.dtsi
- - Based on i.MX6 and PDK2 (works with i.MX6 HW300)
imx6qdl-dh_pdk2.dtsi --> imx6qdl-COMPANY_BOARDNAME.dtsi
- - Based on i.MX6 and PDK1 (works with i.MX6 HW200)
- 2. Clone the main Device Tree file and change the included boad file to yours
- E.g. based on i.MX6DL HW300 with PDK2
imx6dl-dhcom3B-pdk2.dts --> imx6dl-dhcom3B-BOARDNAME.dts
- E.g. based on i.MX6DL HW300 with PDK2
- 3. Add your new main Device Tree file to
Makefile
(located in the same folder)
Rootfilesystem
Available Rootfilesystems
- Please have a look at the iMX6 Images section.
Login
dhcom login: root
Password: foo
Reboot
# reboot
- or
# shutdown -r now
Shutdown
# poweroff
- or
# shutdown -h now
- Note: If the watchdog is active, the system will be reset.
Calibrating the touchscreen (only on Debian 6.0)
# ts_calibrate
- Check the enviroment variable "TSLIB_TSDEVICE=/dev/input/event0" with printenv if an error occurs.
How to calibrate resistive touchscreens (only on Yocto images)
On devices with resistive touchscreens, the touchscreen has to be calibrated.
At our yocto images, we usually use libinput as library for handling input.
Prerequisites
- Yocto packages weston, weston-init and weston-examples have to be installed inside the image.
- The config file /etc/xdg/weston/weston.ini needs the following lines (to enable touchscreen calibration):
[libinput] touchscreen_calibrator=true
After changing the configuration of weston, weston needs to be restarted:
systemctl restart weston |
Steps for calibration
1. Get the touchscreen device name with weston-touch-calibrator
XDG_RUNTIME_DIR=/var/run/user/$(id -u weston) weston-touch-calibrator |
Example result (bold part is needed for next steps):
device "/sys/devices/platform/soc/2100000.bus/21a8000.i2c/i2c-2/2-0049/input/input0/event0" - head "DPI-1" |
2. Run weston-touch-calibrator on the device for starting the calibration. With the example part of the last result, the command looks like this (bold part is from the last result):
XDG_RUNTIME_DIR=/var/run/user/$(id -u weston) weston-touch-calibrator -v /sys/devices/platform/soc/2100000.bus/21a8000.i2c/i2c-2/2-0049/input/input0/event0 |
Now you press the highlighted points at the touchscreen to calibrate it. You will now get an output on the console like this (the important part is marked bold):
Calibration values: -0.001472 -1.081086 1.033880 -1.135099 0.000319 1.082698 |
3. To make the calibration permanent, you need to add a udev rule. Create the file /etc/udev/rules.d/touchscreen-cal.rules and use the calibration values there. With the result of the previous example, the file looks like this (bold part is the result of the last example):
SUBSYSTEM=="input", KERNEL=="event[0-9]*", ENV{ID_INPUT_TOUCHSCREEN}=="1", ENV{LIBINPUT_CALIBRATION_MATRIX}="-0.001472 -1.081086 1.033880 -1.135099 0.000319 1.082698"
Kernel Userspace Interfaces to Access Hardware
Ethernet Interfaces
DHCOM ENET 1 ethsom0 DHCOM ENET 2 ethsom1
Serial (UART) Interfaces
DHCOM (FF) UART 1 /dev/ttymxc0 DHCOM (BT) UART 2 /dev/ttymxc4 DHCOM (STD) UART 3 /dev/ttymxc3
I2C Interfaces
- Hardware revision 300 and newer (dhcom3.., dhcom4.., ...)
DHCOM I2C 1 /dev/i2c-1 DHCOM I2C 2 /dev/i2c-0 On Module Devices /dev/i2c-2
- Hardware revision 100 / 200 (dhcom1.. / dhcom2..)
DHCOM I2C 1 /dev/i2c-0 DHCOM I2C 2 /dev/i2c-1 On Module Devices /dev/i2c-2
SPI Interfaces
Device Kernel <= 5.4.xxx Kernel >= 5.10.xxx DHCOM SPI 1 /dev/spidev0.2 /dev/spidev0.1 DHCOM SPI 2 /dev/spidev1.0 /dev/spidev1.0
- Remark: DHCOM SPI1 interface doesn‘t work with DHCOM Premium Developer Kit (HD00013).
- Reason: At DHCOM Premium Developer Kit SPI 1 isn‘t connected, because otherwise i.MX6 doesn‘t boot with the current schematic.
MMC/SD/eMMC Interfaces
DHCOM SD-Interface /dev/mmcblk0pX on module µSD Card /dev/mmcblk1pX on module eMMC /dev/mmcblk2pX
- 'X' has to be replaced with the partition number
Control the display brightness
- Set brightness level (X = 0...10)
echo X >/sys/class/backlight/display/brightness
Control GPIOs
- See which gpio is already used by the system
cat /sys/kernel/debug/gpio | grep -v "gpio-... ( "
or
gpioinfo | grep -v unnamed
DHCOM Name: alt. DHCOM Name: SO-DIMM Pin# CPU Pad Name Linux <GPIO#> * gpiod label (deprecated): gpiod label: GPIO A 154 PAD_GPIO_2 2 A DHCOM-A GPIO B 156 PAD_GPIO_4 4 B DHCOM-B GPIO C 162 PAD_GPIO_5 5 C DHCOM-C GPIO D 163 PAD_CSI0_DAT17 163 D DHCOM-D GPIO E 164 PAD_GPIO_19 101 E DHCOM-E GPIO F 165 PAD_DI0_PIN4 116 F DHCOM-F GPIO G 167 PAD_EIM_D27 91 G DHCOM-G GPIO H 173 PAD_KEY_ROW0 103 H DHCOM-H GPIO I 175 PAD_KEY_COL1 104 I DHCOM-I GPIO J CIF HSYNC 74 PAD_NANDF_CS1 174 J DHCOM-J GPIO K CIF PCLK 72 PAD_NANDF_CS2 175 K DHCOM-K GPIO L CIF MCLK 70 PAD_KEY_ROW1 105 L DHCOM-L GPIO M CIF VSYNC 68 PAD_SD3_DAT5 192 M DHCOM-M GPIO N CIF D9 66 PAD_SD3_DAT4 193 N DHCOM-N GPIO O CIF D8 64 PAD_CSI0_VSYNC 149 O DHCOM-O GPIO P CIF D7 62 PAD_GPIO_18 205 P DHCOM-P GPIO Q CIF D6 60 PAD_SD1_CMD 18 Q DHCOM-Q GPIO R CIF D5 58 PAD_SD1_DAT0 16 R DHCOM-R GPIO S CIF D4 56 PAD_SD1_DAT1 17 S DHCOM-S GPIO T CIF D3 54 PAD_SD1_DAT2 19 T DHCOM-T GPIO U CIF D2 52 PAD_SD1_CLK 20 U DHCOM-U GPIO V CIF D1 50 PAD_CSI0_PIXCLK 146 V DHCOM-V GPIO W CIF D0 48 PAD_CSI0_MCLK 147 W DHCOM-W INT HIGHEST PRIORITY 151 PAD_KEY_COL0 102 INT DHCOM-INT
- * = Valid if you didn't change the CONFIG_ARCH_NR_GPIO value in kernel config AND if your kernel doesn't probe another GPIO controller before the imx6 GPIO controller
- Remark: Depending on your board configuration some of the additional gpios shared with the camera interface are not available on your system.
- GPIO pin configuration
- The default Linux Device Tree pin configurarion of the DHCOM GPIOs A - W is
0x400120b0
- The default Linux Device Tree pin configurarion of the DHCOM GPIOs A - W is
Pad Mux Register (0x020E_xxxx) = 0x0000_0015 SION: 1 Enabled (Force input path of pad) MUX_MODE: 0101 ALT5 Pad Control Register (0x020E_xxxx) = 0x0001_20B0 HYS: 1 Hysteresis enabled (Schmitt trigger input) ============== PUS: 00 100k Pull Down PUE: 1 PULL (Pull enabled) PKE: 0 Disable (Pull/Keeper disabled) ODE: 0 Disable (Output is CMOS) RESERVED: 000 -------------- SPEED: 10 imx6: 100MHz (medium) imx6ull: 100MHz (medium) DSE: 110 Drive strength imx6: 40 Ohm imx6ull: 43 Ohm @ 3.3V RESERVED 00 SRE: 0 SLOW (Slow Slew Rate)
- Controlled by gpiod tools (need Kernel v4.7 or higher)
- Set state
gpioset $(gpiofind GPIO_LABEL)=0 gpioset $(gpiofind GPIO_LABEL)=1
- Get state
gpioget $(gpiofind GPIO_LABEL) gpioget $(gpiofind GPIO_LABEL)
- Remark: GPIO_LABEL could be DHCOM-A, DHCOM-B, DHCOM-C, ... see table above
- Controlled by sysfs (since Kernel v4.8 deprecated)
- Export
echo <GPIO#> >/sys/class/gpio/export
- Remark: Have a look into /sys/class/gpio/ for already configured gpios.
- Set direction
echo in >/sys/class/gpio/gpio<GPIO#>/direction echo out >/sys/class/gpio/gpio<GPIO#>/direction
- Set state
echo 0 >/sys/class/gpio/gpio<GPIO#>/value echo 1 >/sys/class/gpio/gpio<GPIO#>/value
- Get state
cat /sys/class/gpio/gpio<GPIO#>/value
Initialize and Test CAN Interface
- Initialize:
ip link set can0 up type can bitrate 500000
- Send test message via cansend (part of can-utils):
cansend can0 100#11.2233.44556677.88
- Receive can messages (part of can-utils):
candump can0
- Get can-utils:
apt-get install can-utils
Parallel Address- / Databus
- To use the 16-bit address / databus from Linux userspace you can use the UIO driver interface. To enable and configure the interface it is necessary to setup the WEIM controller with the device tree. See the documentation of the device tree bindings of weim here.
- Here is an example code which demonstrates how to do enable and configure the WEIM interface (parallel address- / databus):
&weim { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_dhcom_weim &pinctrl_dhcom_weim_cs0 &pinctrl_dhcom_weim_cs1>; #address-cells = <2>; #size-cells = <1>; /* it is necessary to setup 2x 64MB otherwise setting gpr fails */ ranges = <0 0 0x08000000 0x04000000>, // Chip select 0 == DHCOM CS A <1 0 0x0c000000 0x04000000>; // Chip select 1 == DHCOM CS B fsl,weim-cs-gpr = <&gpr>; status = "okay"; uiomap_cs0@0,0 { compatible = "generic-uio"; reg = <0 0x00000000 0x04000000>; reg-names = "uio_cs0"; interrupt-parent = <&gpio1>; interrupts = <2 2>; // Add gpio A == interrupt #address-cells = <1>; #size-cells = <1>; fsl,weim-cs-timing = <0x00610089 0x00001002 0x0F011061 0x00000000 0x0F068A31 0x00000000>; status = "okay"; }; uiomap_cs1@0,1 { compatible = "generic-uio"; reg = <1 0x00000000 0x04000000>; reg-names = "uio_cs1"; interrupt-parent = <&gpio1>; interrupts = <4 2>; // Add gpio B == interrupt #address-cells = <1>; #size-cells = <1>; fsl,weim-cs-timing = <0x00610089 0x00001002 0x0F011061 0x00000000 0x0F068A31 0x00000000>; status = "disabled"; }; };
- We have already written some demo code at /arch/arm/boot/dts/imx6qdl-dhcom_cfg-weim.dtsi. It is easy to enable in the matching device-tree file:
- // #include "imx6qdl-dhcom_cfg-weim.dtsi + #include "imx6qdl-dhcom_cfg-weim.dtsi
- To use the generic uio driver it has to be enabled in the kernel configuration (
make menuconfig
)- Device Drivers -> Userspace I/O Drivers -> Userspace I/O platform driver with generic IRQ handling
- The device-tree of_id of the uio driver has to be set via kernel command line
- Add "optargs='uio_pdrv_genirq.of_id=generic-uio'" to uLinuxEnv.txt
- Example for a UIO userspace driver:
- uio_access.cpp
- for further information have a look at the paper Userspace I/O drivers in a realtime context
Configure your own display
- To configure your own display you have to do the following steps:
- 1. Configure your display and build a settings file by our tool DHCOMSettingsGenerator (Download v2.0.0.2)
- 2. Place generated file into the first partition (label: "boot")
- 3. Create a symbolic link to the file settings.bin ($ ln -s YourSettingsFile.bin settings.bin)
- Remake: It is still possible to config the display via Device Tree e.g.
dev/4.4.60_dhcom/arch/arm/boot/dts/imx6qdl-dh_pdk2.dtsi
(not recommended by DH)
For detailed description of the display boot args please have a look at Display and Hardware settings of the iMX6 Bootloader.