Difference between revisions of "DESK-MX6UL-L/Peripherals/USB OTG"

From DAVE Developer's Wiki
Jump to: navigation, search
(Accessing the peripheral)
Line 138: Line 138:
 
...
 
...
 
...
 
...
 +
</pre>
 +
 +
==== Usage in Host mode ====
 +
 +
When a USB peripheral is inserted, in the following example a memory mass storage device, the kernel recognizes the device (i.e. class, vendor id, product id, etc.)
 +
 +
<pre class="workstation-terminal">
 +
root@desk-mx6ul-axelulite:~# [  431.623145] usb 1-1: new high-speed USB device number 2 using ci_hdrc
 +
[  431.865699] usb 1-1: New USB device found, idVendor=0951, idProduct=1665
 +
[  431.872537] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
 +
[  431.883302] usb 1-1: Product: DataTraveler 2.0
 +
[  431.887825] usb 1-1: Manufacturer: Kingston
 +
[  431.892114] usb 1-1: SerialNumber: 50E549C202681071F97202CB
 +
[  431.910893] usb-storage 1-1:1.0: USB Mass Storage device detected
 +
[  431.928942] scsi host0: usb-storage 1-1:1.0
 +
[  432.966408] scsi 0:0:0:0: Direct-Access    Kingston DataTraveler 2.0 0000 PQ: 0 ANSI: 4
 +
[  432.995263] sd 0:0:0:0: [sda] 15151168 512-byte logical blocks: (7.76 GB/7.22 GiB)
 +
[  433.015350] sd 0:0:0:0: [sda] Write Protect is off
 +
[  433.031915] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
 +
[  433.067380]  sda: sda1
 +
[  433.089246] sd 0:0:0:0: [sda] Attached SCSI removable disk
 +
 +
root@desk-mx6ul-axelulite:~#
 
</pre>
 
</pre>
  
Line 143: Line 166:
  
 
<pre class="workstation-terminal">
 
<pre class="workstation-terminal">
root@imx6qdlxelk:~# dd if=/dev/zero of=mass_storage count=256 bs=1M
+
root@desk-mx6ul-axelulite:~# dd if=/dev/zero of=mass_storage count=32 bs=1M
256+0 records in
+
32+0 records in
256+0 records out
+
32+0 records out
268435456 bytes (268 MB, 256 MiB) copied, 15.924 s, 16.9 MB/s
+
33554432 bytes (34 MB, 32 MiB) copied, 3.62181 s, 9.3 MB/s
root@imx6qdlxelk:~# mkfs.msdos mass_storage
+
root@desk-mx6ul-axelulite:~# mkfs.msdos mass_storage
 
mkfs.fat 4.1 (2017-01-24)
 
mkfs.fat 4.1 (2017-01-24)
root@imx6qdlxelk:~# mkdir loop
+
root@desk-mx6ul-axelulite:~# mkdir loop
root@imx6qdlxelk:~# mount -o loop mass_storage loop
+
root@desk-mx6ul-axelulite:~# mount -o loop mass_storage loop
root@imx6qdlxelk:~# echo "Test USB OTG with mass storage device" > loop/usb.txt
+
root@desk-mx6ul-axelulite:~# echo "Test USB OTG with mass storage device" > loop/usb.txt
root@imx6qdlxelk:~# umount loop
+
root@desk-mx6ul-axelulite:~# umount loop
 
</pre>
 
</pre>
  
Line 158: Line 181:
  
 
<pre class="workstation-terminal">
 
<pre class="workstation-terminal">
root@imx6qdlxelk:~# modprobe g_mass_storage removable=y file=mass_storage
+
root@desk-mx6ul-axelulite:~# modprobe g_mass_storage removable=y file=mass_storage
891.807023] Mass Storage Function, version: 2009/09/11
+
137.706620] Mass Storage Function, version: 2009/09/11
891.813145] LUN: removable file: (no medium)
+
137.711809] LUN: removable file: (no medium)
891.818901] LUN: removable file: /home/root/mass_storage
+
137.731390] LUN: removable file: /home/root/mass_storage
891.824754] Number of LUNs=1
+
137.737101] Number of LUNs=1
891.827901] g_mass_storage gadget: Mass Storage Gadget, version: 2009/09/11
+
137.740256] g_mass_storage gadget: Mass Storage Gadget, version: 2009/09/11
891.834955] g_mass_storage gadget: userspace failed to provide iSerialNumber
+
137.751272] g_mass_storage gadget: userspace failed to provide iSerialNumber
891.842109] g_mass_storage gadget: g_mass_storage ready
+
137.760299] g_mass_storage gadget: g_mass_storage ready
root@imx6qdlxelk:~#
+
root@desk-mx6ul-axelulite:~#
 
</pre>
 
</pre>
  
Line 172: Line 195:
  
 
<pre class="workstation-terminal">
 
<pre class="workstation-terminal">
root@imx6qdlxelk:~# [  892.036840] g_mass_storage gadget: high-speed config #1: Linux File-Backed Storage
+
root@desk-mx6ul-axelulite:~# [  214.837430] g_mass_storage gadget: high-speed config #1: Linux File-Backed Storage
 
</pre>
 
</pre>
  

Revision as of 14:27, 21 April 2021

History
Version Issue Date Notes
1.0.0 Apr 2021 First DESK release


Peripheral USB OTG[edit | edit source]

The USB OTG ports can be configured as Host or Device mode depending on the device tree configuration.

In OTG mode they can be easily tested using the Mass Storage Gadget, which lets the device export a file as a mass storage device to the connected PC.

Device tree configuration[edit | edit source]

Here below an example of device tree configuration used on standard DAVE's kit for the AXEL ULite SOM where USB OTG1 is configured as otg while the USB OTG2 port is configured in host mode:

From imx6ul-lynx-som0013.dtsi:

&usbotg1 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_usb_otg1_id>;
        vbus-supply = <&reg_usb_otg1_vbus>;
        dr_mode = "otg";
        srp-disable;
        hnp-disable;
        adp-disable;
        status = "disabled";
};

&usbotg2 {
        vbus-supply = <&reg_usb_otg2_vbus>;
        dr_mode = "host";
        status = "disabled";
};
...
...
&iomuxc {
...
...
	pinctrl_usb_otg1_id: usbotg1idgrp {
		fsl,pins = <
			MX6UL_PAD_GPIO1_IO00__ANATOP_OTG1_ID    0x17059
		>;
	};

	pinctrl_usb_otg1: usbotg1grp {
		fsl,pins = <
			MX6UL_PAD_ENET2_RX_DATA0__GPIO2_IO08    0x10b0 /* OTG1 PWR */
			MX6UL_PAD_ENET2_RX_DATA1__GPIO2_IO09    0x17059 /* OTG1_OC */
		>;
	};

	pinctrl_usb_otg1_oc: usbotg1grp1 {
		fsl,pins = <
			MX6UL_PAD_ENET2_RX_DATA0__GPIO2_IO08    0x10b0 /* OTG1 PWR */
			MX6UL_PAD_ENET2_RX_DATA1__USB_OTG1_OC   0x17059 /* OTG1_OC */
		>;
	};

	pinctrl_usb_otg2: usbotg2grp {
		fsl,pins = <
			MX6UL_PAD_ENET2_TX_DATA1__GPIO2_IO12    0x17059 /* OTG2_PWR */
			MX6UL_PAD_ENET2_TX_EN__USB_OTG2_OC       0x17059 /* OTG2_OC */
		>;
	};

	pinctrl_usb_otg2_1: usbotg2grp-1 {
		fsl,pins = <
			MX6UL_PAD_UART3_CTS_B__GPIO1_IO26       0x17059 /* OTG2_PWR */
			MX6UL_PAD_UART3_RTS_B__GPIO1_IO27       0x17059 /* OTG2_OC */
		>;
	};

From imx6ul-lynx-som0013-cb002f.dts:

&reg_usb_otg1_vbus {
        pinctrl-0 = <&pinctrl_usb_otg1_oc>;
};

&usbotg1 {
        over-current-active-low;
        status = "okay";
};

&usbotg2 {
        over-current-active-low;
        status = "okay";
};

...
...
&iomuxc {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_hog_gpios>;

        imx6ul-lynx {
...
...
                pinctrl_usb_otg1: usbotg1grp {
                        fsl,pins = <
                                MX6UL_PAD_ENET2_RX_DATA0__GPIO2_IO08    0x10b0 /* OTG1 PWR */
                                MX6UL_PAD_ENET2_RX_DATA1__USB_OTG1_OC   0x17059 /* OTG1_OC */
                        >;
                };

                pinctrl_usb_otg2: usbotg2grp {
                        fsl,pins = <
                                MX6UL_PAD_ENET2_TX_DATA1__GPIO2_IO12    0x17059 /* OTG2_PWR */
                                MX6UL_PAD_ENET2_TX_EN__USB_OTG2_OC       0x17059 /* OTG2_OC */
                        >;
                };


Accessing the peripheral[edit | edit source]

Linux messages at boot time[edit | edit source]

...
...
[    3.387128] usb_otg1_vbus: supplied by SWBST
[    3.418986] usb_otg2_vbus: supplied by SWBST
[    5.245408] usb_otg1_vbus: disabling
...
...

Usage in Host mode[edit | edit source]

When a USB peripheral is inserted, in the following example a memory mass storage device, the kernel recognizes the device (i.e. class, vendor id, product id, etc.)

root@desk-mx6ul-axelulite:~# [  431.623145] usb 1-1: new high-speed USB device number 2 using ci_hdrc
[  431.865699] usb 1-1: New USB device found, idVendor=0951, idProduct=1665
[  431.872537] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  431.883302] usb 1-1: Product: DataTraveler 2.0
[  431.887825] usb 1-1: Manufacturer: Kingston
[  431.892114] usb 1-1: SerialNumber: 50E549C202681071F97202CB
[  431.910893] usb-storage 1-1:1.0: USB Mass Storage device detected
[  431.928942] scsi host0: usb-storage 1-1:1.0
[  432.966408] scsi 0:0:0:0: Direct-Access     Kingston DataTraveler 2.0 0000 PQ: 0 ANSI: 4
[  432.995263] sd 0:0:0:0: [sda] 15151168 512-byte logical blocks: (7.76 GB/7.22 GiB)
[  433.015350] sd 0:0:0:0: [sda] Write Protect is off
[  433.031915] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[  433.067380]  sda: sda1
[  433.089246] sd 0:0:0:0: [sda] Attached SCSI removable disk

root@desk-mx6ul-axelulite:~#

Usage with mass-storage[edit | edit source]

root@desk-mx6ul-axelulite:~# dd if=/dev/zero of=mass_storage count=32 bs=1M
32+0 records in
32+0 records out
33554432 bytes (34 MB, 32 MiB) copied, 3.62181 s, 9.3 MB/s
root@desk-mx6ul-axelulite:~# mkfs.msdos mass_storage
mkfs.fat 4.1 (2017-01-24)
root@desk-mx6ul-axelulite:~# mkdir loop
root@desk-mx6ul-axelulite:~# mount -o loop mass_storage loop
root@desk-mx6ul-axelulite:~# echo "Test USB OTG with mass storage device" > loop/usb.txt
root@desk-mx6ul-axelulite:~# umount loop

then insert the g_mass_storage kernel module driver enabling an Windows PC to see it as a removable device

root@desk-mx6ul-axelulite:~# modprobe g_mass_storage removable=y file=mass_storage
[  137.706620] Mass Storage Function, version: 2009/09/11
[  137.711809] LUN: removable file: (no medium)
[  137.731390] LUN: removable file: /home/root/mass_storage
[  137.737101] Number of LUNs=1
[  137.740256] g_mass_storage gadget: Mass Storage Gadget, version: 2009/09/11
[  137.751272] g_mass_storage gadget: userspace failed to provide iSerialNumber
[  137.760299] g_mass_storage gadget: g_mass_storage ready
root@desk-mx6ul-axelulite:~#

Once the USB cable is connected to the PC, the kernel prints the following messages:

root@desk-mx6ul-axelulite:~# [  214.837430] g_mass_storage gadget: high-speed config #1: Linux File-Backed Storage

and the Windows PC activate the driver and the disk is available as a Drive Unit (with the usb.txt file available).

Additional information[edit | edit source]

More information about Mass Storage Gadget driver is given in the kernel tree under Documentation/usb/mass-storage.txt