Skocz do zawartości

USB - założenia "konsoli KVM"


H1M4W4R1

Pomocna odpowiedź

Wstęp

Witajcie, naszedł mnie pomysł, by zrobić sobie coś w rodzaju konsolki KVM pod USB (chodzi mi głównie o klawiaturę / myszkę). Rozmyślałem chwilę nad sterowaniem liniami danych, bo zasilanie to nie jest problem (zewnętrzne) i zastanawiałem się czy da radę sterować nimi przy użyciu N-MOS Bidirectional Switch

Teoretycznie rezystancja N-MOS (rDSon) to 10-20mΩ, więc nie powinna znacząco wpłynąć na stabilność linii dla USB HS. Oczywiście płytka PCB z kontrolą impedancji 90R differential 8mil distance. Niestety martwię się pojemnością MOS, która jest dość duża, co daje dość sporą szansę, że nie zadziała.

Proponowane rozwiązanie

Stąd alternatywa - rozważam zastosowanie tego MAX4899 (lub innego MUX'a USB (albo drabinki MUX'ów, chociaż to może się źle skończyć)). Posiada 3/4 wyjścia USB, więc teoretycznie jest całkiem dobrym rozwiązaniem. Z tego co wiem USB jest dwukierunkowe, więc nie powinienem się przejmować orientacją przepływu danych - pod port USB_COM podłączony będzie HUB USB. Pod porty USB(n) konkretne kontrolowane urządzenia.

Chciałbym też mieć prawdopodobnie kontrolę nad kilkoma urządzeniami, ale do tego wykorzystam układ HS8836(A) - w zależności od dostępności. (strona device będzie posiadała wbudowany HUB USB bazujący na powyższym układzie. Jakby ktoś się zastanawiał nad wyborem tego układu - mam na blacie aktualnie huba na tym chipie, który działa całkiem dobrze, więc zawsze jest referencja.

usb_control.thumb.png.c7231135d01c8bbccb9cabae6090579a.png

Wszystko będzie kontrolowane przez (tu wybierz MCU, prawdopodobnie RP2040) 😄 [nie ma go na powyższym schemacie, bo nad jego implementacją muszę się zastanowić czy chcę MCU na płytce (wtedy wybór pójdzie w STM32(cośtam) czy na pająku (wtedy RP Pico)]

Założenia:

1. to jest urządzenie do zastosowania prywatnego, więc zgodność ze standardami nie jest aż tak mocno oczekiwana 😄 
2. z
astosowanie HS8836A powoduje automatycznie, że wszystkie urządzenia podłączone pod rozdzielacz mogą mieć (bodajże) 5m kabla (specyfikacja USB, hub jest buforem sygnału). Zwykle będzie to coś rzędu 1-1.5m (chyba mam tylko jeden kabel dłuższy niż 3m - do drukarki 3D). Jest to dość przyjemne rozwiązanie konstrukcyjne.
3. dzięki zastosowaniu HUB'a USB mogę podłączyć sobie do 4 urządzeń łączących się z jednym hostem (wybranym)

Pytania:

1. czy połączenie MUXów szeregowo wpłynie negatywnie na działanie układu w sposób znaczący (w teorii)
2. czy są jakieś inne wady w moim rozumowaniu?
3. czy takie coś ma rację bytu? 😄 
4. Czy tragiczny pinout TS3USB30 będzie znaczącym wrzodem przy projektowaniu PCB? (bo przy lutowaniu to i tak idzie na pastę Sn42Bi58 😄)

P.S.

Jakby ktoś zastanawiał się czemu - jak byście ciągle przełączali urządzenia między dwoma komputerami to byłoby to prostsze do zrozumienia 😉

  • Lubię! 2
Link do komentarza
Share on other sites

Niestety z USB nie jest tak prosto, wypada niestety usiąść i trochę doczytać. Rozumiem, że nie zależy ci na "zgodności ze standardami", ale dobrze by było, żeby to jednak mimo wszystko działało. Producentom sprzętu USB też nie zależy na zgodności.

Na początek, USB jest protokołem ze stanem wewnętrznym, więc nie możesz sobie po prostu w losowym momencie przełączać linii sygnałowych tranzystorem. Za każdym razem musi nastąpić enumeracja i inicjalizacja, a żeby to wymusić musisz też sterować liniami zasilania.

Po drugie, USB jest protokołem "dwukierunkowym" w tym sensie, że wymaga komunikacji w obu kierunkach, ale nie w tym sensie, że jest mu wszystko jedno co jest w jakim kierunku połączone. Zawsze masz "host" i "device" i komunikacja wygląda zupełnie inaczej w zależności od tego.

KVM-y kupne zazwyczaj nie przełączają urządzenia USB (to by trwało za długo i śmieciło w logach), tylko same udają, że są klawiaturą i myszką i "tłumaczą" to, co dostają od podłączonej klawiatury i myszki — dlatego nie działają z innymi urządzeniami USB. Zdarzają się KVM-y, które mają jeden lub więcej "prawdziwy" port USB, ale tam jest wtedy praktycznie symulowanie wyciągnięcia wtyczki i przepięcia do innego gniazdka.

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

(edytowany)
18 godzin temu, deshipu napisał:

żeby to wymusić musisz też sterować liniami zasilania

To da się zrobić zwykłym N-MOS'em - odłącz zasilanie podłącz zasilanie. Dwie operacje 😉 Człowiek rozpędzony twórczością zapomniał, że USB ma enumerację, która jest najgorszym co można było stworzyć i najlepszym co można było stworzyć... (taka wadozaleta)...

18 godzin temu, deshipu napisał:

wszystko jedno co jest w jakim kierunku połączone

Tutaj akurat miałem na myśli schemat wewnętrzny MUX'a USB, który wygląda jakby był dwukierunkowy (i tak wynika ze specyfikacji USB, bo czasem sygnały kontroluje host, czasem device, podobnie jak w SPI czy 1-Wire). To, że jedno urządzenie to host, drugie device to oczywiste.

18 godzin temu, deshipu napisał:

KVM-y kupne zazwyczaj nie przełączają urządzenia USB (to by trwało za długo i śmieciło w logach)

Logi moich komputerów i tak są zaśmiecone 😄 Parę enumeracji USB w lewo czy w prawo...
Sarkastyczny żart: nic nie przebije logów z SCP Secret Labolatory (gra na Steam) - kiedyś usuwałem 400GB logów z serwera, bo nie były usuwane automatycznie

18 godzin temu, deshipu napisał:

praktycznie symulowanie wyciągnięcia wtyczki i przepięcia do innego gniazdka

Czyli powiadasz, że powinienem zrobić to w tej kolejności:
1. odłącz zasilanie USB (od urządzeń) (np. mosfetem logic-level)
2. odczekaj
3. podmień porty USB w MUX'ie
4. odczekaj
5. podłącz zasilanie USB 
6. PROFIT

Ofc też sterowanie zasilaniem od strony hosta.

Technicznie wtedy USB będzie odłączone w trakcie podmiany portów, więc przełączenie powinno działać całkiem sprawnie i powinno się enumerować od zera na odpowiednim hoście.

18 godzin temu, deshipu napisał:

to by trwało za długo

Nie zależy mi na szybkości - to bardziej projekt utility (używany raz na 15-30 minut, by się przełączyć hardware'owo na drugie urządzenie). Dodatkowo zależy mi odrobinę na "realnym" porcie USB by przełączyć np. klucz sprzętowy.

18 godzin temu, deshipu napisał:

wypada niestety usiąść i trochę doczytać

Doczytać i zrozumieć to dwie bardzo różne rzeczy 😉 

18 godzin temu, deshipu napisał:

Producentom sprzętu USB też nie zależy na zgodności.

Co innego produkt na rynek, co innego do użytku własnego... Rozumiem jak ktoś oleje impedancję dla USB Full Speed, bo "i tak zadziała", sam tak zrobiłem, bo byłem zbyt leniwy na to (dopasowałem ją wyłącznie w przybliżeniu +/- 1mil, ale ścieżki mają < 1cm między wtykiem, a MCU i to tylko przez diodę ESD i rezystory pomiarowe, więc długość ścieżek z matched impedance to w rzeczywistości coś rzędu 2-3mm). Nie rozumiem za to pomijania diody ESD... to już zakrawa o pomstę do nieba 🙂 

Plus ostatnio czytałem to, ale muszę chyba powtórzyć lekturę.

image0.thumb.jpg.d6f73713d2304d7ce9b6c776172214cd.jpg

Jakby ktoś tutaj trafił przypadkiem - polecam książkę, tylko jak widać trzeba ją parę razy przeczytać 😉 

@deshipu I dzięki za pomoc.

EDIT: 5/2/2020 18:43

Schemat

Taki wstępny schemat zaprojektowałem (PDF w załączniku). Jeszcze muszę doczytać i sprawdzić czy nie zrobiłem gdzieś jakiegoś durnego błędu 🙂 

HUB USB był bazowany na tanich chińskich hub'ach 2.0 (rozłożyłem jeden i odbudowałem jego płytkę, miała tylko jedną warstwę).

Switch USB: TS3USB221

Założenie jest takie, by odłączyć całkowicie zasilanie od HUB'a (PWR_ON = HIGH) (oprócz 3.3V), przełączyć linię "S", co przełączy automatycznie I/O w TS3USB221 na drugi port. Potem przełączyć ponownie linię PWR_ON na LOW, po czym nowy host powinien wykryć HUB USB i go enumerować. Niestety dokumentacja HS8836A jest dość biedna. Oprócz kopiowania płytki spróbowałem coś wygrzebać i znalazłem Sample Application. W innym miejscu znalazłem, że REXT powinien mieć 10k, ale to kwestia przelutowania jednego rezystora, więc dałem wedle schematu.

ezgif.com-gif-maker.png

Jako, że nie mam stosownej obudowy, to Shield USB zostawiam bez podłączeń (zawsze mogę się wpiąć pod TP1 lub TP2 jak będą problemy).

Zasilanie USB pochodzi z zewnętrznego zasilacza USB-B. Dodatkowo ten port też będzie służył do wgrywania firmware na Raspberry Pi Pico. Jako,że jestem leniwy to z USB-B idą ścieżki na USB-A, do którego wepnę się kabelkiem USB-A -> uUSB. Zasilanie hosta jest używane do włączenia diody led pokazującej wybrany host i status połączenia (jeżeli kabel będzie odłączony to dioda nie będzie się świecić). Dodatkowo Pico na każdym GPIO obsługuje PWM, więc można sobie regulować jasność 😉 

TS3USB221 posiada własną ochronę ESD (2kV), stąd nie implementowałem zewnętrznej.

Złącza H3 i H4 służą do ewentualnego podpięcia przycisków do sterowania urządzeniem. A UART tradycyjnie do debugowania 😉 SWD jest na doczepne, bo zawsze lepiej mieć więcej dostępnych portów niż mniej.

IRF9630 został wybrany "na oko" - tutaj jeszcze muszę pogrzebać by poszukać jakiegoś alternatywnego Power P-MOS'a, chociaż ten jest dostępny w AVT, więc raczej przy nim zostanę. Z mojego doświadczenia z IRF'ami zwykle działają bez problemu na 3.3V 🙂 

Decoupling wedle zaleceń producentów układów.

Zastanawiam się czy regulator 3.3V na Pico wyrobi, ale raczej powinien... 

Ścieżki USB matched impedance 90R +/-2-5% (nie oznaczam na schemacie, ale warto to mieć na uwadze). Maksymalna różnica długości 30mil.

Jak coś zepsułem chętnie usłyszę krytykę (i nauczę się czegoś nowego).

Design PCB bazować będę na tej nocie. Wprawdzie jest do innego układu, ale jest tam sporo przydatnych informacji.

KVM Console rev1 - not verified.pdf

Edytowano przez H1M4W4R1
schemat
Link do komentarza
Share on other sites

Cześć @H1M4W4R1, jestem ciekaw jak postęp Twojego projektu. Jeśli masz już to ogarnięte to może sprzedajesz płytki albo cały produkt? Przydałby mi się przełącznik usb do klawiatur, myszki a nie koniecznie wierzę w tą chińszczyznę którą można kupić na różnych portalach.

Edytowano przez JackTheJack
  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

23 godziny temu, JackTheJack napisał:

jestem ciekaw jak postęp Twojego projektu

Wylądował w koszu na śmieci nazywanym "szufladą". Ogólny koncept działał, ale był to bardziej projekt hobbystyczny, by rozwinąć umiejętności. Z rzeczy, które mogę powiedzieć, to wyżej wspominany układ jak najbardziej działa poprawnie. Warto pamiętać, by w trakcie przełączania odciąć zasilanie od USB (pozwala na odłączenie starych urządzeń i podłączenie nowych - coś w rodzaju przepięcia przewodu z jednego gniazda do drugiego).

  • Lubię! 2
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.