4 장 USB 링크 (Link) USB 프로토콜에서링크가중요한역할로부각되기시작한것은 USB 3 슈퍼스피드 (SS) 로부터이 다. 링크는호스트 ( 루트허브포트 ) 또는외장허브의다운스트림포트 (DP) 와외장허브또는디바이스의 업스트림포트 (UP) 간의연결을의미한다. 이들간의서로를링크파트너 (Link Partner) 라고부른다. 이번장에서는 USB 링크에대한전체적인개념을배우도록한다. 링크에는전원관리프로토콜이포 함되어있다. 이부분은이후 6 장에서 USB 2 와함께배우도록하고, 이번장에서는전원관련된내 용은생략하도록한다. 그림 4-1 USB 3 SS 에서보여주는 USB 링크 USB 링크에서는다음과같은중요한요점들을알아야한다. * 패킷을구성하는방법 (Framing) 링크는상위의프로토콜계층에서정의하는프로토콜패킷을물리층 (PHY) 으로전송하는책임을가 진다. 이때, 프로토콜계층에서정의되는다양한프로토콜패킷을보다로우레벨패킷형태로프레임 을구성하는책임을가진다. 링크의유형에따라서이렇게프레임이구성되는방식과모형이다
를수있다. * 링크명령어 링크는양쪽파트너사이에지정된링크명령어 ( 프로토콜계층에서정의하지않은 ) 을별도로준비해 서사용한다. 링크명령어는링크상태의전환및흐름제어 (Flow Control) 등에사용된다. * 링크전원관리 USB 3 SS 에서는링크의버스전원사용상태가어떤상태인지를파악하고있다. U0 상태로부터 U3 상태까지전원이공급되는상황을감시하면서, 불필요한전력낭비를효과적으로피해가는방법을 제공한다. 이부분은 6 장에서배우도록하겠다. * LTSSM(Link Training and Status State Machine) USB 3 SS 링크에서가장중요한포인트가 LTSSM 이다. 링크양쪽파트너는현재의링크상태가어떤상태이며, 어떤조건에의해서어떤상태로변화될수있는지를규정하고있다. 프로토콜계층에서아무리프로토콜패킷을상대방에게전송하고싶다하더라도, 링크의상태가 LTSSM에서규정하고있는허용된상태 (U0) 가아니면이런요청은금지된다. 4.1 프레임구성 링크에서프레임을구성하는방법은총 3 가지의경우로구분될수있다. 4.1.1 Header Packet Header Packet(HP) 은프로토콜계층에서정의한패킷들을총칭하는패킷이다. 이것들은다음의경 우가포함된다. * LMP(Link Management Packet), TP(Transaction Packet), ITP(Isochronous Timestamp Packet), DPH(Data Packet Header)
이와같은패킷들은모두프로토콜계층에서구성되는패킷이다. Header Packet 과관련된내용은 5 장에서자세히배우도록하자. 이와같은 Header Packet 은공통적으로 16 바이트로구성된다. 이중마지막 2 바이트는프로토콜계 층에서공간만할여할뿐그내용을채우거나확인하는작업은링크층에서수행한다. 그림 4-2 Header Packet 을담고있는링크 Frame [ 그림 4-2] 를보면, Header Packet 을담기위해서총 20 바이트 (4 바이트헤더 + 16 바이트 HP) 를구 성하는모습을알수있다. Header Packet 을위한링크프레임의시작은그림처럼 4 개의심볼 (Symbol) 로시작된다. 심볼에대해서구체적인내용은 3 장을참조한다. SHP(Start Header Packet) 심볼 3 개와 EPF(End Packet Framing) 심볼 1 개로구성된다. 사용되는 CRC 는 CRC-16 을사용한다.
그림 4-3 LCW(Link Control Word) 의구성 LCW 는링크층에서사용하는흐름제어에중요한역할을담당한다. 시퀀스넘버 3 비트는 0 부터 7 까지총 8 가지의수를가질수있다. 이값은로테이트된다. Seq #0, Seq #1, Seq #2, Seq #3, Seq #4, Seq #5, Seq #6, Seq #7, Seq #0, Seq #1, 링크층에서는이와같은총 8 가지시퀀스만사용한다는것을유념하길바란다. USB 3.0 에서는외장허브를최대 5 개까지직렬로연결할수있기때문에, Hub 의깊이를표현하는 데는 3 개의비트면충분하다. Hub 깊이, Delayed, Deferred 는모두허브와관련된필드로서, 7 장에 서배우도록하자. LCW 에서사용하는 CRC 는 CRC-5 를사용한다. 프로토콜을공부하려는독자들은 Header Packet 을사용하는패킷이어떻게프레임을구성하는지 알아야한다.
4.1.2 Data Packet Header Packet(HP) 과함께프로토콜계층에서정의한데이터패킷을의미한다. 이런데이터패킷을 DPP(Data Packet Payload) 라고부른다. HP 에포함된 DPH(Data Packet Header) 와 DPP 는함께전송되는패킷이다. 외부에서볼때는하나 의패킷으로보이지만, 실제서로다른패킷이다. 그림 4-4 Data Packet(DPP) 을담고있는링크 Frame [ 그림 4-4] 와같이, DPP 를전송하는프레임은 HP 을전송하는프레임과모습이조금다르다. Data Packet Payload 을위한링크프레임의시작은그림처럼 4 개의심볼 (Symbol) 로시작된다. SDP(Start Data Packet) 심볼 3 개와 EPF(End Packet Framing) 심볼 1 개로구성된다. 사용되는 CRC 는 CRC-32 을사용한다.
DPP 에포함되는데이터는최대 1024 바이트까지허용한다. 프레임의마지막에는 4 개의추가심볼 (END 심볼 3 개와 EPF 심볼 1 개 ) 이사용된다. 그림 4-5 DPH(Header Packet) 와 Data Packet(DPP) 을전송하는모습 (Frame) [ 그림 4-5] 는 Header Packet 중에서 DPH 와 DPP 를함께전송하는모습을 Frame 형태로보여주고 있다. 결국 USB 3 에서 SS 통신에서전송되는모든순수데이터는이와같은모습을사용해서전송 된다. 4.1.3 링크명령어 링크계층에서는링크를구성하는양쪽의파트너로하여금데이타무결성및흐름제어 (Flow Control) 기능을사용하도록요청하고있다. 링크파트너가사용하는이런요청들을 Link 명령어라고부른다.
Header Packet, Data Packet 처럼 Link 명령어역시독특한프레임형태의구성을필요로한다. 그림 4-6 링크명령어를담고있는링크 Frame [ 그림 4-6] 을보면, 링크명령어를담고있는링크프레임은총 8 바이트로구성됨을알수있다. 다 른프레임과마찬가지로프레임의시작은 4 바이트심볼순서열을가진다. SLC(Start Link Command) 심볼 3 개와하나의 EPF 심볼이다. 이후에 2 바이트의링크명령어 (Link Command Word) 가 2 개가이어진다. 2 개의링크명령어는동일 한값을사용한다. (LCW 약자가 Link Control Word, Link Command Word 인지를꼭구분해야한다 )
[ 표 4-1] 을보면링크명령어에사용되는 2 바이트의비트맵이어떻게정의되어있는지알수있다. 표 4-1 링크명령어비트맵정의 Class Type Bit 6-4 SubType Bit 10-9 링크명령어 Bit 8-7 Bit 3-0 00 LGOOD_n LCRD_x LRTY LBAD 00 : LGOOD_n 사용안함 Bit 3 : 사용안함 Bit 2-0 : Seq # 000 : LGOOD_0 001 : LGOOD_1 010 : LGOOD_2 011 : LGOOD_3 100 : LGOOD_4 101 : LGOOD_5 110 : LGOOD_6 111 : LGOOD_7 01 : LCRD_x Bit 3-2 : 사용안함 Bit 1-0 : Credit # 00 : LCRD_A 01 : LCRD_B 10 : LCRD_C 11 : LCRD_D 10 : LRTY 사용안함 11 : LBAD 01 LGO_Ux LAU LXU 00 : LGO_Ux 0001 : LGO_U1 0010 : LGO_U2 0011 : LGO_U3 LPMA 01 : LAU 사용안함 10 : LXU 11 : LPMA 10 LUP LDN 00 : LUP 11 : LDN 사용안함
4.2 링크명령어의동작 그림 4-7 링크명령어와포트 [ 표 4-1] 에서는 USB 3 SS 에서사용되는다양한링크명령어가소개되고있다. 4.2.1 LGOOD_n 링크계층에서는모든 USB 패킷을총 8 개의시퀀스넘버를부여해서관리한다. 이때문에 LGOOD_0 부터 LGOOD_7 까지명명해서사용하기도한다. 모든패킷의시퀀스넘버는 [ 그림 4-3] 의시퀀스넘버항목에기록된다. 링크파트너는자신이받은패킷의시퀀스넘버를확인해서, 해당하는패킷을잘받았는지혹은그 렇지않은지를상대방파트너에게알려주어야한다. 기본적인흐름제어의시작이다.
그림 4-8 LGOOD_n 가사용되는모습 [ 그림 4-8] 을보면, 링크양쪽포트는각각자신이가지고있는버퍼속으로파트너가전송해준패킷을잘수신하였다. 수신한패킷의시퀀스넘버를의미하는 LGOOD_n 링크명령어를파트너에게전달하는그림이다. 보통 USB통신에서별다른문제가없다면흔히발생되는모습이라고볼수있다. 양쪽이서로전송하는패킷 (#4와 #2) 은각자보내는것이다. LGOOD_n 링크명령어가발생되지않으면, 파트너는재전송을해야하므로해당하는패킷을지우지않고가지고있어야한다. 4.2.2 LCRD_x 링크양쪽포트는내부적으로최대 4 개까지의버퍼를두고수신되는패킷의흐름제어를관리한다. 스팩에서는최대 4 개까지로제한하고있지만, 현실속에서는 4 개로고정되어서사용된다. 이런버퍼를버퍼 A, B, C, D 이렇게부른다. 포트는파트너가전송해준패킷을순서대로 (A 부터 D 까지 ) 버퍼에저장한다. 이렇게저장이된
패킷은반드시순서대로비워져야한다. 순서대로비워지는버퍼에대한상태를파트너에게알리 기위해서사용하는링크명령어가 LCRD_x 이다. 버퍼가총 4 개가있기때문에, LCRD_x 명령어는 LCRD_A, LCRD_B, LCRD_C, LCRD_D 이렇게 4 개가 존재한다. USB 패킷을전송하는포트측에서는파트너로부터해당하는패킷이처리완료되었다는 확인메시지로서 LCRD_x 를사용한다. 그림 4-9 LCRD_x 가사용되는모습 [ 그림 4-9] 를보면, 시퀀스넘버 4 의패킷을 Upstream Port 가수신한뒤, 잘받았다는 LGOOD_4 링크 명령어를 Downstream Port 에게전송하였다. 이후, 수신한버퍼 A 의상태가비워졌을때, LCRD_A 링크명령어를보내고있다.
그림 4-10 LGOOD_n 과 LCRD_x 가사용되는모습 [ 그림 4-10] 을보면, DP 에서 #2 패킷을 UP 로전송하고있다. 이후 UP 에서 #4 패킷을 DP 로전송 하고있다. 이들간의패킷시퀀스넘버는서로관련이없다. 각각의 LCRD_x 명령어를받은뒤, UP 는 다음패킷 #5 를 DP 로전송하고있고, DP 는다음패킷 #4 을 UP 로전송하고있다. 이와같은흐름제어를통해서온전하게 USB 패킷이양쪽파트너에게전달된다. LGOOD_n 과 LCRD_x 가이렇게실제 USB 패킷전송에만사용되는것은아니다. 링크가처음형성 된뒤 U0 상태 ( 프로토콜 USB 패킷을송, 수신할수있는상태 ) 로진입하게되면, 이과정중에양쪽 링크파트너의동작을확인하는목적으로도사용된다.
그림 4-11 LGOOD_n 과 LCRD_x 가사용되는모습 (U0 상태진입 ) [ 그림 4-11] 을보면, 링크의상태가 Polling.Config 상태에서 U0의상태로변화하는과정에서각각의링크파트너는 LGOOD_7, LCRD_A, LCRD_B, LCRD_C LCRD_D 링크명령어를순서대로상대에게보내고있다. 이과정까지성공적으로진행하는링크는정상적으로 U0 상태로진입하게되며, 이후필요에따라서프로토콜계층에서요청하는패킷을송, 수신하게된다. 4.2.3 LBAD 링크파트너는자신이받은 USB 패킷의오류가발견되면, 상대에게받은패킷이잘못되었음을알린 다. 이때사용하는명령어가 LBAD 링크명령어이다. 4.2.4 LRTY 링크파트너는상대방으로부터 LBAD 링크명령어가수신되면, 최근에보냈던패킷을다시재전송 하게된다. 이때재전송하는패킷바로이전에 LRTY 링크명령어를보낸다.
그림 4-12 LBAD 와 LRTY 가사용되는모습 4.2.5 LGO_Ux 링크가전력을소비하는상태는크게 4 가지상태 (U0, U1, U2, U3) 로나뉜다. U0 상태가가장많은 전력을사용하고있는상태이며, 나머지는순서대로전력소비량이많은순서가된다. U3 상태의링 크는가장최소한의전력을사용하는상태이다. (U3 상태와 Disconnected 상태가다르다 ) 상태는다음과같은형태로만변화될수있다.
그림 4-13 U0, U1, U2, U3 링크상태변화도 [ 그림 4-13] 을보면, U0 상태에서 U1, U2, U3 상태로진입하도록요청하는명령어로 LGO_Ux 명령 어가사용되고있다. U0 상태가아닌상태에서는정상적인링크명령어를사용할수없다. U1, U2, U3 상태에있는링크 는서로에게 LFPS 시그널을사용해서 U0 상태로돌아가려는의사를표현하고있으며, 이결과링 크는 Recovery 상태를통해서다시 Training 되어 U0 상태로진입할수있다. U1 상태에서 U2 상태로변환하는것은특별한링크명령을사용할수없기때문에, 내부적으로지 정한 U2 Timeout 값을사용한다.( 구체적인내용은 6 장에서배우자 ) 4.2.6 LAU U0 상태에서 U1, U2, U3 로진입을요청하는것은링크파트너모두가해야한다. 어느한쪽만진 입을요청할수없다. 양쪽의진입요청이모두수락되어져야정상적인상태변화가가능하다. 링크파트너는이와같이 LGO_Ux 링크명령어에대해서 LAU 링크명령어를통해서수락사실을파
트너에게알린다. 4.2.7 LXU LAU 와다른의미로사용된다. LGO_Ux 링크명령어에대해서거부의사를나타내는명령이 LXU 링 크명령어이다. 4.2.8 LPMA 양쪽링크는모두 LGO_Ux 링크명령어에대해서수락의사 (LAU) 를보여야한다. 모든포트가수락 의사를표현했다는확신의의미로양쪽포트는자신의링크상태를변환한뒤에반드시 LPMA 링크 명령어를파트너에게보내야한다. 4.2.9 LDN Downstream Port(DP) 는링크파트너에게더이상전송할링크명령어가없다는사실을매 10us 마다알린다. 이때사용하는링크명령어가 LDN 명령이다. 4.2.10 LUP Upstream Port(UP) 는링크파트너에게더이상전송할링크명령어가없다는사실을매 10us 마다 알린다. 이때사용하는링크명령어가 LUP 명령이다.
그림 4-14 LDN 과 LUP 가사용되는모습 4.3 LTSSM(Link Training and Status State Machine) USB 3 링크의꽃 (?) 이라고부를만큼가장중요한위치를차지하는개념이 LTSSM 이다. LTSSM 은런타임시에형성되어운용중인링크의현재상태를규정하고, 이상태가다른상태로전환되 는사건을규정한다. LTSSM 은 12 개의링크상태를정의하고있다. 또한, 각각의링크상태는서브상태를또다시규정하 고있다.
그림 4-15 LTSSM 상태도 [ 그림 4-15] 를보면, LTSSM 에서규정한 12 개의링크상태와각각의상태가변할때발생하는사건 을명시하고있다. 4.3.1 ess.disabled 그림 4-16 ess.disabled 상태
이상태는링크양쪽포트의 Receiver Termination 이제거된상태이다. 동작을하지않는상태이 다. 또한, 양쪽포트의연결도보장할수없다. 전원공급도되지않은상태로간주한다. 2 개의서브상태를가진다. 이상태에서 Rx.Detect 상태로진입하기위해서는리셋명령을성공적으 로수행해야한다. ess.disabled.default : 기본상태. 리셋명령에대해서성공적인처리를못하는회수가 3 번이상누 적되면 ess.disabled.error 상태로진입한다. ess.disabled.error : 이상태를빠져나오기위해서는 Power On Reset 방법밖에없다. 4.3.2 ess.inactive 그림 4-17 ess.inactive 상태
링크를형성하는과정중에실패했거나, Warm Reset 명령어에의해서진입될수있다. 이상태에서는 VBus 가발견된다. 2 개의서브상태를가진다. ess.inactive.quiet : 기본상태. 이상태에서 Receiver Termination 회로를찾는다. 회로가발견되면 Warm Reset 명령에의해서 Rx.Detect 상태로진입한다. 발견되지못하면 ess.inactive.disconnect.detect 상태로진입하여 Receiver Termination 회로를찾 는다. ess.inactive.disconnect.detect : Receiver Termination 회로가발견되면 ess.inactive.quiet 상태로 진입한다. 회로가발견되지못하면 Rx.Detect 상태로진입한다. 4.3.3 Rx.Detect 그림 4-18 RxDetect 상태
링크양쪽포트에전원이공급되었다. 또는 Downstream Port 가 Warm Reset 명령을보내고있는 상태이거나, Upstream Port 가 Warm Reset 명령을발견한상태이다. 3 개의서브상태를가진다. RxDetect.Reset : 링크의양쪽파트너는 Warm Reset 명령에대해서서로반응을보이는상태이다. 이상태를성공적으로수행하지못하면, ess.disabled 상태로전환된다. RxDetect.Active : 링크의양쪽파트너는서로가 Super Speed 를지원하는지를확인하는과정을가 진다. 확인이되면, Polling 상태로전환된다. RxDetect.Quiet : 링크의양쪽파트너는 Receiver Termination 를못찾거나, 정상적인수신기를확인 하지못하면이상태가된다. 이상태는 12ms 타이머에의해서 RxDetect.Active 상태로전환한다. 지정된회수만큼검색을반복하다더이상찾을수없는경우 ess.disabled 상태로전환된다.
4.3.4 Polling 그림 4-19 Polling 상태 링크 Training 을시작하는상태이다. 반복적인 LFPS 핸드쉐이킹이발생하고양쪽포트의수신기의 Equalizaion 설정을위한테스트및 U0 상태로진입하기위한준비과정을가진다. [ 그림 4-19] 처럼 Polling 상태는가장많은서브상태를가진다. 구체적인내용은스팩을참조하는 것이좋겠다. 여기서는이중에서가장중요한 5 가지서브상태에대해서만설명하도록하겠다. Polling.LFPS : 모든 USB 3.0 SS 디바이스는이상태에진입하면, 80us 내에 LFPS 시그널통신이시작된다. 이단계에서디바이스의포트는 360ms 타이머를구동한다. 타이머가구동된시간동안지정된조건의 LFPS(Polling.LFPS) 시그널이발견되지않으면링크는 Rx.Detect 상태로되돌아간다. 지정된조건이란스팩에의하면다음과같이정의되어있다. 링크의포트는최소한 16 번에걸쳐서 Polling.LFPS 시그널을송신해야한다. 링크의포트는최소한연속으로 2 번 Polling.LFPS 시그널을수신해야한다
링크의포트는하나의 Polling.LFPS 를수신한상태에서연속으로 4 번의 Polling.LFPS 를송신한다. 그림 4-20 Rx.Detect 상태에서 Polling.LFPS 상태로전환하는모습 Polling.RxEQ : 양쪽포트는 65,535 번의 TSEQ 순서열을전송을통해서수신기 (Receiver) 측이사용 할 Receiver Equalizer 로직이필요로하는패턴데이타를수집하는기간이다. 그림 4-21 Polling.LFPS 상태에서 Polling.RxEQ 상태로전환하는모습
Polling.Active : 12ms 타이머가작동하고, Transceiver 는연속적인 TS1 순서열을파트너에게보낸다. Receiver 는 TS1 또는 TS2 순서열을파트너에게응답으로보낸다. 그림 4-22 Polling.RxEQ 상태에서 Polling.Active 상태로전환하는모습 Polling.Configuration : Transceiver 는연속적인 TS2 순서열을파트너에게보낸다. Receiver 는 TS2 순서열을파트너에게응답으로보낸다.
그림 4-23 Polling.Active 상태에서 Polling.Configuration 상태로전환하는모습 Polling.Idle : 링크파트너간의연속적인 Symbol IDLE 을송, 수신하는상태. U0 상태로진입하기 바로이전상태이다. 이상태가생략되기도한다. 4.3.5 Compliance Mode Transceiver 의전원공급상태와타이밍을테스트해보는상태이다. 4.3.6 U0 링크가허용되고 USB 패킷이전송될수있는상태이다. 이상태에진입하면, LGOOD_7, LCRD_A, LCRD_B, LCRD_C, LCRD_D 링크명령어를포트는주고받 아야한다. LMP(Link Management Packet) 패킷을사용해서링크간구성을완료한다. 이때사용하는 LMP 패킷은다음과같다. * Port Capability, Port Configuration, Port Config Response
이것과관련된내용은프로토콜을설명하는 5 장에서배우도록한다. 4.3.7 U1 저전력링크상태이고, 패킷전송이없는상태이다. 4.3.8 U2 저전력링크상태이고, U1 보다낮은전력을가지는상태이다. 4.3.9 U3 링크가 Suspended 된상태이다. 거의전력을소비하지않는상태이다. 호스트의요청에의해서만 진입될수있다. 4.3.10 Recovery 그림 4-24 Recovery 상태 Hot Reset 명령을통해서재 Training 절차를시도하거나 Loopback 모드로전환하는준비를하는
상태이다. U1, U2, U3 상태에서 U0 상태로전환하기위해서거쳐가는상태이다. 또한, U0 상태에서 회복하기어려운에러상태가감지되면 Recovery 상태로진입한다. 3 개의서브상태를가진다. Recovery.Active : 재 Training 과정을시작한다. Polling.Active 과정에서수행한작업을한다.
그림 4-24 U0 상태에서 Recovery.Active 상태로전환하는모습 Recovery.Configuration : U0 상태로들어갈수있도록마지막 Training 작업을수행한다. Polling.Configuration 과정에서수행한작업을한다. 그림 4-25 Recovery.Active 상태에서 Recovery.Configuration 상태로전환하는모습
Recovery.Idle : Recovery.Configuration 과정을통해서얻은정보를토대로 U0 상태로진입할수 있도록준비하는작업을한다. 4.3.11 Loopback 그림 4-26 Loopback 상태 BERT(Bit Error Rate Test) 상태다이아그램을구성하고, Receiver 의시그널수신상태를테스트한다. Polling 상태에서 TS2 순서열의 Loopback 비트값의유무에따라서 Loopback 모드로진입한다. TS2 순서열의 Loopback 비트값이 TRUE 인대상포트를 Loopback Master, 그렇지않은포트를 Loopback Slave 라고한다. Loopback 테스트는 Loopback Slave 를테스트하는과정을의미한다. 2 개의서브상태를가진다. Loopback.Active : Loopback 마스터는테스트를위한데이터혹은명령어를 Slave 에게전달한다. Slave 는수신된명령어를해석한다. Loopback.Exit : Loopback Exit 을위한 LFPS 시그널을기다린다. Loopback Master 에의해서모든 Loopback 테스트를종결한다.
4.3.12 Hot Reset 그림 4-27 Hot Reset 상태 Downstream Port 에의해서발생하는리셋상태이다. Warm Reset 보다빠르게 U0 상태로진입될수있다. 링크파트너양쪽이서로 TS2 순서열 ( 리셋비 트가 TRUE) 을사용해서리셋과정을진행한다. 그림 4-28 Hot Reset 을진행하는모습
2 개의서브상태를가진다. HotReset.Active : Warm Reset 에의해서 Hot Reset 상태로들어온경우에는 Rx.Detect 상태로전환 한다. 그외에경우는 [ 그림 4-28] 에서보여주는과정을진행한다. HotReset.Exit : Warm Reset 에의해서 Hot Reset 상태로들어온경우에는 Rx.Detect 상태로전환한 다. 그외에경우는양쪽포트는 Symbol IDLE 데이터를송신한다. 정상적으로수신하면 U0 상태로 링크의상태를돌린다. 그렇지않으면 ess.inactive 상태로전환한다.