OpenDCC: BiDiB

Einleitung

    Für alle Baugruppen, welche BiDiB unterstützen, ist die Vergabe einer eindeutigen Produktkennung zwingend erforderlich. Die Produktkennung besteht aus Vendor ID (VID = Herstellerkennung), Product ID (PID = Produktkennung) und Seriennummer.

    Die Vendor-ID ist die normale DCC-Herstellerkennung, für Selbstbaudekoder ist hier die Nummer 13 vorgesehen.

Aufteilung des PID-Raumes bei Vendor-ID 13

    Innerhalb dieser VID=13 ist der Bereich nach PID wie folgt aufgeteilt:
    VIDPIDKlassenProduct
    130 .. 49IPID für Entwicklung
    1350..100Ireserviert
    13101 (0x65)IBiDiB-IF, kleines Evaluierunginterface, USB
    13102 (0x66)IMGBM16TC, 16-64facher Railcom-Melder mit Interface.
    13103 (0x67)MBGBMBoost, 16-48facher Railcom-Melder, integrierter Booster
    13104 (0x68)IMBGBMBoost, 16-48facher Railcom-Melder, integrierter Booster, Interface
    13105 (0x69)MBiDiB-S88-Brigde
    13106 (0x6a)SBiDiB-IO16 (Schalt-Knoten mit 4 Servos, 16 IO)
    13107 (0x6b)SLightControl 1 (Lichtsteuerung mit 32 LEDs, 16 Universalausgänge, 4 Servos)
    13108 (0x6c)SMoBaList (Lichtsteuerung mit 24 Ausgängen)
    13112 (0x70)-BiDiBOne nur Bootloader
    13113 (0x71)SBiDiBOne OneTester: 24 LED-Testboard
    13114 (0x72)IBiDiBOne OneHub: BiDiBus Hub
    13115 (0x73)SBiDiBOne OneDMX: DMX Controller, 64 DMX Kanäle, 8 Taster
    13116 (0x74)-BiDiBOne default Produktkennung, noch keine Funktionen
    13117 (0x75)-BiDiBOne Control
    13119 (0x77)-StepControl 1 nur Bootloader
    13120 (0x78)SMStepControl 1 Schrittmotorsteuerung für Drehscheiben / Schiebebühnen / Segmentbühnen
    13121 (0x79)S- OneST: 4-fach Weichen- und Servodekoder mit Herzstück-Polarisierung
    13122 (0x7A)SBiDiBOne OneDriveTurn: Weichen- und Servodekoder mit Lageüberwachung (16 IO, 8 Servo, 8 Out für Weichenmotoren)
    13123 (0x7B)SSTµ STµist ein Clone der OneST (4 Servos, 8 Relais, v. Michael Volk)
    13124 (0x7C)MS88-TLE S88-TLE: 16 TLE Inputs direkt, 1 S88 Strang
    13125 (0x7D)SBoot644P Bootloader für Atmel 644P-Prozessoren
    13126 (0x7E)SMobalist644 Mobalist644: 24 Schaltausgänge/Lichtausgänge (wie Mobalist, aber auf 644p-Basis)
    13127 (0x7F)SMobaLED MobaLED: 24 LEDs, direkt angesteuert.
    13128 (0x80)SMobaIO24 MobaIO24: 24 frei konfigurierbare Ports
    13129 (0x81)SBiDiBOne OneWS: 64 LEDs nach WS2812-Standard, Gruppenansteuerung
    13130 (0x82)SST4 ST4: 4 Servos, 4 Relais zur Herzstückpolarisation
    13131 (0x83)-IF2 nur Bootloader
    13132 (0x84)IIF2 IF2: kleines USB-Interface with DCC Generator
    13133 (0x85)-OpPanel OpPanel: Evaluierungsmodul für lokale Eingabe
    13134 (0x86)SGBM16TS GBM16TS ist ein Belegtmelder (16 Kanäle, Railcom, Standalone)
    13135 (0x87)SOctagon-1 Eine Kirmessteuerung, speziell für Lichteffekte
    13136 (0x88)IBBiDiB-Pi1 Ein BiDiB-Shield für den Raspberry Pi3, mit Interface und Booster
    13146 (0x92)SOpenSwitch Dekoder mit 8 Outputs / 4 Weichenantrieb
    13147 (0x93)-OpenSwitchBoot Bootloader zu OpenSwitch
    13148 (0x94)-BiDiB-Handregler-Interface Software Adapter Roco Z21-LAN und netBiDiB
    13149 (0x95)-TrackEmu 1 Komponente des DCCtest-Platzes; Gleissimulation
    13206 (0xCB) SBiDiB-RS-GW BiDiB-RS-GW, Interface für bis 1024 RS-Rückmelder
    13205 (0xCD) S BiDiBOne NeoControl_Light: Lichtsteuerung, mit WS2811 / Neopixel, Einzelansteuerung
    13206 (0xCE) SNeoControl NeoControl_Signal: Lichtsteuerung, mit WS2811 / Neopixel, Einzelansteuerung und Signale
    Bedeutung der Abkürzungen bei den Klassen: I: Interface, M: Melder, S: Schalten, B:Booster

Seriennummern für OpenDCC-Produkte

    Für jede Baugruppe ist eine individuelle Seriennummer erforderlich, diese kann mit dem nachfolgenden Generator erzeugt werden.

    Wie funktioniert es?
  • In den Downloaddateien zu OpenDCC-BiDiB-Projekten ist die VID und PID bereits integriert, jedoch ist keine Seriennummer enthalten. Die Downloaddateien können daher problemlos auf den Prozessor geladen werden, eine eventuell bereits vorhandene Seriennummer wird dabei nicht überschrieben.
  • Wenn die Firmware beim Starten keine geladene Seriennummer erkennt, blinkt ein Fehlercode und der Betrieb wird blockiert. Ohne Seriennummer läuft die Firmware nicht!
  • Zu jeder Baugruppe muß mit dem nachfolgenden Generator einmalig eine Seriennummer erzeugt werden.
  • Die erzeugte Seriennummer bitte notieren und auch auf der Baugruppe vermerken.
  • Der Generator erzeugt ein Intel-Hex-File mit dem Inhalt der Seriennummer. Diese wird als Text dargestellt und auch als Download angeboten.
  • Die Seriennummer muß auf dem üblichen Weg (also via Programmiergerät (z.B. AVRmkII) oder Bootloader) in die Baugruppe eingespielt werden, andere Inhalte werden dabei nicht überschrieben. Das muß nur einmalig erfolgen.

Generator

    Um den Generator benutzen zu können, ist eine Anmeldung erforderlich. Hierbei ist die Benutzerkennung und das Passwort vom OpenDCC-Forum zu verwenden. Wenn Sie aktuell im Forum angemeldet sind, wird die Anmeldung hier übernommen. (Datenschutzhinweis: mit der Benutzung des Seriennummergenerators erklären sie sich mit der Speicherung der hierfür benötigten Daten (Anmeldedaten, erzeugte Seriennummern) auf unserem Server einverstanden. Wenn Sie damit nicht einverstanden sind, dürfen Sie den Seriennummergenerator nicht verwenden).
    Wichtig: nur neue Seriennummern generieren, wenn tatsächlich eine Baugruppe gebaut wird. Hinweis:
    Sollte die Anmeldung nicht funktionieren, so kann eine zu restriktive Einstellung des Browsers die Ursache sein. Z.B. unter IE9 und Win7 muß man die beiden URLs https://opendcc.de und https://fichtelbahn.de in Liste der vertrauenswürdigen Sites aufnehmen. Zu finden ist diese Einstellung unter "Interneteinstellungen" - "Sicherheit", dort unter "vertrauenswürdige Sites" die beiden Sites hinzufügen. Dadurch werden die Restriktionen gelockert und der Datenaustausch zwischen den beiden Domains wird zugelassen.

PIDs für Entwicklung und rein privatem Gebrauch

    Es ist zwingend erforderlich, dass jede Baugruppe eine eigene Nummer hat. Trotzdem kann es in der Entwicklungsphase oder für rein privaten Gebrauch wünschenswert sein, keine 'offzielle' Nummer zu verwenden. Der Bereich 0..49 ist hierfür freigehalten, für diese PID gelten folgende Regeln:
  • Sie dürfen frei für Entwicklungszwecke benutzt werden.
  • Baugruppen mit dieser Kennung dürfen nicht 'geteilt' werden: d.h. sie dürfen nicht verkauft/verschenkt werden, es darf davon kein fertiges Image zum Nachbau ins Netz gestellt werden.
  • Zugehörige Firmware und CV Beschreibungen sind strikt privat zu halten.
  • Alle Anwender einer solchen PID müssen sich der Gefahr möglicher Unique-Kollisionen bewußt sein.

Hintergrundinformationen zum AVR-Studio

    Nur für Programmierer wichtig!
    Die Seriennummer wird in den beiden höchsten Bytes des EEPROMs abgelegt. Das wird durch eine eigene section .ee_serial und entsprechende Linkeranweisungen festgelegt. Im Quellcode ist also folgende Zeile erforderlich:
      unsigned int e_serial[] __attribute__((section(".ee_serial"))) = {0}; 
    Nun muß man diese Seriennummer im Linker an die richtige Stelle lenken, dabei sind folgende Änderungen am makefile erforderlich: Im Bereich des Linkers ist eine Zeile hinzuzufügen, welche die neue Section mit aufnimmt und zuweist:
      LDFLAGS += -Wl,-section-start=.ee_serial=0x8101fe
    Beim Builder der hex-Dateien muß man nun dafür sorgen, dass die Seriennummer nicht mit reingepackt wird:
      HEX_FLASH_FLAGS += -R .ee_serial
    Wenn man nur die Seriennummer erzeugen will, dann muss man die Zeile
      HEX_EEPROM_FLAGS = -j .eeprom 
    durch folgende Zeile ersetzen:
      HEX_EEPROM_FLAGS = -j .ee_serial 
    Das erzeugte eep-file für das eeprom sieht dann z.B. so aus:
      :0201FE0055AA00


    Ein andere Möglichkeit ist die Benutzung einer Compiler-Variable EEPROM_SIZE.
    #if defined (__AVR_ATmega162__)
        #define EEPROM_SIZE     512
    #else
        #warning undefinded AVR
    #endif

    Diese Variable wird nun benutzt, um die Serialnumber aus den EEPROM zu lesen:
        my_unique_id.product_serial = eeprom_read_word((unsigned int*)(EEPROM_SIZE-2));
    


    Hinweis: die EESAVE-Fuse muß gesetzt sein, damit die Seriennummer den Befehl 'chip erase' überlebt.

Alternativen zum Seriennummergenerator

    Achtung: dieser Weg ist für normale Anwender absolut nicht empfohlen, ich notiere das hier nur als Hinweis für Anwender, welche ganze Baureihen oder eigene Baugruppen erzeugen!

    1. Man benutzt einen hex-file Manipulator, hier verwenden wir srecord. (win) Dieses Programm bietet sehr weitreichende Möglichkeiten, an Binärformaten rumzuschrauben.

    2. Nun erzeugt man sich mit folgendem Befehl eine Datei:
    srec_cat -generate 0x0CFE 0x0D00 -constant-l-e 0x1234 2 -o my_serial.hex -intel -address-length=2
    Was bedeutet das im Einzelnen?
    srecord soll was erzeugen, und zwar von Adresse 0xCFE bis 0x0D00 (eben der Bereich der Seriennummer) und das mit einer Konstante füllen (-constant), diese soll little endian sein. 0x1234 ist also die Konstante und damit die Seriennummer. -o: jetzt kommt die Outputdatei (my_serial.hex) und diese soll bitte im Intel-Hex-Format mit kurzer Adresse sein.
    Beim Einsatz im Batch muß man das passend mit einer Umgebungsvariablen befüllen. (for i=1...)