123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- ===============
- USB3 debug port
- ===============
- :Author: Lu Baolu <[email protected]>
- :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.
|