1. USB Host에서 URB Monitor
USB URB Debugging하기 위해서는 Host 에서 URB를 Capture 동작이 되며, 반드시 HCD와 함께 같이 동작해야한다.
1.1 USB Kernel Message 및 Device Descriptor 분석
- Kernel Message 확인
$ cat /proc/kmsg $ dmeg
- USB Device Descriptor 분석 과 Kernel Message 분석법
우선적으로 USB Hots에서 각 Device 의 Descriptor를 우선적으로 분석해야한다.
https://ahyuo79.blogspot.com/2017/10/linux-usb-1.html1.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
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 같이 동작되는 구조
- Binary File은 /dev/usbmonx 로 생성되어 확인가능
- Text 정보는 /sys/kernel/debug 로 확인 가능 (Kernel Config에서 별도 설정)
- URB Binary 분석방법-A (좌측)
- URB Text 분석방법-B (우측)
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 정보들을 알수 있다. #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=""> 15>
2. Linux에서 usbmon 기반으로 wireshark 분석
Window와 Linux의 각 Driver를 보면 아래와 같다.
Linux에서 USB의 기본적인 Descriptor들은 아래의 명령으로 쉽게 확인가능
하지만, 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 Host 에서 usbmon 이용하여 tcpdump로 capture하는법
https://ahyuo79.blogspot.com/2014/11/usb-host-gadget-debug-2.html
TI Kernel usbmon 사용 (쉽게설명)
https://elinux.org/images/1/17/USB_Debugging_and_Profiling_Techniques.pdf
Linux에서 USB Capture를 위한 Setup 방법
https://wiki.wireshark.org/CaptureSetup/USB
Linux에서 Bluetooth Capture를 위한 Setup 방법
https://wiki.wireshark.org/CaptureSetup/Bluetooth
글을 읽다보면, 기본 OS를 Linux로 사용하고, Virtual로 Window를 설치한 다음 이용하는 기능같다.
https://wiki.wireshark.org/CaptureSetup/NetworkMedia
http://desowin.org/usbpcap/capture_limitations.html
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와 연동을 해봐야 알것같음
https://ahyuo79.blogspot.com/2014/11/usb-host-gadget-debug-2.html
TI Kernel usbmon 사용 (쉽게설명)
https://elinux.org/images/1/17/USB_Debugging_and_Profiling_Techniques.pdf
Linux에서 USB Capture를 위한 Setup 방법
https://wiki.wireshark.org/CaptureSetup/USB
Linux에서 Bluetooth Capture를 위한 Setup 방법
https://wiki.wireshark.org/CaptureSetup/Bluetooth
- HOST OS 별로 USB 지원을 확인가능
글을 읽다보면, 기본 OS를 Linux로 사용하고, Virtual로 Window를 설치한 다음 이용하는 기능같다.
https://wiki.wireshark.org/CaptureSetup/NetworkMedia
http://desowin.org/usbpcap/capture_limitations.html