# Rozhraní USB

**Specifikace USB**
- USB 1.0 - původní
- USB 1.1 - doplnění/upřesnění
	- rychlosti Low Speed (1.5 Mb/s) a Full Speed (12 Mb/s)
- USB 2.0
	- navíc High Speed (480 Mb/s) a další rozšíření (ping, ...)
- USB 3.0
	- navíc Super Speed (5 Gb/s), směrování paketů a další rozšíření
- USB OTG (On-The-Go)
	- doplněk k USB 2.0
	- rozšíření o komunikaci mezi dvěma zařízeními (bez počítače Host)

**Architektura USB**
- připojení pomocí USB má stromovou strukturu
- počítač je obvyhle Host (kořen)
- na dalších úrovních je buď zařízení nebo rozbočovač
	- USB 1.1 - max. 5 vrstev
	- USB 2.0 - max. 7 vrstev
- zařízení může mít více různých rozhraní (Interface)
	- např. CD může mít Audio CD a CD-ROM
- každé rozhraní má několik bran (Endpoint)
	- pro řízení a pro data

**Konektory a kabely**
- maximální délka kabelu LS = 3 metry (zpoždění 18 ns)
- maximální délka kabelu FS a HS = 5 metrů (zpoždění 26 ns)
- $Z_{0} = 90\Omega$

**Fyzická vrstva LS/FS**
- používá se diferenciální signál
- jeden pár vodičů pro oba směry
- elektrické úrovně na vodičích definují několik stavů (odlišné pro LS, FS, HS)
- stavy hodnot J, K a SE0

**Fyzická vrstva HS**
- rozšířená proti LS/FS
- budiče linky HS fungují jako zdroj proudu 0 nebo 17 mA
- napětí na lince (400/800 mV) závisí na zakončovacích odporech ($2 \times 45 \Omega$)
- detekce připojení HS - napřed jako FS, potom "HS chirp"
- detekce odpojení - zvýšení linkového napětí na 800 mV

## Přenos dat

**Kódování dat**
- kód NRZI
- po souvislém sledu 6 x 1 se vkládá 0 (bit stuffing) pro synchronizaci

**Formát paketu USB 1.1**
- začátek paketu (SOP) = přechod z klidového stavu (Idle) do K
- konec paketu (EOP) = 2x SE0 a přechod do klidového stavu (J)
- na začátku paketu synchronizační pole `0000 0001`
- za synchr. polem je 1 byte s typem paketu
- další obsah paketu závisí na jeho typu
- na konci paketu CRC 5 nebo 16 bitů (5, 2, 0 resp. 16, 15, 2, 0)

**Typy paketů**
1. pověřovací (Token Packet)
2. datové (Data Packet)
3. potvrzovací (Handshake Packet)
4. speciální (Special Packet)

**Transakce**
- obsahuje pakety **Token - Data - Potvrzení**
- některé nemají datový nebo potvrzovací paket
- transakce s odmítnutím
	- NAK indikuje nedostupnost dat (IN) nebo odmítnutí dat (OUT)

**Rámce**
- na USB 1.1 je přenosové kapacita rozdělena do rámců dlouhých 1 ms
	- při FS: 1 rámec = 12 000 bitových intervalů, tj. 1500 bytů
- na začátky rámce se vysílá SOF pro případnou synchronizaci zařízení

**Mikrorámce**
- na USB 2.0 (HS) je přenosová kapacita rozdělena do mikrorámců (125 μs)
	- při HS (480 MHz): 125 μs = 60 000 bitových intervalů, tj. 7500 bytů

**Typy přenosů**
- podle požadavků na přenos používány různé typy přenosu
+ **Setup** - nastavení / zjištění konfigurace zařízení
	- obecně fáze Setup - Data - Status
- **Isochronous** - přenos dat s dodržením požadované rychlosti přenosu
	- při konfiguraci se žádá o přenos Isochronous s určitou kapacitou, Host žádost akceptuje nebo zamítne
	- maximálně 1023 bytů v paketu (u HS: 1024 bytů)
	- v rámci maximálně 1 Isochronous paket pro každou bránu (endpoint) (u HS: 3 pakety)
	- nepotvrzuje se ACK/NAK
	- maximální přenosové rychlosti
		- **FS**: 1 paket a 1023 B x 1000 rámců/s = cca 1 MB/s (69% kapacity)
		- **HS**: 3 pakety a 1024 B x 8000 rámců/s = cca 24 MB/s (41% kapacity)
+ **Bulk** - přenos dat bez dodržení požadavku na rychlost přenosu
	- nemají zaručenou přenosovou rychlost
	- v paketu 8, 16, 32 nebo 64 bytů (HS: max. 512 bytů)
	- v jednom rámci libovolný počet transakcí na jednu bránu (endpoint)
	- maximální přenosové rychlosti
		- **FS**: 19 paketů a 64 B x 1000 rámců/s = cca 1.2 MB/s
		- **HS**: 13 pakety a 512 B x 8000 mikrorámců/s = cca 52 MB/s
- **Interrupt** - požadavek na přenos (token IN/OUT) se vysílá s nastavenou periodou

**Přidělování kapacity rámce**
- plánování provádí Host podle požadavků jednotlivých zařízení
- 90% kapacity rámce se přednostně přiděluje přenosům Isochronous a Interrupt (u USB 2.0 - 80%)
- 10% vyhrazeno pro řídicí přenosy (Setup)
- případný zbytek pro přenosy Bulk

**Kombinace LS/FS zařízení na USB 1.1**
- při komunikaci s FS jsou porty s LS zařízeními odpojeny
- při komunikaci s LS se porty LS připojí paketem PRE
- LS přenos je detekován i ve FS zařízeních

**Kombinace zařízení LS/FS/HS na USB 2.0**
1. Host/Hub je USB 1.1 (LS/FS), zařízení je USB 2.0 (HS).
	- zařízení se přizpůsobí a komunikuje podle USB 1.1 (FS)
2. Host/Hub je USB 2.0 (HS), zařízení je USB 1.1 (LS/FS).
	- port se zařízením se nastaví do režimu USB 1.1
	- Hub převede pakety z HS do LS/FS a naopak („Split“ transakce)

**Split Transakce**
- je zahájena paketem SSPLIT resp. CSPLIT
- Hub převede pakety HS na LS/FS a naopak

## Připojení zařízení

- po připojení musí mít zařízení funkční bránu 0 (Endpoint 0)
- Host přečte z brány 0 deskriptor konfigurace zařízení a přidělí mu unikátní adresu na USB
- Host přečte sadu deskriptorů pro jednotlivá zařízení, konfigurace, rozhraní a brány a nastaví vhodnou konfiguraci zařízení

**Deskriptory**
- každé zařízení má hierarchickou sadu deskriptorů, které popisují zařízení, konfigurace, rozhraní a brány
- čtou se ze zařízení po jeho připojení v procesu "enumerace"

**Třídy zařízení**
- každé zařízení má jedno nebo více rozhraní pro zařízení různé třídy a podtřídy (Device Class, Device Subclass) - zjistí se z deskriptoru
- pro každou třídu existují specifické drivery
+ Audio Class, Communication Device Class, Content Security Class, Human Interface Device Class, Image Device Class, IrDA Class, Mass Storage Class, Monitor Class, Physical Device Interface Class, Power Device Class, Printer Device Class, ...

**Napájení zařízení**
- po připojení může z USB odebírat maximálně 100 mA
- při konfiguraci maximálně 500 mA
- podle způsobu napájení se zařízení dělí
	- zařízení napájená jen z USB
	- zařízení napájená jen z vnějšího zdroje
	- zařízení napájená z USB a vnějšího zdroje

## USB 3.0

- základní rysy architektury odvozené od USB 2.0
	- typy přenosů stejné, tokeny v principu podobné
- doplněno směrování paketů a streaming
- pro rychlost Super Speed (5 Gb/s) přidány 2 páry SDP (5 kontaktů na konektoru)
	- každý pár určený pro jeden směr přenosu
- propracované nízkopříkonové režimy

**Architektura**
- oboustranně kompatibilní s USB 2.0

**Konektory a kabel**
- v kabelu 9 vodičů
	- 2 pro napájení
	- 2 vodiče UTP pro USB 1.1 a 2.0
	- 2x SDP (Shielded Differenmtial Pair) + GND pro USB 3.0
- délka kabelu max. 3 metry

**Linková vrstva**
- kódování 8 -> 10 bitů
- v kódu definovány speciální značky (K-symbols)
	- SKP (Skip), SDP (Start Data Packet), SHP (Start Header Packet), SLC (Start Link Command), EPF (End Packet Framing), ...
	- K-symbols mimo jiné označují začátek paketu

**Pakety**
- 4 typy paketů
- Link Management Packets (LMP)
	- nastavení konfigurace portu, test zařízení, ... (6 podtypů)
- Transaction Packets (TP)
	- řízení a potvrzování přenosů (ACK, NRDY, Stall, Ping, ...) (8 podtypů)
- Data Packets (DP)
	- dvě hlavní části - Header (DPH) a Payload (DPP)
- Isochronous Timestamp Packets (ITS)
	- vysílá Host do všech zařízení jako multicast (nemá Route String)
+ v záhlaví paketu Route String
	+ obsahuje max. 5 čísel portů, která se postupně použijí v jednotlivých úrovních hubů ve směru OUT

**Směrování paketů**
- HUB používá informaci Route String k určení portu, na který paket vyšle

**USB On-The-Go**
- pro propojení dvou zařízení (Device)
- zařízení jsou vybavena zásuvkami Mini AB
- strana A je implicitní host
- doplněny nové protokoly
	- protokol **HNP** (Host Negotiation Protocol) - průběžný převod zařízení z Host na Device a opačně
	- protokol **SRP** (Session Request Protocol) - žádost odpojených zařízení o zahájení komunikace

## Řadiče USB

- hardwarový řadič USB (Host Controller) má nad sebou několik vrstev ovladačů
+ **OHCI** (Open Host Controller Interface)
	+ definuje komunikaci mezi HC a HCD (Host Controller Driver) (pro USB 1.1)
+ **UHCI** (Universal Host Controller Interface)
	+ používá jiný typ HC s menší schopností plánování (plánování přenosů provádí HCD) (pro USB 1.1)
+ **EHCI** (Enhanced Host Controller Interface)
	+ pro USB 2.0

**OHCI**
- dva způsoby komunikace mezi HCD a HC
	- registry v HC
	- sdílená paměť (součást hlavní paměti)
		- HCD vytváří a udržuje seznamy deskriptorů
			- ED - Endpoint Descriptor (popisuje komunikaci s branami)
			- TD - Transfer Descriptor (popisuje jednotlivé přenosy)
		- ukazatele na seznamy deskriptorů jsou v registrech HC nebo v komunikační oblasti sdílené paměti (HCCA)

**Endpoint Descriptor**
- maximální délka paketu
- řízení a status (směr přenosu, ... )
- odkaz na seznam TD
- odkaz na další ED

**Transfer Descriptor**
- řízení a status
- adresa na začátku a konce datového bufferu
- odkaz na další TD
+ pro každý ED se použije jen první TD v seznamu
+ po dokončení přenosu se TD zařadí do seznamu dokončených přenosů

**Plánování přenosu**
- v první části rámce se přenáší Control a Bulk (min. 10% kapacity)
- po vyčerpání kapacity Control a Bulk se přenáší periodické přenosy (Interrupt a Isochronous)
- je-li volná kapacita na konci rámce, použije se Control a Bulk
- poměr mezi přenosy Control a Bulk se nastavuje v registrech HC