2011년 11월 21일 월요일

USB 사용하여 시스템 개발하기

USB I/F를 사용할 경우 자신이 개발하려는 디바이스가 USB host 로 동작해야 하는지 USB device로 동작해야 하는지를 결정해야 하고 각각에 맞는 USB controller를 사용하면 된다. 하지만 USB controller가 MPU에 내장된 임베디드 시스템에서는 사용하고자 하는 MPU에 내장된 USB controller가 자신이 원하는 모드(host/device)를 지원하는지 확인하여야 한다. MPU에 USB controller가 없거나 원하는 모드를 지원하지 않을 경우 외부 controller가 필요하다.  보통 임비디드 디바이스용 MPUs는 device용 USB controller를 내장하고 있지만, 최근에는 OTG(On The Go)를 지원하는 장치가 많이 있고, OTG를 지원하는 장치는 host/device 모두 사용이 가능하다.

*Host controller는 OHCI, UHCI, EHCI and xHCI controller가 있고, 이중 EHCI가 USB2.0 high speed까지 지원하는 것으로 가장 널리 사용된다.

*보통 통신 디바이스는 Master/Slave로 표현을 많이 하는데, USB는 Host/Device로 구분한다. Host가 Master,  Device가 Slave라고 생각하면 된다.


간혹 동일기기(동일 보드)안에서 USB를 사용하여 두개의 MPU를 연결해야 할 경우에는 굳이 일반적인 USB 대신 HSIC를 고려해볼 필요가 있다. HSIC는 USB2.0 high speed만 지원 하고, 회로 길이등의 제약(10cm)사항이 있으므로 설계시 주의가 필요하다. SW적으로는 USB용 드라이버를 거의 수정없이 사용할 수 있다.(진짜?)  HSIC는 전송을 위해서 장치 밖 원거리로 데이터를 전송할 필요가 없으므로, 이에 알맞게 Front End HW가 USB와 다르게 설계되어 있다.

USB는 여러가지 종류의 장치를 지원하는데, 이 장치를 기능별로 분류하여 class라고 부르고 class별로 표준 protocol을 정의하여 놓았다. 따라서 각 장치는 이 protocol을 준수하여 동작하여야 한다.

가장 대표적인 class가 CDC(Communication Device Class)이다. 대표적으로 USB2Serial, USB2ethernet등 USB포트에 연결하여 다른 통신 방법을 제공하는 디바이스들이 여기에 속한다.  CDC는 통신 방법에 따라 ECM,EEM, NCM, ACM, OBEX 등등 다양한 SubClass들이 있다.

USB-ACM: USB2Serial장치를 위한 SubClass
USB-EEM(ethernet emulation model): USB2ethernet 장치를 위한 SubClass

ECM(Ethernet networking Control Model), EEM(Ethernet Emulation Model),  NCM(Network Control Model ), MBIM(Mobile Broadband Interface Model)등은 모두 ethenet packet을 전송하기 위한 class들이며 점차 성능이 개선되고 기능이 추가 되면서 ECM->EEM->NCM->MBIM(Mobile Broandband Interface Model) 순서로 표준이 발표되어 왔다. 이중 MBIM은 NCM v2.0이 이름만 바뀐 것으로 단순 ethernet 통신 뿐만 아니라 무선 전화망을 사용한 인터넷 access관련 기능 지원등이 추가된 것으로 보인다. (잘 모르겠음 ㅠㅠ)
EEM은 ECM이 발표된 이후에 ECM의 비 효율적인 부분을 개선하여 발표되었는데, 추후 ECM도 버전업되면서 이러한 부분이 개선되었다고 한다.
(이들 sub-class간에 차이점 및 use-case는 좀더 study가 필요)

USB host쪽을 개발할 경우에는 우선 USB host controller driver가 필요하다. 그 다음으로 host장치에 연결할 device의 class driver가 필요하다(class driver는 host에서 실행된다!!!).  예를들어 USB2Ethernet 장치의 경우, USB CDC 에 속하고 그중에서도 CDC-EEM 을 사용하여 class driver를 구현할 수 있다.

반대로 USB device쪽에서는 device controller driver가 있어야 하고,  host에서의 class driver에 대응하는 USB function 드라이버의 개발이 필요하다.

참조 사이트:
http://www.jungo.com/st/embedded_usb_cdc.html