Edit online

调试指南

4 Dec 2024
Read time: 5 minute(s)

USB Host 调试

  1. 查看 USB 设备
    在单板的 USB Host 端口有设备插入或者拔出时,单板串口会有打印提示:
    [aic@] #
    [ 6792.678130] usb 1-1: new high-speed USB device number 2 using aic-ehci
    [ 6792.884601] usb-storage 1-1:1.0: USB Mass Storage device detected
    [ 6792.910596] scsi host0: usb-storage 1-1:1.0
    [ 6793.970429] scsi 0:0:0:0: Direct-Access     SanDisk  Cruzer Blade     1.00 PQ: 0 ANSI: 6
    [ 6793.995300] sd 0:0:0:0: [sda] 30842880 512-byte logical blocks: (15.8 GB/14.7 GiB)
    [ 6794.018466] sd 0:0:0:0: [sda] Write Protect is off
    [ 6794.025383] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
    [ 6794.055267]  sda: sda1
    [ 6794.074720] sd 0:0:0:0: [sda] Attached SCSI removable disk
    [ 6806.436142] usb 1-1: USB disconnect, device number 2
    也可以使用 lsusb 命令查看目前系统 USB 总线的情况:
    [aic@] # lsusb
    Bus 001 Device 001: ID 1d6b:0002
    Bus 001 Device 003: ID 0781:5567

    如果是 PC 上的 Linux 发行版, lsusb -v 命令可以查看 USB 设备的详细信息。但是单板上使用的 lsusb -v 被进行了简化。

  2. Sysfs 节点
    也可以使用 /sys/kernel/debug/usb/devices 文件节点查看 USB 设备的详细信息:
    [aic@] # mount -t debugfs none /sys/kernel/debug
    
    [aic@] # cat /sys/kernel/debug/usb/devices
    
    T:  Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=480  MxCh= 1
    B:  Alloc=  0/800 us ( 0%), #Int=  0, #Iso=  0
    D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
    P:  Vendor=1d6b ProdID=0002 Rev= 5.10
    S:  Manufacturer=Linux 5.10.44-00071-g935288d48127-dirty ehci_hcd
    S:  Product=EHCI Host Controller
    S:  SerialNumber=10220000.usb
    C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=  0mA
    I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub
    E:  Ad=81(I) Atr=03(Int.) MxPS=   4 Ivl=256ms
  3. USB 总线分析仪

    在 USB 设备不能正常枚举或者 USB 通讯过程中出现问题时,我们一般使用 USB 总线分析仪,接入到 USB 总线上进行旁路抓包分析。


    image0

    抓包数据的分析界面如下图所示:


    image1

    USB 总线分析仪对抓取的数据包进行了解析,用起来非常方便。市面上这类仪器大同小异,非常容易上手。

  4. usbmon
    在没有外部 USB 分析仪的情况下,也可以使用 Linux 内核自带的 USB 抓包模块 usbmon 来抓取数据包进行分析。
    1. 打开 Linux 内核中的 usbmon 配置:
      > Device Drivers > USB support
      
       <*>   USB Monitor
    2. 重新编译内核后就可以进行抓包了:
      [aic@] # mount -t debugfs none /sys/kernel/debug
      
      [aic@] # ls /sys/kernel/debug/usb/usbmon/
      0s  0u  1s  1t  1u  2s  2t  2u
      [aic@] # cat /sys/kernel/debug/usb/usbmon/0u
      c1b0e380 68846726 C Ii:1:001:1 0:2048 1 = 02
      c1b0e380 68846851 S Ii:1:001:1 -115:2048 4 <
      c7a15900 68847426 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
      c7a15900 68847507 C Ci:1:001:0 0 4 = 01050100
      c7a15900 68847595 S Co:1:001:0 s 23 01 0010 0001 0000 0
      c7a15900 68847652 C Co:1:001:0 0 0
      c7a15900 68847732 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
      c7a15900 68847790 C Ci:1:001:0 0 4 = 01050000
      c7a15900 68890082 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
      c7a15900 68890154 C Ci:1:001:0 0 4 = 01050000
      c7a15900 68940072 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
      c7a15900 68940142 C Ci:1:001:0 0 4 = 01050000
      c7a15900 68990067 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
      c7a15900 68990129 C Ci:1:001:0 0 4 = 01050000

USB Device 调试

  1. 查看 USB 设备当单板充当 USB Device 连接到 PC 主机 USB Host 端口时,可以在主机上查看 USB 设备有没有成功被枚举:
    • Linux 主机,可以通过 lsusb 命令进行查看。

    • Windows 主机,可以通过设备管理器命令进行查看:


      image2

  2. Sysfs 节点
    在单板上也可以通过 /sys/kernel/debug/usb/xxxx.usb/ 文件夹下的文件节点,对 UDC 驱动进行配置:
    [aic@] # ls /sys/class/udc
    10200000.usb
    [aic@] # ls /sys/kernel/debug/usb/10200000.usb/
    dr_mode    ep1out     ep3in      ep4out     params     testmode
    ep0        ep2in      ep3out     fifo       regdump
    ep1in      ep2out     ep4in      hw_params  state
    [aic@] #
    例如可以 dump 寄存器:
    [aic@] # cat /sys/kernel/debug/usb/10200000.usb/regdump
    GOTGCTL = 0x00000000
    GOTGINT = 0x00000000
    GAHBCFG = 0x00000000
    GUSBCFG = 0x00000000
    GRSTCTL = 0x00000000
    GINTSTS = 0x00000000
    GINTMSK = 0x00000000
    GRXSTSR = 0x00000000
    GRXFSIZ = 0x00000000
    GNPTXFSIZ = 0x00000000
    GNPTXSTS = 0x00000000
  3. 抓包工具

    和 USB Host 调试一样,抓包可以使用专门的 USB 总线分析仪或者在 Linux 主机上使用 usbmon 进行抓包。