OpenDCC: USB

Einleitung

    Am USB-Bus hat jeder Teilnehmer eine eindeutige VID und PID (VID: Vendor ID = Herstellerkennung, PID: Product ID, Produktkennung).
    Die hier vorgestellten Schaltungen basieren zumeist auf dem FT232RL von FTDI. Für die OpenDCC Projekte wurde mir von FTDI eine eigene PID innerhalb der für FTDI vergebenen VID zugeteilt. Im Linux-Kernel ab Version 2.6.31.2 sind diese VID und PID als bekannte Devices enthalten, damit werden diese Geräte ohne manuelle Einstellungen als serielle Schnittstelle erkannt.

VID und PID bei OpenDCC

Erstinbetriebnahme des USB

    Nach dem Aufbau einer OpenDCC Schaltung muß die USB-Verbindung konfiguriert werden. Dies gliedert sich in zwei Teile:
  • Treiber am PC installieren
  • FTDI Chip konfigurieren

Konfiguration und Installation der FTDI Treiber

    FTDI bietet einen Kombitreiber an, der zwei verschiedene Modi kennt:
     - VCP (Virtual COM Port): dieser Mode emuliert eine serielle Schnittstelle, damit wird der Baustein später im Betrieb angesteuert.
     - D2XX: dieser Mode dient zur Konfiguration.


    Es wird wie folgt vorgegangen:
  • Es dürfen keine VCP- bzw. D2XX- Treiber installiert sein. Sind bereits ältere Versionen vorhanden, müssen diese zuerst deinstalliert werden.
  • Damit nach der korrekten Installation die OpenDCC Hardware richtig erkannt wird, muß man dem Treiber mitteilen, dass sich hinter VID 0x403 und PID 0xBFD8 OpenDCC verbirgt. Es müssen also die originalen Treiberinformationen um VID und PID ergänzt werden.
    Was man wo eintragen muß ist nachfolgend beschrieben. Für Windows-XP kann man diesen angepassten Kombi-Treiber (ursprünglich von FTDI ) herunterladen, dort ist bereits alles eingetragen.

    Treiberanpassung:
    • Von FTDI den Treiber für das verwendete Betriebssystem herunterladen und in ein beliebiges Verzeichnis entpacken.
    • Nun müssen die VID und PID für OpenDCC in die Dateien ftdibus.inf und ftdiport.inf dieses Treibers eingetragen werden. Hierzu sind in diesen Dateien die folgenden kursiven, roten Zeilen zu ergänzen.
    • ftdibus.inf

      [FtdiHw]
      %USB\VID_0403&PID_6001.DeviceDesc%=FtdiBus.NT,USB\VID_0403&PID_6001
      %USB\VID_0403&PID_BFD8.DeviceDesc%=FtdiBus,USB\VID_0403&PID_BFD8
      %USB\VID_0403&PID_BFD9.DeviceDesc%=FtdiBus,USB\VID_0403&PID_BFD9
      %USB\VID_0403&PID_BFDA.DeviceDesc%=FtdiBus,USB\VID_0403&PID_BFDA
      %USB\VID_0403&PID_BFDB.DeviceDesc%=FtdiBus,USB\VID_0403&PID_BFDB

      [FtdiHw.NTamd64]
      %USB\VID_0403&PID_6001.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0403&PID_6001
      %USB\VID_0403&PID_BFD8.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0403&PID_BFD8
      %USB\VID_0403&PID_BFD9.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0403&PID_BFD9
      %USB\VID_0403&PID_BFDA.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0403&PID_BFDA
      %USB\VID_0403&PID_BFDB.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0403&PID_BFDB

      [Strings]
      Ftdi="FTDI"
      DESC="CDM Bus Driver Package (OpenDCC Mod)"
      DriversDisk="FTDI USB Drivers Disk"
      USB\VID_0403&PID_6001.DeviceDesc="USB Serial Converter"
      USB\VID_0403&PID_BFD8.DeviceDesc="USB-IF OpenDCC V1.2"
      USB\VID_0403&PID_BFD9.DeviceDesc="USB-IF DCC Sniffer V1.0"
      USB\VID_0403&PID_BFDA.DeviceDesc="USB-IF OpenDCC Throttle V1.0"
      USB\VID_0403&PID_BFDB.DeviceDesc="USB-IF OpenDCC Gateway V1.0"
    • ftdiport.inf

      [FtdiHw]
      %VID_0403&PID_6001.DeviceDesc%=FtdiPort232.NT,FTDIBUS\COMPORT&VID_0403&PID_6001
      %VID_0403&PID_BFD8.DeviceDesc%=FtdiPort232.NT,FTDIBUS\COMPORT&VID_0403&PID_BFD8
      %VID_0403&PID_BFD9.DeviceDesc%=FtdiPort232.NT,FTDIBUS\COMPORT&VID_0403&PID_BFD9
      %VID_0403&PID_BFDA.DeviceDesc%=FtdiPort232.NT,FTDIBUS\COMPORT&VID_0403&PID_BFDA
      %VID_0403&PID_BFDB.DeviceDesc%=FtdiPort232.NT,FTDIBUS\COMPORT&VID_0403&PID_BFDB

      [FtdiHw.NTamd64]
      %VID_0403&PID_6001.DeviceDesc%=FtdiPort232.NTamd64,FTDIBUS\COMPORT&VID_0403&PID_6001
      VID_0403&PID_BFD8.DeviceDesc%=FtdiPort232.NTamd64,FTDIBUS\COMPORT&VID_0403&PID_BFD8
      VID_0403&PID_BFD9.DeviceDesc%=FtdiPort232.NTamd64,FTDIBUS\COMPORT&VID_0403&PID_BFD9
      VID_0403&PID_BFDA.DeviceDesc%=FtdiPort232.NTamd64,FTDIBUS\COMPORT&VID_0403&PID_BFDA
      VID_0403&PID_BFDB.DeviceDesc%=FtdiPort232.NTamd64,FTDIBUS\COMPORT&VID_0403&PID_BFDB

      [Strings]
      FTDI="FTDI"
      DESC="CDM Port Driver Package (OpenDCC Mod)"
      DriversDisk="FTDI USB Drivers Disk"
      PortsClassName = "Ports (COM & LPT)"
      VID_0403&PID_6001.DeviceDesc="USB Serial Port"
      VID_0403&PID_6010.DeviceDesc="USB Serial Port"
      VID_0403&PID_6011.DeviceDesc="USB Serial Port"
      VID_0403&PID_BFD8.DeviceDesc="USB-IF OpenDCC V1.2"
      VID_0403&PID_BFD9.DeviceDesc="USB-IF DCC Sniffer V1.0"
      VID_0403&PID_BFDA.DeviceDesc="USB-IF OpenDCC Throttle V1.0"
      VID_0403&PID_BFDB.DeviceDesc="USB-IF OpenDCC Gateway V1.0"
    • Die Veränderung der DESC Variablen ist in beiden Dateinen optional, hilft aber bei der Indentifizierung in der Softwareliste.
  • Da aktuelle Systeme (besonders Vista) bevorzugt zuerst online nach Treibern suchen, empfiehlt es sich den Treiber vor dem ersten Verbinden zu installieren. Als besonders hilfreich erweist sich an dieser Stelle das windowsinterne Driver Installation Framework (DIFx).
    Hierfür einfach mal im System nach der Datei DPInst*.exe suchen, in das Verzeichnis kopieren in welchem der Treiber ausgepackt wurde und direkt starten.
    Hinweise:
    • Sollten die Treiber als ungültig abgewiesen werden, muss DPInst im legacy mode über den Parameter DPInst.exe -lm in der Konsole (cmd) gestartet werden.
    • für x64 Systeme muss DPInstx64.exe verwendet werden.
  • Jetzt OpenDCC mit dem PC verbinden. Eine neue Hardware wird erkannt und die registrierten Treiber werden verwendet.
  • Wenn man noch keine Treiber installiert hat (s.oben), so ist jetzt bei der Frage nach den passenden Treibern auf das entsprechende Verzeichnis zu verwiesen.
  • Im Geräte Manager sollte nun ein neuer serieller Port sowie ein neues USB Device erscheinen. Wenn die Hardware bereits die OpenDCC PID und VID enthält, dann wird das auch angezeigt. Bei neuer Hardware fehlt das noch und man muß das noch konfigurieren.

Konfiguration des USB-Chips

    Damit die Hardware nicht nur als 'irgendein' serieller Port, sondern als OpenDCC erkannt wird, muß man PID und VID in den FTDI Chip hineinschreiben.
  • Mprog Screenshot
    Mit dem Konfigurationprogramm MPROG wird nun die richtige Herstellerkennung und Produktkennung gemäß obiger Tabelle eingetragen. Wichtig: kein Häkchen bei 'load D2XX', damit der Chip später als serielle Schnittstelle anmeldet. Zur Vereinfachung kann man auch das jeweilige Template (z.B. OpenDCC_V1.2.ept) laden, damit sind alle notwendigen Einstellungen bereits vorgenommen.
    Nach dem Eintrag der richtigen Kennung kann man mit 'Cycle Device' ("Lupe") ein Neueinlesen des Busses veranlassen.
  • Durch Drücken auf das Blitzsymbol werden der USB-Chip und das EEPROM konfiguriert.
  • Jetzt die OpenDCC Baugruppe wieder vom PC trennen und kurz warten bis Port und Device im Gerätemanager verschwinden.
  • Stellt man nun die Verbindung von OpenDCC Baugruppe und PC wieder her, dann sollte die OpenDCC Baugruppe korrekt in der Deviceübersicht in der Systemsteuerung erscheinen.

    Die OpenDCC Zentrale 1 wurde gefunden und wird mittels des VCP-Treibers (=Virtual Com Port) als serielle Schnittstelle (im Bild: COM6) im Gerätemanager angezeigt.
  • Tipp

      Man kann sich (unter Windows XP) den Device-Manager als Verknüpfung auf den Desktop holen, dann muß man nicht immer über Arbeitsplatz, rechte Maus, Eigenschaften usw. da hin. Einfach von devmgmt.msc eine Verknüpfung erstellen.

    Links