Forum: PC-Programmierung cp2104 an Rapi + USB-HUB


von Peter II (Gast)


Lesenswert?

Hallo,
ich will mehrere Module mit einem cp2104 an einen Raspi betreiben. Im 
Test funktioniert alles mit 2 Modulen ohne Fehler.

Jetzt wurde aber 4 Module an einem zusätzlichen HUB angeschlossen. Sie 
werden auch fehlerfrei erkannt. Aber nach ein paar Minuten gibt es 
Fehler beim Öffnen von ttyUSBx

can not open /dev/ttyUSB1: Input/output error

im Kernellog steht folgendes:

cp210x ttyUSB1: cp210x_open - Unable to enable UART


Das ganze wurde schon mit 2 verschiedenen USB-HUBs (aktiv und Passiv) 
getestet und brache keine Verbessrung. Das Modul was direkt am Raspi 
steck läuft fehlerfrei weiter.

Es wurde auch verschiedene Treiber getestet (das vom Kernel und das von 
Silabs). Dabei kommt es zum gleichen Verhalten. Ein reboot behebt das 
Problem für ein paar Minuten.

Hat jemand eine Idee was das sein könnte?
gibt es eine Möglichkeit USB-Geräte von Linux aus einzeln zu resetten? 
(Modul neu laden reicht nicht aus)

Intern kommt es zu fehler -71 bei usb_control_msg. Die 71 steht für
#define EPROTO          71      /* Protocol error */


aktuell wird der Port immer geöffnet und geschlossen ( aller 30sek).

von Jim M. (turboj)


Lesenswert?

USB Spannung hinter dem Hub messen, vielleicht mit Oszi.

Viele aktive Hubs speisen "rückwärs", was beim RPi (und auch bei PC/MAC) 
Probleme bereiten kann. Dann hilft eine Diode am USB Hub Upstream Port.

Peter II schrieb:
> gibt es eine Möglichkeit USB-Geräte von Linux aus einzeln zu resetten?

Bei LibUSB gibt es eine usb_reset() Funktion, allerdings gibts das AFAIK 
nicht fertig außerhalb von C. Falls es PyUSB auf dem RPi gibt, dann 
müsste es vom Python Skript aus gehen.

Bei TTYUSB Geräten hat das aber häßliche Nebenwirkungen.

von Peter II (Gast)


Lesenswert?

Danke für die Rückmeldung.

Ich konnte mittlerweile das Problem sogar mit gekauften Modulen die auch 
einen CP2104 haben nachstellen. (an eine Rapi1 und Rapi2)

Sobald 2 davon an den HUB(passiv) hängen geht nach ein paar Minuten 
nichts mehr. Damit kann ich erst mal ausschließen das es an meinen 
Modulen liegt. Da an den Modul nur eine LED dran ist, die Strom 
verbraucht, ist es auch kein Überlast Problem. Es hilft auch nicht das 
Modul neu aus und wieder einzustecken es muss zwingend der HUB gesettet 
werden sonst geht nichts mehr. Ein Modul was direkt am Raspi hängt lässt 
sich nicht aus der Ruhe bringen. Es scheint sich also der HUB 
aufzuhängen.

Ich muss mal sehen ob ich HUBs von verschieden Herstellern finde, 
eventuell geht es ja mit einem.
Mal sehen ob ich ein kleines Testprogramm schreiben kann, damit andere 
das Problem eventuell nachstellen können.

von Peter II (Gast)


Angehängte Dateien:

Lesenswert?

langsam gehen mir die Ideen aus, wo der Fehler sein könnte.

Der Fehler kommt bei 4 verschiedenen HUBs.
Am einem "normalen" PC mit den gleichen HUB gibt es keine Fehler.

Ich kann den Fehler also nur an einem Raspi(1 oder 2) mit eine HUB 
nachstellen. Ohne HUB geht es fehlerfrei.

Werde jetzt mal testen ob ich BSD auf dem Rapi zum laufen bekomme.

sonst noch jemand Ideen?

Anbei noch das Testprogramm wenn jemand Lust hat, bei der Analyse zu 
helfen.

Man braucht ein Raspi + USB-Hub + 2 CP2104 USB-Serial converter.

gcc UsbTest.c -lpthread
./a.out /dev/ttyUSB0 /dev/ttyUSB1

von Jim M. (turboj)


Lesenswert?

Peter II schrieb:
> Sobald 2 davon an den HUB(passiv) hängen geht nach ein paar Minuten
> nichts mehr. Damit kann ich erst mal ausschließen das es an meinen
> Modulen liegt. Da an den Modul nur eine LED dran ist, die Strom
> verbraucht, ist es auch kein Überlast Problem.

Ein RPi kann auf dem USB weniger Strom liefern als ein PC. Bei billigen 
Wandwarzen könnten auf den 5 Volt auch noch viele Störungen drauf sein 
-> Oszi.

Wenn die CP210x mit denselben Hubs am PC ohne Probleme laufen, würde ich 
zuerst auf die Spannung tippen.

von Peter II (Gast)


Lesenswert?

Jim M. schrieb:
> Ein RPi kann auf dem USB weniger Strom liefern als ein PC. Bei billigen
> Wandwarzen könnten auf den 5 Volt auch noch viele Störungen drauf sein
> -> Oszi.
>
> Wenn die CP210x mit denselben Hubs am PC ohne Probleme laufen, würde ich
> zuerst auf die Spannung tippen.

aus dem Grunde wurde schon mit einen Aktiven-HUP getestet - keine 
Besserung. Die Hubs sind mit 10mA angegeben, ohne den HUB-Läuft es auch.

von Peter II (Gast)


Lesenswert?

Nachtrag:

Wenn man je HUB nur ein CP2104 verwendet geht es auch fehlerfrei.

Funktioniert:
1
RASPI -> HUB  -> CP2104
2
              -> HUB     ->   HUB -> CP 2104

Fehler:
1
RASPI -> HUB  -> CP2104
2
              -> CP2104

von .Jörg (Gast)


Lesenswert?

Während die Anpassung der USB-Konfigurationsdaten optional ist, ist die 
Anpassung der VID/PID-Kombination empfohlen. Eine eindeutige 
VID/PID-Kombination verhindert, dass der Treiber mit anderen 
USB-Treibern in Konflikt steht. Die Hersteller-ID kann von www.usb.org 
bezogen werden oder Silicon Labs kann eine kostenlose PID für das 
OEM-Produkt bereitstellen, das mit dem Silicon Labs VID verwendet 
werden. Das Anpassen der Seriennummer wird auch empfohlen, wenn die 
OEM-Anwendung eine, bei der mehrere CP210x-basierte Geräte an denselben 
PC angeschlossen werden können.

von Skip (Gast)


Lesenswert?

Der Trick für den Workaround ist nicht das Device, sondern den HUB zu 
resetten:
z.B. via cron:
if  (dmesg | tail -10 | grep -q "cp210x ttyUSB1: cp210x_open - Unable to 
enable UART") ; then usbreset 05e3:0608 ; fi
dabei muss man beim usbreset natürlich das richtige Gerät angeben.
Vorher mit usbreset ohne Argumente und ggf. lsusb ermitteln.

von Skip (Gast)


Lesenswert?

Nachtrag: Als 'Rootcause' konnte ich bei mir das Packet rpi.gpio-common 
identifizieren. Nach dessen Deinstallation sind die Fehler weg.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.