11/30/2014

Linux USB Host URB 분석

1. USB Host에서 URB Monitor

USB URB Debugging하기 위해서는 Host 에서 URB를 Capture 동작이 되며, 반드시 HCD와 함께 같이 동작해야한다. 



1.1 USB Kernel Message 및 Device Descriptor 분석 

  • Kernel Message 확인  
USB Request Blocks (URBs) 보다는 USB Descriptor 를 분석하고 관련 USB Driver의 debug message들을 분석하여 기본동작을 확인하자 

$ cat /proc/kmsg
$ dmeg 

  • USB Device Descriptor 분석 과 Kernel Message 분석법  
우선적으로 USB Hots에서 각 Device 의 Descriptor를 우선적으로 분석해야한다.
  https://ahyuo79.blogspot.com/2017/10/linux-usb-1.html


1.2 USB Host 의 usbmon 동작구조 이해  

아래의 TI문서를 읽어보면 아래와 같이 usbmon이라는 HCD와 연결되어 동작되어 debugging할수 있게 되어있다.


USB Host에서 Kernel 의 usbmon  세부사용법
  http://elinux.org/images/1/17/USB_Debugging_and_Profiling_Techniques.pdf
  https://drive.google.com/open?id=0B_ehveuLi8MVZ3lHYU11QVViUEk


  • HCD 와 usbmon 같이 동작되는 구조 
USB Host Mode에서 usbmon 과 동작할 경우 
  1. Binary File은 /dev/usbmonx 로 생성되어 확인가능
  2. Text 정보는 /sys/kernel/debug 로 확인 가능 (Kernel Config에서 별도 설정)

  • URB Binary 분석방법-A (좌측) 
/dev/usbmonx를 tcpdump를 이용하여 dump를 하고, 이를  wireshark로 분석하는 것이다.


  • URB Text 분석방법-B (우측)
/sys/kernel/debug/usb/usbmon/Xu를 이용하여 vusb-anlayzer라는 linux에서 돌아가는 프로그램을 이용하는 것이다.


1.3 Kernel 설정 변경 

  • Kernel Config 설정 
# usbmon 기능 과 Kernel Debug 기능 on 
....
CONFIG_USB_MON=m
...
CONFIG_DEBUG_FS=y
...

  • USB Host의 EHCI의 IRQ 에서 URQ 전송 
ehci_irq () 주요 파일 urq로 core로 DMA로 전송 status 로 HW 정보들을 알수 있다.
ehci_irq () 주요 파일 urq로 core로 DMA로 전송 status 로 HW 정보들을 알수 있다.
#define  STS_ASS  (1<<15 ...="" access="" advance="" also="" any="" are="" as="" async="" bits="" change="" completion="" define="" detect="" error="" errors="" flags="" frame="" interrupted="" intr_enable="" list="" normal="" not="" on="" over="" overflow="" pci="" periodic="" port="" pre="" reason="" reclamation="" reserved="" rolled="" running="" schedule="" short="" some="" status="" sts_="" sts_err="" sts_fatal="" sts_flr="" sts_halt="" sts_iaa="" sts_int="" sts_pcd="" sts_pss="" sts_recl="" such="" these="">



2. Linux에서 usbmon 기반으로 wireshark 분석 

Window와 Linux의 각 Driver를 보면 아래와 같다.
  • Window : USBPcap  ( Wireshark에서 기본제공)
  • Linux     : usbmon (/dev/usbmonx , Kernel에서 제공해야함)

Linux에서 USB의 기본적인 Descriptor들은 아래의 명령으로 쉽게 확인가능

$ cat /sys/kernel/debug/usb/devices  
or 
$ lsusb 

하지만, URB를 모니터를 하기위해서는 Linux Kernel에서 CONFIG_USB_MON 설정필요하며,  Linux Kernel에서 설정이되면 /dev/usbmonX 생성이 되며
이를 기반으로 USB의 URB 모니터 즉 Capture가 가능하다

Kernel Config usbmon 
  https://www.kernel.org/doc/Documentation/usb/usbmon.txt


  • USB URB Capture 방법 
$ mount -t debugfs none_debugs /sys/kernel/debug  // mount가 기본으로 거의되어있음
$ modprobe usbmon  // module로 했을 경우 

$ ls /sys/kernel/debug/usb/usbmon
 0s  0u  1s  1t  1u  2s  2t  2u  3s  3t  3u  4s  4t  4u

$ cat /sys/kernel/debug/usb/usbmon/0u > /tmp/1.mon.out // 모든 USB Bus Capture

$ cat /sys/kernel/debug/usb/usbmon/3u > /tmp/1.mon.out  // URB를 Capture 추정 추후 Wireshark와 연동을 해봐야 알것같음 

USB Host 에서 usbmon 이용하여 tcpdump로 capture하는법 
  https://ahyuo79.blogspot.com/2014/11/usb-host-gadget-debug-2.html

Linux에서 USB Capture를 위한 Setup 방법
  https://wiki.wireshark.org/CaptureSetup/USB

Linux에서 Bluetooth Capture를 위한 Setup 방법
  https://wiki.wireshark.org/CaptureSetup/Bluetooth

  • HOST OS 별로 USB 지원을 확인가능 
아직 USB의 RNDIS를 이용하여 사용하는 기능은 확인을 해보지 못했다.
글을 읽다보면, 기본 OS를 Linux로 사용하고, Virtual로 Window를 설치한 다음 이용하는 기능같다.

  https://wiki.wireshark.org/CaptureSetup/NetworkMedia
  http://desowin.org/usbpcap/capture_limitations.html