레이블이 Debug-USB인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Debug-USB인 게시물을 표시합니다. 모든 게시물 표시

1/16/2019

Jetson TX2 Jetpack3.3 설치 및 USB Device 관련사항

1. Jetson Tx2 Jetpack 설치 

회사일을 Jetson Tx2관련일을 하게되어 이에 관련된 일을 간단히 정리하고자 한다.
그리고, 인터넷에 오픈된 것만 관련하여 간단히 서술한다.

현재 Ubuntu는 16.04LTS이며, 아래와 같이 Jetpack 3.3 설치를 하며, 설치 방법도 EVM의 영문 매뉴얼을 참조하면 어느정도 이해를 할수 있다.

  • Jetson TX2 Jetpack 설치 정보 
현재 나의 경우는 JetPack L4T를 설치를 Force Recovery Mode를 이용하여 최종으로 설치한다음 아래와 같이 update와 upgrade를 진행했다.

$ sudo apt update && sudo apt upgrade -y 

아래의 부분은 Jetson TX2에서 진행을 했지만, 동작이 되지 않았다.

$ sudo ./jetson_clocks.sh
$ cd ~/tegra_multimedia_api/samples/backend
./backend 1 ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264 --trt-deployfile ../../data/Model/GoogleNet_one_class/GoogleNet_modified_oneClass_halfHD.prototxt --trt-modelfile ../../data/Model/GoogleNet_one_class/GoogleNet_modified_oneClass_halfHD.caffemodel --trt-forcefp32 0 --trt-proc-interval 1 -fps 10

관련정보
  https://judo0179.tistory.com/19


JetPack 3.3 Download
  https://developer.nvidia.com/embedded/jetpack

JetPack Manual
 https://docs.nvidia.com/jetson/jetpack/index.html
 https://docs.nvidia.com/jetson/jetpack/introduction/index.html
 https://docs.nvidia.com/jetson/jetpack/release-notes/index.html

  https://devblogs.nvidia.com/jetson-tx2-delivers-twice-intelligence-edge/

2. JetPack 설치 후 USB Device 정보 

Jetson TX2의 Jetpack 3.3 설치 후 아래와 같이 USB의 설정확인하였으며, 간단히 정리해본다.


일반적인 USB 정보 알아두자.
  https://ahyuo79.blogspot.com/2014/11/class-descriptor.html
  https://ahyuo79.blogspot.com/search/label/IF-USB

  • Host PC 확인  (JetsonTX2 USB 접속)
Jetpack 3.3 설치 후 아래와 같이 USB를 확인을 해보면 Nvidia 관련사항을 확인가능
좀더 자세히 분석하여 알아 보면 다음과 같다.

Jetson TX2의 USB Device Mode 일경우 지원사항
  1. USB Mass Storage :  USB CDC 관련 Manual 내용 
  2. USB CDC-ACM :  /dev/ttyACM0 으로 Serial로 쉽게 Login 가능 
  3. USB CDC-RNDIS:  USB를 통하여 Window의 RNDIS Ethernet 사용가능 
  4. USB CDC-ether:  USB CDC Ethernet이며 RNDIS와 같이 연동되는 것 같음  
결론적으로 USB Ethernet이 두개 지원가능하며, Serial도 지원가능 및 Mass Storage도 지원
Window에서는 Network는 상위 CDC-RNDIS만 지원될 것라고 생각함


USB CDC-Network Adapters (Kernel Config 사항) 
( Device Drivers - Network device support - USB Network Adapters)
CONFIG_USB_NET_CDCETHER
CONFIG_USB_NET_RNDIS_HOST
CONFIG_USB_NET_CDC_EEM
CONFIG_USB_NET_CDC_MBIM

USB CDC ACM (Kernel Config 사항)
( Device Drivers - USB support)
CONFIG_USB_ACM

**CDC-ACM은 Ethernet 기반의 Adapter가 아니므로 별도로 /dev/ttyACMx 존재하지만,
상위 Network Adapters들의 경우 별도의 /dev는 존재하지 않음 주의   

USB CDC 관련세부사항 
  https://en.wikipedia.org/wiki/Ethernet_over_USB
  http://processors.wiki.ti.com/index.php/Networking_over_USB


$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 007: ID 0955:7020 NVidia Corp. 
Bus 001 Device 003: ID 045e:00cb Microsoft Corp. Basic Optical Mouse v2.0
Bus 001 Device 002: ID 045e:07f8 Microsoft Corp. Wired Keyboard 600 (model 1576)
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

$ lsusb -t  // Host USB 와 Module 관련부분 확인 
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/12p, 480M
    |__ Port 9: Dev 7, If 0, Class=Communications, Driver=rndis_host, 480M
    |__ Port 9: Dev 7, If 1, Class=CDC Data, Driver=rndis_host, 480M
    |__ Port 9: Dev 7, If 2, Class=Communications, Driver=cdc_acm, 480M
    |__ Port 9: Dev 7, If 3, Class=CDC Data, Driver=cdc_acm, 480M
    |__ Port 9: Dev 7, If 4, Class=Mass Storage, Driver=usb-storage, 480M
    |__ Port 9: Dev 7, If 5, Class=Communications, Driver=cdc_ether, 480M
    |__ Port 9: Dev 7, If 6, Class=CDC Data, Driver=cdc_ether, 480M
    |__ Port 11: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
    |__ Port 11: Dev 2, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M
    |__ Port 12: Dev 3, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M

$ lsusb -d 0955:7020 -v  // Jetson TX2 USB Descriptor 확인 

Bus 001 Device 004: ID 0955:7020 NVidia Corp. 
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.10
  bDeviceClass          239 Miscellaneous Device
  bDeviceSubClass         2 ?
  bDeviceProtocol         1 Interface Association
  bMaxPacketSize0        64
  idVendor           0x0955 NVidia Corp.
  idProduct          0x7020 
  bcdDevice            0.01
  iManufacturer           1 
  iProduct                2 
  iSerial                 3 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength          248
    bNumInterfaces          7
    bConfigurationValue     1
    iConfiguration          4 
    bmAttributes         0x80
      (Bus Powered)
    MaxPower                2mA
    Interface Association:
      bLength                 8
      bDescriptorType        11
      bFirstInterface         0
      bInterfaceCount         2
      bFunctionClass          2 Communications
      bFunctionSubClass       6 Ethernet Networking
      bFunctionProtocol       0 
      iFunction               7 
    Interface Descriptor:
....


  • Host PC에서 관련 Module Driver 확인 
사용되어지는 Module Driver를 알았으니, Depend를 알아보자.

$ lsmod        // Host PC Module 사용확인 
Module                  Size  Used by
rndis_wlan             57344  0
rndis_host             16384  1 rndis_wlan
cfg80211              622592  1 rndis_wlan
cdc_ether              16384  1 rndis_host
usbnet                 45056  3 rndis_wlan,rndis_host,cdc_ether
mii                    16384  1 usbnet
uas                    24576  0
usb_storage            69632  2 uas
cdc_acm                32768  2
pci_stub               16384  1
vboxpci                24576  0
vboxnetadp             28672  0
vboxnetflt             28672  0
vboxdrv               471040  3 vboxpci,vboxnetadp,vboxnetflt
binfmt_misc            20480  1
nls_iso8859_1          16384  2
snd_hda_codec_hdmi     49152  1
intel_rapl             20480  0
snd_hda_codec_realtek   106496  1
snd_hda_codec_generic    73728  1 snd_hda_codec_realtek
x86_pkg_temp_thermal    16384  0
intel_powerclamp       16384  0
coretemp               16384  0
kvm_intel             217088  0
kvm                   598016  1 kvm_intel
snd_hda_intel          40960  3
snd_hda_codec         126976  4 snd_hda_codec_generic,snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec_realtek
irqbypass              16384  1 kvm
snd_hda_core           81920  5 snd_hda_codec_generic,snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec,snd_hda_codec_realtek
snd_hwdep              20480  1 snd_hda_codec
snd_pcm                98304  4 snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec,snd_hda_core
crct10dif_pclmul       16384  0
crc32_pclmul           16384  0
snd_seq_midi           16384  0
ghash_clmulni_intel    16384  0
snd_seq_midi_event     16384  1 snd_seq_midi
joydev                 24576  0
pcbc                   16384  0
input_leds             16384  0
aesni_intel           188416  0
aes_x86_64             20480  1 aesni_intel
snd_rawmidi            32768  1 snd_seq_midi
crypto_simd            16384  1 aesni_intel
snd_seq                65536  2 snd_seq_midi,snd_seq_midi_event
snd_seq_device         16384  3 snd_seq,snd_seq_midi,snd_rawmidi
glue_helper            16384  1 aesni_intel
snd_timer              32768  2 snd_seq,snd_pcm
cryptd                 24576  3 crypto_simd,ghash_clmulni_intel,aesni_intel
snd                    81920  17 snd_hda_codec_generic,snd_seq,snd_seq_device,snd_hda_codec_hdmi,snd_hwdep,snd_hda_intel,snd_hda_codec,snd_hda_codec_realtek,snd_timer,snd_pcm,snd_rawmidi
soundcore              16384  1 snd
intel_cstate           20480  0
intel_rapl_perf        16384  0
mei_me                 40960  0
shpchp                 36864  0
mei                    90112  1 mei_me
acpi_pad              180224  0
mac_hid                16384  0
parport_pc             36864  1
ppdev                  20480  0
lp                     20480  0
parport                49152  3 parport_pc,lp,ppdev
autofs4                40960  2
hid_generic            16384  0
usbhid                 49152  0
hid                   118784  2 usbhid,hid_generic
i915                 1630208  104
i2c_algo_bit           16384  1 i915
drm_kms_helper        172032  1 i915
syscopyarea            16384  1 drm_kms_helper
e1000e                249856  0
sysfillrect            16384  1 drm_kms_helper
sysimgblt              16384  1 drm_kms_helper
fb_sys_fops            16384  1 drm_kms_helper
ptp                    20480  1 e1000e
drm                   401408  6 drm_kms_helper,i915
pps_core               20480  1 ptp
ahci                   36864  3
libahci                32768  1 ahci
video                  45056  1 i915


  • Udev 관련부분 확인 
좀 더 자세히 알고 싶다면 USB와 같이 동작되는 Udev 관련부분을 찾아보자.
이 부분 까지 조사하지 않고 서술만 한다.

$ ls /lib/udev/rules.d/
39-usbmuxd.rules                     73-special-net-names.rules
40-crda.rules                        73-usb-net-by-mac.rules
40-usb-media-players.rules           75-net-description.rules
...

$ ls /sys/class/net/
enp0s20f0u9  enp0s20f0u9i5  enp0s31f6  lo

  https://wiki.archlinux.org/index.php/Android_tethering
  https://unix.stackexchange.com/questions/388300/udev-does-not-rename-usb-ethernet-device

Udev관련 Rule
  http://fewstreet.com/2015/06/09/ubuntu-udev-naming-rules.html


  • Jetson TX2의 USB-ACM Interface 
Jetson Manual을 읽어보면, 기본으로 nvidia/nvidia 로 id/pw로 제공을 하며, 두번째 id와 pw는 ubuntu/ubuntu를 제공해준다.


$ ls /dev/ttyACM0    // USB ACM  Interface 확인 
/dev/ttyACM0
$ minicom -s    // JetsonTx2 접속  nvidia:nvidia 


2.1 Jetson의 USB Ethernet 통신 설정 

Host PC와 Jetson Tx2 USB의 설정을하면 USB를 통하여 Internet 통신이 가능하다.
이를 이용하여 SSH 와 SFTP 및 추후 GDB까지 기능확장이 가능하다.
이 관련 Manual은 Mass Storage의 영문 Manual을 참조하자.

  • Host PC의 USB Host 의 Network 설정 
나의 경우 Host PC 아래와 같이  두 개의 USB Interface가 잡히며, 이를 설정해주자.
이 관련내용은 Mass Storage의 영문 매뉴얼을 참조하자.

직접설정

$ sudo ifconfig enp0s20f0u9 192.168.55.3 netmask 255.255.255.0 up
$ sudo ifconfig enp0s20f0u9i5 192.168.55.4 netmask 255.255.255.0 up

설정환경

$ sudo vi /etc/network/interfaces
auto lo
iface lo inet loopback

#allow-hotplug enp0s20f0u9
auto enp0s20f0u9
iface enp0s20f0u9 inet static
address 192.168.55.3
netmask 255.255.255.0
#gateway 192.168.55.1

$ sudo /etc/init.d/networking restart
$ sudo ifup enp0s20f0u9 

  https://wiki.debian.org/NetworkConfiguration

설정후 확인

$ ifconfig -a
enp0s20f0u9 Link encap:Ethernet  HWaddr 86:dd:47:07:ec:e4  
          inet addr:192.168.55.3  Bcast:192.168.55.255  Mask:255.255.255.0
          inet6 addr: fe80::84dd:47ff:fe07:ece4/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:761 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1065 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:95357 (95.3 KB)  TX bytes:229667 (229.6 KB)

enp0s20f0u9i5 Link encap:Ethernet  HWaddr 16:bd:4f:fa:6a:df  
          inet addr:192.168.55.4  Bcast:192.168.55.255  Mask:255.255.255.0
          inet6 addr: fe80::14bd:4fff:fefa:6adf/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:800 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1017 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:98669 (98.6 KB)  TX bytes:178966 (178.9 KB)

enp0s31f6 Link encap:Ethernet  HWaddr 70:85:c2:3e:a8:2b  
          inet addr:10.0.0.107  Bcast:10.0.0.255  Mask:255.255.255.0
          inet6 addr: fe80::725b:9a50:8ca0:81e8/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:31853921 errors:0 dropped:0 overruns:0 frame:0
          TX packets:317267 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:46162303120 (46.1 GB)  TX bytes:35161467 (35.1 MB)
          Interrupt:16 Memory:df000000-df020000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:21308 errors:0 dropped:0 overruns:0 frame:0
          TX packets:21308 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:2903284 (2.9 MB)  TX bytes:2903284 (2.9 MB)



  • Jetson TX2의 USB Ethernet Device 설정 
상위의 Serial 프로그램(minicom)을 이용하여 ttyACM0 접속하여  Jetson TX2의 ethernet 환경을 살펴보자

Jetson Network 환경 확인

$ ifconfig -a                                              
docker0   Link encap:Ethernet  HWaddr 02:42:d0:89:67:5a                         
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0          
          UP BROADCAST MULTICAST  MTU:1500  Metric:1                            
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0                    
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0                  
          collisions:0 txqueuelen:0                                             
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)                                
                                                                                
dummy0    Link encap:Ethernet  HWaddr 16:34:65:bc:75:19                         
          BROADCAST NOARP  MTU:1500  Metric:1                                   
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0                    
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0                  
          collisions:0 txqueuelen:1000                                          
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)                                
                                                                                
eth0      Link encap:Ethernet  HWaddr 00:04:4b:c5:80:6f                         
          inet addr:10.0.0.170  Bcast:10.0.0.255  Mask:255.255.255.0            
          inet6 addr: fe80::9fdc:aa1b:faf4:9ad0/64 Scope:Link                   
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1                    
          RX packets:208078 errors:0 dropped:0 overruns:0 frame:0               
          TX packets:1925 errors:0 dropped:0 overruns:0 carrier:0               
          collisions:0 txqueuelen:1000                                          
          RX bytes:20077947 (20.0 MB)  TX bytes:354820 (354.8 KB)               
          Interrupt:42                                                          
                                                                                
l4tbr0    Link encap:Ethernet  HWaddr 7a:f3:26:af:7a:49                         
          inet addr:192.168.55.1  Bcast:192.168.55.255  Mask:255.255.255.0      
          inet6 addr: fe80::3851:d0ff:feaa:b4c4/64 Scope:Link                   
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1                    
          RX packets:10704 errors:0 dropped:0 overruns:0 frame:0                
          TX packets:101 errors:0 dropped:0 overruns:0 carrier:0                
          collisions:0 txqueuelen:1000                                          
          RX bytes:1739228 (1.7 MB)  TX bytes:10780 (10.7 KB)                   
                                                                                
lo        Link encap:Local Loopback                                             
          inet addr:127.0.0.1  Mask:255.0.0.0                                   
          inet6 addr: ::1/128 Scope:Host                                        
          UP LOOPBACK RUNNING  MTU:65536  Metric:1                              
          RX packets:219 errors:0 dropped:0 overruns:0 frame:0                  
          TX packets:219 errors:0 dropped:0 overruns:0 carrier:0                
          collisions:0 txqueuelen:1                                             
          RX bytes:16393 (16.3 KB)  TX bytes:16393 (16.3 KB)                    
                                                                                
tunl0     Link encap:IPIP Tunnel  HWaddr                                        
          NOARP  MTU:1480  Metric:1                                             
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0                    
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0                  
          collisions:0 txqueuelen:1                                             
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)                                
                                                                                
usb0      Link encap:Ethernet  HWaddr 9e:52:2b:63:ed:f2                         
          inet6 addr: fe80::9c52:2bff:fe63:edf2/64 Scope:Link                   
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1                    
          RX packets:5407 errors:5407 dropped:0 overruns:0 frame:5407           
          TX packets:4407 errors:0 dropped:0 overruns:0 carrier:0               
          collisions:0 txqueuelen:1000                                          
          RX bytes:874353 (874.3 KB)  TX bytes:813177 (813.1 KB)                
                                                                                
usb1      Link encap:Ethernet  HWaddr 7a:f3:26:af:7a:49                         
          inet6 addr: fe80::78f3:26ff:feaf:7a49/64 Scope:Link                   
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1                    
          RX packets:5297 errors:0 dropped:0 overruns:0 frame:0                 
          TX packets:4519 errors:0 dropped:0 overruns:0 carrier:0               
          collisions:0 txqueuelen:1000                                          
          RX bytes:864875 (864.8 KB)  TX bytes:633831 (633.8 KB)                
                                                                                
wlan0     Link encap:Ethernet  HWaddr 00:04:4b:c5:80:6d                         
          UP BROADCAST MULTICAST  MTU:1500  Metric:1                            
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0                    
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0                  
          collisions:0 txqueuelen:1000                                          
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)   

usb0 직접 설정 or DHCP 설정

$ sudo ifconfig usb0 192.168.55.2 netmask 255.255.255.0 up
or
$ udhcpc -i usb0   // DHCP Client로 설정 

network 환경설정

$ sudo vi /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

auto usb0
iface usb0 inet static
netmask 255.255.255.0
address 192.168.55.2


상위와 같이 설정후  Host PC에서 Jetson(192.168.55.2)로 접속가능.(SSH/SFTP/NFS)

$ ssh nvidia@192.168.55.2   // ID: ubuntu 가능 
$ sftp nvidia@192.168.55.2  // ID: ubuntu 가능 

  • Jetson 의 NFS지원 
아래와 같이 Kernel에서 NFS는 지원이 되지만, /sbin/mount의 NFS가 지원이 되지 않아 별도의 package 설치
 
$ cat /proc/filesystems | grep nfs  // Kernel의 NFS지원확인 
$ sudo apt-get install nfs-common   // mount nfs 지원 
$/sbin/mount  // mount 명령어 nfs 지원확인 
mountall                mount.ecryptfs_private  mount.lowntfs-3g        mount.nfs4              mount.ntfs-3g
mount.ecryptfs          mount.fuse              mount.nfs               mount.ntfs  

Host PC의 NFS Server 설정 후 아래와 같이 테스트

$ mount -t nfs -o nolock 192.168.5.3:/home/jhlee/test /home/nvidia/test 


2.2 USB Storage

이 부분은 추후 사용하기 위해 만든 것이며, 지금은 자료만 모음

USB Mass Storage Disable
  https://askubuntu.com/questions/888052/how-to-block-all-usb-storage-devices-in-ubuntu
  https://www.cyberciti.biz/faq/linux-disable-modprobe-loading-of-usb-storage-driver/
  https://help.ubuntu.com/community/Mount/USB

3.  Flash Jetson TX2

Host PC에서 USB를 통해 손쉽게 Flash하며, Backup 도 가능하기 때문에 관련 Command를 소개한다.


  • USB Force Recovery Mode



  • flash.sh 기본사용법 
Host PC와 Jetson의 microUSB 과 연결하여 USB를 통하여 Image를 Write or Read 할 수 있는 기능이다.





  • Host PC USB 연결확인 
만약 문제가 있다면, 상위 USB Force Recovery Mode로 진입하자.

$ lsusb  // Host 에서 USB 로 Jetson TX2 연결 후 Connection 확인
.....
Bus 001 Device 036: ID 0955:7020 NVidia Corp. 

  • Image Flash 방법  (USB 연결확인 후)
$  cd jetsonTX2/64_TX2/Linux_for_Tegra // JetPack 3.3 설치 위치  
$ sudo ./flash.sh  jetson-tx2 mmcblk0p1// For Jetson TX2 


  • Image Backup 및 Flash 방법 
$ sudo ./flash.sh -r -k APP -G clone.img jetson-tx2 mmcblk0p1    //기존에 사용하던 Image Backup
$ ls
clone.img  clone.img.raw
$ sudo cp clone.img.raw bootloader/system.img             // 실행전 반드시 bootloader/system.img bakcup  
$ sudo ./flash.sh -r -k APP jetson-tx2 mmcblk0p1                              // 적용된 이미지로 Flash


  • mount system.img.raw 방법 
system.img 는 mount가 되지 않으며, system.img.raw만 mount가 되었으며, mount 한 후에 NVIDIA에서 제공하는 SDK가 제대로 설치되었는지 확인하자.

$ mkdir test   //mount 할 장소 
$ sudo mount -t ext4 -o loop ./bootloader/system.img.raw ./test    // RAW File Mount

$ ls test/      // Target File System , APP 
README.txt  bin  boot  dev  etc  home  lib  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  sys  tmp  usr  var // Target Filesystem 

$ ls ./test/usr/local/      //CUDA 설치확인 
bin  etc  games  include  lib  man  sbin  share  src    // 미설치 

$ ls ./test/usr/src/      //tensorrt 설치 확인  /usr/src/tensorrt/bin/   , /usr/src/tensorrt/samples/
linux-headers-4.4.38-tegra

$ sudo umount test   // 반드시 unmount

  • flash.sh 사용법
$ ./flash.sh -h

Usage: sudo ./flash.sh [options]  
  Where,
 target board: Valid target board name.
 rootdev: Proper root device.
    options:
        -b  --------- nvflash boot control table config file.
        -c  --------- nvflash partition table config file.
        -d  --------- device tree file.
        -e  ------- Target device's eMMC size.
        -f  -------- Path to flash application: nvflash or tegra-rcm.
        -h ------------------- print this message.
        -i ------------------- pass user kernel commandline as-is to kernel.
        -k  ---- partition name or number specified in flash.cfg.
        -m  ----- MTS preboot such as mts_preboot_si.
        -n  -------- Static nfs network assignments
                               :::
        -o  --------- ODM data.
        -p  --------- Total eMMC HW boot partition size.
        -r ------------------- skip building and reuse existing system.img.
        -s ----- PKC key used for signing and building bl_update_payload.
        -t  ------- tegraboot binary such as nvtboot.bin
        -u  -------- PKC server in @ format.
        -w  --------- warm boot binary such as nvtbootwb0.bin
        -x  --------- Tegra CHIPID. default = 0x18(jetson-tx2)
                               0x21(jetson-tx1), 0x40(jetson-tk1).
        -y  -------- PKC for secureboot, NS for non-secureboot.
        -z  -------------- Serial Number of target board.
        -B  --------- BoardId.
        -C  --------- Kernel commandline arguments.
                               WARNING:
                               Each option in this kernel commandline gets
                               higher preference over the same option from
                               fastboot. In case of NFS booting, this script
                               adds NFS booting related arguments, if -i option
                               is omitted.
        -F  --------- Flash server such as fastboot.bin.
        -G  ------- Read partition and save image to file.
        -I  ---------- initrd file. Null initrd is default.
        -K  ---------- Kernel image file such as zImage or Image.
        -L  ------ Bootloader such as cboot.bin or u-boot-dtb.bin.
        -M  -------- MTS boot file such as mts_si.
        -N  --------- i.e. :/my/exported/nfs/rootfs.
        -P  -- Primary GPT start address + size of PPT + 1.
        -R  ------ Sample rootfs directory.
        -S  ------------ Rootfs size in bytes. Valid only for internal
                               rootdev. KiB, MiB, GiB short hands are allowed,
                               for example, 1GiB means 1024 * 1024 * 1024 bytes.
        -T  -------- ITS file name. Valid only for u-boot.
        --no-flash ----------- perform all steps except physically flashing the board.
                               This will create a system.img.
        --bup ---------------- Generate bootloader update payload(BUP).
        --multi-spec---------- Enable support for building multi-spec BUP.
        --clean-up------------ Clean up BUP buffer when multi-spec is enabled.
        --usb-instance  -- Specify the USB instance to connect to; integer
                               ID (e.g. 0, 1), bus/dev (e.g. 003/091), or USB
                               port path (e.g. 3-14). The latter is best.



  • Jetson TX2 Partion 구조 (Jetson TX2 확인)
Jetson TX2에서 Terminal에 접속후에 MBR이 아닌 GPT 방식 이므로 아래와 같이 확인하자

$nvidia@tegra-ubuntu:~$ sudo fdisk -l /dev/mmcblk0
Disk /dev/mmcblk0: 29.1 GiB, 31268536320 bytes, 61071360 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 00000000-0000-0000-0000-000000000000

Device             Start      End  Sectors   Size Type
/dev/mmcblk0p1      4097 58724352 58720256    28G Microsoft basic data
/dev/mmcblk0p2  58724353 58732544     8192     4M Microsoft basic data
/dev/mmcblk0p3  58732545 58740736     8192     4M Microsoft basic data
/dev/mmcblk0p4  58740737 58741760     1024   512K Microsoft basic data
/dev/mmcblk0p5  58741761 58742784     1024   512K Microsoft basic data
/dev/mmcblk0p6  58742785 58743808     1024   512K Microsoft basic data
/dev/mmcblk0p7  58743809 58744832     1024   512K Microsoft basic data
/dev/mmcblk0p8  58744833 58750976     6144     3M Microsoft basic data
/dev/mmcblk0p9  58750977 58757120     6144     3M Microsoft basic data
/dev/mmcblk0p10 58757121 58761216     4096     2M Microsoft basic data
/dev/mmcblk0p11 58761217 58762424     1208   604K Microsoft basic data
/dev/mmcblk0p12 58762425 58763632     1208   604K Microsoft basic data
/dev/mmcblk0p13 58763633 58764632     1000   500K Microsoft basic data
/dev/mmcblk0p14 58764633 58765632     1000   500K Microsoft basic data
/dev/mmcblk0p15 58765633 58769728     4096     2M Microsoft basic data
/dev/mmcblk0p16 58769729 58773824     4096     2M Microsoft basic data
/dev/mmcblk0p17 58773825 58786112    12288     6M Microsoft basic data
/dev/mmcblk0p18 58786113 58798400    12288     6M Microsoft basic data
/dev/mmcblk0p19 58798401 58802496     4096     2M Microsoft basic data
/dev/mmcblk0p20 58802497 59064640   262144   128M Microsoft basic data
/dev/mmcblk0p21 59064641 59326784   262144   128M Microsoft basic data
/dev/mmcblk0p22 59326785 59392320    65536    32M Microsoft basic data
/dev/mmcblk0p23 59392321 59457856    65536    32M Microsoft basic data
/dev/mmcblk0p24 59457857 59588928   131072    64M Microsoft basic data
/dev/mmcblk0p25 59588929 59720000   131072    64M Microsoft basic data
/dev/mmcblk0p26 59720001 59721024     1024   512K Microsoft basic data
/dev/mmcblk0p27 59721025 59722048     1024   512K Microsoft basic data
/dev/mmcblk0p28 59722049 60246336   524288   256M Microsoft basic data
/dev/mmcblk0p29 60246337 61071326   824990 402.8M Microsoft basic data
 


$nvidia@tegra-ubuntu:~$ sudo gdisk -l /dev/mmcblk0
GPT fdisk (gdisk) version 1.0.1

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.
Disk /dev/mmcblk0: 61071360 sectors, 29.1 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 00000000-0000-0000-0000-000000000000
Partition table holds up to 29 entries
First usable sector is 4097, last usable sector is 61071327
Partitions will be aligned on 1-sector boundaries
Total free space is 1 sectors (512 bytes)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            4097        58724352   28.0 GiB    0700  APP
   2        58724353        58732544   4.0 MiB     0700  mts-bootpack
   3        58732545        58740736   4.0 MiB     0700  mts-bootpack_b
   4        58740737        58741760   512.0 KiB   0700  cpu-bootloader
   5        58741761        58742784   512.0 KiB   0700  cpu-bootloader_b
   6        58742785        58743808   512.0 KiB   0700  bootloader-dtb
   7        58743809        58744832   512.0 KiB   0700  bootloader-dtb_b
   8        58744833        58750976   3.0 MiB     0700  secure-os
   9        58750977        58757120   3.0 MiB     0700  secure-os_b
  10        58757121        58761216   2.0 MiB     0700  eks
  11        58761217        58762424   604.0 KiB   0700  bpmp-fw
  12        58762425        58763632   604.0 KiB   0700  bpmp-fw_b
  13        58763633        58764632   500.0 KiB   0700  bpmp-fw-dtb
  14        58764633        58765632   500.0 KiB   0700  bpmp-fw-dtb_b
  15        58765633        58769728   2.0 MiB     0700  sce-fw
  16        58769729        58773824   2.0 MiB     0700  sce-fw_b
  17        58773825        58786112   6.0 MiB     0700  sc7
  18        58786113        58798400   6.0 MiB     0700  sc7_b
  19        58798401        58802496   2.0 MiB     0700  FBNAME
  20        58802497        59064640   128.0 MiB   0700  BMP
  21        59064641        59326784   128.0 MiB   0700  BMP_b
  22        59326785        59392320   32.0 MiB    0700  SOS
  23        59392321        59457856   32.0 MiB    0700  SOS_b
  24        59457857        59588928   64.0 MiB    0700  kernel
  25        59588929        59720000   64.0 MiB    0700  kernel_b
  26        59720001        59721024   512.0 KiB   0700  kernel-dtb
  27        59721025        59722048   512.0 KiB   0700  kernel-dtb_b
  28        59722049        60246336   256.0 MiB   0700  CAC
  29        60246337        61071326   402.8 MiB   0700  UDA
 



관련문서는 아래를 참조 혹은 설치시 Start_L4T_Docs.html 부분을 참조

Jetson_X2_Developer_Kit_User_Guide.pdf
  https://developer.nvidia.com/embedded/dlc/l4t-27-1-jetson-tx2-user-guide

4/17/2016

Wireshark를 이용하여 Window에서 USB 분석

1. Wireshark의 USB 분석 기능 

USB를 분석하기위해서는 별도의 USB 스니퍼 프로그램이 필요하며, 잘 설치된 경우 쉽게 Wireshark에서 분석가능하다.
회사 컴퓨터의 경우 USB 분석이 쉽게 잘되었는데, 이상하게 나의 개인노트북은 Wireshark에서 interface 부분에서 USB를 찾지를 못한다.

Wireshark의 USB의 분석기능의 핵심은 URB 분석이 될 것이며, 이는 USB Descriptor의 정의되어진 구조와 맞는지 확인을 하자.

이 부분을 조금씩 문제를 해결하기 위해서 아래와 같이 원인파악을 해보고 분석하려한다.

  • 개인 삼성 노트북의 USB 내부구성 
  1. USB Webcam 
  2. USB Buletooth 
  3. USB SD Card Reader (Host)
  4. Hub 구성 

상위와 같이 노트북 내부의 Device가 USB로 연결구성이 되어있다. (복잡하게 만들었군)
좀 더 확인을 하고자 하면 제어판의 장치관리자에서 확인하자.



  • USBPcap Driver 확인 
USB Capture를 위해 USBPcap Driver 설정확인



1.1 USBPcap 관련 설치 검증 및 관련 테스트 

일단 Hub의 각각의 Driver 정보를 확인하자.
그리고, Hub의 장치 Class GUID를 확인하자

  • USBPcap Class GUID 값 



  • 장치관리자에서 USB Hub의 장치클래스 GUID 확인
  1. 장치관리자->범용 직렬 버스 컨트롤러->Generic USB Hub->속성 
  2. 자세히->장치클래스 GUID 확인

       36FC9E60-C465-11CF-8056-444553540000


  • 레지스터 편집기에서 USBPCap 검색 
  1. regedit.exe를 실행
  2. 편집->찾기 USBPCap 검색
  3. 관련 장치 클래스 GUID 확인 

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class{36FC9E60-C465-11CF-8056-444553540000}\UpperFilters
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\Class{36FC9E60-C465-11CF-8056-444553540000}\UpperFilters
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class{36FC9E60-C465-11CF-8056-444553540000}\UpperFilters

  https://github.com/desowin/usbpcap/issues/3



  • USBPcapCMD 값 Regedit 값 비교 
USBPcapCMD의 USBPcap1,2,3 과 같은 regedit에서 Class GUID를 찾지 못했다.


C:\Program Files\USBPcap\USBPcapCMD.exe 



USBPcap1,2,3을 Class GUID 아래와 같이 동일하지만 앞의 값은 다르다.
   f18a0e88-c30c-11d0-8815-00a0c906bed8

1 \\.\USBPcap1
  \??\USB#ROOT_HUB20#4&4f07082&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8}
    [Port 1] Generic USB Hub
2 \\.\USBPcap2
  \??\USB#ROOT_HUB20#4&1c0cc4&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8}
    [Port 1] Generic USB Hub
3 \\.\USBPcap3
  \??\IUSB3#ROOT_HUB30#4&1e43ead0&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8} 


f18a0e88-c30c-11d0-8815-00a0c906bed8 관련사항
  https://docs.microsoft.com/en-us/windows-hardware/drivers/install/guid-devinterface-usb-hub


  • 레지스터 편집기 1차 검색
regedit에서 USBPcap 및 아래의 값으로 검색을 해보면 아래의 값을 찾을 수 있다
하지만 위와 동일 하지 않다. 장치 Class GUID가 맞지가 않다

ROOT_HUB20

  1. 4&4f07082&0
  2. 4&1c0cc4&0


  • 레지스터 편집기 2차 검색
f18a0e88-c30c-11d0-8815-00a0c906bed8로 검색을 해보면 USBPcap과 연결된 부분을 찾지를 못했다.

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\DeviceClasses{f18a0e88-c30c-11d0-8815-00a0c906bed8}

...


  • 개인노트북의 문제결론 
현재 내 개인 노트북은 USB가 꼬인것 같은데, 일단 직접 Command를 이용하여 각 기능을 기본으로 확인해보자.
아래와 같이 기본 캡쳐와 분석을 해보면 된다.
회사 컴퓨터는 잘되는데, 왜 내 개인 노트북이 문제인지 , 젠장.


2.1 USBPcapCMD이용한 기본 캡쳐 및 분석  

개인노트북에서 직접 USBPcapCMD 명령이용하여 USB 관련 부분을 캡쳐 해보고, 이를 분석해보자.
아래의 파일을 를 관리자 모드로 실행을 해주며,그냥 실행을 하였더니, WRITE가 허용이 되지 않았다.


C:\Program Files\USBPcap\USBPcapCMD.exe 


나의 개인노트북은 위와 같이 Filter 3번 (USBPcap3) 에 잡히는 것을 알수있으며, 우측 전용 USB3.0 Hub에 연결하여도, USB2.0 Hub에 부분에 연결해도 동일하다.
상위에 보듯이 Filter 3번 은 USB 3.0 Hub이며 이부분을 캡쳐해서 분석하자.

  • USB Data Capture 
  1. Select Filter to monitor를 Filter 3번(USBPcap3)로 설정
  2. 저장파일을 test.pcap 저장

  • Wireshark로 USB Data *.pcap 분석 
Ctrl+C로 캡쳐를 종료했다면 이제 test.pcap을 Wireshark를 이용하여 File->Open으로 test.pcap을 분석하자.

위와 같이 중요한 USB Descriptor 관련파일들을 확인을 할수가 있다.

USB Descriptor 부터 URB 분석까지 쉽게 분석이 가능



기본기능은 내노트북에서도 잘동작한다.

2.2 링크파일을 이용한 쉽게 이용 

상위 방법을 이제 간단히 링크로 만들어 쉽게 만들어보자.

  1. 바탕화면화면->새로만들기->바로가기 실행
  2. "C:\Program Files\USBPcap\USBPcapCMD.exe"



2.3  USBPcapCMD.exe 와 Wireshark.exe  기능확인 

cmd를 이용하여 USBPcapCMD.exe와 Wireshark.exe 옵션을 확인하자

C:\Users\JHLEE> cd C:\Program Files\USBPcap
C:\Program Files\USBPcap>USBPcapCMD.exe --help

C:\Program Files\USBPcap> cd C:\Program Files\Wireshark
C:\Program Files\Wireshark> wireshark.exe --help






2.4. Live Capture 기능 

개인노트북에서는 Wireshark에서 Interface가 USB가 잡히지 않아 아래와 같이 cmd.exe를 이용하여 강제로 실행을 했지만, Live Capture는 동작이 되지 않았다.

  • Live Capture 설정 
쉽게 파이프를 이용하여 아래와 같이 설정하자.
C:\Users\JHLEE> cd C:\Program Files\USBPcap
C:\Program Files\USBPcap>USBPcapCMD.exe -d \\.\USBPcap3 -o - | "C:\Program Files\Wireshark\Wireshark.exe" -k -i - 
Selected capture options result in empty capture.

캡쳐 중인 Wireshark 실행되고, 캡쳐모드로 동작하나 USB Capture는 동작되지 않는다.
원인분석을 위해서, 상위 로그내용을 "Selected .. " 부분을 소스에서 찾아보자

  • USBPcapCMD.exe 소스분석  
  start_capture 함수-> "Selected Capture options result.." 관련에러를 확인가능
  상위 에러가 발생하면 start capture 함수가 동작 되지 않는 것을 확인가능

  https://github.com/desowin/usbpcap/blob/master/USBPcapCMD/cmd.c


  • 단위 TEST 진행 
아래와 같이 설정변경하여 USBPcapCMD만  부분 TEST를 진행하자
-o 옵션에 파일명을 적고 실행해도 위와동일하게 에러 메시지를 본다.
하지만 -A 옵션을 추가하면 아래의 에러메시지는 없어지고 USBPcapCMD는 동작된다.

C:\Users\JHLEE> cd C:\Program Files\USBPcap
C:\Program Files\USBPcap>USBPcapCMD.exe -d \\.\USBPcap3 -o test.pcap
Selected capture options result in empty capture.

  • Live Capture 재설정 
이제 원인을 알았으니, 상위에러는 -A 옵션추가하여 다시 실행하면, 상위 에러로그는 사라지지만, Wireshark는 캡쳐 중일 뿐 아무런 동작되지 않는다.

또 다른 문제가 존재하는 것 같은데 추후 이부분을 더 알아보자.
(상위 장치 Class GUID 때문에  USB Interface를 잘 못찾는 느낌 인것 같은데)

C:\Users\JHLEE> cd C:\Program Files\USBPcap
C:\Program Files\USBPcap>USBPcapCMD.exe -d \\.\USBPcap3 -A -o - | "C:\Program Files\Wireshark\Wireshark.exe" -k -i -  

아래와 같이 Capture Interface에 "-" 추가 되었지만 동작되지 않는다.




USBPcapCMD.exe 기본설명서
  http://desowin.org/usbpcap/tour.html

다른 Window USB Driver 설정참조 (*.inf 파일)
  https://blog.sverrirs.com/2016/04/reverse-engineer-usb-protocol.html

WireShark 이용한 USB Capture 부분 
  http://www.packetinside.com/2011/04/usb.html
  https://wiki.wireshark.org/CaptureSetup/USB

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

11/24/2014

Linux USB Descriptor 분석방법-2

1. USB Host에서 USB 기본정보 파악

Linux Device에서 아래의 lsusb 명령어를 이용하여 USB Host의 기본정보를 파악해보자

  • USB Host에서 Device 확인 

# lsusb
Bus 002 Device 003: ID 090c:1000 Silicon Motion, Inc. - Taiwan (formerly Feiya Technology Corp.) 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 
Bus 002 Device 002: ID 1a40:0101 Terminus Technology Inc. Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 


  • USB Host에서 연결된 Device Layers 확인

# lsusb -t
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=musb-hdrc/1p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 2: Dev 3, If 0, Class=Mass Storage, Driver=usb-storage, 480M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=musb-hdrc/1p, 480M



1.1 USB Host에서 Descriptor 분석 

  • MassStorage 의 예제 

#lsusb -v

Bus 002 Device 003: ID 090c:1000 Silicon Motion, Inc. - Taiwan (formerly Feiya Technology Corp.) 
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.10
  bDeviceClass            0 
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0x090c Silicon Motion, Inc. - Taiwan (formerly Feiya Technology Corp.)
  idProduct          0x1000 
  bcdDevice           11.00
  iManufacturer           1 Samsung
  iProduct                2 Flash Drive DUO
  iSerial                 3 0320815120014277
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           32
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              300mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         8 Mass Storage
      bInterfaceSubClass      6 SCSI
      bInterfaceProtocol     80 Bulk-Only
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
Binary Object Store Descriptor:
  bLength                 5
  bDescriptorType        15
  wTotalLength           22
  bNumDeviceCaps          2
  USB 2.0 Extension Device Capability:
    bLength                 7
    bDescriptorType        16
    bDevCapabilityType      2
    bmAttributes   0x00000006
      BESL Link Power Management (LPM) Supported
  SuperSpeed USB Device Capability:
    bLength                10
    bDescriptorType        16
    bDevCapabilityType      3
    bmAttributes         0x00
    wSpeedsSupported   0x000c
      Device can operate at High Speed (480Mbps)
      Device can operate at SuperSpeed (5Gbps)
    bFunctionalitySupport   2
      Lowest fully-functional device speed is High Speed (480Mbps)
    bU1DevExitLat           4 micro seconds
    bU2DevExitLat           4 micro seconds
.....


- 분석
Mass Storage의 경우 Interface Descriptor의 Class 만 설정을 했다.
물론 Vendor ID와 Product ID도 필수로 존재한다.


  • USB Hub 와 HID 예제 


#lsusb -v
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            9 Hub
  bDeviceSubClass         0 Unused
  bDeviceProtocol         0 Full speed (or root) hub
  bMaxPacketSize0        64
  idVendor           0x1d6b Linux Foundation
  idProduct          0x0002 2.0 root hub
  bcdDevice            4.04
  iManufacturer           3 
  iProduct                2 
  iSerial                 1 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           25
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0xe0
      Self Powered
      Remote Wakeup
    MaxPower                0mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         9 Hub
      bInterfaceSubClass      0 Unused
      bInterfaceProtocol      0 Full speed (or root) hub
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0004  1x 4 bytes
        bInterval              12

Bus 002 Device 002: ID 80ee:0021 VirtualBox USB Tablet
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0         8
  idVendor           0x80ee VirtualBox
  idProduct          0x0021 USB Tablet
  bcdDevice            1.00
  iManufacturer           1 
  iProduct                3 
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           34
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 No Subclass
      bInterfaceProtocol      0 None
      iInterface              0 
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.10
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      85
         Report Descriptors: 
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval              10

Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            9 Hub
  bDeviceSubClass         0 Unused
  bDeviceProtocol         0 Full speed (or root) hub
  bMaxPacketSize0        64
  idVendor           0x1d6b Linux Foundation
  idProduct          0x0001 1.1 root hub
  bcdDevice            4.04
  iManufacturer           3 
  iProduct                2 
  iSerial                 1 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           25
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0xe0
      Self Powered
      Remote Wakeup
    MaxPower                0mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         9 Hub
      bInterfaceSubClass      0 Unused
      bInterfaceProtocol      0 Full speed (or root) hub
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0002  1x 2 bytes
        bInterval             255


-분석
HID의 경우 Interface만 Class를 설정하지만,
HUB의 경우 Device와  Interface를 동시에 설정한다.



  • Device/Interface 의 Class 부분 체크 
  http://www.usb.org/developers/defined_class

  • lsusb 명령어
  http://linux.die.net/man/8/lsusb

  • lsusb porting
  https://www.raspberrypi.org/forums/viewtopic.php?f=33&t=185091
  http://www.beyondlogic.org/usbnutshell/usb5.shtml

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에 연결 

11/09/2014

Window USB 분석방법 (Device Descriptor)

1. Window 에서 분석 방법 

다양한 Descriptor 분석 및 패킷분석 Tool이 존재하며, 아직 다 사용해보지 못해
각각의 장단점을 모르겠다.
현재 Wireshark까지 지원하다고 하니, Widnow는 너무 다양하다.

  • Wireshark 
  Network만 지원이 되었지만, USB 분석도 지원이 가능하다.
  https://www.wireshark.org/download.html

  • Thesycon USB Descriptor Dumper
  USB 분석을할때 사용을 해봐야 알겠지만,  사이트에서 제공하는 것으로 봐서 유용하겠다.
  http://www.thesycon.de/eng/usb_descriptordumper.shtml

  • Libusb Program (Descriptor 분석)
  Linux의 Libusb와 비슷한 기능을 가진 것 같으며, 상당히 유용할 것 같다. 
  현재 Window에서 사용할 일이 없기에 Link만 

  http://blog.tcltk.co.kr/?p=888
  http://wiki.tcltk.co.kr/wiki.php/libusb
  https://sourceforge.net/p/libusb-win32/wiki/Home/

  • USB Sniffer For Window 
  정확하게 Descriptor 는 분석이 되는지는 모르겠으나, 
  Packet Sniffer 용도로 사용 되는 것 같다.
  https://sourceforge.net/projects/usbsnoop/


2.2 Window 에서 Driver 지원 및 설정파일 확인 

Window를 USB Host를 사용하는 경우 대표적인 USB Device의 Class Driver는 지원을 해준다.
그리고, 관련 Class Driver의 설정파일, 즉 (*.sys) 을 알아두자.
만약, 별도의 설치 Driver가 필요할 경우도 발생한다.

  https://msdn.microsoft.com/en-us/library/windows/hardware/ff538820(v=vs.85).aspx