Gdzie dokładnie jest specyfikacja USB, która wyjaśnia, co zrobić, gdy kabel jest podłączony po raz pierwszy?

15

Wiem więc o specyfikacji USB 2.0 znajdującej się na stronie USB.org .

Jestem trochę leniwy i niecierpliwy. Czy ktoś może mi powiedzieć, gdzie się udać, aby dowiedzieć się dokładnie, czego oczekuje się od mojego urządzenia peryferyjnego po podłączeniu kabla USB?

Na przykład, jeśli moim urządzeniem peryferyjnym jest drukarka, jak mam powiedzieć komputerowi na drugim końcu, że drukarka (chyba z określonym opisem modelu) właśnie została podłączona? Niż w komputerze, skąd sterownik drukarki wie, który port USB został podłączony do drukarki?

Moja aplikacja to właściwie USB MIDI. Dostałem również ten dokument USB-MIDI , ale brakuje mi bardziej podstawowego protokołu USB.

Tylko dla informacji ludzi, układ USB, którego używam, to FTDI FT220x i jest podłączony do SPI ADSP-21479 SHArC. Teraz używamy go po prostu do komunikacji tekstowej za pomocą komputera PC (z uruchomionym TeraTerm) jako „konsoli” . Mam dostęp do kodu, który konfiguruje port SPI i łączy się z układem FTDI, ale nie ma kodu, który wykonuje początkową komunikację. Nie wiem, co robi FT220x po pierwszym podłączeniu do komputera.

Nie jestem niezadowolony z czytania i nauki, ale chciałbym wiedzieć, od czego zacząć czytanie, a specyfikacja 100 MB USB jest zbyt dużym celem, aby strzelać. Serdeczne podziękowania dla wszystkich za pomoc w działaniu.

Robert Bristol-Johnson
źródło
1
Więc jesteś ciekawy, co FTDI FT220x robi za kulisami, prawda? Ponieważ FTDI dba o wiele urządzeń USB, istnieją również pewne ograniczenia tego, co pozwoli ci zrobić. Od jakiegoś czasu korzystałem z rodziny FT2232H, postaram się wyjaśnić, co wiem ...
MarkU,
to, co ostatecznie staram się zrobić, to użyć tego portu USB, który jest już wystarczająco inteligentny, aby przesyłać tekst tam iz powrotem na komputer z systemem TeraTerm. Chciałem użyć tego samego złącza USB, aby wykonać USB MIDI. Muszę zrozumieć, jak „spakować” dane w pakiet 32-bitowy, ale pomyślałem (i nadal myślę), że musi istnieć jakiś protokół, który mówi drugiemu końcowi, że jest to urządzenie USB MIDI. (do tej pory po prostu nie posiadam podstawowych danych na temat USB, a twoja odpowiedź wydaje się bardzo pomocna, aby mi pomóc.)
Robert Bristol-Johnson

Odpowiedzi:

21

USB ma kilka warstw, które są opisane w specyfikacji USB 2.0 . Jeśli znasz warstwowy model sieci OSI, możesz pomyśleć o tym w następujący sposób:

  • Warstwa sesji = Rozdział 10 Sprzęt i oprogramowanie hosta USB (sterowniki urządzeń)
  • Warstwa transportowa = Rozdział 9 Struktura urządzenia USB
  • Warstwa sieci = Rozdział 8 Warstwa protokołu (strumień bitów)
  • Warstwa łącza danych = rozdział 7 elektryczny (obwód)
  • Warstwa fizyczna = Rozdział 6 Mechaniczny (kabel i złącze)

Koncepcyjnie USB opiera się na strumieniach danych, zwanych punktami końcowymi , które mogą być IN (do hosta) lub OUT (z hosta). Każde urządzenie ma punkt końcowy 0, który służy do kontroli i statusu. Urządzenie może mieć dodatkowe punkty końcowe dla danych aplikacji. Każdy punkt końcowy zachowuje się jak bufor FIFO.

Dane są przesyłane na punkt końcowy albo jako Bulk (jak TCP / IP, co gwarantuje, że każdy bajt przybywa i we właściwej kolejności), lub Isochronous (jak UDP / IP, gwarantuje, że jest świeży, ale może upuszczać pakiety). Istnieje myląco nazwany typ przesyłania „ Przerwanie ”, który tak naprawdę jest odpytywany przez hosta.

USB 2.0 używa pary różnicowej dla łącza danych. Nie będę wchodził w szczegóły, ponieważ jest to omówione w rozdziale 7 specyfikacji USB 2.0. Ogólnie w układzie PCB traktujemy to jako parę różnicową o dopasowanej długości i wkładamy rezystory szeregowe wymagane przez dowolny USB PHY (fizyczny Interfejs) jest używany. Urządzenie peryferyjne USB wykorzystuje rezystor o wysokiej wartości na jednej z linii D + lub D-, aby powiadomić hosta, że ​​jest to urządzenie peryferyjne o dużej lub niskiej prędkości.

Wkrótce po tym, jak host USB odkryje, że urządzenie jest obecne, host żąda od urządzenia kilku deskryptorów . Zajmuje się to za kulisami układ FTDI. Deskryptory opisano w rozdziale 9.5 . Należą do nich urządzenia deskryptora , konfiguracja deskryptora , interfejsu deskryptorów , Endpoint deskryptorów , String deskryptorów , może nawet HID Zgłoś deskryptorów .

Device Descriptor zawiera USB VID (Vendor Identification) i PID (Identyfikacja produktu) liczb. System operacyjny wykorzystuje tę parę liczb, VID_PID, do ustalenia, który sterownik urządzenia będzie używany dla tego urządzenia. Pamiętaj, że numer VID jest wydawany przez członkostwo w forum implementatorów USB, więc jest to pewien problem, jeśli jesteś indywidualnym wynalazcą.

Ponadto istnieje sterownik klasy HID (Human Interface Device), który zapewnia nieco ogólne wejście dla klawiatury / myszy / itp., A także dowolne ogólne wejście / wyjście. Jedną z zalet HID jest to, że nie wymaga dostarczenia niestandardowego sterownika urządzenia, ale jego przepustowość jest nieco ograniczona w porównaniu do niestandardowego sterownika zbiorczego. Istnieje cały inny dokument specyfikacji na temat deskryptorów HID; oraz dokument Tabeli użytkowania HID, który wyszczególnia wszystkie numery kodów opisujące różne funkcje dostępne w danym ludzkim urządzeniu z interfejsem.

Układ FTDI, taki jak arkusz danych FT220X, zapewnia „silnik interfejsu szeregowego” USB (nie mylić z szeregowym SPI lub szeregowym RS232). Zajmuje się tym większość niskopoziomowych rzeczy opisanych w rozdziałach 6, 7 i 8.

FTDI używa EEPROM (offchip na FT2232H, on-chip na FT220X), aby zawierać trochę informacji, które trafiają do deskryptorów. Możesz dostosować wartości VID / PID i podać niestandardowe ciągi opisu.

MarkU
źródło
6
Podobało mi się podsumowanie. Musiałem przeczytać specyfikację CAŁA 2.0 (ponad 1000 stron, jak pamiętam) przez kilka tygodni, ponieważ musiałem sam to wszystko wymyślić. To nie było przyjemne doświadczenie, muszę powiedzieć. (W moim przypadku nie można użyć HID.) Brak dobrych książek na ten temat. I nienawidził książkę Jana Axelson jest na USB i rozważyć jej książkę „niemal całkowicie bezużyteczny” dla kogoś, próbuje zrobić tę pracę jako wbudowany mikro od podstaw. W przeciwnym razie jest to w większości bezwartościowe. Jeśli znasz dobrą książkę dla realizatora (niestandardowy sprzęt), chętnie usłyszę tytuł !! +1
jonk
1
W zależności od potencjalnego rynku Op, VID / PID jest największym wyzwaniem. Korzystanie z metodologii Axelsons działa w tym sensie, że możesz użyć jej VID (który kosztuje 3,5 tys. USD we własnym zakresie) i zażądać jednego lub więcej jej PID za darmo. Możesz także poprosić o PID od organizacji takich jak Microchip / Atmel, FTDI i TI (na podstawie ich VID). Najlepsza książka IMO to Intels „USB design by example”, jest trochę długi w zębie, ale dobry dla USB 2.x. Niestety wiele przykładów kodu psuje się z powodu zmian w Visual Studio w wyniku jego zmian.
Jack Creasey,
1
Najlepszym sposobem na uzyskanie dostępu do VID / PID dla hobbystów jest użycie LUFA (która jest bezpłatna): fourwalledcubicle.com/files/LUFA/Doc/130303/html/ ... ..... nie można ich używać w produktach komercyjnych, ale są dobre do użytku domowego / demonstracyjnego, gdzie można w dużym stopniu kontrolować kolizje.
Jack Creasey
1
PS. Świetnym wprowadzeniem jest użycie „Przykładowego wbudowanego USB: wydanego przez FTDI: ftdichip.com/Support/Documents/TechnicalPublications/ ... ... zawiera wiele użytecznych przykładów (opartych oczywiście na urządzeniach FTDI) i wszystkich powiązanych pliki robocze, w tym użycie kontrolerów PSOC
Jack Creasey,
1
Należy pamiętać, że jeśli urządzenie USB jest zasilane samodzielnie, musi odczekać, aż napięcie VBUS zostanie wykryte, zanim zastosuje rezystor podciągający D + lub D-. Nie udało mi się uzyskać certyfikatu w tej sprawie.
Adam Haun
4

Zachowanie i interakcja „partnerów” USB (hosta i urządzenia) jest rozproszona w specyfikacji USB. Najlepszym sposobem na uzyskanie uzasadnienia jest przyjrzenie się „ramie urządzeń”, rozdział 9, która opisuje możliwe (obowiązkowe) stany urządzeń (Rysunek 9-1), oraz ramce Host (i Hub), w rozdziałach 10 i 11. Ignorowanie szczegóły protokołu (potoki / typy transakcji / abstrakcyjne warstwy protokołu OSI, układ PCB itp.), lepszą kontrolę początkowej interakcji można uzyskać, studiując schemat stanu portu (Rysunek 11-10).

Zasadniczo, jeśli kabel nie jest podłączony między hostem a urządzeniem, porty hosta znajdują się w „stanie zasilania” (VBUS jest włączony), ale „rozłączone”. Przewody D + i D- są utrzymywane na niskim poziomie dzięki 15-stopniowym opadaniom.

Po podłączeniu kabla VBUS przechodzi do urządzenia. Urządzenie rozpoznaje, że jest podłączone, i sygnalizuje zdarzenie „połącz”, pociągając WYSOKI jeden z przewodów D, D +, jeśli jest to urządzenie FS / HS, i D-, jeśli jest to urządzenie LS.

Przeciągnij przewody D +/- na określonym porcie, co powoduje przerwanie oprogramowania hosta, zgłaszając „zmianę statusu portu”. Oprogramowanie hosta (zazwyczaj ehci.sys) następnie inicjuje sekwencjonowanie „resetowania portu” na tym konkretnym porcie. Po pomyślnym zakończeniu „resetowania portu USB” port hosta jest włączony do komunikacji USB. Port staje się aktywny (pakiety ramki zaczynają wypływać).

Za pomocą protokołu USB host przypisuje unikalne adresy do tego urządzenia i odczytuje „deskryptor urządzenia”. Rozpocznie się proces „wyliczenia urządzenia”. Deskryptor urządzenia zawiera informacje o tym, do której klasy urządzenia należy (HID, COM, MIDI, drukarka itp.) Oraz VID / PID tego konkretnego urządzenia, a także kilka innych informacji, patrz Tabela 9-8.

Po uzyskaniu klasy urządzenia i identyfikatora VID / PID oprogramowanie hosta próbuje dopasować te informacje do rejestru urządzeń i ładuje odpowiedni sterownik URZĄDZENIA, ogólny lub specyficzny dla dostawcy (jeśli istnieje). Następnie sterownik urządzenia kończy proces wyliczania, wybierając interfejs urządzenia kończący się ustawieniem „konfiguracja urządzenia”. Oczywiście cała komunikacja USB jest rozpoznawana tylko za tym konkretnym portem , nawet jeśli wszystkie pakiety są nadawane do wszystkich włączonych portów.

Powyżej przedstawiono ogólne ramy protokołu połączenia USB. Pakowanie danych do określonego celu (np. MIDI) to inna historia i jest obsługiwane zarówno na poziomie aplikacji, jak i na poziomie sterownika urządzenia, jeśli system uzyska odpowiednią klasę urządzenia. Aby uzyskać natywną komunikację MIDI, urządzenie musi mieć tę klasę w deskryptorze i przestrzegać wszystkich definicji klas MIDI .

Ale..chenski
źródło