COM iMX6ULL Linux: Difference between revisions

From Wiki-DB
Jump to navigationJump to search
Christoph (talk | contribs)
Created page with "== Storage Layout == <br/> ::500px|DHCOM SPI Boot Flash <br/> :1000px|DHCOM Storage Layout == Linux virtua..."
 
Christoph (talk | contribs)
 
(41 intermediate revisions by the same user not shown)
Line 1: Line 1:
== Storage Layout ==
== Storage Layout ==
<br/>
<br/>
::[[Image:DHCM_SPI_Boot_Flash.jpg|500px|DHCOM SPI Boot Flash]]
::[[Image:DHCM_Boot_Storage_imx6ull.jpg|1100px|DHCOM Boot Storage i.MX6ULL]]
<br/>
<br/>
:[[Image:DHCM_Storage_Layout.jpg|1000px|DHCOM Storage Layout]]
:[[Image:DHCM_Storage_Layout_imx6ull.jpg|1000px|DHCOM Storage Layout i.MX6ULL]]


== Linux virtual machine for development ==
== Linux virtual machine for development ==
Line 10: Line 10:
== Linux Kernel ==
== Linux Kernel ==


===Sources for the i.MX6 Kernel===
=== Sources: Look at page [[DHCOM iMX6ULL-D2#BSP Sources|i.MX6ULL BSP Sources]] ===
:* Mainline
::* [https://github.com/dh-electronics/linux-imx6qdl/tree/dev/4.4.60_dhcom 4.4.60 mainline (GitHub) default branch]
::* [https://github.com/dh-electronics/linux-imx6qdl/tree/dev/4.4.38_dhcom 4.4.38 mainline (GitHub)]
::* [https://github.com/dh-electronics/linux-imx6qdl/tree/dev/3.14.79_dhcom 3.14.79 mainline (GitHub)]
::* [https://github.com/dh-electronics/linux-imx6qdl/tree/dev/3.14.12_dhcom 3.14.12 mainline (GitHub)]
:* Vendor
::* [https://github.com/dh-electronics/linux-imx6-vendor/tree/release/v4.1.15/20170405 4.1.15 vendor 2017-04-05 (GitHub) default branch]
::* [https://github.com/dh-electronics/linux-imx6-vendor/tree/release/v3.10.17/20170130 3.10.17 vendor 2017-01-30 (GitHub)]


=== How to build a Kernel ===
=== How to build a Kernel ===
Line 27: Line 19:
|
|
1. Start the Console on Linux<br/>
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/>
2. <tt>''git clone https://github.com/dh-electronics/linux-imx6qdl.git --branch dev/4.19.135_dhsom''</tt><br/>
3. <tt>''cd linux-imx6qdl''</tt>
3. <tt>''cd linux-imx6qdl''</tt>
|}
|}
Line 33: Line 25:
{| class="wikitable" style="width: 100%; color: #000000; background: #ffffff;" |
{| class="wikitable" style="width: 100%; color: #000000; background: #ffffff;" |
|  
|  
4. <tt>''ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make imx6_dhcom_defconfig''</tt><br/>
4. <tt>''ARCH=arm CROSS_COMPILE=/opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- make imx6ull_dhsom_defconfig''</tt><br/>
5. <tt>''ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make menuconfig''</tt> (optional: If you want to add/remove Kernel features)<br/>
5. <tt>''ARCH=arm CROSS_COMPILE=/opt/gcc-linaro-6.3.1-2017.05-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=arm-linux-gnueabihf- make dtbs''</tt><br/>
6. <tt>''ARCH=arm CROSS_COMPILE=/opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- make dtbs''</tt><br/>
7. <tt>''ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make zImage</tt>
7. <tt>''ARCH=arm CROSS_COMPILE=/opt/gcc-linaro-6.3.1-2017.05-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>
*The built <tt>imx6ull-dhcom-BOARD.dtb</tt> / <tt>imx6ull-dhcor-BOARD.dtb</tt> 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>
*The built <tt>zImage</tt> kernel file will you find in <tt>arch/arm/boot</tt>
|}
|}


=== Update the Kernel and Devicetree with U-Boot ===
=== Update the Kernel and Device Tree with U-Boot ===
:Please refere to the [[DHCOM Update Mechanism|DHCOM Update Mechanism for i.MX6]].
:Please refere to the [[DHCOM Update Mechanism|DHCOM Update Mechanism for i.MX6]].


=== Update Kernel and Devicetree on a running Linux ===
=== Update Kernel and Device Tree on a running Linux ===
{| class="wikitable" align="center" |  style="width: 98%; background: #f3f3f3;" valign="top" |
{| class="wikitable" align="center" |  style="width: 98%; background: #f3f3f3;" valign="top" |
|
|
Line 55: Line 43:
{| class="wikitable" style="width: 100%; color: #000000; background: #ffffff;" |
{| class="wikitable" style="width: 100%; color: #000000; background: #ffffff;" |
|  
|  
'''1.''' Copy the kernel zImage file to the path <tt>'''/boot'''</tt><br/>
'''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 whether the correct zImage file name is set in <tt>'''/boot/uLinuxEnv.txt'''</tt> (e.g. <tt>'''zImage_file=zImage'''</tt>)<br/>
'''2.''' Check '''zImage_file''' variable in '''/boot/uLinuxEnv.txt''' (e.g. <tt>'''zImage_file=zImage_4.19.25'''</tt>)<br/>
|}
|}
==== Devicetree ====
==== Device Tree ====
{| class="wikitable" style="width: 100%; color: #000000; background: #ffffff;" |
{| class="wikitable" style="width: 100%; color: #000000; background: #ffffff;" |
|
|
'''3.''' Copy the devicetree file to the path <tt>'''/boot/dtbs'''</tt><br/>
'''3.''' Copy the Device Tree '''*.dtb''' file to the path '''/boot/dtbs_X.Y.Z'''<br/>
'''4.''' Check '''fdtfile''' variable in <tt>'''/boot/uLinuxEnv.txt'''</tt> (e.g. <tt>'''fdtfile=/dtbs/imx6dl-dhcom3B-pdk2.dtb'''</tt> / see above) <br/>
'''4.''' Check '''fdt_file''' variable in '''/boot/uLinuxEnv.txt''' (e.g. <tt>'''fdtfile=/dtbs_4.19.25/imx6ull-dhcom-pdk2.dtb'''</tt>) <br/>
|}
|}
==== Reboot System ====
==== Reboot System ====
Line 75: Line 63:


:1. Clone the DH Device Tree Board file and change it to fit for your board
: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>imx6ull-dhcom-pdk2.dts --> imx6ull-dhcom-BOARDNAME.dts</code>
:::<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
:2. Add your new main Device Tree file to <code>Makefile</code> (located in the same folder)
:: 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''':
:[[Image:DHCM_Device_Tree_pattern.jpg|1200px|DHCOM Device Tree pattern]]


==Debian Rootfilesystem ==
==Debian Rootfilesystem ==


=== Available Rootfilesystems ===
=== Available Rootfilesystems ===
:Please have a look at the [[COM_iMX6-D2#Downloads | iMX6 Downloads]] section.
:Please have a look at the [[DHCOM iMX6ULL-D2#Download binaries/images | iMX6ULL Images]] section.
 
=== External Documentation ===
:*  [https://debian-handbook.info/browse/stable/ The Debian Administrator's Handbook]: A reference book presenting the Debian distribution, from initial installation to configuration of services. The administration and configuration chapters apply to our Debian based root filesystems.
:*  [https://www.debian.org/doc/ Debian Documentation]


=== Login ===
=== Login ===
Line 102: Line 76:
||
||
<tt>
<tt>
Debian GNU/Linux 8 dhcom ttymxc0<br/>
dhcom login: '''root'''<br/>
dhcom login: '''root'''<br/>
Password: '''foo'''
Password: '''foo'''
Line 109: Line 81:
|}
|}


=== Shutdown ===
=== Reboot ===
:{| class="wikitable" align="center" |  style="width: 400px; color: #000000; background: #FFFFFF;" valign="top" |
:{| class="wikitable" align="center" |  style="width: 400px; color: #000000; background: #FFFFFF;" valign="top" |
|<tt># shutdown -h now</tt>
|<tt># reboot</tt>
|}
|}
 
:or
=== Calibrating the touchscreen (only on Debian 6.0) ===
:{| class="wikitable" align="center" |  style="width: 400px; color: #000000; background: #FFFFFF;" valign="top" |
:{| class="wikitable" align="center" |  style="width: 400px; color: #000000; background: #FFFFFF;" valign="top" |
|<tt># ts_calibrate</tt>
|<tt># shutdown -r now</tt>
|}
|}
:*Check the enviroment variable "TSLIB_TSDEVICE=/dev/input/event0" with <tt> printenv </tt> if an error occurs.


== How to create a microSD-card with a rootfilesystem on it ==
=== Shutdown ===
 
:{| class="wikitable" align="center" | style="width: 400px; color: #000000; background: #FFFFFF;" valign="top" |
:1. Format a microSD card like following (in linux e.g. gparted, palimpsest) with '''Master Boot Record''' partition scheme
|<tt># poweroff</tt>
:{| class="wikitable" | style="width: 450px; color: #000000; background: #FFFFFF;" valign="top" |
|
<tt>P1 '''ext3''', name="boot" (Primary partition: 100MiB)</tt><br/>
<tt>P2 '''ext3''', name="rootfs" (Primary part.: Residual space)</tt>
|}
|}
:2. Untar the root file system to the "rootfs" partition of the microSD card (Don't copy the tar archive directly to the microSD card)
:or
:{| class="wikitable" | style="width: 450px; color: #000000; background: #FFFFFF;" valign="top" |
:{| class="wikitable" align="center" | style="width: 400px; color: #000000; background: #FFFFFF;" valign="top" |
|
|<tt># shutdown -h now</tt>
Start the Console on Linux<br/>
<tt># ''su''</tt><br/>
<tt># ''chmod 755 /path/of/the/microSD_card''</tt><br/>
<tt># ''cd /path/of/the/microSD_card''</tt><br/>
<tt># ''tar xfjv path/to/RootFS/Name_of_RootFS_file.tar.bz2''</tt>
|}
|}
:'''Remark:''' If you got a *.tar.gz file so type <tt> tar xfzv ...  </tt> to extract the rootfilesystem.
:Note: If the watchdog is active, the system will be reset.


== Kernel Userspace Interfaces to Access Hardware ==  
== Kernel Userspace Interfaces to Access Hardware ==  
=== Ethernet Interfaces ===
:{| 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||<tt>/dev/ttymxc0</tt>
  ||DHCOM UART 1||<tt>/dev/ttymxc0</tt>
  |-
  |-
  ||DHCOM (BT) UART 2 ||<tt>/dev/ttymxc4</tt>
  ||DHCOM UART 2 <sup>[1]</sup>||<tt>/dev/ttymxc1</tt>
  |-
  |-
  ||DHCOM (STD) UART 3 ||<tt>/dev/ttymxc3</tt>
  ||DHCOM UART 3||<tt><n/a></tt>
  |}
  |}
:<sup>[1]</sup> If DHCOM UART2 is used for Bluetooth it is possible to have it on a modified module hardware on <tt>/dev/ttymxc5</tt> by losing GPIOs J/K/L/M.


=== I2C Interfaces ===
=== I2C Interfaces ===
:Hardware revision '''300''' and '''newer''' (dhcom3.., dhcom4.., ...)
:{| class="wikitable" style="width: 400px"
:{| class="wikitable" style="width: 400px"
  ||DHCOM I2C 1||<tt>/dev/i2c-1</tt>
  ||DHCOM I2C 1||<tt>/dev/i2c-1</tt>
  |-
  |-
  ||DHCOM I2C 2 ||<tt>/dev/i2c-0</tt>
  ||DHCOM I2C 2 ||<tt>/dev/i2c-0</tt>
|-
||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"
  ||DHCOM SPI 1||<tt>/dev/spidev0.2</tt>
  ||DHCOM SPI 1||<tt>/dev/spidev0.0</tt>
  |-
  |-
  ||DHCOM SPI 2 ||<tt>/dev/spidev1.0</tt>
  ||DHCOM SPI 2 <sup>[1]</sup>||<tt>/dev/spidev1.0</tt>
  |}
  |}


:: '''Remark:''' DHCOM SPI1 interface doesn‘t work with DHCOM Premium Developer Kit (HD00013).
:<sup>[1]</sup> DHCOM SPI2 is only available, if the second ethernet is not mounted.
::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 ||<tt>/dev/mmcblk0pX</tt>
| DHCOM SD-Interface
|-
| rowspan="2" | <tt>/dev/mmcblk1pX</tt>
||on module µSD Card ||<tt>/dev/mmcblk1pX</tt>
|-
|-
| on module µSD Card
||on module eMMC ||<tt>/dev/mmcblk2pX</tt>
|-
|}
||on module eMMC ||<tt>/dev/mmcblk2pX</tt>
|}


: 'X' has to be replaced with the partition number
: 'X' has to be replaced with the partition number
Line 196: Line 153:
:See which gpio is already used by the system
:See which gpio is already used by the system
:{| class="wikitable"
:{| class="wikitable"
|<tt>''cat /sys/kernel/debug/gpio''</tt>
|<tt>''cat /sys/kernel/debug/gpio &#x007C; grep -v "gpio-... ( "''</tt> <br>or<br> <tt>''gpioinfo &#x007C; grep -v unnamed''</tt>
|}
|}


:{|class="wikitable" style="text-align: center; width: 700px"
:{|class="wikitable" style="text-align: center; width: 1000px"
|-
|-
! DHCOM Name: !! alt. DHCOM Name: !! SO-DIMM Pin# !! CPU Pad Name !! Linux <GPIO#> *
! 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
| GPIO A || || 154 || PAD_SNVS_TAMPER0 || 128 || A || DHCOM-A
|-
|-
| GPIO B || || 156 || PAD_GPIO_4 || 4
| GPIO B || || 156 || PAD_SNVS_TAMPER1 || 129 || B || DHCOM-B
|-
|-
| GPIO C || || 162 || PAD_GPIO_5 || 5
| GPIO C || || 162 || PAD_SNVS_TAMPER2 || 130 || C || DHCOM-C
|-
|-
| GPIO D || || 163 || PAD_CSI0_DAT17 || 163
| GPIO D || || 163 || PAD_SNVS_TAMPER3 || 131 || D || DHCOM-D
|-
|-
| GPIO E || || 164 || PAD_GPIO_19 || 101
| GPIO E || || 164 || PAD_SNVS_TAMPER4 || 132 || E || DHCOM-E
|-
|-
| GPIO F || || 165 || PAD_DI0_PIN4 || 116
| GPIO F || || 165 || PAD_SNVS_TAMPER7 || 135 || F || DHCOM-F
|-
|-
| GPIO G || || 167 || PAD_EIM_D27 || 91
| GPIO G || || 167 || PAD_SNVS_TAMPER8 || 136 || G || DHCOM-G
|-
|-
| GPIO H || || 173 || PAD_KEY_ROW0 || 103
| GPIO H || || 173 || PAD_SNVS_TAMPER9 || 137 || H || DHCOM-H
|-
|-
| GPIO I || || 175 || PAD_KEY_COL1 || 104
| GPIO I || || 175 || PAD_UART1_CTS_B || 18 || I || DHCOM-I
|-
|-
| GPIO J || CIF HSYNC || 74 || PAD_NANDF_CS1 || 174
| GPIO J || CIF HSYNC || 74 || PAD_CSI_HSYNC || 116 || J || DHCOM-J
|-
|-
| GPIO K || CIF PCLK || 72 || PAD_NANDF_CS2 || 175
| GPIO K || CIF PCLK || 72 || PAD_CSI_PIXCLK || 114 || K || DHCOM-K
|-
|-
| GPIO L || CIF MCLK || 70 || PAD_KEY_ROW1 || 105
| GPIO L || CIF MCLK || 70 || PAD_CSI_MCLK || 113 || L || DHCOM-L
|-
|-
| GPIO M || CIF VSYNC || 68 || PAD_SD3_DAT5 || 192
| GPIO M || CIF VSYNC || 68 || PAD_CSI_VSYNC || 115 || M || DHCOM-M
|-
|-
| GPIO N || CIF D9 || 66 || PAD_SD3_DAT4 || 193
| GPIO N || CIF D9 || 66 || PAD_CSI_DATA07 || 124 || N || DHCOM-N
|-
|-
| GPIO O || CIF D8 || 64 || PAD_CSI0_VSYNC || 149
| GPIO O || CIF D8 || 64 || PAD_CSI_DATA06 || 123 || O || DHCOM-O
|-
|-
| GPIO P || CIF D7 || 62 || PAD_GPIO_18 || 205
| GPIO P || CIF D7 || 62 || PAD_CSI_DATA05 || 122 || P || DHCOM-P
|-
|-
| GPIO Q || CIF D6 || 60 || PAD_SD1_CMD || 18
| GPIO Q || CIF D6 || 60 || PAD_CSI_DATA04 || 121 || Q || DHCOM-Q
|-
|-
| GPIO R || CIF D5 || 58 || PAD_SD1_DAT0 || 16
| GPIO R || CIF D5 || 58 || PAD_CSI_DATA03 || 120 || R || DHCOM-R
|-
|-
| GPIO S || CIF D4 || 56 || PAD_SD1_DAT1 || 17
| GPIO S || CIF D4 || 56 || PAD_CSI_DATA02 || 119 || S || DHCOM-S
|-
|-
| GPIO T || CIF D3 || 54 || PAD_SD1_DAT2 || 19
| GPIO T || CIF D3 || 54 || PAD_CSI_DATA01 || 118 || T || DHCOM-T
|-
|-
| GPIO U || CIF D2 || 52 || PAD_SD1_CLK || 20
| GPIO U || CIF D2 || 52 || PAD_CSI_DATA00 || 117 || U || DHCOM-U
|-
|-
| GPIO V || CIF D1 || 50 || PAD_CSI0_PIXCLK || 146
| GPIO V || CIF D1 || 50 || <n/a> || <n/a> || <n/a> || <n/a>
|-
|-
| GPIO W || CIF D0 || 48 || PAD_CSI0_MCLK || 147
| GPIO W || CIF D0 || 48 || <n/a> || <n/a> || <n/a> || <n/a>
|-
|-
| INT HIGHEST PRIORITY || || 151 || PAD_KEY_COL0|| 102
| INT HIGHEST PRIORITY || || 151 || PAD_KEY_COL0|| 11 || 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
:: * = 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>
|<tt>''echo <GPIO#> >/sys/class/gpio/export''</tt>
|}
|}
:: '''Remark:''' Have a look into <tt> /sys/class/gpio/ </tt> for already configured gpios.
:: '''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 in >/sys/class/gpio/gpio<GPIO#>/direction''</tt>
|-
|-
Line 266: Line 266:
|}
|}


:Set state
::Set state
:{| class="wikitable"
::{| class="wikitable"
|<tt>''echo 0 >/sys/class/gpio/gpio<GPIO#>/value''</tt>
|<tt>''echo 0 >/sys/class/gpio/gpio<GPIO#>/value''</tt>
|-
|-
Line 290: Line 290:


:Get can-utils:
:Get can-utils:
:* [[media:can-utils_armel.zip|Debian package containing can-utils (ARM)]]
:{| class="wikitable"
|<tt>''apt-get install can-utils''</tt>
|}


=== Parallel Address- / Databus ===
=== 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 i.MX6 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].
: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.19.25_dhsom/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):
:Here is an example code which demonstrates how to do enable and configure the WEIM interface (parallel address- / databus):
Line 336: Line 338:
  };
  };
  };
  };
</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>
</tt>
|}
|}
Line 360: Line 351:


=== Configure your own display ===
=== Configure your own display ===
 
: Coming soon
: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 [[COM iMX6 Bootloader U-Boot#Display and Hardware settings|Display and Hardware settings]] of the iMX6 Bootloader.


== Additional Information ==
== Additional Information ==
:*[[Linux Kernel Features | Linux Kernel Features ]]
:*[[Linux Kernel Features | Linux Kernel Features ]]
:*[[ELBE Overview| Embedded Linux Build Environment (ELBE)]]
:*[[ELBE Overview| Embedded Linux Build Environment (ELBE)]]

Latest revision as of 10:52, 21 September 2021

Storage Layout


DHCOM Boot Storage i.MX6ULL


DHCOM Storage Layout i.MX6ULL

Linux virtual machine for development

Linux Kernel

Sources: Look at page i.MX6ULL BSP Sources

How to build a Kernel

Get sources from Github

1. Start the Console on Linux
2. git clone https://github.com/dh-electronics/linux-imx6qdl.git --branch dev/4.19.135_dhsom
3. cd linux-imx6qdl

Configure and build the Device Tree + Kernel

4. ARCH=arm CROSS_COMPILE=/opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- make imx6ull_dhsom_defconfig
5. ARCH=arm CROSS_COMPILE=/opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- make menuconfig (optional: If you want to add/remove Kernel features)
6. ARCH=arm CROSS_COMPILE=/opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- make dtbs
7. ARCH=arm CROSS_COMPILE=/opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- make zImage

  • The built imx6ull-dhcom-BOARD.dtb / imx6ull-dhcor-BOARD.dtb devicetree files are available in arch/arm/boot/dts
  • The built zImage kernel file will you find in arch/arm/boot

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

1. Copy the kernel zImage file to the path /boot (You can rename it after the Kernel version zImage_X.Y.Z)
2. Check zImage_file variable in /boot/uLinuxEnv.txt (e.g. zImage_file=zImage_4.19.25)

Device Tree

3. Copy the Device Tree *.dtb file to the path /boot/dtbs_X.Y.Z
4. Check fdt_file variable in /boot/uLinuxEnv.txt (e.g. fdtfile=/dtbs_4.19.25/imx6ull-dhcom-pdk2.dtb)

Reboot System

5. Restart the system (e.g. reboot)

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
imx6ull-dhcom-pdk2.dts --> imx6ull-dhcom-BOARDNAME.dts
2. Add your new main Device Tree file to Makefile (located in the same folder)

Debian Rootfilesystem

Available Rootfilesystems

Please have a look at the iMX6ULL 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.

Kernel Userspace Interfaces to Access Hardware

Ethernet Interfaces

DHCOM ENET 1 ethsom0
DHCOM ENET 2 ethsom1

Serial (UART) Interfaces

DHCOM UART 1 /dev/ttymxc0
DHCOM UART 2 [1] /dev/ttymxc1
DHCOM UART 3 <n/a>
[1] If DHCOM UART2 is used for Bluetooth it is possible to have it on a modified module hardware on /dev/ttymxc5 by losing GPIOs J/K/L/M.

I2C Interfaces

DHCOM I2C 1 /dev/i2c-1
DHCOM I2C 2 /dev/i2c-0

SPI Interfaces

DHCOM SPI 1 /dev/spidev0.0
DHCOM SPI 2 [1] /dev/spidev1.0
[1] DHCOM SPI2 is only available, if the second ethernet is not mounted.

MMC/SD/eMMC Interfaces

DHCOM SD-Interface /dev/mmcblk1pX
on module µSD Card
on module eMMC /dev/mmcblk2pX
'X' has to be replaced with the partition number

Control the display brightness

Coming soon

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_SNVS_TAMPER0 128 A DHCOM-A
GPIO B 156 PAD_SNVS_TAMPER1 129 B DHCOM-B
GPIO C 162 PAD_SNVS_TAMPER2 130 C DHCOM-C
GPIO D 163 PAD_SNVS_TAMPER3 131 D DHCOM-D
GPIO E 164 PAD_SNVS_TAMPER4 132 E DHCOM-E
GPIO F 165 PAD_SNVS_TAMPER7 135 F DHCOM-F
GPIO G 167 PAD_SNVS_TAMPER8 136 G DHCOM-G
GPIO H 173 PAD_SNVS_TAMPER9 137 H DHCOM-H
GPIO I 175 PAD_UART1_CTS_B 18 I DHCOM-I
GPIO J CIF HSYNC 74 PAD_CSI_HSYNC 116 J DHCOM-J
GPIO K CIF PCLK 72 PAD_CSI_PIXCLK 114 K DHCOM-K
GPIO L CIF MCLK 70 PAD_CSI_MCLK 113 L DHCOM-L
GPIO M CIF VSYNC 68 PAD_CSI_VSYNC 115 M DHCOM-M
GPIO N CIF D9 66 PAD_CSI_DATA07 124 N DHCOM-N
GPIO O CIF D8 64 PAD_CSI_DATA06 123 O DHCOM-O
GPIO P CIF D7 62 PAD_CSI_DATA05 122 P DHCOM-P
GPIO Q CIF D6 60 PAD_CSI_DATA04 121 Q DHCOM-Q
GPIO R CIF D5 58 PAD_CSI_DATA03 120 R DHCOM-R
GPIO S CIF D4 56 PAD_CSI_DATA02 119 S DHCOM-S
GPIO T CIF D3 54 PAD_CSI_DATA01 118 T DHCOM-T
GPIO U CIF D2 52 PAD_CSI_DATA00 117 U DHCOM-U
GPIO V CIF D1 50 <n/a> <n/a> <n/a> <n/a>
GPIO W CIF D0 48 <n/a> <n/a> <n/a> <n/a>
INT HIGHEST PRIORITY 151 PAD_KEY_COL0 11 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
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

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";
	};
};

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:

Configure your own display

Coming soon

Additional Information