linux에서 분석하는 방법은 가장 기본적으로 사용하는 것
- proc 정보
- 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의 연결과 상관 이 있으므로 중요하다.
- if#=x : bInterfaceNumber
- Alt=0 : bAlternateSetting
- EPs=1 : bNumEndpoints
- Cls=09: bInterfaceClass
- Sub=00: bInterfaceSubClass
- Prot=00: bInterfaceProtocol
- 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에 연결