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.
Innerhalb dieser VID=13 belegen OpenDCC-Projekte die Produktkennungen 100 ... 199. Für jede Baugruppe ist eine individuelle Seriennummer erforderlich, diese kann mit dem nachfolgenden Generator erzeugt werden.
Produktkennungen von OpenDCC-Baugruppen
| VID | PID | Klassen | Product |
|---|---|---|---|
| 13 | 101 | M | GBM16TC, 16-64facher Railcom-Melder. (Evaluierungsmodul, Stand-Alone) |
| 13 | 102 | IM | GBM16TC, 16-64facher Railcom-Melder mit Interface. |
| 13 | 103 | MB | GBMBoost, 16-48facher Railcom-Melder, integrierter Booster |
| 13 | 104 | IMB | GBMBoost, 16-48facher Railcom-Melder, integrierter Booster, Interface |
| 13 | 105 | M | BiDiB-S88-Brigde |
| 13 | 106 | S | OpenDecoder 2.8 (Lichtsteuerung mit 4 LEDs, 2 Servos) |
| 13 | 107 | S | LightControl 1 (Lichtsteuerung mit 32 LEDs, 16 Universalausgänge, 4 Servos) |
| 13 | 108 | S | MoBaList (Lichtsteuerung mit 24 Ausgängen) |
Seriennummern für OpenDCC-Produkte
-
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.
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 http://opendcc.de und http://picotronic.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.
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=0x8101feBeim Builder der hex-Dateien muß man nun dafür sorgen, dass die Seriennummer nicht mit reingepackt wird:
HEX_FLASH_FLAGS += -R .ee_serialWenn man nur die Seriennummer erzeugen will, dann muss man die Zeile
HEX_EEPROM_FLAGS = -j .eepromdurch folgende Zeile ersetzen:
HEX_EEPROM_FLAGS = -j .ee_serialDas 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...)