11/23/2014

Linux USB Descriptor 분석방법-1

1.  Linux 에서 분석설정  

linux에서 분석하는 방법은 가장 기본적으로 사용하는 것

  1. proc 정보 
  2. kernel log 


1.1  proc 정보 (usb filesystem )

proc는 기본적으로 아래와 같이 usbfs 을 사용해야 아래와 같이 지원이 가능하다.
mount -t usbfs none /proc/bus/usb
물론 Kernel에서 USB Filesystem을 사용해야한다.

# vi /etc/fstab
none  /proc/bus/usb  usbfs  defaults  0  0


# cat /proc/bus/usb/devices  or 
# cat /sys/kernel/debug/usb/devices

   상위분석방법 및 설정
   https://www.kernel.org/doc/Documentation/usb/proc_usb_info.txt

1.2 Kernel Log


# dmesg  // Kernel log 
# cat /proc/kmsg 


1.3 lsusb tool 사용 

linux에서 제공하는 lsusb tool을 사용하는 것이다.

2. Linux의 Proc의 정보분석 

현재 Device Descriptor 와 Driver의 정보확인이 가능하며, 연결상태를 확인하는 좋은 정보이다.
이 정보만으로는 연결상태를 알수는 있지만, debugging을 한다면, 역시 Kernel message가 필요하다.

2.1 USB Host 확인예제 

아래와 같이 기본  hub정보가 나온다.

# cat /proc/bus/usb/devices  or 
# cat /sys/kernel/debug/usb/devices

T:  Bus=02 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=01 MxPS=64 #Cfgs=  1
P:  Vendor=1d6b ProdID=0002 Rev= 4.04
S:  Manufacturer=Linux 4.4.32-gadde2ca9f8 musb-hcd
S:  Product=MUSB HDRC host driver
S:  SerialNumber=musb-hdrc.2.auto
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

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=01 MxPS=64 #Cfgs=  1
P:  Vendor=1d6b ProdID=0002 Rev= 4.04
S:  Manufacturer=Linux 4.4.32-gadde2ca9f8 musb-hcd
S:  Product=MUSB HDRC host driver
S:  SerialNumber=musb-hdrc.1.auto
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

sys filesystem을 사용한다면, 아래에 위치에 존재할 것이다.

# /sys/bus/usb/devices/usb* 



  • 상위내용 분석 

D: 와 P:  모두 Device Descriptor에서 가져오는정보이며, 각각의 중요 정보들을 분석해보자.

D: Cls=: Class / Sub=: Sub Class / Prot=: Protocol 을 나타낸다.
P: Vendor ID와 ProductID가 확인가능하다.
I: 의 경우는 Interface descriptor로 Driver의 연결과 상관 이 있으므로 중요하다. 

  1. if#=x :    bInterfaceNumber
  2. Alt=0 :    bAlternateSetting
  3. EPs=1 :   bNumEndpoints
  4. Cls=09:   bInterfaceClass
  5. Sub=00:  bInterfaceSubClass
  6. Prot=00:  bInterfaceProtocol
  7. Driver=hub : linux에 연결된 Driver


  https://linux.die.net/man/1/usb-devices

  • 의미 설명 및 분석 

T = Topology (etc.)
B = Bandwidth (applies only to USB host controllers, which are
    virtualized as root hubs)
D = Device descriptor info.
P = Product ID info. (from Device descriptor, but they won't fit
    together on one line)
S = String descriptors.
C = Configuration descriptor info. (* = active configuration)
I = Interface descriptor info.
E = Endpoint descriptor info.


자세한 내용은 아래의 문서를 반드시 참조하자
  https://www.kernel.org/doc/Documentation/usb/proc_usb_info.txt


2.2 USB Hub에서 확인예제2 

이것은 최근에 작성한 것이며, 특이한 것은 Vendor Specific으로 작성했기때문에
아래와 같이 넣었다.


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=01 MxPS=64 #Cfgs=  1
P:  Vendor=0000 ProdID=0000 Rev= 2.06
S:  Manufacturer=Linux 2.6.18_IPNC_TENC-3003_1.0.1 musb-hcd
S:  Product=MUSB HDRC host driver
S:  SerialNumber=musb_hdrc
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=   2 Ivl=256ms

T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=480 MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=05c6 ProdID=9025 Rev= 2.32
S:  Manufacturer=Android
S:  Product=Android
S:  SerialNumber=0123456789ABCDEF
C:* #Ifs= 6 Cfg#= 1 Atr=80 MxPwr=500mA
I:  If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:  If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=42 Prot=01 Driver=(none)
E:  Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:  If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
E:  Ad=84(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
E:  Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:  If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
E:  Ad=86(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
E:  Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:  If#= 4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
E:  Ad=88(I) Atr=03(Int.) MxPS=   8 Ivl=32ms
E:  Ad=87(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=05(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:  If#= 5 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
E:  Ad=89(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=06(O) Atr=02(Bulk) MxPS= 512 Ivl=125us


대충 분석해보면, 2번째 T: 부터 봐야한다.
D: 의 Class/SubClass/Protocol은 사용되지 않는다. (추후 Interface에서 사용)
총 6개의 Interface로 구성이 되고, 0~4까지는 Vendor Specific Driver이다.
5번은 Class에서 Mass Storage로 연결이 되어 Driver에 연결