Jak działa USB?? :P

Witam!!

Takie jedno pytanie, dosyć ogólne... . Ściągam właśnie specyfikację USB, ale obawiam się, że ciężko mi będzie przez to przebrnąć :/... . Może ktoś w skrócie mi napisać, co się dzieje w momencie podpięcia urządzenia USB do kompa, kiedy np. Windows wykrywa urządzenie?? Chodzi o to, że mam uszkodzony skaner, Windows wykrywa go jako "nieznane urządzenie" :P... . I tak mnie zastanawia - jak on to robi, że w ogóle wykrywa podpięcie urządzenia - jakieś sygnały muszą tam iść :D... . Tylko co jest skopane, że skaner nie działa?? :>... . Z góry dzięki za wszelką pomoc :D... .

Pozdrawiam Konop

Reply to
Konop
Loading thread data ...

Niezle niezle :))))

Moze najpierw zainstaluj sterowniki. (?)

Sebastor

Reply to
Sebastor

Obawa dobrze uzasadniona. :-)

Do linii D+ albo D- (zależnie od prędkości urządzenia) w urządzeniu jest podpięty opornik 1k5 do Vdd i to pozwala hostowi na wykrycie podłączenia urządzenia. Reszta już idzie programowo: SIE urządzenia jest resetowane i otrzymuje adres 0, a host przesyła sekwencję 0x80 0x06 0x00 0x01, oznaczającą polecenie GET_DEVIVE_DESCRIPTOR, nakazującą urządzeniu bardzo skrótowe przedstawienie się. Następnie idzie sekwencja 0x00 0x05 addr, czyli nakazanie urządzeniu przyjęcia adresu addr, a później na ten adres są wysyłane sekwencje 0x80 0x06 0x00 N, gdzie N to identyfkator deskryptora, na co urządzenie odpowiada swoim opisem w postaci m.in. napisu w 16-bitowym Unicode, który następnie widać w managerze urządzeń, opisuje architekturę logiczną endpointów, informuje o swoich możliwych konfiguracjach (a może być ich dużo) i enumeracja się kończy, a zaczyna faza normalnej parcy urządzenia.

Pozdrawiam Piotr Wyderski

Reply to
Piotr Wyderski

Oj tak... :-)))

Nie pomogą, urządzenie powinno się przedstawić bez sterowników

-- w takiej sytuacji w managerze USB masz okienko z napisem "Wykryto nowe urządzenie XYZ, czy zainstalować sterowniki?", ale nazwa XYZ jest przesyłana do hosta w fazie enumeracji, która jest standardowa i sterowników nie wymaga. Pytający napisał o nieznanym urządzeniu, a zakładając, że nie buduje tego skanera sam, tj. kiedyś enumeracja działała poprawnie, a teraz nie, to wypada przyjąć, że skaner padł na amen.

Pozdrawiam Piotr Wyderski

Reply to
Piotr Wyderski

Tak to jest, jak się chce komuś oszczędzić roboty :/... . Pytanie było skrótowe!! Otóż.. sterowniki zainstalowałem, ale po włączeniu oprogramowania dowiaduję się, że skanera nie znaleziono. Tak, jakby w ogóle nie był podpięty... . Można mieć wrażenie, że elektronika jest cała zjarana i tyle :P... Ale nie... jak podpina się skaner, to system wykrywa "nieznane urządzenie".... . Czyli coś tam jednak działa... . I chciałem po prostu zapytać, czym się różni komunikacja między kompem a skanerem w momencie wykrywania urządzenia od komunikacji w czasie dalszej pracy?? I czym może być spowodowane to, że skaner nie jest wykrywany jako skaner tylko nieznane urządzenie. Czy teraz pytanie wydaje się być bardziej logiczne?? :P... Z resztą... mały dodatek :D.. Kumepl kupił skaner na Allegro, bo potrzebuje pilnie i nie ma kasy... . Uznał, że zaryzykuje, jeśli uda mi się to naprawić, to kiedyś mi coś odpali... . Tyle tylko, że nie dowiedział się, co jest nie tak :P... . Znalazłem jedną usterkę - szkodzone były tranzystory zasilające silnik krokowy. Wymieniłem wszystko, powinno już działać, ale teraz system nie wykrywa skanera!! I jestem po prostu ciekawy, gdzie mogę szukać przyczyny problemu?? Może po prostu najprawdopodobniej wina leży po stronie sterowników i błędnej konfiguracji systemu?? :>... .

Pozdrawiam Konop

Reply to
Konop

Owszem. Wspomniany opornik, kabel USB i gniazdko. :-D

Numerami endpointów i trybem transmisji, ale w Twoim przypadku to nie ma znaczenia, bo do tej fazy nie dochodzisz.

Pozdrawiam Piotr Wyderski

Reply to
Piotr Wyderski

Dzięki, takiej właśnie odpowiedzi potrzebowałem!! :D... . Po prostu myślałem, że USB wykorzystuje nieco "mądrzejszy" sposób wykrywania urządzenia niż opornik i wtedy znaczyłoby to, że coś działa :D... A tak - jasne jest, że pewnie padł scalak za to odpowiedzialny :D... . No nic, dzięki wielkie za pomoc!! :D...

Pozdrawiam Konop

Reply to
Konop

Dla LS lub FS. Dla Hs jest specjalny protokół (Chirp J K i takie tam).

brakuje kilku bajtów do ośmiu. Requesty zawsze są ośmio bajtowe.

Potem GET_CONFIGURATION -"krótka" konfiguracja Potem GET_CONFIGURATION -"długa" konfiguracja

Potem zapytanie "stringi" Stringi nie są obowiązkowe. Różne Systemy Operacyjnie w różnej kolejności to pobierają, nie ma reguły. Jak host już wszystko wie o urządzeniu to wysyła SetConfiguration i od tego momentu urządzenie działa wg ustawionej konfiguracji. Najczęściej wg jakieś klasy: np Mass Storage, Audio , HID czy innej.

Mister

Reply to
Mister

Owszem, długość i takie tam "nieistotne" rzeczy.

To prawda, wg specyfikacji kolejność nie jest obowiązkowa. To Windows XP wysyła w takiej, jak napisałem.

Tylko wychodzi na to, że my się niepotrzebnie rozpisujemy na temat protokołu, bo odpowiedź poprawna brzmi "opornik". :-)

Pozdrawiam Piotr Wyderski

Reply to
Piotr Wyderski

A pod linuxem to dopiero ciekawie to wygląda;-)

ok EOT.

M
Reply to
Mister

Czy moglbys troche szerzej? Wlasnie probuje zrobic softowego klienta usb i ciekawi mnie jak proces enumeracji wyglada w linuxie.

gr

Reply to
gr

Oj, chyba nie. :-( Właśnie próbuję zaprogramować AT89C51SND1C w roli USB mass storage device i urządzenie nie chce mi przejść procesu enumeracji. Odbiór danych z EP0 działa, zakładam, że wysyłanie też, bo jeśli procedura wysyłająca jest aktywna, to dostaje więcej parametrów od hosta. Parametry w poniższych liniach są zgodne z ich miejscem w pakietach wysłanych przez hosta. Oto cała komunikacja widziana przez urządzenie:

request ID = 80 command id = 6 (0 1) (requested_len = 64, to_send = 18)

// GET_DESCRIPTOR, DEVICE_DESCRIPTOR, max. 64 bajty do wysłania, // 18 bajtów rzeczywistych danych do wysłania

request ID = 0 command id = 5 new_address = 2

// SET_ADDRESS

request ID = 80 command id = 6 (0 1) (requested_len = 18, to_send = 18)

// GET_DESCRIPTOR, DEVICE_DESCRIPTOR

request ID = 80 command id = 6 (0 2) (requested_len = 9, to_send = 9)

// GET_DESCRIPTOR, CONFIGURATION_DESCRIPTOR

request ID = 80 command id = 6 (0 3) (requested_len = 255, to_send = 4)

// GET_DESCRIPTOR, STRING_DESCRIPTOR, LANG_ID

request ID = 80 command id = 6 (3 3) (requested_len = 255, to_send = 22)

// GET_DESCRIPTOR, STRING_DESCRIPTOR, SN_INDEX

I tu się zaczyna coś dziwnego dziać, bo polecenia się powtarzają:

request ID = 80 command id = 6 (0 2) (requested_len = 255, to_send = 9)

// GET_DESCRIPTOR, CONFIGURATION_DESCRIPTOR

request ID = 80 command id = 6 (0 1) (requested_len = 64, to_send = 18) request ID = 0 command id = 5 new_address = 2 request ID = 80 command id = 6 (0 1) (requested_len = 18, to_send = 18)

itd., jak wyżej, po czym komunikacja się zatrzymuje. Co może być powodem takiego zachowania się układu? Na pewno nie przychodzi żadna nieobsłużona komenda, bo mam w odpowiednim miejscu wstawione printf, które takie rzeczy wyłapie.

Czy istnieje jakiś program pod Windows, który umożliwia pooglądanie transmisji na szynie od strony hosta poczynając od samego początku, tj. enumeracji? Taki, który pozwala pooglądać transmisję rozpoznanego urządzenia znalazłem, ale do tego etapu jeszcze nie doszedłem. ;-(

Pozdrawiam Piotr Wyderski

Reply to
Piotr Wyderski

Polecam BusHound. Wersja darmowa ma ograniczenie chyba do 14 dni. Może podglądać praktycznie wszystko, co widać w Menadżerze Urządzeń - czyli podglądasz np. hub'a, do którego podłączasz urządzenie oraz komunikację z samym urządzeniem.

BTW: Wersja darmowa ma też kilka innych upierdliwych ograniczeń, m.in. podglądanie tylko pierwszych 8 bajtów danych (ale wystarczy do debugowania enumeracji na USB) i ograniczenie liczby logowanych ramek. Natomiast wersja niedarmowa kosztuje dużo za dużo. :-(

Reply to
Adam Dybkowski

Już hula aż miło popatrzeć -- miałem 2 błędy w obsłudze GET_DESCRIPTOR, a konkretnie w fazie CONFIGURATION posyłałem tylko tyle bajtów, ile miał pierwszy deskryptor w konfiguracji, a nie tyle, ile ma cała konfiguracja. Drugi błąd to żądanie obsługi magistrali USB 10.1 zamiast 1.1. :->

Teraz urządzenie zatrzymuje się z błędem na nieznanej mu jeszcze komendzie SET_CONFIGURATION, ale w Managerze Urządzeń widać już Mass Storage Device, a nie Nieznane Urządzenie. :-) Tylko ciekawe dlaczego host robił nawrót w pobieraniu niepoprawnej konfiguracji po pobraniu kilku innych komend, a nie od razu resetował SIE...

Dziękuję, zaraz sobie poszukam. :-) Ja znalazłem HHD Software USB Monitor i działa bardzo dobrze (dla testu podsłuchiwałem modem ISDN :->), ale enumeracji nie udało mi się w nim podglądać.

Pozdrawiam Piotr Wyderski

Reply to
Piotr Wyderski

hehe to dlatego ostatni kolega opowiadal ja to siedzi przed kompem i mu nagle wyskakuje "nieznane urzadzenie", a to jego corka gryzie wtyczke od usb :)

pozdr sobol

Reply to
Sobol

Dlatego wspomniałem wczoraj o krótkiej konfiguracji i o długiej.

zasadniczo nic nie trzeba robić jak masz jedną konfigurację, oczywiście trzeba go formalnie obsłużyć.

Tak już to windows robi, dlatego łatwiej oprogramować hosta aniżeli device;)

Mister

Reply to
Mister

a wyglądą podobnie jak w windowsach tylko inna kolejność i bardzo dziwne ilości danych są przesyłane podczas enumeracji, można się naciąć.

Mister

Reply to
Mister

Właśnie chodzi o to, że wczoraj jeszcze tej obsługi nie było. ;-) Dziś już jest i host próbuje mi posyłać jakieś komendy SCSI, ale nie zrobiłem jeszcze odpowiedniej procedury, więc po kilku próbach Windows się poddaje. Enumeracja chyba jednak się udała, bo nic oprócz komend z endpointu 2 nie przychodzi, a w managerze jestem Manufacturerem. ;o)

Niestety przez takie zachowanie szukałem błędu tam, gdzie go nie było, bo "wykonane" polecenie uznałem za obsłużone poprawnie.

Pozdrawiam Piotr Wyderski

Reply to
Piotr Wyderski

Pierwszą komendą jest INQUIRY na którą trzeba odesłać 44 bajty danych.

M
Reply to
Mister

Moje urządzenie USB jest już obsługiwane całkowicie poprawnie, przechodzi fazę enumeracji i wyświetla wszystkie podane przeze mnie stringi. :-)

Zgadza się, 0x12. Mam jeszcze dwa pytania, bo jeszcze nigdy nie oprogramowywałem Mass Storage Device:

  1. W jaki sposób powinienem obsłużyć komendę FORMAT, zakładając, że nośnikiem jest karta CF?
  2. Uprzedzając fakty: niedługo powinienem zabrać się za software radio, a tam USB też trzeba będzie oprogramować. Tylko pytanie, jaką klasę powinienem dla niego wybrać, zakładając, że są dwa _strumienie_ danych: wejściowy i wyjściowy. USB Communication Device, czy coś innego?

Pozdrawiam Piotr Wyderski

Reply to
Piotr Wyderski

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.