Procesor z USB udający device type UART

Jak trudno jest udawać USB UART (np. taki jak w chipsach FTDI) mając do dyspozycji 32-bitowy procesor z USB, np. ARM (Cortex M3 firmy NXP, np. LPC1788 lub M4 LPC4088)?

Buduję urządzenie, które będzie podłączane do linuxa... Będzie się komunikowało strumieniem danych dobrze reprezentowanym przez coś ala UART i pasowałoby się przedstawić do tego linuxa jako dodatkowy port...

Mam więc opcję kupić gotowy chipset USB-UART i połączyć z jego UARTem któryś UART z mojego Cortexa M3. Ale to wydaje się być trochę nadmiarowe, bo tenże Cortex M3 ma już port USB-Device. Gdybym chciał uniknąć kładzenia na płytce chipsetu USB-UART i wejść z USB wprost na port device mojego Cortexa - jak ciężko jest w tym procku udawać że jest się UARTem dla USB Hosta?

Istotne jest aby aplikacja używająca moje urządzenie widziała tylko port szeregowy i najchętniej aby nie było konieczności pisania specjalnego drivera pod linuxa.

Reply to
Pszemol
Loading thread data ...

W dniu 2015-11-10 o 04:15, Pszemol pisze:

Jeśli urządzenie ma być na stałe podłączone do PC to nie polecam korzystania z procka udającego urządzenie USB CDC. Sam tak robiłem przy pomocy bibliotek LPCUSB. Jeśli nastąpi reset procka (np. przez Watchdoga) to program w procku będzie chciał na nowo zainicjować USB, ale host w PC nie będzie mógł zrobić enumeracji bo ma otwarty wirtualny UART. Lepiej dołożyć te 2$ i dać np FT230. Inna sprawa, że najlepiej dać jakiś izolator w rodzaju ISO7221 na liniach między prockiem i FT230. Wtedy zasilasz FT230 z VCC USB i nawet wyłączenie procka z zasilania nie rozłączy ci połączenia USB z PC, a wiec nie zwiesi ci wirtualnego UART na którym np nasłuchuje ci chodząca na PC aplikacja.

Reply to
Mario

Użytkownik "Mario" napisał w wiadomości grup dyskusyjnych:n1scdk$mrb$ snipped-for-privacy@dont-email.me...

A FT230 lepiej wznawia, czy nie resetuje sie ?

A to swoja droga ... izolatora na USB jeszcze nie ma ?

J.

Reply to
J.F.

Jesteś pewien? W moim przypadku robi enumerację i tworzy nowy tty, gdy aplikacja trzyma uchwyt do starego. Wystarczy w aplikacji wykryć błąd w komunikacji i zrobić reopen ttyUSBn+1 gdzie n to id poprzednio otwartego. Z tego co kojarzę problem z enumeracją w takich przypadkach to brak pełnej kompatybilności drivera hci w keenelu z tym co wykrył na płycie.

Reply to
Marek

W dniu 2015-11-10 o 10:30, J.F. pisze:

NIe zdarzyło mi się żeby zwiesił się FT, a LPC1768 owszem.

Zdaje się że są jakieś szybkie izolatory, które można by dać na linie USB.

Reply to
Mario

Pod Windowsem mając otwarty terminal próba pisania do wirtualnego portu po resecie procka, powodowała zwis tego portu. Nie powstawał przy tym nowy port. Musiałem ubijać terminal i ponownie wymuszać enumerację np. wyłączając zasilanie procka lub rozłączając kabel USB. Pewnie dałoby się to zrobić gdybym np badał w procku czy jest komunikacja i przy jej braku co trochę inicjalizował USB. Pod Linuksem, gdyby faktycznie tworzył się nowy port to sądzę, że programiści zajmujący sie tym potrafili by to zastosować. Wybrali dość siłowe rozwiązanie polegające na sprzętowym Watchdogu wyłączającym zasilanie elektroniki będącej na drugim końcu kabla USB :)

Reply to
Mario

Tak, ma być na stałe podłączone do "jednopłytkowego" "peceta" embedded na ARMie 1GHz przez port USB3.1. Moje USB-Device będzie USB2.0, w tej samej skrzynce. Świat "embedded", jedna aplikacja.

Rozumiem. Właśnie dlatego pytam kogoś kto już ma z tym doświadczenie. Czyli biorę opcję z chipsetem USB-UART.

Pomyślę o tym - bardzo dziękuję za rozsądnie brzmiące uwagi :-)

Reply to
Pszemol

Ale kogo Windows obchodzi...? Mówimy o Linuksie.

Ale co, nie wierzysz i mam pokazać film, że tworzony jest nowy tty jeśli poprzedni padnie a jego uchwyt trzyma proces w userlandzie?

Kiepskich programistów jest pełno ;).

Reply to
Marek

Partyzantka pełną gębą :-) Sprawdzi się jak masz podpięte tylko jedno urządzenie CDC. Nie lepiej wyszukać urządzenie za pomocą udeva? Jest dostępne API w c, można spokojnie znaleźć port urządzenia na postawie numeru VID/PID, albo numeru seryjnego itp. Można też dostawać zdarzenia związane z podłączaniem/odłączaniem urządzeń.

Reply to
Zbych

Zalezy to od posiadanej biblioteki/drvera itd. i ocywiscie jej jakosci.

Dokladnie takie rozwiazenie zastosowalismy na naszym module z kontrolerem Cortex-M czyli FT232 podpiete strona UART do kontrolera natomiast strona USB do Hosta z dowolnym OS-em. Kosztem ok 30 PLN uniknelismy zabawy z USB-CDC. Na kontrolerze Atmel-a piny USB sa jednoczesnie jedynymi pinami GPIO o "duzej" wydajnosci pradowej.

BTW. Dlaczego nie mozesz bezposrednio polaczyc procesora z kontrolerem UART-em skoro ma to byc trwale/stale polaczenie?

Reply to
brak

Dramatu nie ma, ale warto poczytać może jakis poradnik:

formatting link
Książki ogólnie nie polecam z powodu nagłego ataku patriotycznego tłumaczenia wszystkie co popadnie, ale usb jest wyjasnione na poziomie nie najgorszym, w tym jest przykład portu szeregowego i na zbliżonej arch to bazuje.

Reply to
Sebastian Biały

O jakim kontrolerze piszesz? On chyba łączy te urządzenie z prockiem do komputera z Linuksem. Raczej można się spodziewać, że ten komputer nie będzie miał w ogóle UART.

Reply to
Mario

Ach, tu mi uzmysłowiłeś że chciałem zapytać też o coś innego... A mianowicie identyfikację portów wielokrotnie powtórzonych. Innymi słowy mam płytkę wtykaną w USB, na płytce dwa UARTy. W porzo. Teraz chcę takich płytek mieć 5, każda po dwa UARTy. Jak zidentyfikuję która płytka jest na którym /dev/sda0...8 czy jak się one tam zwą? A po pierwotnej instalacji, coś się schrzani, pierun trzaśnie, serwisant płytkę wymieni, i jak wpasować nową aby widoczna była tak samo jak stara?

Wprowadzić jakiś osobny identyfikator na jakimś obrotowym przełączniku? Czy da się to przemycić jakoś w samym USB? Jakiś design pattern dla linuxa i portów szeregowych? Widziałem np. kostkę XAR co robi USB -> Dual UART, pod Windows 7 pojawiają mi się na liście sterowników Port A i Port B. I można im przydzielić COM4 i COM5 na ten przykład... Czyli wiem że Port A i B to COM4 i COM5 ale gdybym tych płytek miał więcej, i wetknął wszystkie na raz a nie pokolei to nie miałbym pojęcia który jest A i B a który jest C i D lub E i F?

Reply to
Pszemol

Ta trwałość nie dotyczy jednorazowej instalacji i konfiguracji. Jak to w świecie embedded bywa, użytkownik nie ładuje tam swojego softu, nie zmienia funkcjonalności - user zamawia to i tamto, ja mu to konfiguruję i wysyłam... Co nie znaczy że dla każdego usera będę osobne płytki majstrował dla każdej różnej permutacji możliwości :-)

Reply to
Pszemol

Moze zmyliłem go niefortunnym użyciem słowa "pecet". Miałem to w luźnym słowa tego znaczniu, w sensie coś co ma gigowy rdzeń i robi pod linuxem a nie jest embeded 8051 lub PIC :-) A swoją drogą płytka komputera głownego ma 3 UARTy, ale to za mało, i na dodatek nie są izolowane, więc nie będę ich używał. Wykorzystam USB, potem HUBa i dalej wciąż USB do modułów.

Reply to
Pszemol

a jakbyście chceli żeby wnioski zostały dla innych na przyszłość, to zapraszam do mnie...

Reply to
platformowe głupki

Nakleić na każdym konwerterze jego numer seryjny i dać możliwość przyporządkowania numeru do funkcji w twoim programie.

Ja bym to załatwił przy pomocy udeva. Możesz wylistować porty szeregowe i posortować jest najpierw po numerze seryjnym a potem po nazwie portu. Teoretycznie port A powinien dostać niższy numer niż port B. Przynajmniej tak mi to działa z modemami GSM, które się meldują jako

2...3 porty szeregowe. Gwarancji ci nie dam, musisz sam sprawdzić.
Reply to
Zbych

USBDP...

Reply to
platformowe głupki

Chciałbym aby serwisant który ma wymienić uszkodzoną płytkę nie musiał wchodzić do konfiguracji systemu i czegokolwiek zmieniać. Wolałbym aby ustawił nową płytkę tak, aby system sam sobie rozpoznał która jest która i że ta nowa nie jest dodatkowa tylko jest zamiennikiem tej którą wyjęto...

Chcę dodać minimalną inteligencję na płytkę modułu dołączanego przez USB do komputera, aby ta płytka miała możliwości identyfikacji i wpasowania się w dziurę po uszkodzonej AUTOMATYCZNIE.

Reply to
Pszemol

jakieś bzdury, chyba po braku odpowiedzi z urządzenia wystawiany jest reset na złączu...

Reply to
platformowe głupki

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.