Linux virtual machine for development
Building your own Kernel
Sources for the i.MX6 Kernel
How to build a kernel:
1. Start the Console on Linux
|
2. git clone https://github.com/dh-electronics/linux-imx6qdl.git
|
3. cd linux-imx6qdl
|
4. ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- make imx6_dhcom_defconfig
|
5. ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- make menuconfig (optional: If you want to add/remove Kernel features)
|
6. ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- make dtbs
|
7. ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- make zImage
|
- The built imx6x-dhcom#Y-BOARD.dtb device tree files will you find in arch/arm/boot/dts
- x = s, dl, d, q
- # = 2 for HW200, 3 for HW300
- 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 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)
|
|
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
Calibrating the touchscreen (only on Debian 6.0)
- 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
- dhcom3B = Hardware revision 300
DHCOM I2C 1 |
/dev/i2c-1
|
DHCOM I2C 2 |
/dev/i2c-0
|
On Module Devices |
/dev/i2c-2
|
- old: dhcom2B = Hardware revision 200
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
DHCOM Name: |
alt. DHCOM Name: |
SO-DIMM Pin# |
Linux <GPIO#>
|
GPIO A |
|
154 |
2
|
GPIO B |
|
156 |
4
|
GPIO C |
|
162 |
5
|
GPIO D |
|
163 |
163
|
GPIO E |
|
164 |
101
|
GPIO F |
|
165 |
116
|
GPIO G |
|
167 |
91
|
GPIO H |
|
173 |
103
|
GPIO I |
|
175 |
104
|
CIF HSYNC |
GPIO J |
74 |
174
|
CIF PCLK |
GPIO K |
72 |
175
|
CIF MCLK |
GPIO L |
70 |
105
|
CIF VSYNC |
GPIO M |
68 |
192
|
CIF D9 |
GPIO N |
66 |
193
|
CIF D8 |
GPIO O |
64 |
149
|
CIF D7 |
GPIO P |
62 |
205
|
CIF D6 |
GPIO Q |
60 |
18
|
CIF D5 |
GPIO R |
58 |
16
|
CIF D4 |
GPIO S |
56 |
17
|
CIF D3 |
GPIO T |
54 |
19
|
CIF D2 |
GPIO U |
52 |
20
|
CIF D1 |
GPIO V |
50 |
146
|
CIF D0 |
GPIO W |
48 |
147
|
- 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):
- 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. Type in the display values into the device tree file
/arch/arm/boot/dts/imx6qdl-dheva01.dtsi
Parallel display: |
display@di0
|
LVDS display: |
&ldb
|
Remarks: If you don't want to use both interfaces comment the unwanted out! The frame buffer resolution depends on the higher display resolution of both displays
|
-
- Here is an example:
display-timings {
DataImage_7inch_FG0700G3DSSW {
clock-frequency = <33260000>;
hactive = <800>;
vactive = <480>;
hback-porch = <86>;
hfront-porch = <42>;
vback-porch = <33>;
vfront-porch = <10>;
hsync-len = <128>;
vsync-len = <2>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <1>;
pixelclk-active = <1>;
};
};
|
- 2. Build the device tree dtb files
ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- make dtbs
- 3. Copy the dtb files onto your boot partition
/dtbs
(SD, µSD or eMMC)
- The built
imx6xx-dheva01.dtb
device tree files will you find in arch/arm/boot/dts
Additional Information