10 장 xhci(extensible Host Controller Interface) USB 호스트시스템 (Host System) 은많은수의하드웨어와소프트웨어영역으로구성된다. [ 그림 10-1] 은개념적인호스트시스템을구성하는각종영역이어떻게연결되는지를보여주는 블록다이어그램을보여준다. 그림 10-1 USB 3.0 시스템블록다이아그램 * 응용프로그램소프트웨어 (Application Software) 응용프로그램소프트웨어는클래스드라이버 에의해서제공되는표준화된인터페이스를통해서 USB 디바이스와데이터를송, 수신한다. * 클래스드라이버소프트웨어 (Class Driver Software) USB 디바이스의소위클래스 (Mass Storage, Human Interface, Audio, 등등 ) 에대응하는호스트의소프트웨어를의미한다. 클래스드라이버는대게운영체제가제공하는드라이버와제조사가 USB 디바이스와함께제공하는드라이버로구분된다. * USB 드라이버 (USBD) USBD 는시스템소프트웨어버스드라이버이다. 복수개의호스트컨트롤 러드라이버와복수개의클래스드라이버간의연결을책임진다. USBD 가제공하는인터페이스를
USB Driver Interface(USBDI) 라고부른다. * 호스트컨트롤러드라이버 (xhcd) 호스트컨트롤러하드웨어와 USBD 사이에존재하는소프트 웨어영역을제공한다. * 호스트컨트롤러 (xhc) 보통 Low Speed, Full Speed, High Speed, Super Speed 를지원하는 USB 3.0 호스트컨트롤러를의미한다. 호스트컨트롤러가호스트컨트롤러드라이버와대화하는방식 을호스트컨트롤러인터페이스 (xhci) 라고부른다. * USB 디바이스 (USB Device) 호스트컨트롤러하드웨어가통신하는대상의디바이스를 USB 디 바이스라고부른다. 이것은허브디바이스를포함한다. 그림 10-2 USB 3.0 extensible Host Controller [ 그림 10-2] 는호스트컨트롤러의내부를블록다이아그램으로보여주고있다. USB 3.0 호스트컨트롤러는 Low Speed, Full Speed, High Speed, Super Speed 인터페이스를모두 지원한다. 그리고복수개의 Down Stream Port 를가진다. 이것은루트허브의역할을수행한다.
이번장에서중요하게다룰부분은 Host Interface(xHCI) 이다. 호스트컨트롤러 (xhc) 는 xhci 를통해 서호스트컨트롤러드라이버와대화를한다. 이것을채널이라고도부른다. 10.1 아키텍쳐개관 10.1.1 인터페이스아키텍쳐 (Interface Architecture) 그림 10-3 호스트컨트롤러인터페이스 (xhci) 의일반적인아키텍쳐 [ 그림 10-3] 을보면, 크게 3 개의인터페이스공간을정의하고있다. * 호스트컨피규레이션영역 (Host Configuration Space) xhc 는 PCI Config Space 라고불리는공 간을사용해서열거된다. 이공간은내부레지스터를접근하기위한 Base Address 들과 PCI Extended Capability 특성정보를포함하고있다. * 메모리맵드영역 (Memory Mapped IO Space, MMIO) xhc 는시스템소프트웨어에게메모리
맵드형태의레지스터를제공한다. 이공간은일반적인 xhc 의동작과관련된레지스터들과실시 간제어상태레지스터 (Runtime Control Status Register) 와도어벨 (Doorbell) 배열등을제공한다. * 호스트메모리공간 (Host Memory Space) xhc는램 (RAM) 메모리공간에트리혹은리스트 (List) 자료구조를구성한다. 이것은실시간으로 xhc에의해서업데이트되고참조되는공간이다. 시스템소프트웨어는모든전송작업 ( 컨트롤전송, 인터럽트전송, 벌크전송, 등시성전송 ) 에관계된전송요청블럭을호스트메모리공간에존재하는트리혹은리스트의항목 ( 트랜잭션환형버퍼 ) 내부로추가기술하고 xhc는이것을참고하여트랜잭션을시작한다. 10.1.2 xhci 데이터자료구조 xhci 는호스트메모리공간에다양한자료구조를정의하여시스템소프트웨어와대화를한다. 여기에사용되는자료구조는다음과같다. 10.1.2.1 Device Context Base Address Array 호스트에연결되는모든 USB 디바이스는각각 Device Context 자료구조를사용해서대화한다. 이와같은 Device Context를보관하고있는배열정보를 Device Context Base Address Array( 줄여서 DCBAA) 라고부른다. DCBAA의배열의특정항목을담는공간을디바이스슬롯 (Slot) 이라고부른다. 이곳에 Device Context 가보관된다. 10.1.2.2 Device Context 하나의 Device Context 는하나의 USB 디바이스와대화를하기위한자료구조이다. Device Context 는 32 개의배열로구성된다. 이중첫번째항목 ( 인덱스 = 0) 을 Slot Context 라고부른다. 나머지항 목들 ( 인덱스 = 1-31) 을 Endpoint Context 라고부른다. 10.1.2.3 Slot Context Device Context 와 Input Context 의맴버로서사용되는 Slot Context 는디바이스혹은디바이스가 가진모든엔드포인트에게영향을미치거나현재의상태를알려주는파라미터들로구성된다. Slot Context 는사용되는목적에따라서크게 2 가지로구분된다. 각각의목적에따라서사용되는
Slot Context 는존재하는위치가서로다르다. Device Context 의맴버로사용되는경우, 시스템소프트웨어에게현재디바이스혹은디바이스가가진모든엔드포인트에게영향을미치는 현재파라미터값을보고하는용도로사용된다. 이런경우 Output Slot Context 라고도부른다. 이 것을통상 Slot Context 라고생각한다. Input Context 의맴버로사용되는경우, 시스템소프트웨어는 xhc 에게디바이스혹은디바이스가가진엔드포인트에게영향을미칠수있 는파라미터값을전달하는용도로사용된다. 이런경우 Input Slot Context 라고도부른다. 이것은 Device Context 가가지는 32 개의배열의첫번째항목이아니다. 10.1.2.4 Endpoint Context Device Context 와 Input Context 의맴버로서사용되는 Endpoint Context 는디바이스가가진각각 의엔드포인트에게영향을미치거나현재의상태를알려주는파라미터들로구성된다. Endpoint Context 는사용되는목적에따라서크게 2 가지로구분된다. 각각의목적에따라서사용 되는 Endpoint Context 는존재하는위치가서로다르다. Device Context 의맴버로사용되는경우, 시스템소프트웨어에게현재디바이스가가진특정엔드포인트의현재파라미터값을보고하는용도로사용된다. 이런경우 Output Endpoint Context 라고도부른다. 이것을통상 Endpoint Context라고생각한다. Device Context가가지는 32개의배열의인덱스 1-31까지의항목이여기에해당한다. Input Context 의맴버로사용되는경우, 시스템소프트웨어는 xhc 에게디바이스가가진특정엔드포인트에게영향을미칠수있는파라
미터값을전달하는용도로사용된다. 이런경우 Input Endpoint Context 라고도부른다. 이것은 Device Context 가가지는 32 개의배열에포함되는항목이아니다. 10.1.2.5 Input Context 디바이스의파라미터혹은디바이스가가진엔드포인트를위한파라미터를변경하고자하는요청요하려할때, 시스템소프트웨어는 Input Context의내용을변경한다. Input Context는 Slot Context와 Endpoint Context를포함하고있다. 이것들은모두변경하고자하는파라미터값을기록하는데사용된다. Input Context 는 Input Control Context 자료구조를추가로정의하고있다. Input Control Context 는 지정하는엔드포인트를현재사용중인 Device Context 로추가혹은변경요청하는 Add 계열과 사용중인엔드포인트를 Device Context 에서제거하는 Drop 계열로구분된다. 10.1.2.6 Ring 그림 10-4 Transfer Ring 의구조
Ring 은환형버퍼자료구조로구현된다. xhc 는몇개의 Ring 을통해서시스템소프트웨어에의해 서전송요청을접수하거나결과를시스템소프트웨어에게보고한다. * 명령 Ring(Command Ring) xhc 는하나의명령 Ring 을가지고있다. 이곳을통해서수용하는 명령어는 xhc 에게영향을미치는명령들이다. 이명령은 10.1.3 절에서소개한다. * 이벤트 Ring(Event Ring) 인터럽트신호와관련된사건 ( 결과 ) 을보고하는용도로사용하는 Ring 을의미한다. xhc 가하나의인터럽트를사용하는경우에는하나의이벤트 Ring을가진다. 효과적인동작을위해서 MSI(Message Signaled Interrupt) 를지원하는경우에는해당하는메시지의개수만큼이벤트 Ring을가진다. * 전송 Ring(Transfer Ring) 컨트롤전송요청, 인터럽트전송요청, 벌크전송요청그리고등시성 전송요청을위해서사용되는 Ring 자료구조로서, 엔드포인트마다하나씩가지고있다. [ 그림 10-4] 를보면, Ring 은복수개의 TRB(Transfer Request Block) 으로구성된다. TRB 는단독으로
혹은복수개가하나의 Transfer Descriptor 로의미를가진다. Ring 은환형버퍼이기때문에넣는위치 (,Enqueue Pointer) 와뽑아내는위치 (Dequeue Pointer) 를가 지고있다. 시스템소프트웨어는이와같은 Ring 의 Enqueue Pointer 를사용해서새로운 TRB 를추 가한다. xhc 는 Dequeue Pointer 를사용해서하나씩 TRB 를끄집어내어실행한다. 10.1.2.7 Transfer Request Block(TRB) TRB 는물리적으로연속적인메모리블럭의주소, 크기와추가적인제어정보등을포함한다. TRB 가표현하는메모리블럭의최대크기는 64KBytes 이다.
그림 10-5 Transfer Ring 의구조 10.1.2.8 Scatter/Gather 전송 가상메모리환경은불연속적인물리메모리페이지들이마치연속적인것처럼보이게하는기능을가 지고있다. xhc 는하드웨어이기때문에이런가상메모리환경을사용하지못한다. 불연속적인물리 메모리페이지를효과적으로사용할수있도록 xhc 는 Scatter/Gather 전송방법을사용할수있다.
그림 10-6 Scatter/Gather 전송예시 [ 그림 10-6] 을보자. Transfer Ring 속에는 3 개의 TRB 가발견되고있다. 그런데, 이들각각의 Ctrl 필드를보면, Chain 의 의미를가진 2 개의 TRB 가보인다. 이것은전체적으로 3 개가하나의전송을표현한다는의미로사 용된다. 10.1.2.9 제어전송 USB 제어전송은총 3 가지단계 (Setup 단계, 데이터단계그리고 Status 단계 ) 로구성된다. Setup 단계를위해서하나의 Setup 단계 TD(Transfer Descriptor) 를준비한다. 이것은 8 바이트셋 업데이타를담는다. 이어서필요에따라서데이터단계를위한데이터단계 TD 를준비한다. 마지막으로처리결과를
위한 Status 단계 TD 를준비한다. 그림 10-7 제어전송예시 [ 그림 10-7] 을보자. 그림속에서두개의제어전송 (1), (2) 를볼수있다. (1) 제어전송은별도의데이터단계를가지지 않는다. (2) 제어전송은 IN 방향을가지는데이터단계를가지고있다. 두가지전송모두 Setup 단계와 Status 단계를위한각각의 TRB 를가지고있으며, Setup 단계는 8 바이트데이터 (Setup Data) 를정의하고있다. 특별히 Setup 단계에사용되는 Immediate 상수는 8 바이트 Setup Data 를별도의데이터버퍼를준 비하지않고 TRB 내부의필드를그대로사용한다는의미로사용된다. 때문에데이터단계때사용 되는 Data 를위한별도의 TRB 를가지지않고 8 바이트 Setup Data 를 Setup TRB 에포함할수있다.
10.1.2.10 벌크, 인터럽트전송 벌크와인터럽트전송은일반적인 TRB 형태를그대로사용한다. 제어전송에서사용되던데이터단 계에서나타나는 TRB 구조를그대로사용한다. 10.1.2.11 등시성전송 그림 10-8 등시성전송예시 [ 그림 10-8] 은등시성전송의예시를보여주고있다. 하나의 TD(Transfer Descriptor) 는하나혹은복수개의 TRB 로구성될수있다. 등시성전송에서는 하나의 TD 는 TRB 의 Ctrl 필드가가리키는 Frame ID(ms 단위의시간 ) 시간에전송을시작하는데이 터읽기혹은쓰기요청을표현한다.
10.1.3 명령인터페이스 (Command Interface) xhc 는연결되는 USB 디바이스를관리하기위해서 Command Ring 인터페이스를사용한다. xhc 가가지는 Command Ring 은오직한개다. 이곳에기록되는내용을 Command Descriptor(CD) 라고부른다. Command Descriptor 는다양한종류의명령어를포함하고있다. 모든명령은처리가완료될때 Event Ring 속에 Command Completion Event 를만들어서보관한 다. 시스템소프트웨어는이것을읽어보아명령의처리상태를확인한다. Command Descriptor 를구성하는 TRB 는다음과같은명령어에따라서가변적인파라미터를가지 고있다. 10.1.3.1 No Op 해당하는명령어는 xhc 와 USB 디바이스에게아무런영향을미치지않는테스트용도의명령어이 다. 10.1.3.2 Enable Slot 시스템소프트웨어는 xhci 를사용해서새로운디바이스슬롯을예약한다. 슬롯을예약하는이유 는예약된슬롯공간에 Device Context 자료구조를만들어서담기위해서이다. 이와같은작업은새 로운 USB 디바이스가 USB 호스트시스템에서탐지되었기때문이다. 10.1.3.3 Disable Slot 사용이끝난 Device Context 를메모리에서해제하고나면, 더이상디바이스슬롯을사용할필요 가없다. 이런경우, 시스템소프트웨어는 xhci 를사용해서더이상사용하지않는슬롯을해제하 도록요청한다. 10.1.3.4 Address Device USB 디바이스는리셋이후디폴트주소를사용한다. 이후호스트에의해서적당한주소가지정되 어야한다. 호스트에서 USB 디바이스에게주소를지정하는방법은제어전송명령을사용하는방
법과 Address Device 명령어를사용하는 TD 를작성해서 Command Ring 을사용하는방법으로나 뉜다. 여기서는 Address Device 명령어를사용하는방법을말하고있다. 10.1.3.5 Configure Endpoint USB 디바이스는적당한주소가지정된이후엔드포인트의활성화를위해서셋업 (Configuration) 되어야한다. 이작업은제어전송명령을사용하는방법과 Configure Endpoint 명령어를사용하는 TD를작성해서 Command Ring을사용하는방법으로나뉜다. 여기서는 Configure Endpoint 명령어를사용하는방법을말하고있다. 10.1.3.6 Evaluate Context Full Speed를사용하는 USB 디바이스의경우, 디폴트엔드포인트의 MaxPacketSize값이 8, 16, 32, 64중에한가지를사용할수있다. 하지만, 호스트에서는이값이 8 이라고가정한다. 따라서, 시스템소프트웨어는디바이스로부터 Device Descriptor를읽은뒤, 이곳에기술된 MaxPacketSize값을확인하여이값이 8 이아닌경우, 적당한값으로 Device Context의내용을수정해야한다. 또한, 디바이스로부터얻은정보들 ( 예, Max Exit Latency) 을사용해서현재 Device Context 의내용 을수정해야한다. 이와같은작업을하기위해서 Evaluate Context 명령어를사용한다. 10.1.3.7 Reset Endpoint USB 디바이스의엔드포인트가정지 (Halt) 된경우, 해당하는엔드포인트의정지상태를회복하는데 사용하는명령어이다. 10.1.3.8 Stop Endpoint USB 디바이스의엔드포인트와대화를하는 xhc로하여금잠시동안이런대화를중지또는취소하라는요청의의미로사용되는명령어이다. Endpoint 가중지되면, 관련된 Transfer Ring 의동작이중지된다. 이때, 시스템소프트웨어는보다우선순위가높은 TD(Transfer Descriptor) 를준비해서 Transfer Ring의 Dequeue Pointer로옮길수있다.
10.1.3.9 Set TR Dequeue Pointer xhci 에서사용되는엔드포인트를위한 Transfer Ring 의 Dequeue Pointer 의값을변경하는명령어 이다. 보통 Stop Endpoint 명령어를사용한뒤에이명령어를사용할수있다. 10.1.3.10 Reset Device 시스템소프트웨어는 xhc 에게특정디바이스의상태가리셋되었다는사실을이명령어를통해서 알린다. 이명령을받은 xhc 는디바이스를위해서사용되던 Device Slot 의정보를초기화한다. 다음은초기화하는정보에대한내용이다. 슬롯상태 (Slot State) = Default USB Device Address = 0 Default Endpoint 를제외한나머지엔드포인트를위한 Endpoint Context 슬롯상태 = Disabled 10.1.3.11 Force Event 가상머쉰관리자 (Virtual Machine Manager, VMM) 의기능을사용해서실제존재하지않는 USB 디바이스가존재하는것처럼흉내내도록하는명령어로사용된다. 이기능은 xhc 가가지고있는 가상머쉰기능이활성화된경우에만사용될수있다. 선택적으로사용된다. 10.1.3.12 Negotiation Bandwidth 루트허브가사용하는대역폭에대한사용정도를변경하는데사용하는선택적인명령어이다. 10.1.3.13 Set Latency Tolerance Value USB 3.0에서소개된효과적인전원관리방법으로사용되는 LTM(Latency Tolerance Message) 는디바이스로하여금호스트에게적당한 BELT(Best Effort Latency Tolerance) 값을알리도록권장하고있다. 이와같은기능을사용하는 USB 디바이스와 xhc가대화를하기위해서는디바이스가알려주는 BELT값이호스트에의해서사용되어져야한다. 시스템소프트웨어는디바이스가전달하는 LTM메시지를수신하여이속에들어있는 BELT값을읽어서, 향후 xhc가디바이스와대화를할때
참고할수있도록 xhc 에게알려주어야한다. 이때사용하는명령어이다. 10.1.3.14 Get Port Bandwidth 루트허브가현재사용하고있는각각의포트가연결되어사용중일때, 연결된디바이스의속도와 관련해서전체적인대역폭의몇퍼센트씩포트가사용하고있는지를확인할때사용하는명령어이 다. 10.1.3.15 Force Header USB 3.0 에서사용되는프로토콜패킷중에서 TP(Transaction Packet), LMP(Link Management Packet) 등과같은 Header Packet 을디바이스로강제로전송하고자할때사용한다. 10.2 동작모델 (Operational Model) 이번절에서는시스템소프트웨어가어떤식으로 xhc 를초기화하고, 이후 USB 디바이스가 USB 호 스트에서검색된이후진행하는작업순서, USB 디바이스가제거될때수행하는작업등을살펴보도 록한다. 10.2.1 명령어동작 xhc 는하나의 Command Ring 을가지고있다. Command Ring 을제어하는데사용하는레지스터는 Operational Register 공간안에서찾을수있다 [ 그림 10-3 참고 ]. 10.2.2 호스트컨트롤러초기화 호스트컨트롤러초기화과정은전원이 xhc 에인가된이후최초에수행되어져야하는작업이다. 또한, 새로운 USB 디바이스가검색되기전에반드시먼저수행되어져야하는작업이기도하다.
그림 10-9 xhc 호스트컨트롤러 PCI Configuration Space [ 그림 10-9] 는실제 xhci 인터페이스를충실하게따르는알려진호스트컨트롤러하드웨어를사용 해서실전에서어떻게 PCI(PCIe) 버스에서사용되는지를보여주는그림이다. 그림을보면, xhc 하드웨어가제공하는 BAR1 의값이 0xFE300004( 메모리주소로는 0xFE300000) 인 것을알수있다. 호스트컨트롤러를초기화하려면이와같은주소를먼저할당받아야한다. 그림에서이주소는 0xFE300000 번지가된다. 레지스터맵에대한구체적인내용은이후에다시설명할예정이지만, 이번절에서초기화과정을 설명하는데필요한부분만큼은미리설명을하도록하겠다.
그림 10-10 xhci 레지스터맵의개요 [ 그림 10-10] 을보자. BAR 기준주소 0xFE300000 번지를따라가면, 제일먼저 Capability Registers 와이어지는 Operational Registers 가나타난다. 이후나머지레지스터들과자료구조들은포인터들에의해서찾 아가게된다. 표 10-1 Capability Registers 오프셋 바이트크기 별칭 이름 00h 1 CAPLENGTH Capability Register Length 01h 1 사용안함 02h 2 HCIVERSION Interface Version Numbre 04h 4 HCSPARAMS1 자료구조파라미터 08h 4 HCSPARAMS2 자료구조파라미터
0Ch 4 HCSPARAMS3 자료구조파라미터 10h 4 HCCPARAMS1 Capability 파라미터 14h 4 DBOFF Doorbell 오프셋 18h 4 RTSOFF 런타임레지스터공간오프셋 1Ch 4 HCCPARAMS2 Capability 파라미터 20h CAPLENGTH 20h 사용안함 [ 표 10-1] 에서보여주는 Capability Registers 의전체길이는 CAPLENGTH 필드에의해서결정된다. 이곳에기록된크기만큼 Capability Registers 가존재한뒤, 이어서 Operational Registers 가나타난 다. 표 10-2 Operational Registers 오프셋 별칭 이름 00h USBCMD USB Command 04h USBSTS USB Status 08h PAGESIZE Page Size 0Ch-13h 사용안함 14h DNCTRL Device Notification Control 18h CRCR Command Ring Control 20h-2Fh 사용안함 30h DCBAAP Device Context Base Address Array Pointer 38h CONFIG Configure 3Ch-3FFh 사용안함 400h-13FFh Port Register 집합 1부터 MaxPorts까지기술됨 표 10-3 Port Register(Host Controller USB Port Register 집합 ) 오프셋 별칭 이름 00h PORTSC Port 상태와제어 04h PORTPMSC Port 전원관리상태와제어 08h PORTLI Port 링크정보 0Ch PORTHLPMC Port 하드웨어 LPM 제어
그림 10-11 Capability Registers 와 Operational Registers 의내용, 예시 [ 그림 10-11] 은 [ 표 10-1], [ 표 10-2] 에서보여준레지스터중에서중요한것들을선택적으로보여 주고있다. 1) 전원이공급된이후, USBSTS 레지스터의 CNR(Controller Not Ready) 플래그의값이 0 이될때 까지기다려야한다. 2) CONFIG 레지스터의 MaxSlotsEn 필드의값을 ENABLE 값으로기록하여시스템소프트웨어가앞 으로 Device Slot 을사용할수있도록한다. 3) Device Context Base Address Array Pointer(DCBAAP) 레지스터의값을적당한메모리주소값으로 기록한다. 기록된공간은앞으로 Device Slot 을위한공간으로사용된다. 4) Command Ring Control Register(CRCR) 을프로그래밍하여 Command Ring Dequeue Pointer 가 적당한메모리주소값을가리키도록한다. 이곳은 Command Ring 의첫번째 TRB(Transfer Request
Block) 을가리키게된다. 5) MSI, MSI-X 인터럽트관련초기화작업을수행한다.( 관련내용은 PCI 스팩을참고한다 ) 6) MSI, MSI-X 에서사용하려는인터럽트메시지의개수만큼인터럽터 (Interrupter) 를초기화한다. 이작업은 Event Ring 관련된초기화작업을의미한다. 7) USBCMD 레지스터의 INTE 필드의값을 1 로기록하여인터럽트 (Interrupter) 를가능하도록한 다. 8) 런타임레지스터, Interrupter Management 레지스터의 IE 필드의값을 1 로기록한다. 9) USBCMD 레지스터의 Run/Stop(R/S) 필드의값을 1 로기록하여호스트컨트롤러가동작을시작 하도록하고, 도어벨 (Doorbell) 참조가가능하도록한다. 이제호스트컨트롤러는초기화되었다. 루트허브포트도함께준비가된다. 루트허브는포트에 특정디바이스가연결되는것을기다리는상황이되었다. [ 표 10-3] 을보면, 루트허브와관련된레지스터정보를확인할수있다. 루트허브정보는허브가지원하는포트수에따라서가변적인크기를가지고있다. 하나의포트는 16 바이트의정보로구성된다. [ 표 10-4] 는허브포트레지스터들중에서본절을설명하는데필요한레지스터만간추려서정리해 보았다. 대부분의내용은 USB 3.0, USB 2.0 스팩에서설명하는내용이므로중복설명은피하도록 하겠다. 표 10-4 Port 상태와제어레지스터 (PORTSC) 8-5 4 3 2 1 0 PLS PR OCA 사용안함 PED CCS 15-14 13-10 9 이어짐 PIC Port Speed PP
23 22 21 20 19 18 17 16 CEC PLC PRC OCC WRC PEC CSC LWS 31 30 29-28 27 26 25 24 WPR DR 사용안함 WOE WDE WCE CAS 요약이름 전체이름 값 의미 CCS Current Connect Status 0 포트에디바이스가연결되어있지않다 1 포트에디바이스가연결되어있다 PED Port Enabled/Disabled 0 포트가사용금지되어있다 1 포트가사용허용되어있다 OCA Over Current Active 0 포트가과전류상태가아니다 1 포트가과전류상태이다 PR Port Reset 0 포트가리셋과정중이아니다 1 포트가리셋과정중이다 PLS Port Link State 0 읽기 링크상태가 U0 상태임 쓰기 링크상태를 U0 상태로전환 1 읽기 링크상태가 U1 상태임 쓰기 사용안함 2 읽기 링크상태가 U2 상태임 쓰기 USB2에서만사용. 링크상태를 U2 상태로전환 3 읽기 링크상태가 U3 상태임 쓰기 링크상태를 U3 상태로전환 4 읽기 링크상태가 U0 상태임 쓰기 사용안함 5 읽기 링크상태가 RxDetect 상태임 쓰기 USB3에서만사용. 링크상태를 RxDetect상태, Port상태를 Disconnected상태로전환 6 읽기 링크상태가 Inactive 상태임 쓰기 사용안함 7 읽기 링크상태가 Polling 상태임 쓰기 사용안함 8 읽기 링크상태가 Recovery 상태임 쓰기 사용안함 9 읽기 링크상태가 Hot Reset 상태임 쓰기 사용안함
10 읽기 링크상태가 Compliance 상태임 쓰기 USB3에서만사용. 링크상태를 Compliance상태로전환 11 읽기 링크상태가 Test Mode 상태임 쓰기 사용안함 12 읽기 사용안함 쓰기 사용안함 13 읽기 사용안함 쓰기 사용안함 14 읽기 사용안함 쓰기 사용안함 15 읽기 링크상태가 Resume 상태임 쓰기 USB2에서만사용. 링크상태를 U3상태, Port상태를 Resume상태로전환 PP Port Power 0 Port상태가 Power Off상태 1 Port상태가 Power Off상태가아님 Port Speed Port Speed 0 사용안함 1-15 Protocol Speed ID(PSI) 값 PIC Port Indicator Control 0 Port Indicators(PIND) Off 1 Amber 2 Breen 3 사용안함 LWS Port Link State Write Strobe 0 PLS필드의내용을변경하는것을금지 1 PLS필드의내용을변경하는것을허용 CSC Connect Status Change 0 CCS 필드값이변하지않았다 1 CCS 필드값이변함 1을기록하면클리어됨 PEC Port Enabled/Disabled 0 PED 필드값이변하지않았다 Change 1 PED 필드값이변함 1을기록하면클리어됨 WRC Warm Port Reset Change 0 Warm Reset 과정이진행중이지않다 1 Warm Reset 과정이끝났다 1을기록하면클리어됨 OCC Over Current Change 0 OCA 필드값이변하지않았다 1 OCA 필드값이변함 1을기록하면클리어됨 PRC Port Reset Change 0 PR 필드값이변하지않았다
1 PR 필드값이변함 1을기록하면클리어됨 PLC Port Link State Change 0 PLS 필드값이변하지않았다 1 PLS 필드값이다음의조건으로변함 U3 -> Resume Resume -> Recovery -> U0 Resume -> U0 U3 -> Recovery -> U0 U3 -> U0 U2 -> U0 U1 -> U0 Any State -> Inactive Any State -> U3 1을기록하면클리어됨 CEC Port Config Error Change 0 링크파트너설정상태변화없음 1 링크파트너설정상태에러발생 1을기록하면클리어됨 CAS Cold Attach Status 0 변화없음 1 링크상의 Far End Receiver Termincation 이발견됨 (Super Speed Transmitter 발견됨 ) WCE Wake on Connect Enable 0 기능을사용안함 1 디바이스연결시, 시스템깨우기기능활성 WDE Wake on Disconnect Enable 0 기능을사용안함 1 디바이스제거시, 시스템깨우기기능활성 WOE Wake on Over Current Enable 0 기능을사용안함 1 과전류시, 시스템깨우기기능활성 DR Device Removable( 읽기전용 ) 0 연결된디바이스를제거할수없는상태 1 연결된디바이스를제거할수있는상태 WPR Warm Port Reset 0 기능을사용안함 1 USB3에서만사용 Warm Reset기능을시작한다 표 10-5 Port 전원상태와제어레지스터 (PORTSC) 31-17 16 15-8 7-0 사용안함 FLA U2 Timeout U1 Timeout
U1 Timeout Super Speed Link U1 Timeout 값. 단위 us 사용범위 00h 7Fh, FFh : 무한시간 U2 Timeout Super Speed Link U2 Timeout 값. 단위 256us 사용범위 00h FEh, FFh : 무한시간 FLA Force Link PM Accept. 값 0 : 루트허브는연결된디바이스로 Set Link Function LPM 패킷을전송할때, Force_LinkPM_Accept 비트를 0 으로사용한다. 값 1 : 루트허브는연결된디바이스로 Set Link Function LPM 패킷을전송할때, Force_LinkPM_Accept 비트를 1 으로사용한다. 10.2.3 특정디바이스가허브에연결될때수행하는작업 본절에서는특정디바이스가루트허브에연결될때수행하는작업에초점을맞춘다. HCRST 필드의값이 1 이거나 PLS 필드의값이 RxDetect 인상태에서, 루트허브의모든포트는 Disconnect 상태를유지한다. 이때는 PP 필드의값이 1 이고, 디바이스가포트에연결되는상태를 기다리는상황이다. 디바이스가포트에연결되는상황은 USB3 과 USB2 가조금다르게시작한다 * USB3, 루트허브의포트가 Polling 상태가된다. Polling 작업이성공적으로끝나면, 포트는 Enabled 상태가되고, CCS 와 CSC 는모두 1 값을가진다. * USB2, 루트허브의포트가 Disabled 상태가된다. CCS 와 CSC 는모두 1 값을가진다.
포트의상태가 Disabled 상태가된다는의미는 USB3 과 USB2 가다른의미로해석된다. USB3 에서포트가 Disabled 상태가되면, 포트상태다이아그램의 DSPORT.Disabled 상태를의미한 다. 다음이어지는과정은디바이스가연결된이후에호스트측면에서수행하는작업이다. 1) 디바이스가허브의포트에연결되면, CCS 와 CSC 필드의값이 1 이된다. CSC 필드의값이 0 에서 1 로바뀌면 xhc 는 Port Status Change Event 를발생시킨다. 2) Port Status Change Event 가발생하면, 시스템소프트웨어는이벤트를발생시킨포트를확인한 다.(Port ID) 3) 시스템소프트웨어는이벤트를발생시킨포트의 PORTSC 레지스터값을읽는다. CCS 값이 1 인지 0 인지를확인하여디바이스가연결된상태를확인한다. * USB3에서, 포트의상태는자동으로 Enabled상태로바뀐다. PED필드의값은 1 이된다. PR필드의값은 0 이된다. PLS필드의값은 0 이된다. 연결된디바이스의상태는 Default 상태가된다. 에러가발생하면, 포트의상태는자동으로 Disconnected상태로바뀐다. PED필드의값은 0 이된다. PR 필드의값은 0 이된다. PLS필드의값은 5 (RxDetect) 가된다. 에러가발생한다하더라도연결된디바이스에게전원을계속공급한다. * USB2에서, 시스템소프트웨어는포트를리셋한다. 이작업은포트의상태를 Enabled 상태로바꾸고, 디바이스의상태를 Powered 상태에서 Default 상태로바꾸게된다. 연결이성공하면 PED와 PR필드의값은모두 0 이되고, PLS필드의값은 7 (Polling) 이된다. 시스템소프트웨어는포트를리셋한뒤, PRC필드의값이바뀌는이벤트로인해 Port Status Change Event가발생하기를기다린다. 포트리셋과정이끝나면, PRC와 PED필드의값은모두 1 이되고 PR필드의값은 0, PLS필드의값은 0 (U0) 상태가된다. PRC필드의값이 0 에서 1 로바뀌면, xhc는 Port Status Change Event 사건을발생시킨다. 리셋과정은 USB2 디바이스의상태를 Default 상태로만들고, SET_ADDRESS 명령을기다리게한다. 4) 포트의상태가성공적으로 Enabled 상태가되면, 시스템소프트웨어는 Enable Slot Command(Command Ring) 명령을사용해서새로운디바이스슬롯 (Device Slot) 을얻는다. 5) 디바이스슬롯을얻은뒤, 시스템소프트웨어는슬롯과관련된모든자료구조를준비한다.
디바이스슬롯과관련된자료구조를준비하는과정을조금더세부적으로살펴보도록한다. 5-1) Input Context 를위한메모리를할당하고값 0 으로초기화한다. 5-2) Input Context 의 Input Control Context 의 A0, A1 필드의값을 1 로기록한다. 이것은 Input Context 의내용중에서 Slot Context 와디폴트엔드포인트 Context 만변경하도록요청한다. 5-3) Slot Context 자료구조의내용을초기화한다. 5-4) 디폴트엔드포인트를위한 Transfer Ring 을할당하고초기화한다. 5-5) 디폴트엔드포인트 Context 를초기화한다. 5-6) Output Device Context 자료구조를할당하고값 0 으로초기화한다. 6) 슬롯을위한자료구조들의초기화과정이끝나면, 시스템소프트웨어는 Address Device Command(Command Ring) 명령을사용해서연결된디바이스에게주소를할당한다. 7) LS, HS, SS 디바이스의디폴트엔드포인트의 MaxPacketSize는각각 8, 64, 512 를사용한다. 하지만, FS의값은 8, 16, 32, 64중에임의의값을사용하기때문에, 적당한값을얻어내기위해, FS의디바이스는시스템소프트웨어로부터 GET_DSCRIPTOR 명령을통해 Device Descriptor를제공한다. 이곳에기록된 MaxPacketSize0 필드의값을읽은시스템소프트웨어는이값을사용해서 xhc의디바이스슬롯정보를변경요청한다. 이와같은변경요청은 Evaluate Context Command(Command Ring) 명령어에의해서수행된다. 8) 디바이스의상태를 Configured 상태로바꾸기위해서, 시스템소프트웨어는디바이스로부터필 요로하는모든디스크립터정보를충분하게얻는다. 여기에는 Configuration Descriptor 가포함된 다. 9) 시스템소프트웨어는 Evaluate Context Command(Command Ring) 명령어를사용해서추가적 으로변경할디바이스슬롯자료를준비한다. 여기에는 Max Exit Latency 시간정보가포함된다. 10) 보통여기서부터는시스템소프트웨어보다는클래스드라이버 (Class Driver) 가작업을주도하는 것이일반적이다.( 리눅스운영체제는이작업역시시스템소프트웨어가처리한다 ) 클래스드라이버는 Configure Endpoint Command(Command Ring) 명령어를사용해서 xhc 가디바 이스로 SET_CONFIGURATION 명령을전달하도록요청한다. 이작업을통해디바이스의상태는 Addressed 상태에서 Configured 상태로전환된다. 11) 클래스드라이버는선택적으로 Alternate Interface 를지정하는작업을요구할수있다.
10.2.4 특정디바이스가허브에서제거될때수행하는작업 본절에서는루트허브에연결된특정디바이스가제거되는작업에초점을맞춘다. 디바이스가 Root Hub Port로부터제거될때, PORTSC의 CCS필드는값 0 으로초기화될것이다. 그리고 CSC필드는값 1 로기록될것이다. 만일 PSCEG필드의값이값 0 이값 1 로바뀌면, xhc는 Port Status Change Event를통해서변화사실을알릴것이다. 디바이스가제거된것을인식하고나면, 시스템소프트웨어는 Disable Slot Command명령어 (Command Ring을사용 ) 를사용해서디바이스슬롯을금지시킬것이다. 10.2.5 디바이스슬롯관리 xhci 인터페이스는최대 255 개의디바이스를지원한다. 각각의디바이스는 Device Slot 값을할당 받는다. 디바이스슬롯은크게 3 부분으로나누어진다. Device Context Base Address Array, Device Context 그리고 Doorbell Array 이다. Device Context Base Address Array 는 USB 디바이스혹은허브를최대 255 개까지지원할수있다. 각각의항목배열은 Device Context 를가리키는 64 비트포인터를가진다. 슬롯 ID 란 Device Context Base Address Array 의인덱스를나타낸다. 슬롯 ID 를사용해서 Device Context 를가져오거나 Doorbell Register 에접근할수있다. Device Context 자료구조는호스트컨트롤러에연결된각각의 USB 디바이스의특성과현재상태를설명한다. Device Context는 32개의 Context 자료구조의배열로구성된다. 각각의배열은첫번째항목을 Slot Context 이라고부르며, 나머지배열 1-31을 Endpoint Context 자료구조라고부른다. 시스템소프트웨어가 Device Context 자료구조를할당하면, 모든필드의값을 0 으로기록한다. Device Context 의첫번째배열내용을 Slot Context 라고부른다. 이것은디바이스를전체적인관 점에서바로보는경우와전체엔드포인트에게영향을미칠수있는정보를정의하고있다. 각각의엔드포인트를위한 Endpoint Context 자료구조는엔드포인트의특성을정의한다. 엔드포인트의특성은엔드포인트의유형, 방향, 요구하는대역폭, Transfer Ring의포인터또는 Stream Context( 벌크엔드포인트의경우 ) 배열의포인터를나타낸다. Endpoint Context는디바이스의엔드포인트를위해서존재한다. 예를들어, Endpoint Context 0 은디폴트엔드포인트와관련된정보를
사용한다. 그림 10-12 Device Context 구조 10.2.5.1 Device Context Index DCI(Device Context Index) 는 Device Context 내부에서각각의 Context 자료구조를접근하는데사 용되는인덱스를의미한다. DCI 의값은 0 부터 31 까지가진다.
DCI 의값이 0 인경우, Slot Context 라고부른다. 벌크, 등시성, 인터럽트전송을위한엔드포인트를위해 DCI 값은다음과같은공식으로정의된 다. DCI = (Endpoint Number * 2) + Direction Direction = 0, OUT 방향 Direction = 1, IN 방향을의미한다. 예를들어, Endpoint Address 0x82( 벌크 ) 의경우, Endpoint Number 는 0x02, 전송유형은벌크, 방향은 IN 이기때문에, DCI = (0x02 *2) + 1 = 5 가된다. Device Context 내의 5 번째인덱스배열항목이해당하는엔드포인트를위한 Endpoint Context 가 된다. 10.2.5.2 슬롯상태 그림 10-13 슬롯상태다이아그램 [ 그림 10-13] 을보면, 디바이스슬롯의상태가어떤사건에따라서변하게되는지를알수있다.
10.2.5.2.1 Disabled 상태 디바이스슬롯의상태가 Disabled 되면, 슬롯을위한 Doorbell 레지스터도사용금지되고, Device Context 의내용은의미를가지지못한다. 반드시 Enable Slot 명령에의해서만슬롯상태가 Enabled 상태로전환된다. 10.2.5.2.2 Enabled 상태 이상태는 Enable Slot 명령에의해서 Device Slot 이할당되지만, 아직까지 Device Context 의내 용과 Doorbell 레지스터는의미가없다. 이상태는 Address Device 명령어와 Disable Slot 명령어만수행될수있다. 시스템소프트웨어가 Address Device 명령어를사용할때, Block Set Address Request(BSR) 필드의 값을 1 로사용하면상태는 Default 상태로전환된다. BSR 필드의값을 0 로사용하면상태는 Addressed 상태로전환된다. 10.2.5.2.3 Default 상태 이상태에는 USB 디바이스의상태가 Default 상태가된다. Device Slot 의내용중에 Slot Context 와디폴트엔드포인트를위한 Endpoint Context의내용이유효하다. 또한디폴트엔드포인트를위한 Doorbell 레지스터가유효한상태가된다. 이상태에서는 Address Device 명령어 (BSR필드의값이 0 ), Reset Endpoint, Stop Endpoint, Set TR Dequeue Pointer, Disable Slot 명령만처리될수있다. Address Device 명령어 (BSR 필드의값이 0 ) 에의해서상태는 Addressed 상태로전환된다. Disable Slot 명령어에의해서상태는 Disabled 상태로전환된다. 나머지명령어는상태를변화시키지않는다. 10.2.5.2.4 Addressed 상태 이상태에는 USB 디바이스의상태가 Addressed 상태가된다. 이상태에서는 Evaluated Context, Configure Endpoint, Reset Endpoint, Stop Endpoint, Negotiate Bandwidth, Reset Device, Set TR
Dequeue Pointer, Disable Slot 명령만처리될수있다. Configure Endpoint 명령어 (Deconfigure - DC 필드의값이 0 ) 에의해서상태는 Configured 상태로 전환된다. Reset Device 명령어에의해서상태는 Default 상태로전환된다. Disable Slot 명령어에의해서상태는 Disabled 상태로전환된다. 나머지명령어는상태를변화시키지않는다. 10.2.5.2.5 Configured 상태 이상태에는 USB 디바이스의상태가 Configured 상태가된다. 사실상 Device Context 에보관된모든의미있는내용들이유효하다. 실제로사용되는엔드포인트 (1-15) 를위한 Endpoint Context 가모두유효하다. 이상태에서는 Evaluate Context, Configure Endpoint, Reset Endpoint, Stop Endpoint, Negotiate Bandwidth, Reset Device, Set TR Dequeue Pointer, Disable Slot 명령만처리될수있다. Configure Endpoint 명령어 (Deconfigure - DC 필드의값이 1 ) 에의해서상태는 Addressed 상태로 전환된다. Reset Device 명령어에의해서상태는 Default 상태로전환된다. Disable Slot 명령어에의해서상태는 Disabled 상태로전환된다. 나머지명령어는상태를변화시키지않는다. 10.2.5.3 USB 표준명령과 xhci 명령의관계 USB 표준명령은제어전송을사용하는전송으로서, Setup TD형태로 xhci 를사용하는대표적인명령어이다. 이말은시스템소프트웨어에의해서소프트웨어적으로이런명령을발생시킨다는의미이다. 하지만, SET_CONFIGURATION 명령과 SET_ADDRESS 명령은 xhci 가자체적으로지원하는 Command Ring을통한지원요소와중복되는특징을가지고있다. * Address Device 명령어 : BSR = 0, 이명령어를사용하면 xhc 는 Device Context 에기록된디바 이스주소를사용해서자체적으로 SET_ADDRESS 명령어를만들어서디바이스에게전송한다.
* Configure Endpoint 명령어 : DC = 0, 이명령어를사용하면 xhc 는자체적으로 SET_CONFIGURATION 명령어를만들어서디바이스에게전송한다. 10.2.6 Command Interface Command Ring 은하나의 xhc 에하나만존재한다. 시스템소프트웨어는 Command Ring 을사용 하는 TRB 를제공하는제공자이고, xhc 는이것을소비하는소비자로동작한다. 초기에시스템소프트웨어는 Command Ring의 Command Ring Dequeue Pointer 레지스터의초기값을설정한다. 이것은 Command Ring Control Register(CRCR) 을사용한다. Command Ring Running 필드의값이 0 인경우에만시스템소프트웨어는 Command Ring Dequeue Pointer의값을변경할수있다. 시스템소프트웨어가새로운 Command 를 xhc 에게전송하려면, 명령과관련된 TRB 를준비한뒤, 해당하는 TRB 를 Command Ring 에넣는다. 준비가끝나면 xhc 의 Doorbell 레지스터를기록한다. Doorbell 레지스터를기록하는작업을, 초인종을울린다! 로해석하는편이더편하게들린다. Command 를위해초인종을울리는작업은 Doorbell Register 배열의첫번째항목에들어있는 xhc Doorbell 레지스터를기록한다는의미이다. 이후 xhc 는해당하는명령을해석한다. 해석이끝나면, Command Completion Event 사건을발생 시킨다. 사건과함께 xhc 는사건이관련된 TRB 를 Command TRB Pointer 필드를사용해서시스템 소프트웨어에게알려준다. xhc 는 Command Ring 이비워지거나멈추는요청이있을때까지, 계속해서 Command Ring 속에 TRB 를끄집어내면서해석을계속한다. 해석되는순서는 TRB 가접수되는순서를그대로사 용하고, 복수개의 TRB 가동시에접수되는것도허용된다. * 현재동작중인 Command Ring 을멈추기 Command Ring Control Register(CRCR) 의 Command Stop(CS) 필드의값을 1 로기록하는행동은 현재동작중인 Command Ring 의동작을멈추는결과를가져온다. * 현재동작중인 Command 를취소하기
Command Ring Control Register(CRCR) 의 Command Abort (CA) 필드의값을 1 로기록하는행동 은현재동작중인 Command 의해석이취소되는결과를가져온다. Command Completion Event 사건이발생되면, Command Ring 의 Dequeue Pointer 는이어지는 다음 TRB 를가리키도록옮겨진다. 10.2.6.1 No Op Command Ring 의동작을확인하는목적으로사용하는명령어이다. xhc 는해당하는명령을담은 TRB 를 Command Ring 에서끄집어낸뒤, 별다른해석없이 Command Completion Event 를발생시 킨다. 테스트용도이다. 표 10-6 No Op 명령처리방식 시스템소프트웨어가준비하는방법 xhc 가반응하는방법 TRB Type = No Op 명령나머지 TRB 필드 = 0 Cycle 비트 = Command Ring 의 PCS 플래그 [Host Controller Doorbell] DB Target = Host Controller Command Command Completion Event -> Event Ring Command TRB Pointer = No Op Command TRB Completion Code = 성공나머지 TRB 필드 = 0 Cycle 비트 = Event Ring의 PCS 플래그 10.2.6.2 Enable Slot Enable Slot 명령어는사용가능한디바이스슬롯 (Device Slot) 을할당하는명령이다. 할당된디바이 스슬롯의상태가 Disable 상태에서 Enable 상태로전환한다. 이명령을받은 xhc 는사용가능한디바이스슬롯을찾는다. 해당하는슬롯을발견하면, 선택된 슬롯을찾을수있는인덱스 (ID) 가 Command Completion Event 에 Slot ID 필드에담겨져서리턴 된다. 시스템소프트웨어는얻어진슬롯인덱스를사용해서 Device Context Base Address Array 배열의
해당하는위치를찾아서새로준비한 Device Context 구조체의주소를기입한다. 표 10-7 Enable Slot 명령처리방식 시스템소프트웨어가준비하는방법 xhc 가반응하는방법 TRB Type = Enable Slot 명령 Slot Type = 0 나머지 TRB 필드 = 0 Cycle 비트 = Command Ring 의 PCS 플래그 [Host Controller Doorbell] DB Target = Host Controller Command Command Completion Event -> Event Ring Command TRB Pointer = Enable Slot Command TRB 나머지 TRB 필드 = 0 Cycle 비트 = Event Ring의 PCS 플래그 [ 성공 ] Slot ID = 사용가능한 Device Slot ID Completion Code = 성공 [ 실패 ] Slot ID = 0 Completion Code = No Slots Avaliable 상태코드 10.2.6.3 Disable Slot Disable Slot 명령어는사용하던디바이스슬롯의상태를 Disabled 상태로전환한다. 보통사용중 인 USB 디바이스를호스트에서제거할때이와같은명령어가사용될것이다. 해당하는명령을받으면 xhc 는다음과같이행동할것이다. * 사용중인슬롯을위한 Doorbell 레지스터를사용금지시킨다. * 디바이스의주기적인통신을요구하는엔드포인트에게할당된대역폭을제거한다. * 해당하는디바이스와통신중인그어떤패킷전송도전부종료시킨다. * 슬롯과관련된모든내부자원을해제한다. 표 10-8 Disable Slot 명령처리방식
시스템소프트웨어가준비하는방법 xhc 가반응하는방법 TRB Type = Disable Slot 명령 Slot ID = 해제할디바이스슬롯 ID 나머지 TRB 필드 = 0 Cycle 비트 = Command Ring 의 PCS 플래그 [Host Controller Doorbell] DB Target = Host Controller Command Command Completion Event -> Event Ring Command TRB Pointer = Disable Slot Command TRB 나머지 TRB 필드 = 0 Slot ID = 해제요청한디바이스슬롯 ID Cycle 비트 = Event Ring의 PCS 플래그 [ 성공 ] Completion Code = 성공 [ 실패 ] Completion Code = Slot Not Enabled 상태코드 10.2.6.4 Address Device Address Device 명령어는디바이스슬롯에연결된디바이스의상태를 BSR(Block Set Address Request) 의값에따라서, Enabled 상태에서 Default 상태혹은 Addressed 상태로전환하거나, Default 상태에서 Addressed 상태로전환한다. 함께사용하는 Block Set Address Register(BSR) 필드의값에따라서 xhc 의동작이달라진다. 만일 BSR 필드의값이 1 인경우, 디바이스의상태는 Enabled 상태에서 Default 상태로전환된다. 이때 xhc 는별다른실제패킷을만들어서디바이스에게전송하지않는다. 이경우, 디바이스의 주소는값 0 으로간주된다. BSR 필드의값이 0 인경우, 디바이스의상태는 Addressed 상태로전환된다. 이때 xhc 는 SET_ADDRESS 명령어를만들어서디바이스에게전송한다. 적당한디바이스의주소값이할당된다. 이명령어가성공적으로처리되면, 디폴트엔드포인트는 xhc 의엔드포인트스케쥴링리스트에포 함되고늘사용이가능하도록준비된다. 디폴트엔드포인트의 Endpoint Context Doorbell 이사용 가능하도록허용된다. 표 10-9 Address Device 명령처리방식
시스템소프트웨어가준비하는방법 xhc 가반응하는방법 TRB Type = Address Device 명령 Slot ID = 디바이스슬롯 ID Input Context Pointer = Input Context 구조체주소나머지 TRB 필드 = 0 Cycle 비트 = Command Ring 의 PCS 플래그 [Host Controller Doorbell] DB Target = Host Controller Command Command Completion Event -> Event Ring Command TRB Pointer = Address Device Command TRB 나머지 TRB 필드 = 0 Slot ID = 디바이스슬롯 ID Cycle 비트 = Event Ring의 PCS 플래그 <BSR 플래그 = 1 의경우 > [ 성공 ] 모든 Input Slot Context 의내용이 Output Slot Context 로복사됨 Input Endpoint 0 Context 의내용이 Output Endpoint 0 Context 로복사됨 Output Endpoint 0 Context 의 Endpoint State(EP State) 값이 Running 상태로기록됨 Output Slot Context의 Slot State 값이 Default 상태로기록됨 Output Slot Context의 USB Device Address 필드값이 0 으로기록됨 Completion Code = 성공 [ 실패 ] Completion Code = Context State Error 상태코드 <BSR 플래그 = 0 의경우 > 대상의디바이스에게할당할적당한주소값이준비 SET_ADDRESS 명령어준비 (bmrequesttype, wvalue( 주소 ), windex, wvalue) Input Slot Context로부터 Route String 가져오기 SET_ADDRESS 명령어를디바이스로전송 [ 성공 ] 모든 Input Slot Context 의내용이 Output Slot Context 로복사됨 Input Endpoint 0 Context 의내용이 Output Endpoint 0 Context 로복사됨 Output Endpoint 0 Context 의 Endpoint State(EP State)
값이 Running 상태로기록됨 Output Slot Context의 Slot State 값이 Addressed 상태로기록됨 Output Slot Context의 USB Device Address 필드값이적당한주소값으로기록됨 Completion Code = 성공 [ 실패 ] Completion Code = Context State Error 상태코드 10.2.6.5 Configure Endpoint Configure Endpoint 명령어는연결된디바이스를셋업 (Configuring) 하거나반대로 Deconfiguring 하는명령어이다. 파라미터로함께사용되는 DC(Deconfigure) 필드의값이 1 인경우 xhc 는연결 된디바이스를대상으로 Deconfiguring 작업을시도한다. 셋업 (Configuring) 작업은디바이스가준비하고있는엔드포인트가실제로활성화되는과정이기때 문에, 시스템소프트웨어는이명령어를사용할때디바이스가준비한엔드포인트중에서사용하 고자하는엔드포인트와사용하지않으려하는엔드포인트정보를구분해야한다. 그림 10-14 슬롯상태다이아그램
[ 그림 10-14] 를보자. Input Context 의내용은 Device Context와비교해서, 앞부분의내용 (Input Control Context) 이다르다. 이곳에는비트맵형태의배열이존재한다. 디바이스가가지는엔드포인트는디폴트엔드포인트와나머지엔드포인트 (1-15, 양방향모두 ) 를합쳐서모두 31개이다. 이들에대한비트맵정보가존재하는데, 그림에서는이중에서 Endpoint 3( 주소는 0x81) 과 Endpoint 30( 주소는 0x0F) 에대해서만값 1 을기록하고나머진값 0 을기록하고있다. 해당하는두개의엔드포인트만사용하는명령어를작성하기때문이다. Configure Endpoint 명령어의처리가성공하면, 각각의엔드포인트를설명하는 Endpoint Context 의값이 Device Context 내부로복사되는것을알수있다. 그림 10-15 Input Context 와 Input Control Context
[ 그림 10-15] 를보면, Input Control Context의내용을알수있다. Drop Context는 Device Context 내용중에서사용하지않을 Context를지정하고, Add Context는새롭게사용하거나변경할 Context를지정한다. Add Context로지정되는 Context의값은명령어가성공적으로처리되면 Device Context로복사된다. Add Context로지정가능한비트맵과 Drop Context로지정가능한비트맵이조금다른것을알수있다. A0필드는 Slot Context, A1필드는디폴트엔드포인트를나타낸다. 이것들은 Drop 될수없는종류의것들로정의해놓았기때문이다. Configure Endpoint 명령어가 SET_INTERFACE 명령어로사용되는경우, [ 그림 10-15] 의 Input Control Context 의 Interface Number, Alternate Setting 값이사용될수있다. 다만, 이런경우반드시 Operational Registers 중에서 Config 레지스터의 Configuration Information Enable(CIE) 필드의값을 1 로기록해야한다. 그림 10-16 Slot Context 와 Endpoint Context
[ 그림 10-16] 을보자. Slot Context 는디바이스전체적으로영향을미칠수있는속성을정의하고 있다. Endpoint Context 는사용하는엔드포인트와관련된속성만정의를하고있다. 대부분의필드는 USB3, USB2 스팩에서언급되는내용이므로관련된내용은 1 부를참고하도록한 다. [Slot Context] 에서, * Max Exit Latency : us 초단위의지연시간. 디바이스가사용하는현재링크의상태가저전력상태 에서정상상태로회복하는데소요되는최대지연시간을의미한다. * Root Hub Port Number : 해당하는디바이스가연결된최상위포트 ( 루트허브포트 ) 의값을의미 한다.
* Number of Ports : 해당하는디바이스가외장허브인경우, 허브가지원하는포트개수 * Interrupter Target : 해당하는디바이스슬롯에서발생하는이벤트의 ID * Slot State : 디바이스슬롯의상태를나타냄. Disabled/Enabled (0), Default (1), Addressed (2), Configured (3) [Endpoint Context] 에서, * Endpoint State(EP State) : 엔드포인트의상태를나타냄. Disabled (0), Running (1), Halted (2), Stopped (3), Error (4) * Mult : USB Super Speed 등시성전송에서사용되는 Burst 개수를의미한다. 값이 0 이면하나, 값이 1 이면둘, 값이 2 이면셋을의미한다. Super Speed 등시성전송은하나의서비스인터벌안에서하나의 Burst 당최대 16개의패킷을전송할수있기때문에, 최대 Burst 개수로값 2 즉셋을사용하면, 3 * 16 = 48개의패킷을하나의서비스인터벌안에서전송할수있다. * Max Primary Streams(MaxPStream) : USB Super Speed 벌크전송에서, 해당하는벌크엔드포인트가스트림전송을사용하는경우, TR Dequeue Pointer 필드는 Primary Stream Context Array를가리키게된다. 지원가능한스트림수를결정한다. 값 0 은사용하지않는다는의미이고, 값 1 부터 15 까지사용할수있다. 사용되는값을 N 이라고라면, Primary Stream Context Array 배열은 2 ^ (N+1) 의크기를가진다. * Linear Stream Array(LSA) : 보조 Stream Array 의사용유무를결정한다. 이값이 1 이면보조 Stream Array 를사용하지않는다. 이값이 0 이면보조 Stream Array 을사용한다.
* Host Initiated Disable(HID) : Host 가시작요청하는스트림데이터전송명령의사용유무를결정한다. 이값이 1 이면사용금지이다. USB 3 스팩에서정의되는 General Stream Protocol State Machine(SPSM) 에서정의된 Idle 상태에서 Data Move 상태로전환요청을호스트가시작하는기능을허용할지여부를결정한다. 보통하드웨어자원이추가적으로요청되는기능이기때문에특별한경우를제외하고는이기능을사용하지않는다. 이말은기본적으로 HID 값이 1 인것으로간주한다는뜻이다. * Max Burst Size : 서비스인터벌안에수행할수있는 Burst 데이터패킷수. * Dequeue Cycle State(DCS) : TR Deque Pointer 가가리키는 TRB 의 xhc 소비자 Cycle 상태값을나 타낸다. * TR Dequeue Pointer : Endpoint Context 가 Input 용도로사용되는경우, MaxPStream 값이사용되면이필드는 Stream Context Array 배열을가리키고, 그렇지않으면 Transfer Ring 의주소를가리킨다. Endpoint Context 가 Output 용도로사용되는경우, MaxPStream값이사용되면이필드는 Stream Context Array 배열을가리키고, 그렇지않으면 TR Dequeue Pointer는대부분의미없는값으로사용되지만, 해당하는엔드포인트의상태가멈추거나에러가발생하면, 그당시에 Endpoint를위한 Transfer Ring의 Dequeue Pointer위치정보를제공하는목적으로사용된다 * Average TRB Length : 해당하는엔드포인트에의해서실행되는 TRB 의평균데이타바이트크기를 나타낸다. 이값은 System Bus Bandwidth 정보에사용된다.
그림 10-17 Stream Context Array Stream Context [ 그림 10-17] 을보면, Stream Context Array 가 Primary 와 Secondary 로나누어사용되는경우를알 수있다. 이와같이나누어사용되지않고 Primary Stream Context Array 만사용되는경우를 Linear Stream Array(LSA) 라고부른다. Stream Context 구조체에는 PSID, SSID 필드가없다. 이것은논리적으로판단해야하는 ID 값이다. 시스템소프트웨어는계층적인방식의 Stream Array 를사용하는경우, PSID 8 비트와 SSID 8 비트 의인덱스위치를계산해서 Stream ID 값으로사용해야한다.
Stream Context 구조체의필드는다음과같은의미로사용된다. * TR Dequeue Pointer : SCT 값이 0 또는 1 의경우, Stream Context 가 Input 용도로사용되는경우, Stream 을위한 Transfer Ring 의주소를가리킨다. Stream Context 가 Output 용도로사용되는경우, 대부분의미없는값으로사용되지만, 해당하는 엔드포인트의상태가멈추거나에러가발생하면, 그당시에 Stream 을위한 Transfer Ring 의 Dequeue Pointer 위치정보를제공하는목적으로사용된다 SCT 값이 0 또는 1 이아닌경우, Secondary Stream Array 의주소를담는다. * SCT(N) : Stream Context Type, Stream Context 가 Primary 혹은 Secondary 에속한것인지정보 를제공한다. 값 0 : Secondary Stream Array 에속함 값 1.. 7 : Primary Stream Array 에속함. TR Dequeue Pointer 의의미는 SCT 값 (N-1) * 8 개의 Stream Context 를가지는 Seconary Stream Array 의주소를담는다. * DCS : Dequeue Cycle State, xhc 가해석하는용도로사용하는 TRB 의 Consumer Cycle State(CCS) 값으로사용된다. * Stopped EDTLA : xhc 는스트림의동작 ( 스트림을위한 Transfer Ring) 이멈출때, 해당하는스트 림을위한엔드포인트가사용하던총전송량 (EDTLA) 값을기록한다. 10.2.6.6 Evaluate Context Evaluate Context 명령어는 Device Context 의특정필드의값을변경하도록시스템소프트웨어가 호스트컨트롤러에게알리는명령이다.
표 10-10 Evaluate Context 명령처리방식 시스템소프트웨어가준비하는방법 xhc 가반응하는방법 TRB Type = Evaluate Context 명령 Add Context 플래그 = 수정될엔드포인트를명시 Drop Context 플래그 = 모두값 0 으로기록함 Slot ID = 대상이되는디바이스의슬롯 ID Input Context Pointer = Input Context 구조체주소나머지 TRB 필드 = 0 Cycle 비트 = Command Ring 의 PCS 플래그 [Host Controller Doorbell] DB Target = Host Controller Command Command Completion Event -> Event Ring Command TRB Pointer = Evaluate Context Command TRB 나머지 TRB 필드 = 0 Slot ID = 디바이스슬롯 ID Cycle 비트 = Event Ring의 PCS 플래그 [ 성공 ] Input Endpoint 0 Context 의내용이 Output Endpoint 0 Context 로복사됨 Completion Code = 성공 [ 실패 ] Completion Code = Error 상태코드 10.2.6.7 Reset Endpoint Reset Endpoint 명령어는엔드포인트 ( 스트림혹은 Transfer Ring 이정지함 ) 의상태가정지하거나 에러가발생하였을때, 해당하는상황을정상상태로회복하도록시스템소프트웨어가요청하는 명령이다. 이명령어는디바이스슬롯의상태가 Default, Addressed, Configured 상태에서만사용할수있다. 표 10-11 Reset Endpoint 명령처리방식 시스템소프트웨어가준비하는방법 TRB Type = Reset Endpoint 명령
xhc 가반응하는방법 Endpoint ID = 대상엔드포인트 Slot ID = 대상이되는디바이스의슬롯 ID 나머지 TRB 필드 = 0 Cycle 비트 = Command Ring 의 PCS 플래그 [Host Controller Doorbell] DB Target = Host Controller Command Command Completion Event -> Event Ring Command TRB Pointer = Reset Endpoint Command TRB 나머지 TRB 필드 = 0 Slot ID = 디바이스슬롯 ID Cycle 비트 = Event Ring의 PCS 플래그 [ 성공 ] 만일 EP State가 Halted 인경우, EP State = Sopped 만일 Transfer State Preserve(TSP) 플래그가 0 인경우, USB2 Data Packet Toggle값을 0 USB3 Data Packet Sequence Number값을 0 Doorbell 레지스터를활성화 Completion Code = 성공 [ 실패 ] Completion Code = Error 상태코드 10.2.6.8 Stop Endpoint Stop Endpoint 명령어는엔드포인트를위한동작상태를멈추도록요청하는명령이다. 이명령어 가수행되기이전에처리중인전송이취소된다. Endpoint 가중지되면, 관련된 Transfer Ring 의동작이중지된다. 이때, 시스템소프트웨어는보다우선순위가높은 TD(Transfer Descriptor) 를준비해서 Transfer Ring의 Dequeue Pointer로옮길수있다. 이명령어에의해서동작중인 TRB가멈춘경우라면, 해당하는 TRB를가리키는 Event TRB를만들어서 Event Ring에추가한다. 표 10-12 Stop Endpoint 명령처리방식 시스템소프트웨어가준비하는방법 TRB Type = Stop Endpoint 명령 Endpoint ID = 대상엔드포인트 Slot ID = 디바이스의슬롯 ID 나머지 TRB 필드 = 0
Cycle 비트 = Command Ring 의 PCS 플래그 [Host Controller Doorbell] DB Target = Host Controller Command xhc 가반응하는방법이명령어에의해서진행중인전송이취소되는경우, 취소되는전송을위해서새로운 Transfer Event 를만들어서 Event Ring 에포함시킨다. TRB Type = Transfer Event Endpoint ID = 대상엔드포인트 Slot ID = 디바이스의슬롯 ID Completion Code = Stopped 나머지 TRB 필드 = 0 Cycle 비트 = Event Ring의 PCS 플래그 [ 만일취소된전송이 Event Data TRB라면 ] ED = 1 TRB Pointer = 64비트 Event Data TRB 파라미터 Length = 누적된 EDTLA 전송길이값 [ 그렇지않은경우라면 ] ED = 0 TRB Pointer = 전송이취소된 TRB Length = 전송중에취소된 TRB가요구하는나머지데이터전송크기 이후에는다음과같은과정이진행된다. Command Completion Event -> Event Ring Command TRB Pointer = Stop Endpoint Command TRB 나머지 TRB 필드 = 0 Slot ID = 디바이스슬롯 ID Cycle 비트 = Event Ring의 PCS 플래그 [ 성공 ] xhc내부에서수행될해당하는엔드포인트의파이프스케쥴링작업이제외됨 EP State = Stopped Completion Code = 성공 Endpoint Context 혹은 Stream Context의 Dequeue Pointer는멈춘 TR Ring의위치를알려준다. [ 실패 ] Completion Code = Error 상태코드
Stop Endpoint 명령어에의해서사용되던 Endpoint Context 혹은 Stream Context의동작이멈추는경우, 해당하는 Transfer Ring에서수행되던 TRB는취소된다. 통상적으로이렇게취소되는작업은즉시이루어진다. 이때, xhc는 Transfer Event TRB를만들어서취소된 TRB의주소를 TRB Pointer가가리키도록설정한다. 이때, Transfer Event TRB의상태코드의값은통상적으로 Stopped 값을가지게된다. 이와관련해서 Stopped Short Packet Capability (SPC) 기능과 Stopped EDTLA Capability (SEC) 기능을잠시설명하고넘어가도록하겠다. Endpoint Data Transfer Length Accumulator(EDTLA) 기능은엔드포인트별로전송하는데이터크기를 계속해서누적하는기능을말한다. 이렇게누적되는값은 16MB 1 의값을초과할때, 다시값 0 을가지도록 Wrap 된다. 시스템소프트웨어는 EDTLA 기능을사용하면상황에따라서전송되는데이터크기를추적하는도 움을받을수있다. Stopped EDTLA Capability (SEC) 기능은스트림통신을사용하는경우에필요한기능이다. 하나의벌크엔드포인트가복수개의스트림을사용하는경우, Stop Endpoint 명령어에의해서엔드포인트의동작이멈추게되면, 자연스럽게엔드포인트에속한모든스트림의동작이함께멈추게된다. 이럴때, 엔드포인트가사용하던최근의 EDTLA값을각각의스트림을위한 Stream Context내의 Stopped EDTLA 필드의값으로복사를해주는기능을의미한다. 하나의벌크 IN TD(Transfer Descriptor) 가복수개의 TRB 를가지고있는경우를가정해보자. 호스트가디바이스로부터데이터를읽어오는과정중에, Stop Endpoint 명령어가사용되었다면사 용되던당시의 TRB 를위한동작이멈춘다. 이때, 생성되는 Transfer Event TRB 의 TRB Transfer Length 필드는보통전송을끝내지못하고남아있는전송량의정보를담게된다. 시스템소프트웨어입장에서이값을해석하는데자칫하면혼동을가져올요인이있다. 방금 Stop Endpoint 명령어가사용될때, 마침그때디바이스로부터 Short Packet 이호스트로전 송되었다고가정해보자. Short Packet 을디바이스가호스트로전송했다는것은현재의 TD 자체가 끝나야한다는것을나타낸다. 더이상전송할데이터가없다는뜻이다. 이때, Stop Endpoint 명령어가사용되었다면, 이와관련된 Transfer Event TRB 의 TRB Transfer
Length 필드는남아있는데이터양을나타내고있기때문에, 시스템소프트웨어가볼때지금현 재받은데이터가마지막 Short Packet 의데이터인지, 아니면중간에멈추는일로인해서남아있 는데이터양인지혼동을하게된다. 이와같은혼동을피하기위해서사용하는기능이 Stopped Short Packet Capability (SPC) 기능이다. 이기능을활성화하면, 이와같은상황이발생할때, Transfer Event TRB의상태코드는 Stopped Short Packet 값을가지게되고, TRB Transfer Length 필드는현재멈춘상태의 EDTLA 값을담게된다. 10.2.6.9 Set TR Dequeue Pointer Set TR Dequeue Pointer 명령어는엔드포인트혹은스트림 Context 의 TR Dequeue Pointer 필드의 값을변경하는명령어이다. 반드시해당하는엔드포인트의상태는 Stopped 된상태가되어야이 명령어를실행할수있다. 디바이스슬롯의상태는 Default, Addressed, Configured 상태여야한다. 표 10-13 Set TR Dequeue Pointer 명령처리방식 시스템소프트웨어가준비하는방법 xhc 가반응하는방법 TRB Type = Set TR Dequeue Pointer 명령 Endpoint ID = 대상엔드포인트만일 MaxPStreams 값이 0 이아닌경우라면, Stream ID = 대상스트림 ID Slot ID = 디바이스의슬롯 ID New TR Dequeue Pointer = 새롭게변경하려는 TR Dequeue Pointer값 Dequeue Cycle State(DCS) = TR Dequeue Pointer 필드가가리키는 TRB를위한 xhci CCS 플래그상태값나머지 TRB 필드 = 0 Cycle 비트 = Command Ring 의 PCS 플래그 [Host Controller Doorbell] DB Target = Host Controller Command Command Completion Event -> Event Ring Command TRB Pointer = Set TR Dequeue Pointer Command TRB 나머지 TRB 필드 = 0 Slot ID = 디바이스슬롯 ID
Cycle 비트 = Event Ring의 PCS 플래그 [ 성공 ] 만일스트림 ID가사용되는경우, 새로운 TR Dequeue Pointer값이대상스트림 Context에반영된다. DCS값이대상스트림 Context의 Dequeue Cycle State값으로반영된다. 스트림 ID가사용되지않는경우, 새로운 TR Dequeue Pointer값이대상엔드포인트 Context 에반영된다. DCS값이대상엔드포인트 Context의 Dequeue Cycle State(DCS) 값으로반영된다. Completion Code = 성공 [ 실패 ] Completion Code = Error 상태코드 10.2.6.10 Reset Device Reset Device 명령어는 xhc 에게디바이스슬롯에연결된디바이스가리셋되었다는사실을알리는 명령어이다. 이명령어에의해, xhc 는슬롯의상태를 Default 상태로전환하고, USB Device Address 필드값을 0 으로사용한다. 디바이스슬롯의상태는다음과같이설정된다. * 디바이스를위한모든트랜잭션이취소된다. * 슬롯의상태가 Default 상태로전환된다. * Slot Context 의 Context Entries 필드값이 1 로기록된다. * Slot Context 의 USB Device Address 필드값이 0 로기록된다. 또한, 이명령어는디폴트엔드포인트 Context 를제외한나머지모든엔드포인트 Context 의상태 를 Disabled 로전환하여사용금지시킨다. 시스템소프트웨어는이명령어를사용하기이전에반드 시사용중이던모든엔드포인트의사용이멈춘것을확인해야한다.
디폴트엔드포인트를제외한나머지모든엔드포인트는다음과같이설정된다. * 패킷전송등을하는모든 USB 행동이멈춘다. * 엔드포인트의 Doorbell 기능이꺼진다. * Event Ring 에대기중인사건들이모두취소된다. * 주기적인전송을위해서사용되는대역폭예약이해제된다. * 엔드포인트를위해서사용되던내부적인자원이해제된다. 표 10-14 Reset Device 명령처리방식 시스템소프트웨어가준비하는방법 xhc 가반응하는방법 TRB Type = Reset Device 명령 Slot ID = 디바이스의슬롯 ID 나머지 TRB 필드 = 0 Cycle 비트 = Command Ring 의 PCS 플래그 [Host Controller Doorbell] DB Target = Host Controller Command Command Completion Event -> Event Ring Command TRB Pointer = Reset Device Command TRB 나머지 TRB 필드 = 0 Slot ID = 디바이스슬롯 ID Cycle 비트 = Event Ring의 PCS 플래그 [ 성공 ] Completion Code = 성공 [ 실패 ] Completion Code = Error 상태코드 10.2.6.11 Force Event Force Event 명령어는가상머쉰관리자 (Virtual Machine Manager) 와관련된명령으로써, 실제 USB 디바이스가연결된것처럼시뮬레이션하는용도로사용하는명령이다. 본책의범위를벗어나므로 생략하도록한다. 사용은선택적이다. 10.2.6.12 Negotiate Bandwidth
xhc 로하여금주기적인통신을필요로하는엔드포인트를가진모든디바이스에게 Bandwidth Request Event 사건을알려주는용도로사용하는명령어이다. 사용은선택적이다. 10.2.6.13 Set Latency Tolerance Value 시스템소프트웨어가 Best Effort Latency Tolerance(BELT) 값을 xhc 에게제공하는용도로사용된다. BELT 값은디바이스가견딜수있는최대지연시간값으로링크의전원관리를효과적이고적극적 으로수행할수있는방법을제공한다. 관련된내용은 1 부를참고한다. 사용은선택적이다. 10.2.6.14 Get Port Bandwidth Get Port Bandwidth 명령어는루트허브혹은외장허브의각각의다운스트림포트 (Downstream Port) 의사용가능한대역폭퍼센트값을구하는목적으로사용된다. 이값은주기적인전송을필요 로하는엔드포인트를위해서사용된다. 이명령어는 Port Bandwidth Context 자료구조를 xhc 에게제공한다. xhc 는이곳에각각의포트를 위해서사용가능한대역폭정보를담아준다. 표 10-15 Get Port Bandwidth 명령처리방식 시스템소프트웨어가준비하는방법 xhc 가반응하는방법 TRB Type = Get Port Bandwidth 명령 Dev Speed = 대상디바이스의속도 Hub Slot ID = 해당하는디바이스가연결된허브슬롯ID Port Bandwidth Context Pointer = Port Bandwidth Context 자료구조의주소나머지 TRB 필드 = 0 Cycle 비트 = Command Ring 의 PCS 플래그 [Host Controller Doorbell] DB Target = Host Controller Command Command Completion Event -> Event Ring Command TRB Pointer = Get Port Bandwidth Command TRB 나머지 TRB 필드 = 0 Slot ID = 0
Cycle 비트 = Event Ring의 PCS 플래그 [ 성공 ] Completion Code = 성공 [ 실패 ] Completion Code = Error 상태코드 표 10-16 Port Bandwidth Context 자료구조의구조 31 24 23 16 15 8 7 0 Port 3 Port 2 Port 1 Port 0 03 00H Port 7 Port 6 Port 5 Port 4 07 04H. Port n Port n-1 Port n-2 Port n-3. 10.2.6.15 Force Header Force Header 명령어는 USB3 에서사용되는 TP(Transaction Packet), LMP(Link Management Packet) 등을만들어서디바이스에게전송하는목적으로사용된다. 디버그용도로사용될수있다. 표 10-17 Force Header 명령처리방식 시스템소프트웨어가준비하는방법 xhc 가반응하는방법 TRB Type = Force Header 명령 Root Hub Port Number = 루트허브포트번호 Packet Type = Super Speed 패킷의유형 Header Info = USB3 에서정의하는패킷데이타구조나머지 TRB 필드 = 0 Cycle 비트 = Command Ring 의 PCS 플래그 [Host Controller Doorbell] DB Target = Host Controller Command Command Completion Event -> Event Ring Command TRB Pointer = Force Header Command TRB 나머지 TRB 필드 = 0 Slot ID = 0 Cycle 비트 = Event Ring의 PCS 플래그 [ 성공 ] Completion Code = 성공
[ 실패 ] Completion Code = Error 상태코드 10.2.7 Doorbells( 초인종 ) xhc 는 256 개의 32 비트 Doorbell 레지스터를지원하고있다. 이것은 Device Slot ID 인덱스를사용 해서찾을수있는 Memory Mapped IO 공간에존재한다. Doorbell 레지스터배열의기준주소는 xhci Capability 레지스터그룹의 DBOFF(Doorbell Offset) 레지 스터를통해서찾을수있다. 그림 10-18 Doorbell 레지스터 비트설명 7:0 DB Target RW. Doorbell Target. 값설명 0 사용안함 1 디폴트엔드포인트 Enqueue Pointer Update 2 엔드포인트 #1 OUT Enqueue Pointer Update 3 엔드포인트 #1 IN Enqueue Pointer Update 4 엔드포인트 #2 OUT Enqueue Pointer Update 5 엔드포인트 #2 IN Enqueue Pointer Update 30 엔드포인트 #15 OUT Enqueue Pointer Update 31 엔드포인트 #15 IN Enqueue Pointer Update 15:8 사용안함 31:16 DB Stream ID RW. Doorbell Stream ID 스트림프로토콜을사용하는경우, Doorbell 초인종을울리는목적이 Stream ID때문인경우에사용함 Doorbell 레지스터배열이담고있는각각의 Doorbell 레지스터는저마다 DB Target 필드를가지 고있다. 이것은시스템소프트웨어가 Doorbell 레지스터를사용해서초인종을누를때 (ring), 구 체적인이유를기록하는필드이다. 설명을쉽게하기위해서 Doorbell 레지스터의초인종을누르
는작업을 Doorbell 레지스터를기록한다 라고부르도록하겠다. Doorbell 레지스터 #0 은호스트컨트롤러를위해서할당되어있다. 이레지스터의 DB Target 필 드값은 0 (Host Controller Command) 값만사용하도록되어있다. 나머지 Doorbell 레지스터 #1 - #255 는각각 Device Context Doorbell 레지스터로사용된다. 이들은각각 1:1 로매핑된다. 시스템소프트웨어는엔드포인트 / 스트림 Context 의 Transfer Ring 위 로새로운 TRB(Transfer Request Block) 를추가하고 Doorbell 레지스터를기록한다. 주의할점은디바이스슬롯의상태가 Disabled 상태일때는 Doorbell 레지스터를기록하지말아야 한다. Doorbell 레지스터를읽으면값은 0 이읽혀진다. 10.2.8 엔드포인트 (Endpoint) USB 디바이스는총 31 개, 즉하나의 Control 엔드포인트와 15 개의 IN, 15 개의 OUT 엔드포인트를 가지고있다. 그림 10-19 디바이스 Context 와엔드포인트 Context
10.2.8.1 엔드포인트 Context 초기화 디폴트엔드포인트, 벌크엔드포인트, 인터럽트엔드포인트그리고등시성엔드포인트를위한 Context 를초기화하는방법을살펴보도록한다. 10.2.8.1.1 디폴트엔드포인트 원칙적으로 USB 디바이스는복수개의컨트롤엔드포인트를가질수있다. 하지만, 실전에서는디 폴트엔드포인트만컨트롤엔드포인트로사용된다. 엔드포인트 Context 의내용은다음과같은값으로준비한다. EP Type : Control Max Packet Size : USB2, Device Descriptor 의 bmaxpacketsize0
USB3, 2 ^ (Device Descriptor 의 bmaxpacketsize0) TR Dequeue Pointer : 미리할당한 Transfer Ring 의첫번째세그먼트주소 Dequeue Cycle State(DCS) : 값 1. TRB 의 Cycle 비트를반영한다. 10.2.8.1.2 벌크엔드포인트 EP Type : Bulk IN 또는 Bulk OUT Max Packet Size : Endpoint Descriptor 의 wmaxpacketsize Max Burst Size : USB3, Super Speed Endpoint Companion Descriptor 의 bmaxburst [ 스트림이사용되는경우 ] Primary Stream Array 를할당하고초기화한다. MaxPStreams : Primary Stream Array 의크기 TR Dequeue Pointer : Primary Stream Array 의시작주소 HID : Host Initiated Move Data 기능을허용할것인가여부. 보통은값 1 을사용한다. LSA : Stream Array 의형태를선형 ( 1 ) 으로사용할것인지, Secondary 를사용 ( 0 ) 할것인지를나타낸 다. [ 스트림이사용되지않는경우 ] MaxPStreams : 0 TR Dequeue Pointer : 미리할당한 Transfer Ring 의첫번째세그먼트주소 Dequeue Cycle State(DCS) : 값 1. TRB 의 Cycle 비트를반영한다. 10.2.8.1.3 등시성또는인터럽트엔드포인트 등시성또는인터럽트엔드포인트는주기적전송에사용되는엔드포인트이다.
EP Type : 등시성 (Isoch) IN, 등시성 OUT, 인터럽트 (Interrupt) IN 또는인터럽트 OUT Max Packet Size : Endpoint Descriptor 의 wmaxpacketsize & 07FFh Max Burst Size : Super Speed Endpoint Companion Descriptor 의 bmaxburst 또는 (Endpoint Descriptor 의 wmaxpacketsize & 1800h) >> 11 Mult : Super Speed Endpoint Companion Descriptor 의 bmattributes(mult) 값. 인터럽트엔드포인트 에서는사용되지않는다. TR Dequeue Pointer : Primary Stream Array 의시작주소 Dequeue Cycle State(DCS) : 값 1. TRB 의 Cycle 비트를반영한다. 10.2.8.2 엔드포인트 Context State 엔드포인트 Context 의상태는다양한사건에따라서변한다. 엔드포인트 Context 의상태는총 5 가지상태가존재한다. Disabled, Running, Error, Stopped, Halted 상태이다. 1) Address Device 명령어는디폴트엔드포인트의상태를 Disabled 상태에서 Running 상태로전 환한다. 2) Configure Endpoint 명령어 (Add= 1, Drop= 0 ) 는디폴트엔드포인트를제외하고다른엔드포인 트의상태를 Disable 상태에서 Running 상태로전환한다. 3) Configure Endpoint 명령어 (Add= 0, Drop= 1 ) 또는 Reset Device 명령어는디폴트엔드포인트 의상태를 Stopped 상태에서 Running 상태로전환한다. 다른엔드포인트의상태를 Disabled 상태 로전환한다. 4) Disable Slot 명령어는디바이스슬롯의모든엔드포인트의상태를 Disabled 상태로전환한다. 5) Running 상태에서, Set TR Dequeue Pointer 명령어는비활성화된스트림엔드포인트를위한 Transfer Ring 으로만사용될수있다. 6) Configure Endpoint 명령어 (Add= 1, Drop= 0 ) 는디폴트엔드포인트를제외하고다른엔드포인 트의상태를 Stopped 상태에서 Running 상태로전환한다. 7) Stopped 상태에서, Set TR Dequeue Pointer 명령어는 Doorbell 을울리기전에비활성화된스트 림엔드포인트를위한 Transfer Ring 의시작위치를변경하는데사용될수있다.
그림 10-20 엔드포인트상태다이아그램 10.2.9 TRB(Transfer Request Block) Ring TRB Ring 은환형큐 (Queue) 를정의하고있는자료구조이다. 큐에넣는항목을 TRB 라고부른다. TRB 를큐에넣는대상을생산자 (Producer), 큐에서제거하는대상을소비자 (Comsumer) 라고부른 다. TRB Ring 은 3 가지형태가존재한다. Transfer Ring : USB 디바이스와데이터를송, 수신하는주목적을가지고있는환형큐로서, 시스 템소프트웨어가생산자, xhc 가소비자의역할을수행한다. 디바이스슬롯내부의엔드포인트 Context 혹은스트림 Context 마다하나씩의 Ring 을가질수있다. Command Ring : xhc 호스트컨트롤러는하나의 Command Ring 을지원한다. USB 디바이스의열 거과정에참여하는목적으로사용되는환형큐로서, 시스템소프트웨어가생산자, xhc 가소비자의 역할을수행한다. Operational 레지스터그룹에포함된 Command Ring Control 레지스터에의해서
관리된다. Event Ring : xhc 가 Transfer Ring 혹은 Command Ring 에접수된 TRB 를해석한결과를담아주거 나새로운사건을담아주는용도로환형큐로서, xhc 가생산자, 시스템소프트웨어가소비자의역 할을수행한다. Runtime 레지스터에의해서관리된다. 그림 10-21 TRB Ring 의유형 10.2.9.1 Transfer Descriptor(TD) 하나의 TD 는하나혹은복수개의 TRB 로구성된다. 복수개의 TRB 가하나의 TD 를구성하는경우 TRB 속에 Chain(C) 비트를사용한다. 특별한 TD 로서, Zero Length USB Transaction 을발생시키고자하는경우, 하나의 TRB 를가지는 TD 를구성한다. TRB 의 Transfer Length 값은 0 을가진다.
TRB Ring을유지하는포인터 (Enqueue Pointer, Dequeue Pointer) 가움직이는원칙은 TRB단위이지만, 특별한상황에서 TD단위로움직일수있다. 이런상황은전송중에러가발생하는 TRB가있거나, 기대보다짧은데이터만디바이스로부터전송되는 Short Packet 상황이발생하는경우이다. 물론전송이정상적으로완료된경우도여기에포함된다. 이런경우, 기대보다짦은데이터가수신됐지만, 호스트입장에서는하나의기대하는 TD를완료해야하는상황이기때문에, TD 자체를제거한다 ( 이말은 TD를구성하는복수개의 TRB가있다면, 한번에이들모두가제거된다는뜻 ). 10.2.9.2 Transfer Ring, Command Ring 관리 그림 10-22 Transfer Ring 의운영방식 [ 그림 10-22] 를보자. TRB 를만들어내는생산자 ( 시스템소프트웨어 ) 와 TRB 를소비하는소비자 (xhc) 는각각자신의내 부에 Enqueue Pointer 와 Dequeue Pointer 를유지하고있어서, Transfer Ring 속으로새로운 TRB 를 기입 (Enqueue Pointer ) 하거나끄집어 (Dequeue Pointer) 내는용도로사용하고있다. 그리고각각 Cycle State 비트를유지하고있다. 생산자가가진 Cycle State 비트를 PCS(Producer
Cycle State) 비트라고부르고, 소비자가가진 Cycle State 비트를 CCS(Consumer Cycle State) 비트 라고부른다. Transfer Ring 에새로운 TRB 를기입하려는생산자는 TRB 를기입할때, 함께 PCS 값을기입한다. Transfer Ring 으로부터 TRB 를끄집어내는소비자는끄집어낸 TRB 와함께존재하는 Cycle 비트 의값을읽어서, 자신이가진 CCS 값과비교한다. 이값이동일한경우에만 TRB 를해석한다. Transfer Ring 에기입되는 TRB중에서특별한목적이부가된종류의것이있다. 이것이 Link TRB 이다. Link TRB는불가피하게현재의연속적인메모리로더이상 TRB를담을수없거나, 환형큐형태로동작하도록하기위해서현재메모리의시작부분으로다음포인터를연결시키는목적으로가지고있다. Link TRB는 Toggle Cycle 비트를가지고있다. 이비트의값이 1 이면, 생산자와소비자가 Link TRB를참조할때는자신의 Cycle 비트의값을토글 (1의보수 ) 해야한다. 이와같이토글된자신의 Cycle 비트값은이후생산자의역할로인해, TRB를 Transfer Ring 에넣을때, 함께기록된다는특징으로인해, 소비자가 Transfer Ring으로부터 TRB를끄집어낼때, Transfer Ring 의상태가비어있는상태임으로알수있도록돕는다. 이것은자연스럽게 Dequeue Pointer 로부터시작해서계속해서포인터를증가시켜나가다보면, 각각의포인터에포함된 Cycle 비트의값이변하는상황을만나게될것이고, 이곳이마지막 Dequeue Pointer로사용된다는의미가되기때문이다. Transfer Ring 을위해서사용하는소비자의 CCS 플래그값은 Endpoint Context DCS 필드값으로결 정된다. Command Ring 을위해서사용하는소비자의 CCS 플래그값은 Command Ring Control 레지스터 RCS 필드값으로결정된다. Event Ring 을위해서사용하는소비자의 CCS 플래그값은 1 로초기화된다. Transfer Ring 에포함되는 TD 는하나혹은복수개의 TRB 로구성되지만, Command Ring 과 Event Ring 에포함되는 TD 는하나의 TRB 가하나의 TD 역할을수행한다. Transfer Ring, Command Ring 을통해서요청된 TRB 는처리가완료되면, Event Ring 을통해서시 스템소프트웨어에게보고된다. 이때, Event Ring 을통해서 Transfer Ring, Command Ring 각각의 수정된 Dequeue Pointer 주소가보고된다. 이값을시스템소프트웨어가사용해야한다. Transfer Ring 으로새로운 TRB 가기입되면, 시스템소프트웨어는해당하는디바이스슬롯의 Doorbell 레지스터를기록한다. Command Ring 으로새로운 TRB 가기입되면, 시스템소프트웨어는 Host Controller Doorbell 레지
스터를기록한다. 10.2.9.3 Event Ring 관리 xhc Runtime 레지스터에포함된 Event Ring Segment Table 주소는 Event Ring 세그먼트를찾아 가는기준정보를제공하고있다. 그림 10-23 Event Ring 의운영방식 [ 그림 10-23] 을보면, Event Ring Dequeue Pointer(ERDP) 레지스터가존재한다. 이것은현재 Event Ring의 Dequeue Pointer를가리키는용도로사용된다. Event Ring의소비자는시스템소프트웨어이기때문에소프트웨어가 Event Ring으로부터 TRB를끄집어낸뒤에 Dequeue Pointer 레지스터의값을변경 ( 증가 ) 해주어야한다.
10.2.10 TRB(Transfer Request Block) TRB 구조체는 TRB Ring 에기입되는 16 바이트로준비되는핵심내용이다. 그림 10-24 TRB 의구성요소 [ 그림 10-24] 를보면, TRB 가크게 3 가지 (Parameter, Status, Control) 로구분된다는것을알수있다. TRB 의종류에따라서이들 3 가지필드의값들이달라진다. 10.2.10.1 Transfer TRBs Transfer Ring 에접수되는기본적인요청단위를 Transfer Descriptor(TD) 라고부른다. 하나의 TD 는 하나혹은복수개의 Transfer TRB 로구성된다. 10.2.10.1.1 Normal TRB Normal TRB 는벌크, 인터럽트전송등에사용되고 Scatter/Gather 동작을지원하는 TRB 이다. 그림 10-25 Normal TRB 의구성요소
비트설명 63:0 Data Buffer Pointer Hi/Lo. TRB의데이터버퍼를가리키는 64비트주소. IDT 필드의값이 1 인경우, 이곳은버퍼의주소가아니라 8바이트의임시데이타공간으로사용될수있다 80:64 TRB Transfer Length. xhc가처리하는데이터바이트크기 85:81 TD Size. 현재 TD입장에서 TRB를해석한뒤, 남아있는이어지는몇개의 TRB를해석해야하는지를알려준다. 최대값 31 이므로, 31이상의 TRB를사용해야한다면 31 값을사용해야한다. 95:86 Interrupter Target. 현재 TRB가처리되는결과로발생하는이벤트 (Event) 가발생시킬인터럽터인덱스를지정한다 96 Cycle bit. Transfer Ring 의 Enqueue Pointer를찾는용도로사용된다 97 Evaluate Next TRB(ENT). 이필드의값이 1 이면 xhc는엔드포인트상태를변경하지않고이어지는다음 TRB를처리한다. 98 Interrupt on Short Packet(ISP). 짧은패킷이전송되면인터럽트를발생시킬것인지여부를알린다 99 No Snoop(NS). 기본적으로값 0 을사용한다. PCIe Transaction의 No Snoop 비트의값을결정한다. 100 Chain bit. 현재 TRB가하나의 TD를구성하는일부 TRB임을알림. 101 Interrupt on Completion(IOC). 현재 TRB가처리완료되면인터럽트를발생시킬것인것여부를알린다. 속도문제로보통 TD의마지막 TRB만이기능을사용한다 102 Immediate Data(IDT). 이필드의값이 1 이면, Data Buffer Pointer 필드 64비트가주소를나타내는목적이아닌, 8바이트변수의역할로바뀐다. 104:103 사용안함 105 Block Event Interrupt(BEI). TRB 처리결과이벤트로인해서인터럽트가발생하지않도록막는다 111:106 TRB Type. Normal TRB 유형 (1) 127:112 사용안함 10.2.10.1.2 Control TRBs 제어전송에사용되는 TRB 는, 제어전송이 3 가지단계를사용하기때문에각각의단계에맞는 TRB 가존재한다. 10.2.10.1.2.1 Setup Stage TRB 컨트롤전송 (TD) 에서사용하는 8 바이트셋업명령어를전송하는목적으로사용하는 TRB 를의미한
다. 그림 10-26 Setup Stage TRB 의구성요소 비트 설명 7:0 bmrequesttype. USB2, USB3 에서정의하는셋업명령어의 bmrequest Type값 15:8 brequest. USB2, USB3 에서정의하는셋업명령어의 brequest값 31:16 wvalue. USB2, USB3 에서정의하는셋업명령어의 wvalue값 47:32 windex. USB2, USB3 에서정의하는셋업명령어의 windex값 63:48 wlength. USB2, USB3 에서정의하는셋업명령어의 wlength값 80:64 TRB Transfer Length. xhc가처리하는데이터바이트크기 85:81 사용안함 95:86 Interrupter Target. 현재 TRB가처리되는결과로발생하는이벤트 (Event) 가발생시킬 인터럽터인덱스를지정한다 96 Cycle bit. Transfer Ring 의 Enqueue Pointer를찾는용도로사용된다 100:97 사용안함 101 Interrupt on Completion(IOC). 현재 TRB가처리완료되면인터럽트를발생시킬것인 것여부를알린다. 속도문제로보통 TD의마지막 TRB만이기능을사용한다 102 Immediate Data(IDT). 이필드의값이 1 이면, Data Buffer Pointer 필드 64비트가주 소를나타내는목적이아닌, 8바이트변수의역할로바뀐다. 104:103 사용안함 105 Block Event Interrupt(BEI). TRB 처리결과이벤트로인해서인터럽트가발생하지않도 록막는다 111:106 TRB Type. Setup Stage TRB 유형 (2) 113:112 TRT. Transfer Type. 값 의미 0 Data 단계가아님 1 사용안함 2 OUT Data 단계 3 IN Data 단계 127:114 사용안함
10.2.10.1.2.2 Data Stage TRB 제어전송에서사용되는데이터전송단계를위한 TRB 를정의한다. 그림 10-27 Data Stage TRB 의구성요소 비트설명 63:0 Data Buffer Pointer Hi/Lo. TRB의데이터버퍼를가리키는 64비트주소. IDT 필드의값이 1 인경우, 이곳은버퍼의주소가아니라 8바이트의임시데이타공간으로사용될수있다 80:64 TRB Transfer Length. xhc가처리하는데이터바이트크기 85:81 TD Size. 현재 TD입장에서 TRB를해석한뒤, 남아있는이어지는몇개의 TRB를해석해야하는지를알려준다. 최대값 31 이므로, 31이상의 TRB를사용해야한다면 31 값을사용해야한다. 95:86 Interrupter Target. 현재 TRB가처리되는결과로발생하는이벤트 (Event) 가발생시킬인터럽터인덱스를지정한다 96 Cycle bit. Transfer Ring 의 Enqueue Pointer를찾는용도로사용된다 97 Evaluate Next TRB(ENT). 이필드의값이 1 이면 xhc는엔드포인트상태를변경하지않고이어지는다음 TRB를처리한다. 98 Interrupt on Short Packet(ISP). 짧은패킷이전송되면인터럽트를발생시킬것인지여부를알린다 99 No Snoop(NS). 기본적으로값 0 을사용한다. PCIe Transaction의 No Snoop 비트의값을결정한다. 100 Chain bit. 현재 TRB가하나의 TD를구성하는일부 TRB임을알림. 101 Interrupt on Completion(IOC). 현재 TRB가처리완료되면인터럽트를발생시킬것인것여부를알린다. 속도문제로보통 TD의마지막 TRB만이기능을사용한다 102 Immediate Data(IDT). 이필드의값이 1 이면, Data Buffer Pointer 필드 64비트가주소를나타내는목적이아닌, 8바이트변수의역할로바뀐다. 104:103 사용안함 105 Block Event Interrupt(BEI). TRB 처리결과이벤트로인해서인터럽트가발생하지않도록막는다 111:106 TRB Type. Data Stage TRB 유형 (3)
112 Direction(DIR). 데이터통신의방향을결정함. 값 0 OUT, 값 1 IN 127:113 사용안함 10.2.10.1.2.3 Status Stage TRB 제어전송에서사용되는 Status 단계를위한 TRB 를준비한다. 그림 10-28 Status Stage TRB 의구성요소 비트 설명 85:0 사용안함 95:86 Interrupter Target. 현재 TRB가처리되는결과로발생하는이벤트 (Event) 가발생시킬 인터럽터인덱스를지정한다 96 Cycle bit. Transfer Ring 의 Enqueue Pointer를찾는용도로사용된다 97 Evaluate Next TRB(ENT). 이필드의값이 1 이면 xhc는엔드포인트상태를변경하지 않고이어지는다음 TRB를처리한다. 99:98 사용안함 100 Chain bit. 현재 TRB가하나의 TD를구성하는일부 TRB임을알림. 101 Interrupt on Completion(IOC). 현재 TRB가처리완료되면인터럽트를발생시킬것인 것여부를알린다. 속도문제로보통 TD의마지막 TRB만이기능을사용한다 105:102 사용안함 111:106 TRB Type. Status Stage TRB 유형 (4) 112 Direction(DIR). Status 단계의통신방향을결정함. 값 0 OUT, 값 1 IN 127:113 사용안함 10.2.10.1.3 Isoch TRB 지정된프레임시간에맞추어서등시성데이터통신을하고자할때사용하는 TRB 구조이다. 그림 10-28 Isoch TRB 의구성요소
비트설명 63:0 Data Buffer Pointer Hi/Lo. TRB의데이터버퍼를가리키는 64비트주소. IDT 필드의값이 1 인경우, 이곳은버퍼의주소가아니라 8바이트의임시데이타공간으로사용될수있다 80:64 TRB Transfer Length. xhc가처리하는데이터바이트크기 85:81 TD Size. 현재 TD입장에서 TRB를해석한뒤, 남아있는이어지는몇개의 TRB를해석해야하는지를알려준다. 최대값 31 이므로, 31이상의 TRB를사용해야한다면 31 값을사용해야한다. 95:86 Interrupter Target. 현재 TRB가처리되는결과로발생하는이벤트 (Event) 가발생시킬인터럽터인덱스를지정한다 96 Cycle bit. Transfer Ring 의 Enqueue Pointer를찾는용도로사용된다 97 Evaluate Next TRB(ENT). 이필드의값이 1 이면 xhc는엔드포인트상태를변경하지않고이어지는다음 TRB를처리한다. 98 Interrupt on Short Packet(ISP). 짧은패킷이전송되면인터럽트를발생시킬것인지여부를알린다 99 No Snoop(NS). 기본적으로값 0 을사용한다. PCIe Transaction의 No Snoop 비트의값을결정한다. 100 Chain bit. 현재 TRB가하나의 TD를구성하는일부 TRB임을알림. 101 Interrupt on Completion(IOC). 현재 TRB가처리완료되면인터럽트를발생시킬것인것여부를알린다. 속도문제로보통 TD의마지막 TRB만이기능을사용한다 102 Immediate Data(IDT). 이필드의값이 1 이면, Data Buffer Pointer 필드 64비트가주소를나타내는목적이아닌, 8바이트변수의역할로바뀐다. 104:103 Transfer Burst Count(TBC). 현재의 TD를전송하는데소요되는 Burst 개수 - 1 105 Block Event Interrupt(BEI). TRB 처리결과이벤트로인해서인터럽트가발생하지않도록막는다 111:106 TRB Type. Isoch TRB 유형 (5) 115:112 Transfer Last Block Packet Count(TLBPC). 현재 TD의마지막 Burst에사용되는패킷수 1 126:116 Frame ID. ms 단위. [ 표 10-18] MFINDEX 레지스터의비트 13:3을기준으로사용한다. 전송을시작하고싶은시간정보를제공한다. 127 Start Isoch As Soon As Possible(SIA). Frame ID를고려하지않고가능하면빨리전송하도록요청한다.
표 10-18 xhc Runtime Register 와 MFINDEX 오프셋 약어 레지스터이름 0000h MFINDEX Microframe Index 001Fh:0004h 사용안함 0020h IR0 Interrupter Register Set 0... 8000h IR1023 Interrupter Register Set 1023 등시성전송에서사용하는 TD 를위한 Frame ID 는다음과같은규칙을가지고있다. ESIT(Endpoint Service Interval Time) 값에따라서가질수있는 Frame ID 규칙이정해져있다. * ESIT 값이 1ms 이상의경우, 이어지는등시성전송 (TD) 의 Service Interval 시간이 1ms 보다큰경우에는, ESIT 시간의배수값이 Frame ID 값으로사용이가능하다. 예를들어, ESIT 값이 1ms 이면, Frame ID 는다음과같이사용될수있다. 1, 2, 3, 4, 5, ESIT 값이 2ms 이면, Frame ID 는다음과같이사용될수있다. 2, 4, 6, ESIT 값이 4ms 이면, Frame ID 는다음과같이사용될수있다. 4, 8, 12, 유의할점은, Frame ID 가 4, 8, 12, 형태로가질수있다는것은정확하게그시간에패킷전송을 시작한다는뜻이아니라, 그사이에전송을한다는뜻이다. Frame ID 가 4, 8, 12, 의경우를보면, 전송은현재기준시간 Frame 으로부터, 4 Frame 시간부터 8 Frame 시간이되기이전에전송을시작한다는뜻이다.
* ESIT 값이 1ms 이하의경우, 이런경우 125us 의배수만가능하다. 이어지는등시성전송 (TD) 의 Service Interval 시간이 1ms 보다작은경우에는, ESIT 시간의배수값 의 ms 시간부분이 Frame ID 값으로사용이가능하다. 예를들어, ESIT 값이 125us 이면, Frame ID 는다음과같이사용될수있다. 시간정보를기준으로보면, 125us, 250us, 375us, 500us, 625us, 750us, 875us, 1000us, 1125us, Frame ID 로보면, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, ESIT 값이 250us 이면, Frame ID 는다음과같이사용될수있다. 시간정보를기준으로보면, 250us, 500us, 750us, 1000us, 1250us, Frame ID 로보면, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, ESIT 값이 500us 이면, Frame ID 는다음과같이사용될수있다. 시간정보를기준으로보면, 500us, 1000us, 1500us, Frame ID 로보면, 0, 1, 1, 2, 2, 처음시작만 0 이하나부족한상황이지만, 이어지는 1 부터는발견되는개수가규칙적이다. 10.2.10.2 Event TRBs Event Ring 에접수되는기본적인요청단위를 Event Descriptor(ED) 라고부른다. 하나의 ED 는하나 의 Event TRB 로구성된다. 10.2.10.2.1 Transfer Event TRB Transfer TRB 에대한결과로 xhc 는 Transfer Event TRB 를만들어서시스템소프트웨어에게알려 준다. 그림 10-29 Transfer Event TRB 의구성요소
비트 설명 63:0 TRB Buffer Pointer Hi/Lo. Transfer TRB를가리키는 64비트주소. Transfer Event TRB가만들어진이유를제공하는 Transfer TRB이다. ED 필드의값이 1 인경우, Event Data 의 64비트를담은변수로사용된다. 87:64 TRB Transfer Length. Transfer TRB가요구하는전송요청크기중에실제처리된크기 95:88 Completion Code. [ 표 10-19] 96 Cycle bit. Event Ring 의 Dequeue Pointer를찾는용도로사용된다 97 사용안함 98 ED. Event Data. TRB Pointer 영역 64비트가 Event Data의영역으로사용됨 105:99 사용안함 111:106 TRB Type. Transfer Event TRB 유형 (32) 116:112 Endpoint ID. 이벤트가관련된엔드포인트 Context의 ID 119:117 사용안함 127:120 Slot ID. 이벤트를발생시킨디바이스슬롯 ID 표 10-19 Completion Code 값정의 0 Invalid 1 Success 2 Data Buffer Error 3 Babble Detected Error 4 USB Transaction Error 5 TRB Error 6 Stall Error 7 Resource Error 8 Bandwidth Error 9 No Slots Availiable Error 10 Invalid Stream Type Error 11 Slot Not Enabled Error 12 Endpoint Not Enabled Error 13 Short Packet
14 Ring Underrun 15 Ring Overrun 16 VF Event Ring Full Error 17 Parameter Error 18 Bandwidth Overrun Error 19 Context State Error 20 No Ping Response Error 21 Event Ring Full Error 22 Incompatible Device Error 23 Missed Service Error 24 Command Ring Stopped 25 Command Aborted 26 Stopped 27 Stopped Length Invalid 28 Stopped Short Packet 29 Max Exit Latency Too Large Error 30 사용안함 31 Isoch Buffer Overrun 32 Event Lost Error 33 Undefined Error 34 Invalid Stream ID Error 35 Secondary Bandwidth Error 36 Split Transaction Error 10.2.10.2.2 Command Completion Event TRB Command TRB 에대한결과로 xhc 는 Command Completion Event TRB 를만들어서시스템소프 트웨어에게알려준다. 그림 10-30 Command Completion Event TRB 의구성요소
비트 설명 3:0 사용안함 63:4 Command TRB Pointer Hi/Lo. Command TRB를가리키는 64비트주소. Command Completion Event TRB가만들어진이유를제공하는 Command TRB이다. 87:64 Command Completion Parameter. 통상사용안함 95:88 Completion Code. [ 표 10-19] 96 Cycle bit. Event Ring 의 Dequeue Pointer를찾는용도로사용된다 105:97 사용안함 111:106 TRB Type. Command Completion Event TRB 유형 (33) 119:112 VF ID. Virtual Function ID. 가상머쉰환경에서이벤트를발생시킨가상 Function ID 127:120 Slot ID. 이벤트와관련있는디바이스슬롯 ID No Op, Set Latency Tolerance Value, Get Port Bandwidth, Force Event Command를 사용하는경우, Slot ID = 0 10.2.10.2.3 Port Status Change Event TRB 루트허브의포트에연결된디바이스가사용중일때, 해당하는포트의상태가변화를가질때해 당하는이벤트 TRB 가전달된다. 그림 10-31 Port Status Change Event TRB 의구성요소 비트 설명 23:0 사용안함 31:24 Port ID. 루트허브포트의포트 Number 63:32 사용안함 87:64 사용안함 95:88 Completion Code. [ 표 10-19] 96 Cycle bit. Event Ring 의 Dequeue Pointer를찾는용도로사용된다 105:97 사용안함 111:106 TRB Type. Port Status Change Event TRB 유형 (34) 127:112 사용안함
10.2.10.2.4 Bandwidth Request Event TRB xhc 가 Negotiate Bandwidth Command 를실행하면 Bandwidth Request Event TRB 를만들어서, 허 브에연결되어사용중인모든디바이스를대상으로 Event Ring 에넣는다. 그림 10-32 Bandwidth Request Event TRB 의구성요소 비트 설명 23:0 사용안함 63:24 사용안함 87:64 사용안함 95:88 Completion Code. [ 표 10-19] 96 Cycle bit. Event Ring 의 Dequeue Pointer를찾는용도로사용된다 105:97 사용안함 111:106 TRB Type. Bandwidth Request Event TRB 유형 (35) 119:112 사용안함 127:120 Slot ID. 해당하는이벤트가전달되는대상의디바이스슬롯 ID 10.2.10.2.5 Doorbell Event TRB 가상머쉰환경에서사용하는이벤트. 이책의범위를벗어나기때문에생략한다. 10.2.10.2.6 Host Controller Event TRB 호스트컨트롤러 (xhc) 의상태변화를알리기위해서사용되는 TRB 이다. 그림 10-33 Host Controller Event TRB 의구성요소
비트 설명 23:0 사용안함 63:24 사용안함 87:64 사용안함 95:88 Completion Code. [ 표 10-19] 96 Cycle bit. Event Ring 의 Dequeue Pointer를찾는용도로사용된다 105:97 사용안함 111:106 TRB Type. Host Controller Event TRB 유형 (37) 127:112 사용안함 10.2.10.2.7 Device Notification Event TRB 그림 10-34 Device Notification Event TRB 의구성요소 비트 설명 3:0 사용안함 7:4 Notification Type. USB3 Device Notification TP의 Notification Type값 63:8 Device Notification Data Hi/Lo. USB3 Device Notification TP Data값 87:64 사용안함 95:88 Completion Code. [ 표 10-19] 96 Cycle bit. Event Ring 의 Dequeue Pointer를찾는용도로사용된다 105:97 사용안함 111:106 TRB Type. Device Notification Event TRB 유형 (38) 119:112 사용안함 127:120 Slot ID. Device Notification Event 를발생시킨디바이스슬롯 ID 10.2.10.2.8 MFINDEX Wrap Event TRB
MFINDEX 레지스터의값이최대값 (3FFFh) 이되어서, 다시처음값 (0) 으로되돌아간다는의미로시 스템소프트웨어에게전달하기위해서만들어지는 Event TRB 이다. 그림 10-35 MFINDEX Wrap Event TRB 의구성요소 비트 설명 23:0 사용안함 63:24 사용안함 87:64 사용안함 95:88 Completion Code. [ 표 10-19] 96 Cycle bit. Event Ring 의 Dequeue Pointer를찾는용도로사용된다 105:97 사용안함 111:106 TRB Type. MFINDEX Wrap Event TRB 유형 (39) 127:112 사용안함 10.2.10.3 Command TRBs Command Ring 에접수되는기본적인요청단위를 Command Descriptor(CD) 라고부른다. 하나의 CD 는하나의 Command TRB 로구성된다. 10.2.10.3.1 No Op Command TRB Command Ring 의동작을확인하는목적으로사용하는명령어이다. xhc 는해당하는명령을담은 TRB 를 Command Ring 에서끄집어낸뒤, 별다른해석없이 Command Completion Event 를발생시 킨다. 테스트용도이다. 그림 10-36 No Op Command TRB 의구성요소
비트 설명 95:0 사용안함 96 Cycle bit. Command Ring 의 Enqueue Pointer를찾는용도로사용된다 105:97 사용안함 111:106 TRB Type. No Op Command TRB 유형 (8) 127:112 사용안함 10.2.10.3.2 Enable Slot Command TRB Enable Slot 명령어는사용가능한디바이스슬롯 (Device Slot) 을할당하는명령이다. 할당된디바이 스슬롯의상태가 Disable 상태에서 Enable 상태로전환한다. 그림 10-37 Enable Slot Command TRB 의구성요소 비트 설명 95:0 사용안함 96 Cycle bit. Command Ring 의 Enqueue Pointer를찾는용도로사용된다 105:97 사용안함 111:106 TRB Type. Enable Slot Command TRB 유형 (9) 116:112 Slot Type. (0) 127:117 사용안함 10.2.10.3.3 Disable Slot Command TRB
Disable Slot 명령어는사용하던디바이스슬롯의상태를 Disabled 상태로전환한다. 그림 10-38 Disable Slot Command TRB 의구성요소 비트 설명 95:0 사용안함 96 Cycle bit. Command Ring 의 Enqueue Pointer를찾는용도로사용된다 105:97 사용안함 111:106 TRB Type. Disable Slot Command TRB 유형 (10) 119:112 사용안함 127:120 Slot ID. 관련된디바이스슬롯 ID 10.2.10.3.4 Address Device Command TRB Address Device 명령어는디바이스슬롯에연결된디바이스의상태를 BSR(Block Set Address Request) 의값에따라서, Enabled 상태에서 Default 상태혹은 Addressed 상태로전환하거나, Default 상태에서 Addressed 상태로전환한다. 그림 10-39 Address Device Command TRB 의구성요소 비트 설명 3:0 사용안함 63:4 Input Context Pointer Hi/Lo. 수정하고자하는 Device Context(Input Context로서 ) 의 주소를지정한다 95:64 사용안함
96 Cycle bit. Command Ring 의 Enqueue Pointer를찾는용도로사용된다 104:97 사용안함 105 BSR. Block Set Address Request. 값 의미 0 실제 SET_ADDRESS 명령패킷을만는다 1 실제 SET_ADDRESS 명령패킷을만들지않는다 111:106 TRB Type. Address Device Command TRB 유형 (11) 119:112 사용안함 127:120 Slot ID. 관련된디바이스슬롯 ID 10.2.10.3.5 Configure Endpoint Command TRB Configure Endpoint 명령어는연결된디바이스를셋업 (Configuring) 하거나반대로 Deconfiguring 하는명령어이다. 파라미터로함께사용되는 DC(Deconfigure) 필드의값이 1 인경우 xhc 는연결 된디바이스를대상으로 Deconfiguring 작업을시도한다. 그림 10-40 Configure Endpoint Command TRB 의구성요소 비트 설명 3:0 사용안함 63:4 Input Context Pointer Hi/Lo. 수정하고자하는 Device Context(Input Context로서 ) 의 주소를지정한다 95:64 사용안함 96 Cycle bit. Command Ring 의 Enqueue Pointer를찾는용도로사용된다 104:97 사용안함 105 DC. Deconfigure 필드. 값 의미 0 Configuration, SET_CONFIGURATION 명령 (bconfigvalue = N,!=0) 1 Deconfiguration, SET_CONFIGURATION 명령 (bconfigvalue = 0) 111:106 TRB Type. Configure Endpoint Command TRB 유형 (12) 119:112 사용안함
127:120 Slot ID. 관련된디바이스슬롯 ID 10.2.10.3.6 Evaluate Context Command TRB Evaluate Context 명령어는 Device Context 의특정필드의값을변경하도록시스템소프트웨어가 호스트컨트롤러에게알리는명령이다. 그림 10-41 Evaluate Context Command TRB 의구성요소 비트 설명 3:0 사용안함 63:4 Input Context Pointer Hi/Lo. 수정하고자하는 Device Context(Input Context로서 ) 의 주소를지정한다 95:64 사용안함 96 Cycle bit. Command Ring 의 Enqueue Pointer를찾는용도로사용된다 105:97 사용안함 111:106 TRB Type. Evaluate Context Command TRB 유형 (13) 119:112 사용안함 127:120 Slot ID. 관련된디바이스슬롯 ID 10.2.10.3.7 Reset Endpoint Command TRB Reset Endpoint 명령어는엔드포인트 ( 스트림혹은 Transfer Ring 이정지함 ) 의상태가정지하거나 에러가발생하였을때, 해당하는상황을정상상태로회복하도록시스템소프트웨어가요청하는명 령이다. 그림 10-42 Reset Endpoint Command TRB 의구성요소
비트 설명 95:0 사용안함 96 Cycle bit. Command Ring 의 Enqueue Pointer를찾는용도로사용된다 104:97 사용안함 105 TSP, Transfer State Preserve. 엔드포인트의상태다이아그램상의현재상태를그대로 유지할지여부를결정 111:106 TRB Type. Reset Endpoint Command TRB 유형 (14) 116:112 Endpoint ID. 관련된엔드포인트 Context ID 119:117 사용안함 127:120 Slot ID. 관련된디바이스슬롯 ID 10.2.10.3.8 Stop Endpoint Command TRB Stop Endpoint 명령어는엔드포인트를위한동작상태를멈추도록요청하는명령이다. 이명령어가수행되기이전에처리중인전송이취소된다. SP 필드의값에따라서해당하는디바이스가 Suspend되도록할수있다. Endpoint 가중지되면, 관련된 Transfer Ring 의동작이중지된다. 이때, 시스템소프트웨어는보다우선순위가높은 TD(Transfer Descriptor) 를준비해서 Transfer Ring 의 Dequeue Pointer로옮길수있다. 그림 10-43 Stop Endpoint Command TRB 의구성요소 비트 설명 95:0 사용안함 96 Cycle bit. Command Ring 의 Enqueue Pointer를찾는용도로사용된다 105:97 사용안함 111:106 TRB Type. Reset Endpoint Command TRB 유형 (14)
116:112 Endpoint ID. 관련된엔드포인트 Context ID 118:117 사용안함 119 SP. Suspend. 해당하는디바이스의상태를 Suspend 시키도록요청한다. 127:120 Slot ID. 관련된디바이스슬롯 ID 10.2.10.3.9 Set TR Dequeue Pointer Command TRB Set TR Dequeue Pointer 명령어는엔드포인트혹은스트림 Context 의 TR Dequeue Pointer 필드의 값을변경하는명령어이다. 시스템소프트웨어는엔드포인트를위한 TR Ring 을처음사용할때, 반드시 Ring 의 Dequeue Pointer 초기값을지정해주어야한다. 그림 10-44 Set TR Dequeue Pointer Command TRB 의구성요소 비트 설명 0 Dequeue Cycle State(DCS). xhc가사용할 TR Ring의 Dequeue Pointer를위한 CCS값 3:1 Stream Context Type(SCT). 스트림 Context를지정하는지아니면엔드포인트 Context를지정하는지를결정함. 값 의미 0 Endpoint Context 1 Stream Context 63:4 New TR Dequeue Pointer Hi/Lo. 새로지정하는 TR Ring의 Dequeue Pointer 주소 79:64 사용안함 95:80 Stream ID. 스트림을위한 TR Ring을사용하는경우에지정함. 96 Cycle bit. Command Ring 의 Enqueue Pointer를찾는용도로사용된다 105:97 사용안함 111:106 TRB Type. Set TR Dequeue Pointer Command TRB 유형 (16) 116:112 Endpoint ID. 관련된엔드포인트 Context ID 119:117 사용안함 127:120 Slot ID. 관련된디바이스슬롯 ID 10.2.10.3.10 Reset Device Command TRB
Reset Device 명령어는 xhc 에게디바이스슬롯에연결된디바이스가리셋되었다는사실을알리는 명령어이다. 그림 10-45 Reset Device Command TRB 의구성요소 비트 설명 95:0 사용안함 96 Cycle bit. Command Ring 의 Enqueue Pointer를찾는용도로사용된다 105:97 사용안함 111:106 TRB Type. Reset Device Command TRB 유형 (17) 119:112 사용안함 127:120 Slot ID. 관련된디바이스슬롯 ID 10.2.10.3.11 Get Port Bandwidth Command TRB Get Port Bandwidth 명령어는루트허브혹은외장허브의각각의다운스트림포트 (Downstream Port) 의사용가능한대역폭퍼센트값을구하는목적으로사용된다. 이값은주기적인전송을필요 로하는엔드포인트를위해서사용된다. 그림 10-46 Get Port Bandwidth Command TRB 의구성요소 비트 설명 3:0 사용안함 63:4 Port Bandwidth Context Pointer Hi/Lo. [ 표 10-16] 참고 95:64 사용안함
96 Cycle bit. Command Ring 의 Enqueue Pointer를찾는용도로사용된다 105:97 사용안함 111:106 TRB Type. Get Port Bandwidth Command TRB 유형 (21) 115:112 Dev Speed. 대역폭을알고싶은관심속도를지정한다 값 의미 0 사용안함 1-15 Protocol Speed ID(PSI). 119:112 사용안함 127:120 Hub Slot ID. 해당하는디바이스가연결된허브의디바이스슬롯 ID Protocol Speed ID(PSI) 는 Lane 속도를정의하는 4 바이트 (DWORD) 의배열항목을찾는용도로사 용된다. 이값 PSID 는 1-15 까지사전에속도를지정할수있다. 기본적으로 1 4 까지는디폴트로다음과같은속도로지정되어있다. 표 10-20 사전에정의된디폴트 PSID(1-4) PSID 정의 Bit Rate 프로토콜 관련된 PSI DWORD 값 PLT PFD PSIE PSIM 1 Full Speed 12Mb/s USB 2.0 0 0 2 12 2 Low Speed 1.5Mb/s USB 2.0 0 0 1 1500 3 High Speed 480Mb/s USB 2.0 0 0 2 480 4 Super Speed 5Gb/s USB 3.0 0 1 3 5 10.2.10.3.12 Force Header Command TRB Force Header 명령어는 USB3 에서사용되는 TP(Transaction Packet), LMP(Link Management Packet) 등을만들어서디바이스에게전송하는목적으로사용된다. 그림 10-47 Force Header Command TRB 의구성요소
비트 설명 4:0 Type. USB3 에서정의하는 Packet Type 95:5 Header Info. Transaction Packet 또는 Link Management Packet 형태의데이터. 96 Cycle bit. Command Ring 의 Enqueue Pointer를찾는용도로사용된다 105:97 사용안함 111:106 TRB Type. Force Header Command TRB 유형 (22) 119:112 사용안함 127:120 Root Hub Port Number. 루트허브포트번호 10.2.10.4 그밖에 TRBs 10.2.10.4.1 Link TRB 세그먼트내부에 TRB 는다음에인접한 TRB 와연결되지만, 더이상인접한 TRB 가없다면다른세 그먼트로혹은현재세그먼트의처음부분으로연결시켜야한다. 이때사용하는 TRB 를 Link TRB 라고부른다. 그림 10-48 Link TRB 의구성요소 비트 설명 3:0 사용안함 63:4 Ring Segment Pointer Hi/Lo. 새로운 Ring의세그먼트로연결하기위한주소 85:64 사용안함 95:86 Interrupter Target. Link TRB가해석된뒤에발생시킬인터럽터의인덱스를지정한다 96 Cycle bit. Transfer 혹은 Command Ring 의 Enqueue Pointer를찾는용도로사용된 다 97 Toggle bit. 현재 TRB를참조하는생산자혹은소비자의 Cycle State값을토글시킬것 인지여부를결정함 99:98 사용안함 100 Chain bit. 현재 TRB가하나의 TD를구성하는일부 TRB임을알림. 101 Interrupt on Completion(IOC). 현재 TRB가처리완료되면인터럽트를발생시킬것인