XELK-AN-002: Using USB Ethernet adapter instead of native MAC controller

From DAVE Developer's Wiki
Revision as of 10:35, 9 September 2016 by U0001 (talk | contribs) (Setting up the system)

Jump to: navigation, search
Info Box
Axel-04.png Applies to Axel Ultra
Axel-02.png Applies to AXEL ESATTA
Axel-lite 02.png Applies to Axel Lite

History[edit | edit source]

Version Date XELK version Notes
1.0.0 September 2016 2.1.0 First release

Introduction[edit | edit source]

Axel family system-on-modules (SOM for short) are based on processors that integrate an Ethernet MAC controller (aka as ENET). In some cases, Linux must be prevented from using this controller. An example of such situation is an AMP configuration where native Ethernet MAC controller must be used by FreeRTOS exclusively. This constraint may have a significant drawback: during the development stage native Ethernet interface can not be used to mount Linux root file system over NFS connection. This application note describes a solution to overcome this limitation by using a cheap common USB Ethernet adapter.

Setting up the system[edit | edit source]

This solution has been tested on a Axel Ultra/AxelEVB+DACU system. The USB Ethernet adapter is the one shown in the following picture. It is built upon a MosChip Semiconductor chip.


Intellinet USB Ethernet adapter


The adapter has been connected to the USB host port of DACU board (reference J33). Please note the the Ethernet cable connected to the native interface (connector J6 of AxelEVB) has not been detached.

About Linux kernel, the default configuration has to be changed in order to remove the support for the ENET controller and to add the drivers required by the USB Ethernet adapter. The following files have to be modified before rebuilding the kernel:

  • imx6q-axelcommon.dtsi
/*&fec {
 pinctrl-names = "default";
 pinctrl-0 = <&pinctrl_enet_axel>;
 phy-mode = "rgmii";
 status = "okay";
};*/

/*enet {
  pinctrl_enet_axel: enetgrp-1 {
   fsl,pins = <
    MX6QDL_PAD_ENET_MDIO__ENET_MDIO       0x1b0b0
    MX6QDL_PAD_ENET_MDC__ENET_MDC         0x1b0b0
    MX6QDL_PAD_RGMII_TXC__RGMII_TXC       0x1b0b0
    MX6QDL_PAD_RGMII_TD0__RGMII_TD0       0x1b0b0
    MX6QDL_PAD_RGMII_TD1__RGMII_TD1       0x1b0b0
    MX6QDL_PAD_RGMII_TD2__RGMII_TD2       0x1b0b0
    MX6QDL_PAD_RGMII_TD3__RGMII_TD3       0x1b0b0
    MX6QDL_PAD_RGMII_TX_CTL__RGMII_TX_CTL 0x1b0b0
    MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK  0x1b0b0
    MX6QDL_PAD_RGMII_RXC__RGMII_RXC       0x1b0b0
    MX6QDL_PAD_RGMII_RD0__RGMII_RD0       0x1b0b0
    MX6QDL_PAD_RGMII_RD1__RGMII_RD1       0x1b0b0
    MX6QDL_PAD_RGMII_RD2__RGMII_RD2       0x1b0b0
    MX6QDL_PAD_RGMII_RD3__RGMII_RD3       0x1b0b0
    MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x1b0b0
    MX6QDL_PAD_ENET_TX_EN__GPIO1_IO28     0xb0b1
    MX6QDL_PAD_SD4_DAT3__GPIO2_IO11        0xb0b1
    MX6QDL_PAD_SD4_DAT2__GPIO2_IO10        0xb0b1
   >;
  };
 };*/
  • imx6qdl.dtsi
/*enet {
  pinctrl_enet_1: enetgrp-1 {
   fsl,pins = <
    MX6QDL_PAD_ENET_MDIO__ENET_MDIO       0x1b0b0
    MX6QDL_PAD_ENET_MDC__ENET_MDC         0x1b0b0
    MX6QDL_PAD_RGMII_TXC__RGMII_TXC       0x1b0b0
    MX6QDL_PAD_RGMII_TD0__RGMII_TD0       0x1b0b0
    MX6QDL_PAD_RGMII_TD1__RGMII_TD1       0x1b0b0
    MX6QDL_PAD_RGMII_TD2__RGMII_TD2       0x1b0b0
    MX6QDL_PAD_RGMII_TD3__RGMII_TD3       0x1b0b0
    MX6QDL_PAD_RGMII_TX_CTL__RGMII_TX_CTL 0x1b0b0
    MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK  0x1b0b0
    MX6QDL_PAD_RGMII_RXC__RGMII_RXC       0x1b0b0
    MX6QDL_PAD_RGMII_RD0__RGMII_RD0       0x1b0b0
    MX6QDL_PAD_RGMII_RD1__RGMII_RD1       0x1b0b0
    MX6QDL_PAD_RGMII_RD2__RGMII_RD2       0x1b0b0
    MX6QDL_PAD_RGMII_RD3__RGMII_RD3       0x1b0b0
    MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x1b0b0
    MX6QDL_PAD_GPIO_16__ENET_REF_CLK      0x4001b0a8
   >;
  };

  pinctrl_enet_2: enetgrp-2 {
   fsl,pins = <
    MX6QDL_PAD_KEY_COL1__ENET_MDIO        0x1b0b0
    MX6QDL_PAD_KEY_COL2__ENET_MDC         0x1b0b0
    MX6QDL_PAD_RGMII_TXC__RGMII_TXC       0x1b0b0
    MX6QDL_PAD_RGMII_TD0__RGMII_TD0       0x1b0b0
    MX6QDL_PAD_RGMII_TD1__RGMII_TD1       0x1b0b0
    MX6QDL_PAD_RGMII_TD2__RGMII_TD2       0x1b0b0
    MX6QDL_PAD_RGMII_TD3__RGMII_TD3       0x1b0b0
    MX6QDL_PAD_RGMII_TX_CTL__RGMII_TX_CTL 0x1b0b0
    MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK  0x1b0b0
    MX6QDL_PAD_RGMII_RXC__RGMII_RXC       0x1b0b0
    MX6QDL_PAD_RGMII_RD0__RGMII_RD0       0x1b0b0
    MX6QDL_PAD_RGMII_RD1__RGMII_RD1       0x1b0b0
    MX6QDL_PAD_RGMII_RD2__RGMII_RD2       0x1b0b0
    MX6QDL_PAD_RGMII_RD3__RGMII_RD3       0x1b0b0
    MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x1b0b0
    MX6QDL_PAD_GPIO_16__ENET_REF_CLK      0x4001b0a8
   >;
  };

  pinctrl_enet_3: enetgrp-3 {
   fsl,pins = <
    MX6QDL_PAD_ENET_MDIO__ENET_MDIO       0x1b0b0
    MX6QDL_PAD_ENET_MDC__ENET_MDC         0x1b0b0
    MX6QDL_PAD_RGMII_TXC__RGMII_TXC       0x1b0b0
    MX6QDL_PAD_RGMII_TD0__RGMII_TD0       0x1b0b0
    MX6QDL_PAD_RGMII_TD1__RGMII_TD1       0x1b0b0
    MX6QDL_PAD_RGMII_TD2__RGMII_TD2       0x1b0b0
    MX6QDL_PAD_RGMII_TD3__RGMII_TD3       0x1b0b0
    MX6QDL_PAD_RGMII_TX_CTL__RGMII_TX_CTL 0x1b0b0
    MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK  0x1b0b0
    MX6QDL_PAD_RGMII_RXC__RGMII_RXC       0x1b0b0
    MX6QDL_PAD_RGMII_RD0__RGMII_RD0       0x1b0b0
    MX6QDL_PAD_RGMII_RD1__RGMII_RD1       0x1b0b0
    MX6QDL_PAD_RGMII_RD2__RGMII_RD2       0x1b0b0
    MX6QDL_PAD_RGMII_RD3__RGMII_RD3       0x1b0b0
    MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x1b0b0
    MX6QDL_PAD_ENET_TX_EN__ENET_TX_EN     0x1b0b0
   >;
  };
 };*/

 /*esai {
  pinctrl_esai_1: esaigrp-1 {
   fsl,pins = <
    MX6QDL_PAD_ENET_RXD0__ESAI_TX_HF_CLK 0x1b030
    MX6QDL_PAD_ENET_CRS_DV__ESAI_TX_CLK  0x1b030
    MX6QDL_PAD_ENET_RXD1__ESAI_TX_FS     0x1b030
    MX6QDL_PAD_ENET_TX_EN__ESAI_TX3_RX2  0x1b030
    MX6QDL_PAD_ENET_TXD1__ESAI_TX2_RX3   0x1b030
    MX6QDL_PAD_ENET_TXD0__ESAI_TX4_RX1   0x1b030
    MX6QDL_PAD_ENET_MDC__ESAI_TX5_RX0    0x1b030
    MX6QDL_PAD_NANDF_CS2__ESAI_TX0       0x1b030
    MX6QDL_PAD_NANDF_CS3__ESAI_TX1       0x1b030
   >;
  };

  pinctrl_esai_2: esaigrp-2 {
   fsl,pins = <
    MX6QDL_PAD_ENET_CRS_DV__ESAI_TX_CLK 0x1b030
    MX6QDL_PAD_ENET_RXD1__ESAI_TX_FS    0x1b030
    MX6QDL_PAD_ENET_TX_EN__ESAI_TX3_RX2 0x1b030
    MX6QDL_PAD_GPIO_5__ESAI_TX2_RX3     0x1b030
    MX6QDL_PAD_ENET_TXD0__ESAI_TX4_RX1  0x1b030
    MX6QDL_PAD_ENET_MDC__ESAI_TX5_RX0   0x1b030
    MX6QDL_PAD_GPIO_17__ESAI_TX0        0x1b030
    MX6QDL_PAD_NANDF_CS3__ESAI_TX1      0x1b030
    MX6QDL_PAD_ENET_MDIO__ESAI_RX_CLK   0x1b030
    MX6QDL_PAD_GPIO_9__ESAI_RX_FS       0x1b030
   >;
  };
 };*/

/*usbh2 {
  pinctrl_usbh2_1: usbh2grp-1 {
   fsl,pins = <
    MX6QDL_PAD_RGMII_TXC__USB_H2_DATA      0x40013030
    MX6QDL_PAD_RGMII_TX_CTL__USB_H2_STROBE 0x40013030
   >;
  };

  pinctrl_usbh2_2: usbh2grp-2 {
   fsl,pins = <
    MX6QDL_PAD_RGMII_TX_CTL__USB_H2_STROBE 0x40017030
   >;
  };
 };

 usbh3 {
  pinctrl_usbh3_1: usbh3grp-1 {
   fsl,pins = <
    MX6QDL_PAD_RGMII_RX_CTL__USB_H3_DATA 0x40013030
    MX6QDL_PAD_RGMII_RXC__USB_H3_STROBE  0x40013030
   >;
  };

  pinctrl_usbh3_2: usbh3grp-2 {
   fsl,pins = <
    MX6QDL_PAD_RGMII_RXC__USB_H3_STROBE 0x40017030
   >;
  };
 };*/

The following picture shows the kernel configuration options related to USB Ethernet adapters [1]. Most common devices - including MosChip-based products - have been enabled.


Linux kernel configuration options related to USB Ethernet adapters


[1] The configuration has been changed via menuconfig option. To run it, the following packages need to be installed on host machine:

  • libncursesw5-dev
  • libncurses5-dev

Testing the system[edit | edit source]

The usual net_nfs variable has been used to boot the system. The following dump shows the complete log of bootstrap messages:


As shown, USB Ethernet adapter is first detected by the kernel ...


... and then initialized by the driver:


It is worth to remember that native Ethernet interface is still available for U-Boot operations. As such, Linux kernel image and device tree blob can be retrieved by target over native Ethernet connection (that's why this cable has not been disconnected). Once Linux kernel gets the control of the processor, it initializes the USB/Ethernet port - that is mapped as eth0 - that is the only one available in the Linux realm.