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)와 일치되는지 확인한다. 만약 일치된 정보가 없으면 Windows는device의 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 |