COM iMX6 Linux: Difference between revisions

From Wiki-DB
Jump to navigationJump to search
Christoph (talk | contribs)
Christoph (talk | contribs)
Line 199: Line 199:
|}
|}


:{|class="wikitable" style="text-align: center; width: 600px"
:{|class="wikitable" style="text-align: center; width: 700px"
|-
|-
! DHCOM Name: !! alt. DHCOM Name: !! SO-DIMM Pin# !! Linux <GPIO#>  
! DHCOM Name: !! alt. DHCOM Name: !! SO-DIMM Pin# !! CPU Pad Name !! Linux <GPIO#> *
|-
|-
| GPIO A || || 154 || 2  
| GPIO A || || 154 || PAD_GPIO_2 || 2
|-
|-
| GPIO B || || 156 || 4  
| GPIO B || || 156 || PAD_GPIO_4 || 4  
|-
|-
| GPIO C || || 162 || 5  
| GPIO C || || 162 || PAD_GPIO_5 || 5  
|-
|-
| GPIO D || || 163 || 163  
| GPIO D || || 163 || PAD_CSI0_DAT17 || 163  
|-
|-
| GPIO E || || 164 || 101  
| GPIO E || || 164 || PAD_GPIO_19 || 101  
|-
|-
| GPIO F || || 165 || 116  
| GPIO F || || 165 || PAD_DI0_PIN4 || 116  
|-
|-
| GPIO G || || 167 || 91  
| GPIO G || || 167 || PAD_EIM_D27 || 91  
|-
|-
| GPIO H || || 173 || 103  
| GPIO H || || 173 || PAD_KEY_ROW0 || 103  
|-
|-
| GPIO I || || 175 || 104  
| GPIO I || || 175 || PAD_KEY_COL1 || 104  
|-
|-
| CIF HSYNC || GPIO J || 74 || 174  
| CIF HSYNC || GPIO J || 74 || PAD_NANDF_CS1 || 174  
|-
|-
| CIF PCLK || GPIO K || 72 || 175  
| CIF PCLK || GPIO K || 72 || PAD_NANDF_CS2 || 175  
|-
|-
| CIF MCLK || GPIO L || 70 || 105  
| CIF MCLK || GPIO L || 70 || PAD_KEY_ROW1 || 105  
|-
|-
| CIF VSYNC || GPIO M || 68 || 192  
| CIF VSYNC || GPIO M || 68 || PAD_SD3_DAT5 || 192  
|-
|-
| CIF D9 || GPIO N || 66 || 193
| CIF D9 || GPIO N || 66 || PAD_SD3_DAT4 || 193
|-
|-
| CIF D8 || GPIO O || 64 || 149  
| CIF D8 || GPIO O || 64 || PAD_CSI0_VSYNC || 149  
|-
|-
| CIF D7 || GPIO P || 62 || 205  
| CIF D7 || GPIO P || 62 || PAD_GPIO_18 || 205  
|-
|-
| CIF D6 || GPIO Q || 60 || 18
| CIF D6 || GPIO Q || 60 || PAD_SD1_CMD || 18
|-
|-
| CIF D5 || GPIO R || 58 || 16
| CIF D5 || GPIO R || 58 || PAD_SD1_DAT0 || 16
|-
|-
| CIF D4 || GPIO S || 56 || 17
| CIF D4 || GPIO S || 56 || PAD_SD1_DAT1 || 17
|-
|-
| CIF D3 || GPIO T || 54 || 19  
| CIF D3 || GPIO T || 54 || PAD_SD1_DAT2 || 19  
|-
|-
| CIF D2 || GPIO U || 52 || 20
| CIF D2 || GPIO U || 52 || PAD_SD1_CLK || 20
|-
|-
| CIF D1 || GPIO V || 50 || 146  
| CIF D1 || GPIO V || 50 || PAD_CSI0_PIXCLK || 146  
|-
|-
| CIF D0 || GPIO W || 48 || 147  
| CIF D0 || GPIO W || 48 || PAD_CSI0_MCLK || 147  
|-
| INT HIGHEST PRIORITY || || 151 || PAD_KEY_COL0|| 102
|}
|}
:: * = 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.



Revision as of 14:30, 10 December 2018

Storage Layout


DHCOM SPI Boot Flash


DHCOM Storage Layout

Linux virtual machine for development

Linux Kernel

Sources for the i.MX6 Kernel

  • Mainline
  • Vendor

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.4.60_dhcom
3. cd linux-imx6qdl

Configure and build the Device Tree + Kernel

4. ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make imx6_dhcom_defconfig
5. ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make menuconfig (optional: If you want to add/remove Kernel features)
6. ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make dtbs
7. ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make zImage

  • The built imx6x-dhcom#Y-BOARD.dtb devicetree files are available in arch/arm/boot/dts
    • x = s, dl, d, q
    • # = 2 for HW200, 3 for HW300, 4 for HW400
    • Y = B for Base, H for Hi-Speed-Interfaces
    • BOARD = pdk1, pdk2, ...
  • The built zImage kernel file will you find in arch/arm/boot

Update the Kernel and Devicetree with U-Boot

Please refere to the DHCOM Update Mechanism for i.MX6.

Update Kernel and Devicetree on a running Linux

Kernel

1. Copy the kernel zImage file to the path /boot
2. Check whether the correct zImage file name is set in /boot/uLinuxEnv.txt (e.g. zImage_file=zImage)

Devicetree

3. Copy the devicetree file to the path /boot/dtbs
4. Check fdtfile variable in /boot/uLinuxEnv.txt (e.g. fdtfile=/dtbs/imx6dl-dhcom3B-pdk2.dtb / see above)

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
- 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
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
3. Add your new main Device Tree file to Makefile (located in the same folder)


DH Device Tree pattern:
DHCOM Device Tree pattern

Debian Rootfilesystem

Available Rootfilesystems

Please have a look at the iMX6 Downloads section.

External Documentation

Login

Debian GNU/Linux 8 dhcom ttymxc0

dhcom login: root
Password: foo

Shutdown

# shutdown -h now

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 create a microSD-card with a rootfilesystem on it

1. Format a microSD card like following (in linux e.g. gparted, palimpsest) with Master Boot Record partition scheme

P1 ext3, name="boot" (Primary partition: 100MiB)
P2 ext3, name="rootfs" (Primary part.: Residual space)

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)

Start the Console on Linux
# su
# chmod 755 /path/of/the/microSD_card
# cd /path/of/the/microSD_card
# tar xfjv path/to/RootFS/Name_of_RootFS_file.tar.bz2

Remark: If you got a *.tar.gz file so type tar xfzv ... to extract the rootfilesystem.

Kernel Userspace Interfaces to Access Hardware

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

DHCOM SPI 1 /dev/spidev0.2
DHCOM SPI 2 /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

Coming soon

Control GPIOs

See which gpio is already used by the system
cat /sys/kernel/debug/gpio
DHCOM Name: alt. DHCOM Name: SO-DIMM Pin# CPU Pad Name Linux <GPIO#> *
GPIO A 154 PAD_GPIO_2 2
GPIO B 156 PAD_GPIO_4 4
GPIO C 162 PAD_GPIO_5 5
GPIO D 163 PAD_CSI0_DAT17 163
GPIO E 164 PAD_GPIO_19 101
GPIO F 165 PAD_DI0_PIN4 116
GPIO G 167 PAD_EIM_D27 91
GPIO H 173 PAD_KEY_ROW0 103
GPIO I 175 PAD_KEY_COL1 104
CIF HSYNC GPIO J 74 PAD_NANDF_CS1 174
CIF PCLK GPIO K 72 PAD_NANDF_CS2 175
CIF MCLK GPIO L 70 PAD_KEY_ROW1 105
CIF VSYNC GPIO M 68 PAD_SD3_DAT5 192
CIF D9 GPIO N 66 PAD_SD3_DAT4 193
CIF D8 GPIO O 64 PAD_CSI0_VSYNC 149
CIF D7 GPIO P 62 PAD_GPIO_18 205
CIF D6 GPIO Q 60 PAD_SD1_CMD 18
CIF D5 GPIO R 58 PAD_SD1_DAT0 16
CIF D4 GPIO S 56 PAD_SD1_DAT1 17
CIF D3 GPIO T 54 PAD_SD1_DAT2 19
CIF D2 GPIO U 52 PAD_SD1_CLK 20
CIF D1 GPIO V 50 PAD_CSI0_PIXCLK 146
CIF D0 GPIO W 48 PAD_CSI0_MCLK 147
INT HIGHEST PRIORITY 151 PAD_KEY_COL0 102
* = 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.
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:

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 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:

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)


The following picture showing the sequence and priorities:
DHCOM Display Settings


For detailed description of the display boot args please have a look at Display and Hardware settings of the iMX6 Bootloader.

Additional Information