Forum: Mikrocontroller und Digitale Elektronik Mehrere FTDI´s (FT232) an einem Rechner identifizieren?


von Spice (Gast)


Lesenswert?

Hallo Zusammen,

ich habe min. 2 FT232R über ein USB-HUB an den Rechner angeschlossen. 
Alles tuts... Allerdings nervt es mich, dass im Gerätemanager immer der 
Eintrag USB Serial Port xxx steht und man dem Gerät nicht einen 
eindeutigen Namen geben kann. Gibt es eine Möglichkeit, diese Namen 
individuell im Chip einzustellen? Mit Mprog bin ich am Gange, aber 
irgendwie bringt mir die Bezeichnung nix, wenn die nur bei der 
Installation einmal aufpoppt und im Gerätemanager steht nicht genau 
dieser Eintrag, sondern USB Serial Port xxx...
Welche .ini oder .inf ist dafür verantwortlich? Ich verwende den orginal 
Kombitreiber von ftdi. Ist es möglich, einen abgewandelten Treiber zu 
schreiben, der im Gerätemanager, je nach Seriennummer des FTDI´s einen 
eigenen DeviceString anzeigt? Kennt jemand Links zu dieser Problematik?

danke und gruß
Spice

von Stefan (Gast)


Lesenswert?

Hallo,
Du musst die inf Dateien der Treiber ändern. Der Treiber ist dann 
allerdings nicht mehr zertifiziert. Genaueres gibts als PDF bei FTDI.
Stefan

von Christian R. (supachris)


Lesenswert?

Das ginge schon, wenn du den Qualifier im inf für jede Seriennummer 
einzeln beschreibst. Ist aber unsauber und sowas macht man nicht. Und 
wie schon geschrieben, ist die Signierung dann hinüber.

von Stefan (Gast)


Lesenswert?

>> und sowas macht man nicht

Na, ja laut FTDI schon :

snip -----------------------------------------------------------------
Hello,

We have allocated 8 PIDs to you from XXXX to XXXX (hex).

The PIDs must be used with VID 0403.
To reprogram the EEPROM use FT_PROG.

http://www.ftdichip.com/Resources/Utilities/FT_Prog.zip
http://www.ftdichip.com/Resources/Utilities/FT_PROG_README.TXT

NOTE 1: Editing the driver for your new identity will invalidate any 
current driver certification.

NOTE 2: It will be necessary for you to maintain your own edited driver
release for distribution to your customers.
snip -----------------------------------------------------------------

Die PIDs kann man sich ausdenken zur Sicheheit kann man auch noch die 
VID ändern damit man nicht mit anderen FTDI Geräten in Konflikt kommt, 
es geht hier ja wohl um ein paar einzelne Geräte für privat!
Stefan

von Reinhard Kern (Gast)


Lesenswert?

Spice schrieb:
> Allerdings nervt es mich, dass im Gerätemanager immer der
> Eintrag USB Serial Port xxx steht und man dem Gerät nicht einen
> eindeutigen Namen geben kann.

Hallo,

da hat sich einfach nichts geändert, die Schnittstellen hiessen früher 
COM1 bis COMn, und das ist immer noch so - du musst dir ja nur die Nr. 
der COM-Schnittstelle merken, das war noch nie anders, und eigentlich 
sollten ja auch alle solchen Schnittstellen gleichwertig sein.

In Linux kannst du meines Wissens für Schnittstellen auch Aliasnamen 
vergeben wie "GPS-Interface" usw., aber bei Windows wird das nicht gehen 
und wenn findet die Software womöglich keine Schnittstellen mehr.

Gruss Reinhard

von Christian R. (supachris)


Lesenswert?

Stefan schrieb:
> Die PIDs kann man sich ausdenken zur Sicheheit kann man auch noch die
> VID ändern damit man nicht mit anderen FTDI Geräten in Konflikt kommt,
> es geht hier ja wohl um ein paar einzelne Geräte für privat!

Naja, bei max. 8 Geräten mag das gehen, aber der Fragesteller hat nach 
der Seriennummer gefragt. Das ginge auch, aber die COM-Namen heißen dann 
trotzdem COM 1 bis COM x. Außerdem ist auch die Signatur futsch, wenn 
man die PID ändert. Normalerweise identifiziert man die über die 
Software. Meine Software für die FTDI basierten Serial-Wandler 
lokalisiert den passenden virtuellen COM Port über die Registry anhand 
der eindeutigen Seriennummer. Das ist sehr leicht zu programmieren.

von Achim M. (minifloat)


Lesenswert?

Wenn man sich auf diese Treiberfummelei nicht einlassen will, kann man 
in die Firmware seines Zielgerätes eine 
"Whats-your-serial-number"-Funktion implementieren, meinetwegen auch 
Verschlüsselt. Die Software am Rechner klappert nacheinander alle 
Com-Ports ab und fragt die Geräte danach. Wo nicht das richtige kommt, 
ist wohl nicht "dein" Gerät.

mfg mf

von Stefan (Gast)


Lesenswert?

Hallo,
Sicher heißen die Ports dann noch COMX währe ja sonst auch blöd.
Aber im Gerätemanager steht dann <mein neuer Name (COMX)>
Damit kannst Du dann auch mehre Geräte auf den gleichen COM legen und 
siehst dann welches angesteckt ist. Dazu muss man weder PID noch VID im 
FTDI ändern, kann aber.
Man braucht aber nicht für jedes Gerät eine registrierte PID!
Die Strings die im Gerätemanager auftauchen in der inf suchen und 
ändern. Dann den Treiber überinstallieren. Next device - same procedure.
Es ging nur darum ob man sowas so macht und da schließt sich FTDI meiner 
Meinung an ;-)
Wenns darum geht Geräte aus einer eigenen Software zu identifizieren 
würde ich auf jeden Fall die D2XX Schnitstelle benutzen dann brauchts 
keinen COM.
Stefan

von Reinhard Kern (Gast)


Lesenswert?

Mini Float schrieb:
> Die Software am Rechner klappert nacheinander alle
> Com-Ports ab und fragt die Geräte danach.

Hallo,

das ist viel zu riskant. Du kannst niemals wissen wie ein fremdes Gerät 
auf deine Abfragesequenz reagiert. Die Erkenntnis, das das so nicht 
geht, ist schon so alt wie die serielle Schnittstelle, da war selbst 
Microsoft trotz der eingebildeten Weltherrschaft genötigt, bei Bedarf 
das Suchen nach einer Maus an allen Anschlüssen zu unterbinden. U.a. 
wurde dadurch manchmal die Notstromversorgung abgehängt, oder ein Modem 
wählte Neuseeland an.

Gruss Reinhard

von Stefan (Gast)


Lesenswert?

Hallo Reinhard,
kann man Windows das suchen und erkennen einer seriellen Maus generell 
oder ab einem bestimmtem Port verbieten? Wenn ich neues USB Gerät egal 
ob anstecke und der Controller ist gerade in Plauderlaune dreht mein 
Windows durch und denk es ist eine Maus. Im Gerätemanager wird dann eine 
seielle Maus angezeigt.  Ein zwei mal ist's ja lustig aber auf Dauer.
Stefan

von Spice (Gast)


Lesenswert?

Hallo Zusammen,

vielen Dank für die zahlreichen Antworten. Nachdem ich nun ein wenig 
rumprobiert habe, werden die FTDI´s mit den neuen PIDs wieder erkannt 
:-)
Ich beschreibe mein Problem mal ausführlicher...
Ich habe an einem USB Hub 2 FT232´s hängen, welche mit verschiedenen 
PIDs versehen sind. Kurzzeitig konnte ich mit den Treibern, die bereits 
installiert waren nicht mehr auf die FTDIs zugreifen und Mprog auch 
nicht, aber nachdem ich die .inf editiert habe (ich glaube die 
FTD2xx.inf), werden die nun auch wieder "erkannt".
Mein Problem ist nun, dass wenn ein dritter FT232 mit standartwerten im 
EEPROM angeschlossen wird, dieser zwar richtig erkannt wird und der VCP 
Treiber geladen wird, wobei bei den anderen beiden, die über den HUB 
angeschlossen sind und eine andere PID haben, der FTD2xx treiber geladen 
wird und ich keine COM-Schnittstelle sehe.
Bevor ich im EEPROM rumprobiert habe, konnte ich im GeräteManager beiden 
USB-Geräten auswählen, dass "VCP aktiviert" werden soll, dann lief alles 
und die COM Schnittstellen wurden erkannt, jedoch haben sich die FTDI´s 
untereinander leicht verhaspelt und darum würde ich im GeräteManager 
gerne verschiedene Namen für diese beiden Geräte vergeben, welche ich in 
die Treiber.inf eintrage...
Meine Frage ist nun, wie bekomme ich es hin, dass die beiden FTDI´s 
wieder den VCP Treiber laden und ein COM-Port zur Verfügung stellen und 
welche Dateien muss ich wo editieren, dass die neuen PIDs auch wieder 
erkannt werden und der VCP Treiber geladen wird? Ich habe im EEPROM der 
FTDI´s die Seriennummer abgeschaltet gehabt. Es geht quasi darum, dass 
sich die beiden FTDI´s am HUB wie zwei COM-Ports verhalten, im 
GeräteManager allerdings für diese beiden Geräte nicht USb Serial 
Converter COM xx steht, sondern zum Beispiel DebugSerielle COM xx und 
RS232 COM xx, damit ich diese beiden Geräte untereinander und von dem 
anderen COM-Port geraffel unterscheiden kann.

Besten Dank nochmal an alle
Gruß Spice

von Frank K. (fchk)


Angehängte Dateien:

Lesenswert?

Ich verwende die Microchip MCP2200 USB-Seriell-Chips, weil diese keine 
proprietären Binärtreiber brauchen, sondern die Standard USB CDC Klasse 
implementieren, und den Treiber hat jedes Betriebssystem einfach so 
eingebaut. Windows will nur noch ein .inf haben.

Mit dem Standard-Inf steht da zwar immer noch "USB Serial Port" (das 
läßt sich im Inf ändern), aber unter Eigenschaften finde ich den String, 
den ich mit dem Konfigurationstool in den Chip hineingeschrieben habe.

Funktioniert das bei Dir nicht? Programmtechnisch kannst Du diesen 
String mit der Setup API abfragen.

Ansonsten schwenke auf echte USB-Controller um, die Du z.B. per HID 
ansteuerst. Dann hast Du zumindest das Problem nicht mehr.

fchk

von Spice (Gast)


Angehängte Dateien:

Lesenswert?

hier nochmal ein Bilchen um das Problem zu verdeutlichen...

von Frank K. (fchk)


Lesenswert?

Zeig mal die Eigenschaftsseite des Devices.

fchk

von Sebastian (Gast)


Lesenswert?

Soweit ich weiß, ist das eine Konfigurationsoption im EEPROM, welcher 
Treiber geladen wird, mit FT_Prog einstellbar.
Übrigens: Wenn man die FTDI-Bibliothek (DLL) benutzt, kann man die Ports 
auch mit Namen oder Seriennummern ansprechen.

von Carsten W. (eagle38106)


Lesenswert?

Hi,

ich programmiere den ID-String des FT232 wie im folgenden c# Code 
gezeigt, um und kann dann mit

1
if (ftdi.OpenByDescription (Description) == FTDI.FT_STATUS.FT_OK)
2
{
3
4
...
5
6
  ftdi.Close ();
7
}

auf den passenden Chip zugreifen.

1
using System.IO;                        // File.<xyz>
2
using System.Reflection;                // Assembly
3
using System.Diagnostics;               // FileVersionInfo
4
using System.Threading;                 // Thread.Sleep
5
6
using FTD2XX_NET;                       // Copy FTD2XX_NET.dll & .XML to project and add via "Add Reference".
7
8
9
namespace Production_Tool
10
{
11
  public partial class frmMain: Form
12
  {
13
14
...
15
16
    /// <summary> Enumeration to indicate the different connection states of the FT232 chip. </summary>
17
    public enum eFTstate
18
    {
19
      DISCONNECTED = 0,                 // No connection available
20
      UNPROGRAMMED,                     // Connected to an unprogrammed FT232 
21
      UNKNOWN,                          // Connected to a programmed FT232 with unknown signature
22
      CONNECTED                         // Connected to xxyyzz board
23
    };
24
25
...
26
27
    // Different ID-strings of unprogrammed and programmed FT232 chips.
28
    public const string IDStringXYZ = "XYZ ";
29
    public const string IDStringOrg = "FT232R USB UART";
30
    public string IDStringLast = "";
31
32
...
33
34
    public eFTstate USBState = eFTstate.DISCONNECTED;
35
36
    private FTDI ftdi = new FTDI ();
37
38
...
39
40
    /// <summary>
41
    /// Check the programming of the first available FT232 chip.
42
    /// </summary>
43
    private void USBCheckConnection ()
44
    {
45
      FTDI.FT232R_EEPROM_STRUCTURE EEPROM = new FTDI.FT232R_EEPROM_STRUCTURE ();
46
47
      USBState = eFTstate.DISCONNECTED;
48
      if (ftdi.OpenByIndex (0) == FTDI.FT_STATUS.FT_OK)
49
      {
50
        if (ftdi.ReadFT232REEPROM (EEPROM) == FTDI.FT_STATUS.FT_OK)
51
        {
52
          IDStringLast = EEPROM.Description;
53
54
          // Check for an xxyyzz board with a non matching serial number and ask whether this serial number
55
          // should be taken instead.
56
          if ((IDStringLast.Length == 16) && (Startup == false))
57
          {
58
            if ((IDStringLast.Substring (0, 4).CompareTo ("XYZ ") == 0) &&
59
                (IDStringLast.Substring (4, 12).CompareTo (this.txtSerialNumber.Text) != 0))
60
            {
61
              if (MessageBox.Show ("Shall I switch to the serial number of the\n" +
62
                                   "detected board?", Application.ProductName,
63
                                   MessageBoxButtons.YesNo, MessageBoxIcon.Question) ==
64
                  System.Windows.Forms.DialogResult.Yes)
65
                this.txtSerialNumber.Text = IDStringLast.Substring (4, 12);
66
            }
67
          }
68
69
          if (EEPROM.Description.CompareTo (IDStringOrg) == 0)
70
            // Genuine FT232 description
71
            USBState = eFTstate.UNPROGRAMMED;
72
          else if (EEPROM.Description.CompareTo (IDStringXYZ + this.txtSerialNumber.Text) == 0)
73
            // Correct xxyyzz Board description
74
            USBState = eFTstate.CONNECTED;
75
          else
76
            // Unknown description
77
            USBState = eFTstate.UNKNOWN;
78
        }
79
        ftdi.Close ();
80
      }
81
    }
82
83
84
    /// <summary>
85
    /// Print status in clear type.
86
    /// </summary>
87
    /// <returns></returns>
88
    private string USBStatus ()
89
    {
90
      switch (USBState)
91
      {
92
        case eFTstate.DISCONNECTED:
93
          return ("Disconnected");
94
        case eFTstate.UNPROGRAMMED:
95
          return ("Connected, but unprogrammed");
96
        case eFTstate.CONNECTED:
97
          return ("Successful programmed.");
98
        case eFTstate.UNKNOWN:
99
          return ("Connected, but programmed with \"" + IDStringLast + "\"");
100
        default:
101
          return ("Illegal FT232 state! Check programming!");
102
      }
103
    }
104
105
106
    /// <summary>Program the FT232 with an individual signature containing the boards serial number.</summary>
107
    private void btnS1ProgFT232_Click (object sender, EventArgs e)
108
    {
109
      FTDI.FT232R_EEPROM_STRUCTURE EEPROM = new FTDI.FT232R_EEPROM_STRUCTURE ();
110
      string Description = IDStringXYZ + this.txtSerialNumber.Text;
111
      this.Cursor = Cursors.WaitCursor;
112
      this.Update ();
113
114
      USBCheckConnection ();
115
      if (USBState != eFTstate.DISCONNECTED)
116
      {
117
        // Found a FT232, do program it.
118
        if (USBState == eFTstate.UNKNOWN)
119
        {
120
          if (MessageBox.Show ("Override the old\nFT232 programming?",
121
            Application.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Warning,
122
            MessageBoxDefaultButton.Button2) == DialogResult.No)
123
          {
124
            // No ironing. Keep the name!
125
            this.lblS1ResultFT232.Text = "Result: Programming aborted!";
126
            this.lblStatus.Text = "Programming of USB chip aborted!";
127
            Report ("\r\nProgramming of USB chip aborted!\r\n", ReportType.Error);
128
            this.Cursor = Cursors.Default;
129
            return;
130
          }
131
        }
132
133
        // Finally program the new ID.
134
        if (ftdi.OpenByIndex (0) == FTDI.FT_STATUS.FT_OK)
135
        {
136
          // Override original setting.
137
          ftdi.ReadFT232REEPROM (EEPROM);
138
          EEPROM.Description = Description;
139
          // Avoids assigning a new com port to every FT232 device connected to PC
140
          // Set HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\UsbFlags 
141
          // REG_BINARY entry "IgnoreHW-SerNum04036001" to "01" to do the same with
142
          // unprogrammed devices!
143
          EEPROM.SerNumEnable = false; 
144
          ftdi.WriteFT232REEPROM (EEPROM);
145
          ftdi.ResetDevice ();
146
          ftdi.Rescan ();
147
          ftdi.CyclePort ();
148
        }
149
        do
150
        {
151
          USBCheckConnection ();
152
        } while (USBState != eFTstate.CONNECTED);
153
      }
154
      else
155
      {
156
        // Did not found any FT232. There is nothing to program!
157
        MessageBox.Show ("Found no FT232 chip to configure!", Application.ProductName,
158
                         MessageBoxButtons.OK, MessageBoxIcon.Error);
159
      }
160
      this.Cursor = Cursors.Default;
161
    }
162
163
...
164
  }
165
}

Gruß
Carsten

von Spice (Gast)


Angehängte Dateien:

Lesenswert?

Danke für die Antworten,

ich habe kein WindowsTool, es soll quasi ausschliesslich mit einem 
TerminalProgramm laufen, daher kein WinCode...

Die Eigenschaften von dem Device zeigen, dass die Registerkarte 
"Erweitert" fehlt, wo man "VCP laden" anklicken kann.

von Spice (Gast)


Lesenswert?

Noch etwas, was mir gerade auffällt...
Sobald ich die EEPROMs wieder auf die Defaultwerte VID/PID 0403/6001 
zurücksetze funktioniert auch das laden der COM-Ports... Bei VID/PID 
0403/6011 wird kein VCP geladen, woran liegt das? Wo liegen die 
inf-files für den VCP-Treiber? Welche muss ich editieren? Ich habe 
bestimmt 30 von den Files auf dem Rechner vergraben von irgendwelchen 
FTDI-projekten mit angepassten treibern... Wie geht man da am besten 
vor? Ich vermute, dass ich auch in die VCP-Treiber inf´s die VID und 
PIDs hinzufügen muss, damit auch die PID 6011 erkannt wird und der 
Com-Port geladen wird?

Danke nochmal und Gruß
Spice

von Einhart P. (einhart)


Lesenswert?

Bei meinen Boards habe ich eigene VIDs und UIDs in FTDIbus.inf und 
FTDIport.inf zugefügt. Hab' da keine Probleme.

Sie tauchen dann im Gerätemanager unter USB und Ports mit den gewählten 
Name auf.

von Spice (Gast)


Lesenswert?

Danke Einhart,

aber in welchem verzeichnis befinden sich die Dateien, die relevant 
sind?

von Spice (Gast)


Lesenswert?

Kann mir jemand den Unterschied der beiden Zeilen erklären?
Was bewirkt das "&MI_xx"

%USB\VID_0403&PID_6011.DeviceDesc%=FTD2XX, USB\VID_0403&PID_6011
%USB\VID_0403&PID_6010&MI_00.DeviceDesc%=FTD2XX, 
USB\VID_0403&PID_6010&MI_00

von Stefan (Gast)


Lesenswert?

Hallo Spice,

XXXX ist deine PID die Du im EPROM des Geräts hast
YYYY ein beliebiger String der unter Anschlüsse bzw. USB-Controller 
angezeigt wird.

------------------------------------------------------------------
ftdiport.inf :

%VID_0403&PID_XXXX.DeviceDesc%=FtdiPort232.NT,FTDIBUS\COMPORT&VID_0403&P 
ID_XXXX

[FtdiHw.NTamd64]
%VID_0403&PID_XXXX.DeviceDesc%=FtdiPort232.NTamd64,FTDIBUS\COMPORT&VID_0 
403&PID_XXXX

[Strings]
FTDI="YYYY Name"
DESC="YYYY Driver Package"
DriversDisk="YYYY Drivers Disk"
PortsClassName = "Ports (COM & LPT)"
VID_0403&PID_XXXX.DeviceDesc="YYYY Serial Port"

--------------------------------------------------------------------
ftdibus.inf

[FtdiHw]
%USB\VID_0403&PID_XXXX.DeviceDesc%=FtdiBus.NT,USB\VID_0403&PID_XXXX

[FtdiHw.NTamd64]
%USB\VID_0403&PID_XXXX.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0403&PID_XXXX

[Strings]
Ftdi="YYYY Name"
DESC="YYYY Driver Package"
DriversDisk="YYYY USB Drivers Disk"
USB\VID_0403&PID_XXXX.DeviceDesc="YYYY Device"
SvcDesc="USB Serial Converter Driver"
ClassName="USB"

--------------------------------------------------------------------

Wichtig ist das Du jeweils eine zum EPROM passende inf Datei hast da 
sonst Windows den Treiber nicht installiert. Wenn beide Dateien passen 
kann man auchden COM-Port für eine beliebige PID installieren. Die 
Dateien befinden sich im Verzeichnis des Treiber. Wie gesagt sollte es 
bei FTDI (jedenfalls vor einem Jahr) ein PDF zum Thema geben.
Stefan

von Spice (Gast)


Lesenswert?

Hey Stefan,

vielen Dank für die Beschreibung, sowas habe ich vermutlich gesucht, ich 
teste das gleich mal. Ich habe mich gerade ein wenig bei google verirrt, 
als ich danach suchte, wie man im Gerätemanager unter Anschlüsse den 
Namen der einzelnen COM-Ports ändern kann (nicht die Nummer) aber nix 
gefunden. Vermutlich ists genau deine Beschreibung, wie das 
funktioniert, ich teste das mal...

Gruß Spice

von Spice (Gast)


Lesenswert?

Funktioniert soweit, danke nochmal an alle...

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.