원문 : USB in a NutShell, Beyond Logic. 번역자 : lifeisforu( http://lifeisforu.tistory.com, lifeisforu@naver.com ) 주의 : 허락받고번역한것이아니므로문제가되면삭제될수있습니다. 주의 : 번역이개판이므로이상하면원문을참조하십시오. 주의 : 가독성을높이기위해서잘알려진용어나발음이비슷한용어는한글로표기합니다. 주의 : 잘못된내용이있을수있는데, 거기에대해서책임지지않습니다. 주의 : 공부하다가관심있는부분만번역했으므로중간에생략된부분이있으니, 그런부분은원문을참조하시기바랍니다. 경고 : 상업적용도로사용하지말아주시기바랍니다. 표기 : 위첨자로되어있는것들은원래용어입니다. USB in a NutShell USB 표준이해하기. USB 를처음시작하는것은매우기죽는일일수있다. USB 2.0 specification 은 650 페이지나되기때문에, 사람들은그표준의양만으로도쉽게포기할수도있다. 이는단지 USB 를위한표준들과관련된긴리스트의시작일뿐이다. HID( Human Interface Devices ) 클래스의책임하에있는 ( 키보드, 마우스와같은 ) 장치들을세분화시키는 HID Class Specification 과같은 USB Class Standard 들도존재한다 또다른 97 페이지의문서이다. 만약당신이 USB 호스트 Host 를설계하고있다면, 당신은세개의 Host Controller Interface Standard 들중의하나를선택해야한다. 이런것들은 USB 2.0 명세에나와있지않다. 좋은소식은당신이전체 USB 표준을읽느라고지겨워할필요가전혀없다는것이다. 일부장 chapter 들은마케팅에휘둘리며, 다른장들은보통당신의 USB 컨트롤러 IC 에의해다뤄지는더저수준의링크레이어 lower link layer 를목표로하며, 2 개의장들은호스트및허브 hub 개발자들을목표로한다. USB 2.0 명세의다양한장들을조금돌아보고, 간단하게핵심을소개해보도록하겠다. Chapter Name Description Pages 1 Introduction USB 의영역과동기를포함한다. 이장의가장중요한정보 2 는 Universal Serial Device Class 명세들에대한참조를만드는데있다. 이장을읽을필요가없다. 2 Terms and 이장은따로설명이필요없다. 그리고모든표준들에있어 8 Abbreviations 악랄하다. 3 Background ( 개발자가아닌 ) 최종사용자에게플러그앤플레이와단 4
숨함을제공한다는 USB 의목적을설명한다. Low, Full, High 스피드범위들을마케팅에있어직관적인기능리스트들을사용해서설명한다. 이장도읽을필요가없다. 4 Architectural Overview 당신이읽기시작할곳이다. 이장은토폴로지 topology, 통신속도 data rates, 데이터플로우타입 data flow type, 기본적인전기적명세 basic electric specs 등을개관을제공한다. 5 USB Data 이장은 Universal Serial Bus 상에서데이터가흘러가는방 Flow Model 식에대해이야기하기시작한다. 그것은엔드포인트 endpoint 와파이프 pipe 같은용어들에대해설명하고, 각데이터플로 우타입들 ( Control, Interrupt, Isochronous, Bulk ) 을설명하기 위해그장의대부분을소비한다. 6 Mechanical 이장은 USB 의구자기표준연결자 connector 들에대해세부 적으로설명한다. 여기에서중요한정보는 A 형연결자가 다운스트림 downstream 을향하며, B 형연결자가업스트림 upstream 을향한다는것이다. 즉두개의업스트림포트들에케이블 cable 을꼽는것이불가능할것이다. 분리가능한 detachable 모든 10 60 33 케이블들은반드시 full/high 스피드여야하는반면에, 모든 low 스피드케이블들은반드시기기 appliance 에고정되어야 hardwired 한다. Other than a quick look at the connectors, USB 연결자나케이블을생산하려는의도가아니라면이장을건너뛸수있다. PCB 설계자들은이장에서표준수신범위 footprint 를찾을수있을것이다. 7 Electrical 이장은 line impedance, rise/fall times, driver/receiver 명세들및 bit level encoding, bit stuffing 등과같은저수준의전기적신호처리 signaling 에대해살펴본다. 이장에서더중요한부분들은디바이스스피드식별 device speed identification 이다. 실리콘 silicon 수준에서 USB transceiver 를설계하고있지않은이상, 당시은이장을휙휙넘길수있다. 좋은 USB 디바이스데이터시트들은당신이 bus impedance matching 을위해필요로하는 value bus termination 레지스터 resistor 들이무엇인지세부적으로보여줄것이다. 8 Protocol 이제우리는프로토콜레이어로들어가기시작한다. 이장 Layer 은 sync, pid, address, enpoint, CRC 필드들을포함하는 USB 패킷들을바이트수준에서설명한다. 이것을이해하면다음 프로토콜레이어와 USB 패킷으로넘어간다. 거의대부분의 개발자들은여전히이저수준프로토콜레이어들에대해알 지못한다. 왜냐하면그것들은 SUB 디바이스 IC 들이취급 하기때문이다. 그러나상태기록 status reporting 과연결 handshaking 에대해이해사는것은가치있는일이다. 75 45
9 USB Device Frame Work 10 USB Host Hardware and Software 11 Hub Specification 이장은전체명세에서가장자주사용되며, 내가출력하고 철하느라고지겨워했던유일한장이다. 이는 USB 프로그래 머들과설계자들이항상보게될가장공통적인프로토콜레 이들을구성하는버스열거 bus enumeration request code 와요청코드 들 ( set address, get descriptor 등 ) 을세부적으로설명한다. 이장은호스트와관련한이슈들을다룬다. 이는프레임생 성과마이크로프레임생성, 호스트컨트롤러요청, 소프트 웨어메커니즘, USB 드라이버모델을포함한다. 당신이호스 트를설계하고있는게아니라면, 이장은넘어가도된다. 허브구성, split transaction, 허브클래스를위한표준디스 크립터 descriptor 등을포함하는 USB 허브의동작들을세부적으 로설명한다. 당신이허브를설계하고있는게아니라면, 넘 어가도된다. 36 23 143 자이제우리는필요한표준부분들을읽기시작할수있다. 만약 USB 주변장치 peripheral 들을위한 ( 소프트웨어 ) 드라이버를개발하고있다면당신은다음장들만읽어도된다. 4 Architectural Overview 5 USB Data Flow Model 9 USB Device Frame Work 10 USB Host Hardware and Software ( 전기적 ) 주변장치하드웨어설계자들은다음장들만읽어도된다. 4 Architectural Overview 5 USB Data Flow Model 6 Mechanical 7 Electrical USB in a NutShell for Peripheral Designers 생략. Introducing the Universal Serial Bus
USB 1.1 은두종류의스피드를지원했다. 12MBits/s 의 full 스피드모드와 1.5Mbits/s 의 low 스피드모드이다. ferrite beads 들과 quality component 들의비용을제거함으로써 1.5MBits/s 모드는느리며 EMI 1 에취약하다. 예를들어크리스탈 crystal 은더싼공명기 resonator 들에의해대체될수있다. 주류데스크탑컴퓨터들에서아직까지도광명을보고있는 USB 2.0 은 480MBits/s 까지판돈을올렸다. 480MBits/s 는 High 스피드모드라고불리며, Firewire Serial Bus 2 에경쟁에붙여졌다. USB Speeds High Speed 480MBits/s Full Speed 12MBits/s Low Speed 1.5MBits/s USB 는호스트가제어한다. 버스당하나의호스트만이존재할수있다. 명세자체는어떠한형태의 multimaster arrangement 도지원하지않는다. 그러나 USB 2.0 표준에덧붙여진 On-The- Go 명세는두개의디바이스들이호스트의역할을협상하는것을허용하는 Host Negotiation Protocol 을소개했다. 이는모바일폰과개인 organiser 같이다중허브나다중디바이스데스크탑구성이아닌단일점대점 point to point 연결에제한된다. USB 호스트는모든트랜잭션 transaction 들을처리 undertake 하고대역폭bandwidth를관리 schedule 할책임이있다. 토큰 token 기반프로토콜을사용하는다양한트랜잭션메서드들에의해데이터가보내질수있다. 내가보기에는 USB 의버스토폴로지는다소제한적이다. USB 의원래의도중하나는당신의 PC 에케이블을연결하는양을줄이는데있었다. Apple 사람들은 Apple Desktop Bus 로부터그아이디어가왔다고주장할것이다. 거기에서는키보드, 마우스, 그리고어던다른주변장치들이하나의케이블을사용해서 ( Daisy Chain 방식으로 ) 서로연결될수있다. 그러나 USB 는 tiered star 토폴로지를사용하며, 10BaseT 이더넷 Ethernet 중의하나인것처럼행동한다. It imposes the use of a hub somewhere, which adds to greater expense, more boxes on your desktop and more cables. 그러나그것은보이는것처럼나쁘지만은않다. 많은디바이스들은 USB 허브들을내장하고있다. 예를들어당신의키보드는컴퓨터와연결되는허브를포함하고있을것이다. 당신의마우스와디지털카메라같은다른디바이스들은키보드뒤에쉽게꼽힐수있을것이다. 모니터들은단지내장허브들을가지고있는긴리스트들중의또다른주변장치일뿐이다. This tiered star topology, rather than simply daisy chaining devices together has some benefits. 먼 1 Electromagnetic interference 전자방해 2 Apple 사와 Texas Instrument 사가제창한고속직렬버스규격 출처 : 네이버사전.
저서로의디바이스에대한전원 power 을모니터링할수있으며, 심지어는다른 USB 디바이스들에지장을주지않고과전류상황이발생한디바이스를꺼버릴수도있다. Both high, full and low speed devices can be supported, with the hub filtering out high speed and full speed transactions so lower speed devices do not receive them. 하나의 USB 버스에동시에 127 개의디바이스들까지연결될수있다. 더많은디바이스가필요한가? 단순하게다른포트 / 호스트를추가하기만하면된다. 거의대부분의초기 USB 호스트들은두개의포트들을가지고있었는데, 거의대부분의제조사들은이를제약으로인식했고 4, 5 개의포트호스트카드들을함께하드디스크들을위한내부포트들과함께소개했다. 초기의호스트들은하나의 SUB 컨트롤러를가지고있었기때문에, 두개의포트들이모두같은 USB 대역폭을공유했다. 대역폭에대한요구가커지면서, 우리는개별채널들을허용하는두개이상의컨트롤러를가지고있는멀티포트카드들을보기시작했다. USB 호스트컨트롤러들은자신만의명세를가진다. USB 1.1 을사용하면, 두개의호스트컨트롤러명세가존재한다. 인텔에의해개발된 UHCI( Universal Host Controller Interface ) 는 ( 마이크로소프트 ) 소프트웨어상에서더많은부담을지게하며싼하드웨어에서도돌아간다. 그리고컴팩, 마이크로소프트, National Semiconductor 에의해개발된 OHCI( Open Host Controller Interface ) 는 ( 인텔 ) 하드웨어에더많은부담을지게하며소프트웨어를더단순하게만든다. 전통적인하드웨어 / 소프트웨어엔지니어관계 USB 2.0 의소개와함께 USB 2.0 에대한레지스터수준세부사항을설명하기위해서새로운호스트컨트롤러인터페이스명세가필요해졌다. EHCI( Enhanced Host Controller Interface ) 가태어났다. 주요기여자들은인텔, 컴팩, NEC, Lucent, 마이크로소프트이다. 그래서그들이우리에게하나의인터페이스표준만을제공하고결국에는 OS 에서구현하기위한하나의새로운드라이버만있으면되는상황이가능해보였다. 시간문제였다. 이름이말해주듯이 USB 는직렬버스를제안한다. 그것은 4 개의차폐된와이어 shielded wire 를사용하는데, 2 개는전원 ( +5v & GND ) 으로사용된다. 나머지 2 개는꼬여있는서로다른데이터신호쌍이다. 그것은호스트와리시버의시간을동기화하기위해서 NRZI( Non Return to Zero Invert ) 인코딩정책을사용하여동기화필드와함께데이터를보낸다. USB 는동적으로로드하고언로드할수있는드라이버들을사용하여플러그앤플레이를지원한다. 사용자는단지디바이스를버스에꽂으면된다. The host will detect this addition, interrogate the newly inserted device and load appropriate driver all in the time it takes the hourglass to blink on your screen provided a driver is installed for your device. 최종사용자는컴퓨터종료, IRQ, 포트주소, 컴퓨터재시작등에대해서걱정할필요가없다. 사용자가작업을마치면, 그들은그냥케이블을뽑으면된다. 호스트는그것이없어졌다는것을감지할것이며, 자동으로드라이버를내릴것이다.
적절한드라이버를로딩하는것은 PID/VID( Product ID/Vendor ID ) 조합을사용해서수행된다. VID 는 USB 구현자들의포럼에유상으로등록되며, 이는 USB 에있어또다른문제가되는조항으로 보인다. 요금에대한가장최근의정보는 USB Implementor s Website 에서찾아볼수있다. 다른표준조직들은교육, 연구, 만지작거리기 ( 취미 ) 같은비상업적활동들을위해추가 VID 를제공한다. USB 구현자들의포럼은아직이서비스를제공하지않는다. 이경우당신은당신의개발시스템의제조사에할당된것을사용하기를원할지도모른다. 예를들어거의대부분의칩제조사들은상업디바이스로서존재하는것으로알려져있지않는당신의칩들을위해사용할수있는 VID/PID 조합을가지고있을것이다. 다른칩제조사들은당신의상업디바이스를위해그들의 VID 와함께사용할수있는 PID 를팔수도있다. 다른더주목할만한 USB 기능들은그것의전송모드이다. USB 는 Control, Interrupt, Bluk, Isochronous 전송을지원한다. While we will look at the other transfer modes later, Isochronous allows a device to reserve a defined about of bandwidth with guaranteed latency. 이는병목 congestion 이생기면데이터를잃어버리거나프레임이떨어지게되는오디오나비디오응용프로그램에서이상적이다. 각전송모드는설계자에게에러감지, 복구, 보장된지연률, 대역폭등과같은영역에서의균형을제공한다. Connectors 생략. Electrical 생략. Speed Identification 생략. Power ( V BUS )
생략. Suspend Current 생략. Entering Suspend Mode 생략. Data Signaling Rate 생략. USB Protocols 보내지는데이터의포맷이정해져있지않은 RS-232 나그와비슷한직렬인터페이스와는다르게, USB 는몇개의프로토콜레이어로구성되어있다. 이것이복잡하게들리기는하지만, 지금포기하지는말기바란다. 일단어떤일이벌어지는지이해하고나면, 당신은단지고수준레이어들에대해서만걱정하면된다. 사실대부분의 SUB 컨트롤러 IC 들이저수준레이어를신경쓸것이므로, 최종설계자들에게는거의노출되지않게된다. 각 USB 트랜잭션은다음과같은요소들로구성된다. 토큰패킷 ( 다음에무엇이올지정의하는헤더 ) 선택적데이터패킷 ( payload 를포함함 ). 상태패킷 ( 트랜잭션을받았음을알리고에러교정의수단을제공하기위해서사용됨 ). 앞에서이미논의했듯이, USB 는호스트중심버스이다. 호스트가모든트랜잭션을초기화한다. 토큰이라불리기도하는첫번째패킷은어떤데이터가뒤이어오는지, 그데이터트랜잭션이읽기인지쓰기인지, 디바이스주소와지정된엔드포인트가무엇인지기술하기위해서호스트에의해생성된다. 다음패킷은보통데이터패킷인데 payload 를담고있으며 handshaking 패킷의
앞에온다. handshaking 패킷은데이터나토큰이성공적으로전달되었는지기록하거나그엔드포 인트가대기중인지데이터를받을수있는지기록한다. Common USB Packet Fields USBus 상의데이터는 LSBit 3 부터전송된다. USB 패킷은다음필드들로구성된다. Sync 모든패킷들은동기화필드로시작한다. 동기화필드는 8 bit 로구성된숫자이며, 그것은전송자transmitter와수신자receiver 의시간clock을동기화하는데사용된다. 마지막두비트는 PID 필드가시작하는곳을지시한다. PID PID 는 packet id 를의미한다. 이는전송되고있는패킷의유형을식별하는데사요된다. 다음표는가능한값들을보여준다. 3 LSBit 는 least significant bit 를의미하는것같다. LSBit 는가장오른쪽비트이다 ( 0 번째비트 ). 그냥 LSB 라고하면 least significant byte 가된다.
PID 에대해 4 개의비트들이존재하지만, 올바르게수신되는것을보장하기위해서는, 4 개의비트들이보충되고반복된다. 그래서총 8 개의 PID 가존재한다. 최종포맷은아래 와같다. ADDR 주소필드는패킷이지정된디바이스가무엇인지를지정한다. 7 개의비트들은 127 개의디바이스가지원될수있도록한다. 주소 0 은유효하지않다. 왜냐하면아직주소를할당받지않은모든디바이스는주소 0 으로보내지는패킷들에응답해야만하기때문이다. ENDP 엔드포인트필드는 4 개의비트들로구성된다. 이는 16 개까지의엔드포인트를가능하게한다. 그러나 low 스피드디바이스는기본파이프의최상위에서의부가적인주소들과더불어단지 2 개의엔드포인트만을가진다 ( 최대 4 엔드포인트 ). CRC Cyclic Redundancy Check 는패킷 payload 내의데이터상에서수행된다. 모든토큰패킷 들은 5 비트의 CRC 를가지는반면, 데이터패킷들은 16 bit 의 CRC 를가진다. EOP 패킷의끝. 약 2 비트타임 4 동안 Single End Zero( SE0 ) 으로, 그후 1 비트타임동안 J 로 시그널링된다. USB Packet Types USB 는네종류의패킷을가지고있다. 토큰패킷은다음에올트랜잭션의종류를지정한다. 데 이터패킷은 payload 를포함한다. Handshake 패킷은데이터의정보의접수를확인하고에러를 4 Bit time 은컴퓨터네트워킹의개념이다. 그것은하나의비트에대해미리정의된 10 MBits/s 와같은표준스피드로실행되는 Network Interface Card( NIC ) 로부터빠져나오는시간으로정 의된다. Bit time = 1 / NIC speed. - 출처 : Bit time. Wikipedia.
기록하기위해서사용된다. 그리고 Start Of Frame 패킷은새로운프레임의시작을지시한다. Token Packets 세종류의토큰패킷이존재한다. In 호스트가정보를읽어들이고자하는 USB 디바이스를알린다. Out 호스트가정보를보내고자하는 USB 디바이스를알린다. Setup 컨트롤전송을시작하는데사용된다. 토큰패킷들은반드시다음과같은포맷을만족해야한다 Data Packets 세종류의데이터패킷이존재한다. 각각은 0 부터 1023 바이트까지의데이터를전송하는기능을가지고있다. Data0 Data1 데이터패킷들은다음과같은포맷을가지고있다. Handshake Packets 세종류의 handshake 패킷들이존재하는데, 간단하게 PID 로구성된다. ACK 패킷이성공적으로수신되었다는접수확인 Acknowledgement. NAK 디바이스가데이터를일시적으로보내거나받을수없음을기록. 또한호스트에게보낼데이터가없다고알려주는인터럽트트랜잭션동안에사용되기도함. STALL The device finds its in a state that it requires intervention from the host. Handshake 패킷들은다음과같은포맷을가진다. Start Of Frame Packets SOF 패킷은 11 비트의프레임번호로구성되는데, 호스트에의해매 1mS±500nS 마다보내 진다.
USB Functions USB 디바이스에대해생각할때, 우리는 USB 주변장치를생각하지만, USB 디바이스는호스트나주변장치, USB 허브나호스트컨트롤러 IC 디바이스, 혹은 USB 주변장치에서사용되는 USB transceiver 디바이스를의미할수도있다. 그러므로표준은 USB function 들에대한참조를만든다. 그러한 function 들은프린터, 집드라이브, 모뎀, 혹은다른주변장치들과같은 capability 나 function 을제공하는 USB 디바이스처럼보일수있다. 그래서지금은우리는 USB 패킷을구성하는것들의종류를알아야한다. 아니라고? 당신은 PID 필드를구성하는비트의개수를이미잊어버렸는가? 우리는너무두려워할필요가없다. 운좋게도거의대부분의 USB function 들은저수준 USB 프로토콜부터 ( 우리가다음장에서다룰 ) 실리콘의트랜잭션레이어까지를모두다룬다. 우리가이정보들을다루는이유는대부분의 USB function 컨트롤러들이 PID 인코딩에러와같은레어들을기록할것이기때문이다. 간단하게나마이를다루지않은채, PID 인코딩에러가뭐냐고질문할수있는가? If you suggested that the last four bits of the PID didn t matching the inverse of the first four bits then you would be right. 대부분의 function 들은일련의버퍼를가질것이다. 보통 8 바이트의길이이다. 각버퍼들은 EP0
IN 과 EP0 OUT 등의엔드포인트에속할것이다. 예를들어, 호스트가디바이스디스크립터요청을보낸다. 그 function 하드웨어는셋업패킷을읽을것이고, 그주소필드로부터패킷이존재하는지여부를확인할것이다. 그리고만약존재한다면, 셋업토큰의엔드포인트필드의값에의해지정된적절한엔드포인트버퍼에다가다음에오는데이터패킷의 payload 를복사할것이다. 그리고나서, reception of byte 에접수확인을하기위해 handshake 패킷을보내고적절한엔드포인트에대한반도체 / 마이크로-컨트롤러안의내부인터럽트를생성하는데, 그것은데이터를수신했음을의미한다. 이것이보통하드웨어내에서수행되는모든것이다. 이제소프트웨어는인터럽트를받고, 엔드포인트버퍼의내용들을읽어야하며, 디바이스디스크 립터요청을파싱한다. Endpoints 엔드포인트는데이터의소스나흡수원 sinks 으로서기술될수있다. 버스는호스트중심이기때문에, 엔드포인트들은 USB function 에서대화채널의끝단에서발생한다. 예를들어, 소프트웨어레이어에서당신의디바이스드라이버는당신의디바이스 EP1 에다가패킷을보낼것이다. 데이터는호스트로부터흘러나오기때문에, 그것은 EP1 OUT 버퍼에서멈출것이다. 당신의펌웨어 firmware 는이데이터를느긋하게읽을것이다. 그런데그것이데이터를반환하기원할때, 그 function 이버스에다가데이터를쓸수는없을것이다. 왜냐하면버스는호스트에의해제어되기때문이다. Therefore it writes data to EP1 IN which sits in the buffer until such time when the host sends a IN packet to that endpoint requesting the data. 엔드포인트는 function 을실행중인펌웨어와 function 디바이스의하드웨어사이의인터페이스처럼보일수도있다. 모든디바이스들은반드시엔드포인트 0 을지원해야만한다. This is the endpoint which receives all of the devices control and status requests during enumeration and throughout the duration while the device is operational on the bus. Pipes 디바이스가일련의엔드포인트상에데이터를송수신하는반면, 클라이언트소프트웨어는데이터를파이프를통해전송한다. 파이프는호스트와엔드포인트간의논리적인연결이다. 파이프는대역폭이얼마나할당되는지, 전송타입 ( control, bulk, iso, interrupt ) 은무엇인지, 데이터흐름의방향은어떤지, 최대패킷 / 버퍼크기는얼마인지와같은것과연관된파라미터집합을가질수도있다. 예를들어기본파이프는양방향파이프인데, control 전송유형을사용해엔드포인트 0 in 과엔드포인트 0 out 으로구성되어있다.
USB 는두종류의파이프를정의한다. Stream Pipes 는정의된 USB 포맷을가지지않는다. 즉당신은어떠한유형의데이터라도스트림파이프를통해보내고받을수있다. 데이터는순차적으로흐르며, in 이나 out 인미리정의된방향을가진다. 스트림파이프들은 bulk, isochronous, interrupt 전송타입을지원한다. 스트림파이프들은호스트나디바이스에의해서제어될수도있다. Message Pipes 는정의된 USB 포맷을가지고있다. 그것들은호스트에의해제어되는데, 호스트로부터보내진요청에의해초기화된다. 그리고나서데이터는요청에의해지시된원하는방향으로전송된다. 그러므로메시지파이프는데이터가양방향으로흐르는것을허용하지만, 단지 control 전송만을허용할것이다. Endpoint Types USB 명세는 4 개의전송 / 엔드포인트유형을정의한다. Control Transfers Interrupt Transfers Isochronous Transfers Bulk Transfers Control Transfers 컨트롤전송은일반적으로명령및상태처리를위해서사용된다. 그것들은컨트롤전송을사용해수행되는모든열거 function 들과함께 USB 디바이스를설정하는데필수적이다. 그것들은보통 bursty, random 패킷들이다. 그패킷들은호스트에의해초기화되며 best effort delivery 5 를사용한다. Low 스피드디바이스에서컨트롤전송의패킷길이는반드시 8 바이트여야하며, high 스피드에서패킷길이는 8, 16, 32, 64 바이트일수있고, full 스피드에서는반드시 64 바이트여야한다. 컨트롤전송은세개의스테이지들까지가질수있다. 5 통신용어. 최선노력전송.
Setup Stage 는요청이보내지는곳이다. 이는세개의패킷들로구성된다. 셋업토큰이먼저보내지는데, 이는주소와엔드포인트번호를포함한다. 데이터패킷이그다음으로보내지는데, 항상 data0 의 PID 타입을가지고있으며, 요청의타입을세부적으로기술하는셋업패킷을포함한다. 마지막패킷은 handshake 이며, 성공적인접수가되었는지확인하거나에러를지시한다. 만약 function 이성공적으로셋업데이터를수신하면 ( CRC 와 PID 등이 OK ) 그것은 SCK 와함께응답하며, 실패하면그데이터를무시하고 handshake 패킷을보내지않는다. Function 들은 STALL 이나 NAK 패킷을셋업패킷의응답으로제출할수없다. 선택적인 Data Stage 는하나이상의 IN 이나 OUT 전송으로구성된다. 셋업요청이이 스테이지에서전송될데이터의양을지시한다. 만약최대패킷사이즈를넘어서면, 데이 터는마지막패킷을제외하고최대패킷길이만큼다중으로전송될것이다. 데이터스테이지는데이터전송의방향에따라두개의시나리오를가진다. IN : 호스트가컨트롤데이터를수신할준비가되면, 그것은 IN 토큰을제출한다. 만약그 function 이 PID 가 inverted PID 비트들과일치하지않는다는것과같은에러와함께 IN 토큰을수신하면, 그것은패킷을무시한다. 만약토큰이올바르게수신되면, 그디바이스는다음과같은패킷들과함께응답할수있다. DATA 패킷은보내질컨트롤데이터를포함한다. Stall 패킷은엔드포인트가에러를가지고있다는것을알려준다. NAK 패킷은엔드포인트가동작중이지만일시적으로보낼데이터를가지고있지않다는것을호스트에알려준다.
OUT : 호스트가디바이스에컨트롤데이터패킷을보낼필요가있을때, 그것은 OUT 토큰다음에 payload 와같은컨트롤데이터를포함하는데이터패킷을제출한다. 만약 OUT 토큰이나데이터패킷의어떠한부분이라도간섭을받게되면, 그 function 은패킷을무시한다. 만약그 function 의엔드포인트버퍼가비어있었고엔드포인트버퍼로데이터를넣었다면, 그것은성공적으로데이터를수신했다고호스트에알려주는 ACK 를제출한다. 만약엔드포인트버퍼가이전패킷을처리하느라비어있지않다면, 그 function 은 NAK 를반환한다. 그러나만약엔드포인트가에러를가지고있거나그것의 half bit 가설정되어있었다면, 그것은 STALL 을반환한다. Status Stage 는전체요청의상태를기록하며, 이역시전송방향에따라다양하다. 상 태기록은항상이 function 에의해서수행된다. IN : 데이터스테이지가데이터를받고있는동안에호스트가 IN 토큰을보내면, 호스트는반드시이데이터가성공적으로접수되었는지확인해야만한다. 이는호스트에의해수행되는데, OUT 토큰다음에길이가 0 인데이터패킷을보냄으로써수행된다. 이 function 은이제그것의상태를 handshaking 스테이지에서기록할수있다. ACK 는이 function 이명령을완료했음을알려주며, 다른명령을받아들일준비가된것이다. 만약명령을처리하는중에에러가발생하면, 이 function 은 STALL
을제출할것이다. 그러나만약이 function 이여전히처리중이라면, 그것은 NAK 를반환하는데, 이는호스트에게상태스테이지를나중에반복하라고알려준다. OUT : 만약호스트가데이터를전송하기위해데이터스테이지동안 OUT 토큰을보내면, 이 function 은 0 의길이를가진패킷을 IN 토큰에대한응답으로보냄으로써데이터의접수를확인할것이다. 그러나만약에러가발생하면, 그것은 STALL 을제출할것이다. 혹은여전히데이터를처리하느라바쁘다면, 그것은 NAK 를제출하는데, 이는호스트에게상태단계를나중에재시도할것을요청한다. Control Transfers : The bigger picture 자, 이모든것들이어떻게서로맞아떨어지는것일까? 예를들어, 호스트가 enumeration 동안 디바이스디스크립터를요청하기를원한다고하자. 보내진패킷들은다음과같다. 호스트는그 function 에다음에오는패킷이셋업패킷이라고알려주는셋업토큰을보낼것이다. Address 필드는호스트가디스크립터를요청하고있는장치의주소를보관할것이다. 엔드포인트번호는 0 이어야만하며, 이는기본파이프를의미한다. 그리고나서호스트는 DATA0 패킷을보낼것이다. 이는 8 바이트 payload 를가지는데, 이는 USB 명세의 9장에나와있는것처럼 Device Descriptor Request 이다. USB function 은그리고나서셋업패킷이에러없이올바르게읽
어들여졌음을확인해준다. 만약그패킷이 corrupt 를수신하면, 디바이스는이패킷을무시한 다. 그러면호스트는잠깐의딜레이후에패킷을다시보낼것이다. 1. Setup Token Address & Endpoint Number 2. Data0 Packet Device Descriptor Request 3. Ack Handshake Device Ack. Setup Packet 위의세패킷들은첫번째 USB 트랜잭션을표현한다. USB 디바이스는이제수신된 8 바이트를디코딩할것이며, 그것이디바이스디스크립터요청이라는것을확인할것이다. 그리고나서그디바이스는디바이스디스크립터를보내려고시도할것인데, 이것이그다음 USB 트랜잭션이될것이다. 1. In Token Address & Endpoint Number 2. Data1 Packet First 8 bytes of Device Descriptor 3. Ack Handshake Host Acknowleges Packet 1. In Token
Address & Endpoint Number 2. Data0 Packet Second 8 bytes of Device Descriptor 3. Ack Handshake Host Acknowledges Packet 1. In Token Address & Endpoint Number 2. Data1/0 Packet Last 8 bytes of Device Descriptor 3. Ack Handshake Host Acknowledges Packet 이경우에, 우리는최대 payload 가 8 바이트라고가정한다. 호스트는 IN 토큰을보내는데, 이는디바이스에게이엔드포인트를위한데이터를보낼수있다고말해준다. 최대패킷크기는 8 바이트이므로, 우리는 12 바이트디바이스디스크립터를보내기위해서청크로분할해야만한다. 각청크는마지막트랜잭션을제외하고는반드시 8 바이트여야한다. 호스트는우리가보내는모든데이터패킷에대한수신확인을한다. 일단디바이스디스크립터가보내지면, 상태트랜색션이뒤따른다. 만약트랜잭션들이성공적이었 으면, 호스트는 zero length 패킷을보낼것인데, 이는전체트랜잭션이성공적임을알려준다. 그 리고나서이 function 은그것의상태를알려주는이 zero length 패킷에응답한다. 1. Out Token
Address & Endpoint Number 2. Data0 Packet Last 8 bytes of Device Descriptor 3. Ack Handshake Host Acknowledges Packet Interrupt Transfers Isochronous Transfers Bulk Transfers 벌크전송은 large bursty 6 데이터를위해서사용될수있다. 그러한예는프린터로보내지는 print-job 이나스캐너로부터생성된이미지를포함할수있다. 벌크전송은데이터 payload 상에서 CRC16 필드의형태로에러교정을제공한다. 그리고데이터가에러없이송수신되는것을보장하기위한에러감지 / 재전송메커니즘을제공한다. 벌크전송은다른모든트랜잭션들이할당된후에버스상에서할당되지않은임시대역폭을사용할것이다. 만약버스가 isochronous 나 interrupt 때문에바쁘면, 벌크데이터는버스를통해느리게흘러갈수있다. 벌크전송의결과는시간에민감하지않은통신을위해서만사용될수있다. 왜냐하면지연 latency 에대한보장이존재하지않기때문이다. 6 Bursty 라는의미는순서가중요하지않은무작위함을의미하는것같다.
벌크전송은 크고무작위한데이터를전송하는데사용된다. CRC 를통해에러감지를한다, with guarantee of delivery. 대역폭이나최소지연에대한보장이없다. 스트림파이프이다 단방향이다. Full & high 스피드모드만지원한다. 벌크전송은 full & high 스피드디바이스만지원한다. Full 스피드엔드포인트에대해, 최대벌크패킷크기는 8, 16, 32, 64 바이트이다. High 스피드엔드포인트에대해, 최대패킷크기는 512 바이트까지이다. 만약데이터 payload 가최대패킷크기의절반으로떨어진다면, 그것을 0 으로채울필요는없다. 벌크전송은그것이요청된데이터의정확한총량을전송했을때와전송된 zerolength 패킷의최대엔드포인트크기보다적은패킷을전송했을때완료된것으로간주된다. 위의다이어그램은벌크 IN 트랜잭션과 OUT 트랜잭션의포맷을보여준다. IN : 호스트가벌크데이터를수신할준비가되어있을때, 그것은 IN 토큰을제출한다. 만약그 function 이에러와함께 IN 토큰을받으면, 그것은그패킷을무시한다. 만약토큰이올바로수신되면, 그 function 은보낼벌크데이터를포함하는 DATA 패킷을가지고응답하거나, 엔드포인트가에러를가지고있다는것을알려주는 stall 패킷을가지
고응답하거나, 호스트에게엔드포인트가동작하지만일시적으로보낼데이터를가지고 있지않음을알려주는 NAK 패킷을가지고응답한다. OUT : 호스트가이 function 에벌크데이터패킷을보내고자한다면, 그것은 OUT 토큰을제출하고, 그다음으로벌크데이터를포함하는데이터패킷을제출한다. 만약 OUT 토큰이나데이터패킷의어떠한부분이라도 corrupt 되면, 그 function 은그패킷을무시한다. 만약그 function 의엔드포인트버퍼가비어있고엔드포인트버퍼에데이터를쓰게되면, 그것은 ACK 를제출하는데, 이는호스트에게성공적으로데이터를수신했음을알려준다. 만약이전패킷을처리하느라엔드포인트버퍼가비어있지않으면, 그 function 은 NAK 를반환한다. 그러나만약엔드포인트가에러를가지고있었거나그것의 half bit 가설정되었으면, STALL 을반환한다. Bandwidth Management USB Descriptors Composition of USB Descriptors Device Descriptors Configuration Descriptors
Interface Descriptors Endpoint Descriptors String Descriptors The Setup Packet 모든 USB 디바이스들은기본파이프상의셋업패킷들에응답해야만한다. 셋업패킷들은디바이 스의방향과구성을위해서사용되며, USB 디바이스의주소를설정하고디바이스디스크립터를 요청하고엔드포인트의상태를확인하는것과같은공통 function 들을수행한다. USB 에부응하는호스트는모든요청들이 5 초안에처리되기를기대한다. 또한특정요청들에 대해서는더엄격한시간을요구한다 : 데이터스테이지를사용하지않는표준디바이스요청들은 50 ms 안에처리되어야한다. 데이터스테이지를사용하는표준디바이스요청들은요청후에 500 ms 안에데이터를반환하기시작해야한다. 각데이터패킷은이전패킷의성공적인전송에대해 500 ms 안에보내져야한다. 상태스테이지는마지막데이터패킷의전송후에 50 ms 안에완료되어야한다. ( 데이터단계를포함하는 )SetAdress 명령은 50 ms 안에명령을처리하고상태를반환해야한다. 그리고나서디바이스는다음요청이보내지기전에주소를변경하기위해 2 ms 를소비한다.
이러한시간제한들은가장느린디바이스들에서도받아들여질만하지만, 디버깅동안에는제약이있을수있다. 50mS doesn t provide for many debugging characters to be sent at 9600bps on an asynchronous serial port or for an In Circuit Debugger/Emulator to single step or to break execution to examine the internal Registers. 결과적으로 USB 는다른마이크로컨트롤러프로젝트들의그것과는약간다른디버깅기법을요구한다. 각요청은아래와같은포맷을가진 8 바이트길이의셋업패킷으로시작한다. bmrequesttype 필드는요청의방향, 요청의타입, 향하는수취인을결정할것이다. brequest 필드는만들어지고있는요청을결정한다. bmrequesttype 이보통파싱되며, 실행은표준디바이스요청핸들러와같은여러개의핸들러로분기된다. 표준인터페이스요청핸들러, 표준엔드포인트요청핸들러, 클래스디바이스요청핸들러등이있다. 셋업패킷을어떻게파싱하느냐는전적으로당신의취향에달려있다. 다른사람들은아마도 brequest 를먼저파싱하고각요청에기반해타입과수취인을결정할것이다. 표준요청들은모든 USB 디바이스들에대해공통적이며다음에올페이지에서세부적으로설명
될것이다. 클래스요청들은드라이버에대한클래스들에대해공통적이다. 예를들어 HID 클래스를허용하는모든디바이스는공통적인클래스한정효청들의집합을가지게될것이다. These will differ to a device conforming to the communications class and differ again to that of a device conforming to the mass storage class. 그리고나머지는모두제조사정의요청들이다. These are requests which you as the USB device designer can assign. 이것들은보통디바이스마다다르지만, 당신의구현과상상에달려있다. A common request can be directed to different recipients and based on the recipient perform different functions. A GetStatus Standard request for example, can be directed at the device, interface or endpoint. When directed to a device it returns flags indicating the status of remote wakeup and if the device is self powered. However if the same request is directed at the interface it always returns zero, or should it be directed at an endpoint will return the half flag for the endpoint. wvalue 와 windex 필드들은파라미터들이요청안에넘겨질수있도록해준다. wlength is used the specify the number of bytes to be transferred should there be a data phase. Standard Requests Standard Device Requests Standard Interface Requests Standard Endpoint Requests
Enumeration