Hi
we have a custom carrier board for colibri imx6 modules that has an FPGA connected to the EIM bus.
We also have a custom kernel module for communicating with the FPGA. This all worked fine in kernel 3.14, but trying it now using linux-toradex-rt 4.14 it fails without any errors. Any reads simply returns 0xFFFFFFFF.
Probing the data lines reveals that there is no activity on the EIM bus (all data lines always high).
For both kernels the custom device trees where adapted from the colibri eval board dts.
There seem to have been significant changes to both the device tree (imx6dl-colibri-eval-v3.dts) and the EIM driver (imx-weim.c).
The old images/kernel were built using buildroot (I belive using this fork: GitHub - ntb-ch/buildroot: Buildroot, making embedded Linux easy. Note that this is not the official repository, but only an infrequently updated mirror. The official Git repository is at http://git.buildroot.net/buildroot/.) and the new images were built using yocto using this guide High performance, low power Embedded Computing Systems | Toradex Developer Center .
Any ideas what might cause this?
Original (kernel 3.14) dts:
/*
* Copyright 2014 Toradex AG
* Copyright 2012 Freescale Semiconductor, Inc.
* Copyright 2011 Linaro Ltd.
*
* The code contained herein is licensed under the GNU General Public
* License. You may obtain a copy of the GNU General Public License
* Version 2 or later at the following locations:
*
* http://www.opensource.org/licenses/gpl-license.html
* http://www.gnu.org/copyleft/gpl.html
*/
/dts-v1/;
#include <dt-bindings/interrupt-controller/irq.h>
#include "imx6dl.dtsi"
#include "imx6qdl-colibri.dtsi"
/ {
model = "Toradex Colibri iMX6DL/S for PATHOS";
compatible = "toradex,colibri_imx6dl-eval", "toradex,colibri_imx6dl", "fsl,imx6dl";
aliases {
rtc0 = &rtc_i2c;
rtc1 = "/soc/aips-bus@02000000/snvs@020cc000/snvs-rtc-lp@34";
};
aliases {
/* the following, together with kernel patches, forces a fixed assignment
between device id and usdhc controller */
/* i.e. the eMMC on usdhc3 will be /dev/mmcblk0 */
mmc0 = &usdhc3; /* eMMC */
mmc1 = &usdhc1; /* MMC 4bit slot */
};
gpio-keys {
compatible = "gpio-keys";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpio_keys>;
wakeup {
label = "Wakeup";
gpios = <&gpio2 22 GPIO_ACTIVE_HIGH>;
linux,code = <KEY_WAKEUP>;
debounce-interval = <10>;
gpio-key,wakeup;
};
};
pwmleds {
compatible = "pwm-leds";
ledpwm2 {
label = "PWM<B>";
pwms = <&pwm1 0 50000>;
max-brightness = <255>;
};
ledpwm3 {
label = "PWM<C>";
pwms = <&pwm4 0 50000>;
max-brightness = <255>;
};
ledpwm4 {
label = "PWM<D>";
pwms = <&pwm2 0 50000>;
max-brightness = <255>;
};
};
regulators {
reg_usb_host_vbus: usb_host_vbus {
status = "okay";
};
};
};
&backlight {
#if 0
/* PWM polarity: 1 is brightest */
brightness-levels = <0 4 8 16 32 64 128 255>;
default-brightness-level = <6>;
#else
/* PWM plarity: 0 is brightest */
brightness-levels = <0 74 128 164 192 210 255>;
default-brightness-level = <1>;
#endif
status = "okay";
};
/* Colibri SPI */
&ecspi4 {
status = "okay";
spidev0: spidev@1 {
compatible = "spidev";
reg = <0>;
spi-max-frequency = <50000000>;
};
};
&hdmi_audio {
status = "okay";
};
&hdmi_core {
status = "okay";
};
&hdmi_video {
status = "okay";
};
&flexcan1 {
status = "okay";
};
&flexcan2 {
status = "okay";
};
/*
* I2C: I2C3_SDA/SCL on SODIMM pin 194/196 (e.g. RTC on carrier
* board)
*/
&i2c3 {
status = "okay";
#if 0 /* not standard pinout, disable PWM<B>, PWM<C>
pcap@10 {
/* TouchRevolution Fusion 7 and 10 multi-touch controller */
compatible = "touchrevolution,fusion-f0710a";
reg = <0x10>;
gpios = <&gpio1 9 0 /* SODIMM-28, Pen down interrupt */
&gpio2 10 0 /* SODIMM-30, Reset */
>;
};
#endif
/* M41T0M6 real time clock on carrier board */
rtc_i2c: rtc@68 {
compatible = "st,m41t00";
reg = <0x68>;
};
};
/*
* DDC_I2C: I2C2_SDA/SCL on MXM3 pin 205/207
*/
&i2cddc {
status = "okay";
hdmi: edid@50 {
compatible = "fsl,imx6-hdmi-i2c";
reg = <0x50>;
};
};
&iomuxc {
/*
* Mux all pins which are unused to be GPIOs
* so they are ready for export to user space
*/
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_weim_gpio_5
&pinctrl_csi_gpio_1
&pinctrl_usbh_oc_1 &pinctrl_usbc_id_1
&pinctrl_usbc_det_1>;
};
&lcd {
status = "okay";
};
&mxcfb1 {
status = "okay";
};
&mxcfb2 {
status = "okay";
};
&pwm1 {
status = "okay";
};
&pwm2 {
status = "okay";
};
&pwm3 {
status = "okay";
};
&pwm4 {
status = "okay";
};
&sound_hdmi {
status = "okay";
};
&uart1 {
status = "okay";
};
&uart2 {
status = "okay";
#if 0
linux,rs485-enabled-at-boot-time;
#endif
};
&uart3 {
status = "okay";
};
&usbh1 {
status = "okay";
};
&usbotg {
status = "okay";
};
/* MMC */
&usdhc1 {
status = "okay";
};
&weim {
status = "okay";
/* weim memory map: 32MB on CS0, 32MB on CS1, 32MB on CS2 */
ranges = <0 0 0x08000000 0x02000000
1 0 0x0a000000 0x02000000
2 0 0x0c000000 0x02000000>;
/* FPGA on CS0 */
fpga@0,0 {
compatible = "ntb,flink_eim_driver";
reg = <0 0 0x00080000>;
#address-cells = <1>;
#size-cells = <1>;
bank-width = <2>;
fsl,weim-cs-timing = <0x07710081 0x00000100 0x04000000
0x00000000 0x04000040 0x00000000>;
};
};
New device tree (kernel 4.14):
/*
* Copyright 2014-2016 Toradex AG
* Copyright 2012 Freescale Semiconductor, Inc.
* Copyright 2011 Linaro Ltd.
*
* This file is dual-licensed: you can use it either under the terms
* of the GPL or the X11 license, at your option. Note that this dual
* licensing only applies to this file, and not this project as a
* whole.
*
* a) This file is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* Or, alternatively,
*
* b) Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
/dts-v1/;
#include <dt-bindings/input/input.h>
#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/pwm/pwm.h>
#include "imx6dl.dtsi"
#include "imx6qdl-colibri.dtsi"
/ {
model = "Toradex Colibri iMX6DL/S on Colibri based NTB CB20 board";
compatible = "toradex,colibri_imx6dl-eval-v3", "toradex,colibri_imx6dl",
"fsl,imx6dl";
memory@10000000 {
reg = <0x10000000 0>;
};
aliases {
i2c0 = &i2c2;
i2c1 = &i2c3;
};
aliases {
rtc0 = &rtc_i2c;
rtc1 = &snvs_rtc;
};
aliases {
/*
* the following, together with kernel patches, forces a fixed
* assignment between device id and usdhc controller
* i.e. the eMMC on usdhc3 will be /dev/mmcblk0
*/
mmc0 = &usdhc3; /* eMMC */
mmc1 = &usdhc1; /* MMC 4bit slot */
};
extcon_usbc_det: usbc_det {
compatible = "linux,extcon-usb-gpio";
debounce = <25>;
id-gpio = <&gpio7 12 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usbc_det>;
};
chosen {
stdout-path = "serial0:115200n8";
};
/* Fixed crystal dedicated to mcp251x */
clk16m: clock-16m {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <16000000>;
clock-output-names = "clk16m";
};
gpio-keys {
compatible = "gpio-keys";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpio_keys>;
wakeup {
label = "Wake-Up";
gpios = <&gpio2 22 GPIO_ACTIVE_HIGH>; /* SODIMM 45 */
linux,code = <KEY_WAKEUP>;
debounce-interval = <10>;
wakeup-source;
};
};
lcd_display: display@di0 {
compatible = "fsl,imx-parallel-display";
#address-cells = <1>;
#size-cells = <0>;
interface-pix-fmt = "bgr666";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ipu1_lcdif>;
status = "okay";
port@0 {
reg = <0>;
lcd_display_in: endpoint {
remote-endpoint = <&ipu1_di0_disp0>;
};
};
port@1 {
reg = <1>;
lcd_display_out: endpoint {
remote-endpoint = <&lcd_panel_in>;
};
};
};
panel: panel {
/*
* edt,et057090dhu: EDT 5.7" LCD TFT
* edt,et070080dh6: EDT 7.0" LCD TFT
*/
compatible = "edt,et057090dhu";
backlight = <&backlight>;
port {
lcd_panel_in: endpoint {
remote-endpoint = <&lcd_display_out>;
};
};
};
};
&backlight {
brightness-levels = <0 45 63 88 119 158 203 255>;
default-brightness-level = <4>;
pwms = <&pwm3 0 6666667 PWM_POLARITY_INVERTED>;
status = "okay";
};
/* Colibri SSP */
&ecspi4 {
status = "okay";
mcp251x0: mcp251x@1 {
compatible = "microchip,mcp2515";
reg = <0>;
clocks = <&clk16m>;
interrupt-parent = <&gpio3>;
interrupts = <27 0x2>;
spi-max-frequency = <10000000>;
status = "okay";
};
spidev0: spidev@1 {
compatible = "toradex,evalspi";
reg = <0>;
spi-max-frequency = <23000000>;
status = "disabled";
};
};
/*
* Colibri I2C: I2C3_SDA/SCL on SODIMM 194/196 (e.g. RTC on carrier board)
*/
&i2c3 {
status = "okay";
/* Atmel maxtouch controller */
atmel_mxt_ts: atmel_mxt_ts@4a {
compatible = "atmel,maxtouch";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_pcap_1>;
reg = <0x4a>;
interrupt-parent = <&gpio1>;
interrupts = <9 IRQ_TYPE_EDGE_FALLING>; /* SODIMM 28 */
reset-gpios = <&gpio2 10 GPIO_ACTIVE_HIGH>; /* SODIMM 30 */
status = "disabled";
};
/*
* the PCAPs use SODIMM 28/30, also used for PWM<B>, PWM<C>, aka pwm1,
* pwm4. So if you enable one of the PCAP controllers disable the pwms.
*/
pcap: pcap@10 {
/* TouchRevolution Fusion 7 and 10 multi-touch controller */
compatible = "touchrevolution,fusion-f0710a";
reg = <0x10>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_pcap_1>;
gpios = <&gpio1 9 0 /* SODIMM 28, Pen down interrupt */
&gpio2 10 0 /* SODIMM 30, Reset */
>;
status = "disabled";
};
/* M41T0M6 real time clock on carrier board */
rtc_i2c: rtc@68 {
compatible = "st,m41t0";
reg = <0x68>;
};
};
&iomuxc {
pinctrl-names = "default";
pinctrl-0 = <
&pinctrl_weim_gpio_5
&pinctrl_csi_gpio_1
&pinctrl_usbh_oc_1 &pinctrl_usbc_id_1
&pinctrl_usbc_det
>;
gpio {
pinctrl_pcap_1: pcap-1 {
fsl,pins = <
MX6QDL_PAD_GPIO_9__GPIO1_IO09 0x1b0b0 /* SODIMM 28 */
MX6QDL_PAD_SD4_DAT2__GPIO2_IO10 0x1b0b0 /* SODIMM 30 */
>;
};
pinctrl_mxt_ts: mxt-ts {
fsl,pins = <
MX6QDL_PAD_EIM_CS1__GPIO2_IO24 0x130b0 /* SODIMM 107 */
MX6QDL_PAD_SD2_DAT1__GPIO1_IO14 0x130b0 /* SODIMM 106 */
>;
};
};
};
&ipu1_di0_disp0 {
remote-endpoint = <&lcd_display_in>;
};
&lcd {
status = "okay";
};
&mxcfb1 {
status = "okay";
};
&mxcfb2 {
status = "okay";
};
&pwm1 {
status = "okay";
};
&pwm2 {
status = "okay";
};
&pwm3 {
status = "okay";
};
&pwm4 {
status = "okay";
};
®_usb_host_vbus {
status = "okay";
};
&uart1 {
status = "okay";
};
&uart2 {
status = "okay";
};
&uart3 {
status = "okay";
};
&can1 {
status = "okay";
};
&can2 {
status = "okay";
};
&usbh1 {
vbus-supply = <®_usb_host_vbus>;
status = "okay";
};
&usbotg {
status = "okay";
extcon = <&extcon_usbc_det>, <&extcon_usbc_det>;
};
/* Colibri MMC */
&usdhc1 {
status = "okay";
};
&weim {
status = "okay";
fsl,weim-cs-gpr = <&gpr>;
/* weim memory map: 32MB on CS0, CS1, CS2 and CS3 */
ranges = <0 0 0x08000000 0x02000000
1 0 0x0a000000 0x02000000
2 0 0x0c000000 0x02000000
3 0 0x0e000000 0x02000000>;
/* FPGA on CS0 */
fpga@0,0 {
compatible = "ntb,flink_eim_driver";
reg = <0 0 0x00080000>;
#address-cells = <1>;
#size-cells = <1>;
bank-width = <2>;
fsl,weim-cs-timing = <0x07710081 0x00000100 0x04000000 0x00000000 0x04000040 0x00000000>;
};
};
kernel module: flinklinux/flink_eim.c at master · flink-project/flinklinux · GitHub
yocto layer used for additional recipes: GitHub - zechenturm/meta-ntb: NTB specific layers for yocto/openembedded
Any help or pointers in where to look would be hugely appreciated.
Thanks!
Moritz