153 lines
5.3 KiB
ReStructuredText
153 lines
5.3 KiB
ReStructuredText
===============
|
|
USB3 debug port
|
|
===============
|
|
|
|
:Author: Lu Baolu <baolu.lu@linux.intel.com>
|
|
:Date: March 2017
|
|
|
|
GENERAL
|
|
=======
|
|
|
|
This is a HOWTO for using the USB3 debug port on x86 systems.
|
|
|
|
Before using any kernel debugging functionality based on USB3
|
|
debug port, you need to::
|
|
|
|
1) check whether any USB3 debug port is available in
|
|
your system;
|
|
2) check which port is used for debugging purposes;
|
|
3) have a USB 3.0 super-speed A-to-A debugging cable.
|
|
|
|
INTRODUCTION
|
|
============
|
|
|
|
The xHCI debug capability (DbC) is an optional but standalone
|
|
functionality provided by the xHCI host controller. The xHCI
|
|
specification describes DbC in the section 7.6.
|
|
|
|
When DbC is initialized and enabled, it will present a debug
|
|
device through the debug port (normally the first USB3
|
|
super-speed port). The debug device is fully compliant with
|
|
the USB framework and provides the equivalent of a very high
|
|
performance full-duplex serial link between the debug target
|
|
(the system under debugging) and a debug host.
|
|
|
|
EARLY PRINTK
|
|
============
|
|
|
|
DbC has been designed to log early printk messages. One use for
|
|
this feature is kernel debugging. For example, when your machine
|
|
crashes very early before the regular console code is initialized.
|
|
Other uses include simpler, lockless logging instead of a full-
|
|
blown printk console driver and klogd.
|
|
|
|
On the debug target system, you need to customize a debugging
|
|
kernel with CONFIG_EARLY_PRINTK_USB_XDBC enabled. And, add below
|
|
kernel boot parameter::
|
|
|
|
"earlyprintk=xdbc"
|
|
|
|
If there are multiple xHCI controllers in your system, you can
|
|
append a host contoller index to this kernel parameter. This
|
|
index starts from 0.
|
|
|
|
Current design doesn't support DbC runtime suspend/resume. As
|
|
the result, you'd better disable runtime power management for
|
|
USB subsystem by adding below kernel boot parameter::
|
|
|
|
"usbcore.autosuspend=-1"
|
|
|
|
Before starting the debug target, you should connect the debug
|
|
port to a USB port (root port or port of any external hub) on
|
|
the debug host. The cable used to connect these two ports
|
|
should be a USB 3.0 super-speed A-to-A debugging cable.
|
|
|
|
During early boot of the debug target, DbC will be detected and
|
|
initialized. After initialization, the debug host should be able
|
|
to enumerate the debug device in debug target. The debug host
|
|
will then bind the debug device with the usb_debug driver module
|
|
and create the /dev/ttyUSB device.
|
|
|
|
If the debug device enumeration goes smoothly, you should be able
|
|
to see below kernel messages on the debug host::
|
|
|
|
# tail -f /var/log/kern.log
|
|
[ 1815.983374] usb 4-3: new SuperSpeed USB device number 4 using xhci_hcd
|
|
[ 1815.999595] usb 4-3: LPM exit latency is zeroed, disabling LPM.
|
|
[ 1815.999899] usb 4-3: New USB device found, idVendor=1d6b, idProduct=0004
|
|
[ 1815.999902] usb 4-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
|
|
[ 1815.999903] usb 4-3: Product: Remote GDB
|
|
[ 1815.999904] usb 4-3: Manufacturer: Linux
|
|
[ 1815.999905] usb 4-3: SerialNumber: 0001
|
|
[ 1816.000240] usb_debug 4-3:1.0: xhci_dbc converter detected
|
|
[ 1816.000360] usb 4-3: xhci_dbc converter now attached to ttyUSB0
|
|
|
|
You can use any communication program, for example minicom, to
|
|
read and view the messages. Below simple bash scripts can help
|
|
you to check the sanity of the setup.
|
|
|
|
.. code-block:: sh
|
|
|
|
===== start of bash scripts =============
|
|
#!/bin/bash
|
|
|
|
while true ; do
|
|
while [ ! -d /sys/class/tty/ttyUSB0 ] ; do
|
|
:
|
|
done
|
|
cat /dev/ttyUSB0
|
|
done
|
|
===== end of bash scripts ===============
|
|
|
|
Serial TTY
|
|
==========
|
|
|
|
The DbC support has been added to the xHCI driver. You can get a
|
|
debug device provided by the DbC at runtime.
|
|
|
|
In order to use this, you need to make sure your kernel has been
|
|
configured to support USB_XHCI_DBGCAP. A sysfs attribute under
|
|
the xHCI device node is used to enable or disable DbC. By default,
|
|
DbC is disabled::
|
|
|
|
root@target:/sys/bus/pci/devices/0000:00:14.0# cat dbc
|
|
disabled
|
|
|
|
Enable DbC with the following command::
|
|
|
|
root@target:/sys/bus/pci/devices/0000:00:14.0# echo enable > dbc
|
|
|
|
You can check the DbC state at anytime::
|
|
|
|
root@target:/sys/bus/pci/devices/0000:00:14.0# cat dbc
|
|
enabled
|
|
|
|
Connect the debug target to the debug host with a USB 3.0 super-
|
|
speed A-to-A debugging cable. You can see /dev/ttyDBC0 created
|
|
on the debug target. You will see below kernel message lines::
|
|
|
|
root@target: tail -f /var/log/kern.log
|
|
[ 182.730103] xhci_hcd 0000:00:14.0: DbC connected
|
|
[ 191.169420] xhci_hcd 0000:00:14.0: DbC configured
|
|
[ 191.169597] xhci_hcd 0000:00:14.0: DbC now attached to /dev/ttyDBC0
|
|
|
|
Accordingly, the DbC state has been brought up to::
|
|
|
|
root@target:/sys/bus/pci/devices/0000:00:14.0# cat dbc
|
|
configured
|
|
|
|
On the debug host, you will see the debug device has been enumerated.
|
|
You will see below kernel message lines::
|
|
|
|
root@host: tail -f /var/log/kern.log
|
|
[ 79.454780] usb 2-2.1: new SuperSpeed USB device number 3 using xhci_hcd
|
|
[ 79.475003] usb 2-2.1: LPM exit latency is zeroed, disabling LPM.
|
|
[ 79.475389] usb 2-2.1: New USB device found, idVendor=1d6b, idProduct=0010
|
|
[ 79.475390] usb 2-2.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
|
|
[ 79.475391] usb 2-2.1: Product: Linux USB Debug Target
|
|
[ 79.475392] usb 2-2.1: Manufacturer: Linux Foundation
|
|
[ 79.475393] usb 2-2.1: SerialNumber: 0001
|
|
|
|
The debug device works now. You can use any communication or debugging
|
|
program to talk between the host and the target.
|