이것저것/My_Work

USB Enumeration

우담바라 2008. 10. 28. 20:45

Enumeration: How the Host Learns about Devices

from USB Complete, Third Edition       http://www.lvr.com/usbcenum.htm

 

Hub 해야 여러 작업 하나는 USB device(이하 device) 연결(attachement) 제거(removal) 감지 하는 것이다. 
hub 이러한 event들을 USB host(이하 host) 알리기 위해서 Interrupt IN endpoint 가지고 있다
.
System
Boot-up중에 host 확장hub 포함하여 USB bus(이하 bus) device 연결되었는지 그리고 확장hub device 연결되었는지를 확인하기 위해서 root hub 조사한다
.
Boot-up
후에도 host 주기적으로 조사하여 새로운 device 연결되었는지 또는 제거되었는지를 계속 확인한다.

새로운 device 확인하는 중에 host 일련의 요구들(request) device hub 보내서 hub host device사이의 통신 경로들을 설치하도록 한다. host device endpoint 0 USB표준요구가 포함된 control전송(transfer) 보내는 것으로 enumerate 시도한다. 모든 USB device들은 반드시 control전송, USB표준요구 End-point 0 지원해야 한다. 올바른 USB enumeration 위해서 device 요구들에 대해서 요구된 정보를 전달하고 다른 요구들에 대한 동작을 받아들이는 것으로서 대응해야 한다.

사용자 관점에서 USB enumeration 새로운 device 감지 하고 이를 성공적으로 설정했는지에 대한 알림을 제외하고 보이지 않게 자동적으로 이루어진다. 처음 사용하는 경우 간혹 사용자는 driver 선택하거나, host driver file 찾도록 특정 경로를 지정해 필요가 있다.   Enumeration 완료되면, Windows 제어판(control panel)안의 장치관리자(Device Manager) 새로운 device 추가하고, 사용자가 device bus에서 제거하면 Windows 장치관리자에서 device 제거한다.

device firmware host 요구할 정보들을 포함하고 있고, 하드웨어와 firmware 조합은 정보에 대한 해독과 요구들에 대한 대응을 한다. 일부 controller들은 firmware 지원 없이 전적으로 하드웨어만으로 enumeration 관리한다. Host Windows에는 OS 이러한 과정을 모두 수행하기 때문에 enumeration 대한 code작업을 필요가 없다.

 

Enumeration Steps

USB스펙은 6개의 device state 정의한다. enumeration동안에 device 이들 state Powered, Default, Address 그리고 Configured 4개의 device state 지나게 된다. (나머지 state Attached Suspend). 각각의 state에서 device 가능성과 동작들을 정의하고 있다. 

아래 절차들은 Windows환경에서 enumeration중에 나타나는 event들의 일반적인 시퀀스들이다. 그러나 enumeration 요구들과 event들은 device 개개의 명령과 요구로 나타나지 않는다.  Enumeration 성공하려면 device 언제든 bus event control요구에 대해서 감지하고 대응해야 한다.

1. 사용자가 USB port device 연결한다. 또는 이미 device 연결되어 있는 상태에서 system 전원이 on되었다.

Port host root hub 있거나, 확장hub 있다.
Hub
port 전원을 공급하고 device 전원공급상태 (Powered state) 된다.

2. Hub device 감지한다.

Hub port 전원 signal line 확인한다. Hub port signal line(D+, D-) 14.25에서 24.8 Kilohms pull-down저항을 가지고 있다. Device Full-speed device용으로 D+, Low-speed device용으로 D- 어느 한쪽에 900에서 1575 ohms 사이의 pull-up저항을 가지고 있다. High-speed 가능한 device full speed 연결된다. Device port 꼽히면 device pull-up저항은 signal line high상태로 올려 hub device 연결을 감지할 있도록 한다. Device 감지하는 과정에서 hub device 전원을 계속 공급하지만 아직device data전송을 하지 않는다.

3. host 새로운 device 연결된 것을 확인한다.  

hub interrupt endpoint 사용해서 hub event들을 host report한다. hub또는 port event 있는지의 여부만을 알려준다. Event 확인하는 중에 host hub “Get_Port_Status”요구를 보내서 다른 event 있는지를 찾는다. 여기서 설명된 Get_Port_Status 다른 요구들은 모든 hub들이 지원하는 표준 hub-class request들이다. 회답된 정보는 device 새롭게 bus 연결되었을 host 전달된다. 

4. hub 연결된 device low-speed인지 high-speed인지 확인한다.

Hub device reset하기 바로 전에, hub port signal line 전압상태를 조사하여 device low또는 high-speed device인지를 결정한다. Hub bus idle 어느 signal line 높은 전압을 가지고 있는지를 확인하여 device speed 감지한다. Hub 다음 Get_Port_Status요구에 대응하여 정보를 host 보낸다. Ver 1.x hub bus reset 바로 후에 device speed 감지한다. USB 2.0 reset하기 전에 speed감지가 일어나는 것을 요구한다 그래서 hub reset중에 high-speed 가능한 device인지 아닌지를 다음과 같은 절차를 통해서 확인한다.      

5. Hub device reset한다.

host 새로운 device 확인할 host controller port reset하도록 하는 “Set_Port_Feature”요구를 hub 보낸다. Hub 최소 10ms reset condition안에 device USB data 올려놓는다. Reset D+ D-신호를 logic low상태로 놓는 특별한 조건 이다. (보통 bus line 서로 반대의 logic상태를 가진다) hub 새로운 device reset신호를 보내고, bus상의 다른 hub들과 device들은 reset신호를 받을 없다.

6. host full-speed device high-speed 지원하는지 확인한다.

개의 특수한signal state 사용해서 device high-speed 지원 하는지를 검출한다. J state에서 D+ line 구동되고, K state에서는 D- line 구동된다.
Reset
동안에 high-speed 지원하는 device K state 보낸다
.
high-speed
지원이 가능한 hub state 감지하고, K J 교차된 일련의 신호로 응답한다. KJKJKJ패턴을 감지하는 device full-speed pull-up 제거하고 이후 모든 통신을 high-speed 수행한다. 만약 hub device K state 대한 응답을 하지 않으면 device full-speed 통신하게 된다. 모든 high-speed device full-speed에서 enumeration요구에 대한 대응이 가능해야만 한다.

7. Hub device bus간의 signal path 설치한다.

host Get_Port_Status요구를 보내는 것에 의해서 device reset state에서 빠져 나오는지를 확인한다. 회답된 data device 여전히 reset state 있는지 아닌지를 가리키고 필요하면 host device reset state에서 빠져 나올 때까지 반복하여 요구한다.
hub
reset상태를 제거할 device default 상태가 된다.  Device USB 레지스터들은 reset state 있고 device endpoint0에서 control전송에 대한 응답을 준비한다
.
device
default address 00h 사용해서 host 통신한다. 이때 device bus로부터 100mA까지 사용할 있다.

8. host “Get_Descriptor”요구를 보내서 default pipe 최대 packet size 확인한다.

host 한번에 하나의 device enumerate하기 때문에 address 0 device endpoint 0번에 요구를 보낸다. 여러 개의 device bus 동시에 연결되었더라도 address 0번이 지정된 device 통신에 대응한다.

8byte device descriptor endpoint 0 지원하는 최대 packet size 포함한다. Host Windows 64byte 요구하지만 packet 개를 받고 (packet 64byte 아니더라도) host 전송의 Status단계를 시작한다. Status단계의 완료 과정에서 Windows host 5 과정과 같이 hub device reset하도록 요구한다.

9. host address 할당한다.

host controller “Set_Address”요구를 보내서 device address 할당해 준다. Device default address(0) 사용해서 Status단계를 완료하고 새로운 address 동작한다. Device 이제부터 Address state 되고 시점부터 모든 통신은 새로운 address 이용한다.
할당된 address device bus 부터 제거, port reset 또는 system reboot 때까지 유효하다. 이후 다음 enumeration에서 host device 다른 address 할당할 있다. 

10. host device 기능에 대한 정보를 확인한다.

host 새로운 address device descriptor 읽기 위해 Get_Descriptor요구를 보낸다. 기간에 host device 대한 모든 descriptor 전달 받는다. Descriptor endpoint 0 최대 packet size, device 지원하는 몇몇 configuration device 대한 다른 기본적인 정보를 포함한 data structure이다. Host 정보들을 다음과 같은 통신에서 사용한다. 

Host device descriptor 명시된 하나 또는 여러 개의 configuration descriptor들을 요구해서 device 대한 정보를 계속 확인한다. Configuration descriptor 개에 대한 요구는 실제로 configuration descriptor다음의 모든 하위 descriptor들에 대한 요구이다. Windows host configuration descriptor 길이와 하위 descriptor 포함한 9 byte configuration descriptor 요구하는 것으로 descriptor들에 대한 확인을 시작한다

그러면, Windows configuration descriptor 통해서 확인된 descriptor 전체길이를 가지고 configuration descriptor 다시 요구한다. Device interface descriptor 뒤를 따르는 endpoint descriptor들과 함께 device interface들에 대한 descriptor들을 보내는 것으로 응답한다.   
몇몇 configuration들은 다른 descriptor 확장하고 수정한, class 또는 vendor-specific descriptor 포함하고 있다. descriptor들은 확장된 또는 수정된 descriptor 다음에 전달된다. 각각의 descriptor 길이와 type으로 시작한다. 

11. host device driver 정하고 로드 한다.
(composite device
제외)

Descriptor 통해서 device 대한 정보를 확인한 host device 통신하기 위한 최적의 device driver 찾는다. Driver 선택하는 과정에 있어서 Windows PC INF file정보와 device Vendor ID, Product ID 그리고 release number(option) 일치되는지 확인한다. 만약 일치된 정보가 없으면 Windowsdevice class, subclass protocol value 일치되는 것이 있는지 찾는다.
이전 단계에서처럼 device enumerate되었다면 Windows INF file 찾는 대신 system registry 정보를 사용할 있다
. 
OS
driver 할당하고 로드 후에 driver device에게 descriptor 또는 다른 class-specific descriptor 보내라고 요구한다.   

과정에서 composite device configuration 다른 interface 대한 다른 driver할당으로 예외 된다. Host device 앞으로 설정되기를 요구하는 interface들이 enable 후에만 driver들을 할당한다.

 

12. host device driver configuration 선택한다.

descriptor 통해 device 대해서 알게 device driver 원하는 configuration번호와 함께 “Set_Configuration”요구를 보내서 configuration 요구한다. 일부 device 하나의 configuration만을 지원한다. Device 여러 개의 configuration 지원하면 driver device 어떻게 사용되는지에 대한 정보를 기반으로 어느 configuration 요구되는지 결정하거나 driver 사용자에게 어떤 작업을 해야 하는지 또는 번째 configuration 선택하여 달라고 물어 있다. Device 요구를 읽고 요구된 configuration enable한다. 그러면 device configure 상태이며 device interface들은 enable된다. 시점에서 host 복합기능 device 대한 driver 할당한다. 다른 device 같이 host device 부터 회답된 정보를 사용해서 configuration에서 활성화된 각각의interface 대한 driver 찾는다.

'이것저것 > My_Work' 카테고리의 다른 글

VGA (VESA DDC)  (0) 2008.11.14
EDID ( Extended display identification data )  (0) 2008.11.14
USB Descriptors  (0) 2008.10.28
전력관리  (0) 2008.10.08
MFC - 콤보박스  (2) 2008.10.08