CVM IV - Verdecköffnen während der Fahrt ohne Zusatzmodul + NCS Exkurs

elkloso

macht Rennlizenz
Registriert
2 Juli 2017
Wagen
BMW Z4 e85 roadster 2,5i
Hi zusammen,

nach einigen Tagen Engineering und tatkräftiger Unterstützung durch @Moscha, habe ich das CVM IV aus dem E85 (und Mini R52) entschlüsselt bekommen. Somit kann man jetzt die Verdecköffnung während der Fahrt codieren.

Wo lag die Schwierigkeit?​

Das CVM nimmt normalerweise keine Werte an. Ändert man mit NCS einfach die Werte, wie z.B. im GM5 oder LSZ, dann bekommt man folgenden Fehler: "COAPI-2060: Codierung Fehlerhaft (allgemein)". Warum passiert das?
Das CVM berechnet pro Block eine Checksumme (Check_Block_x). Diese muss am Ende wieder stimmen, dass er die Kodierung annimmt. Nun sind Checksummen aber nicht genormt, weshalb es dort nicht DAS Verfahren gibt, um sie zu berechnen. Wer mehr wissen möchte, hier entlang: Prüfsumme – Wikipedia

Lösungsansätze​

Was kann man jetzt tun? Man kann die Checksumme bruteforcen, also alle Werte ausprobieren, was bei 255 Werten recht stressig werden kann, wenn man es bei jeder neuen Codierung machen muss.
Also habe ich mir eine Excel Tabelle gebaut, die verschiedene valide Codierungen miteinander vergleicht. Manche sind schon bekannt gewesen (Hardtop vs Kein Hardtop, Mini vs. E85, C.01 vs. C.07) und andere habe ich heraus gefunden durch BruteForce (Geschwindigkeitsprüfung an vs. aus). Dann habe ich an der Tabelle alle möglichen Varianten probiert: Fletchers Checksum, stumpf die Data-Werte addieren, die Adresse mit einbeziehen,... Manche kamen schon nah heran, aber es gab immer wieder dann Summen, die meinen Ansatz widerlegt haben.
Schnell zeigte sich aber, dass die Masked Values etwas damit zu tun haben (dazu später mehr). Allerdings gingen sie manchmal hoch und manchmal runter, haben sich also nicht linear verhalten. Nachdem ich mich dann nochmal tiefer mit Memory-Management und allem was mit Binär-Daten zu tun hat, beschäftigt habe, bin ich auf das eigentlich bekannte Verfahren der Bitwise Operations gekommen. Also noch etwas herumprobiert und herausgefunden, dass Bitwise XOR verwendet wird.


NCS Grundlagen​

Um das tiefer zu verstehen, muss man sich mit NCS etwas mehr auseinander setzen. Die meisten kennen die Möglichkeit mit Text zu codieren. Also z.B. "SIEDEMARKER_US_MIT_FRA_V" von "nicht_aktiv" auf "aktiv" setzen. Aber was passiert da eigentlich?
NCS basiert auf sog. DATEN-Dateien, die wiederum übersetzen von eurem Fließtext in 0 und 1 (Bits & Bytes). Bei "nicht_aktiv" wird meist das Bit auf 0 gesetzt, bei "aktiv" auf 1.
Nun kann das Bit aber Werte von 00 bis FF (0 bis 255) annehmen. Somit können bei vielen Werten z.B. mehrere Optionen codiert werden. Tippblinken kann man z.B. auf "wert_01" = 1x, "wert_02" = 3x, usw. codieren. Was hier eigentlich passiert ist, dass in den DATEN gesagt wird: Wenn in der .MAN Datei "wert_02" steht, dann soll am Byte XY der Wert auf 03 gesetzt werden. Dadurch kann man den DATEN Dateien auch neue Werte beibringen (z.B. Tippblinken 7x), weil man einfach nur der DATEN Datei sagen muss, welchen Wert sie im Bit setzen soll.

Screenshot 2021-06-01 at 13.05.38.png

Soweit, so einfach.
Jetzt sind unsere Steuergeräte aber recht alt und wir reden von einer Zeit als ganze Videospiele noch auf 1MB Kassetten für den Gameboy gepasst haben. Deswegen musste effizient programmiert und der Speicher genutzt werden. Also wurde Bit-Masking verwendet. Kurz gesagt teilen sich hier mehrere Codierungen ein Byte. Mithilfe der Maske werden sie miteinander verknüpft um somit schneller zu rechnen und Speicherplatz zu sparen. Da kommen jetzt auch wieder unser Bitwise Operations ins Spiel. Wen das so richtig interessiert, hier gehts lang: Bitfeld – Wikipedia
Somit hat z.B. bei "aktiv" der Eintrag den Wert 01, aber gesetzt wird eigentlich 08. Das ist wichtig zu wissen.

Bitwise WAS?​

Kurz gesagt ist das ein bisschen wie Schriftliche Addition. Eine Folge von 0 und 1 werden miteinander kombiniert, um eine neue Folge zu erhalten. Dabei kann man Booleans wie AND, OR oder auch XOR verwenden.
XOR bedeutet, dass die zweite Zahl besagt, ob die 0 oder 1 an der gleichen Stelle der ersten Zahl invertiert werden soll.
Als Beispiel: 0101 XOR 1001:
Position 1: 0 XOR 1 -> Die 0 wird invertiert
Position 2: 1 XOR 0 -> Die 1 wird nicht invertiert
Position 3: 0 XOR 0 -> Die 0 wird nicht invertiert
Position 4: 1 XOR 1 -> Die 1 wird invertiert
Das ist jetzt sehr vereinfacht und Bits liest man eigentlich von rechts nach links, aber ich hoffe das Prinzip wurde klar.

Zurück zur Checksumme​

Das war jetzt ein großer Ausflug in die Informatik. Wie hilft uns das beim Steuergerät?
Wir müssen jeweils für einen Block die Masked Values per XOR verrechnen. Wie macht man das also?

  1. Zunächst schauen wir uns in NCSDummy (NCS Dummy - Taking the expert out of NCS Expert) die Masked Values an. Dazu gehen wählen wir Baureihe und Modul aus, dann unten auf Module Functions und auf Export und speichern es als Text-Datei.
  2. Nun sehen wir mehrere Spalten. Interessant ist für uns "Function Keyword", "Data", "Masked". Hier wissen wir welche Funktion wir haben wollen, welchen Wert wir brauchen und wie er maskiert ist. z.B. "GESCHW_VERDECK_AKTIV wert_01" | "0A" | "0A". Also wissen wir, dass dieser Wert einen Masked Value von "0A" hat.
  3. Das übertragen wir uns alles in eine Tabelle und rechnen die jeweiligen Masked Values per XOR zusammen und zuletzt nochmal invertieren (XOR FF). Dann müssten wir auf den Check_Block Wert kommen.
  4. Nun können wir einen Wert ändern z.B. von "0A" auf "32" (10 auf 50). Wir müssen schauen, wie der Masked Value sich ändert. Entweder hat man es im Gefühl oder man fügt den Parameter bei NCS ein (1. Tab, Rechtklick, Add Parameter, Export -> Update Module) und exportiert wieder die Functions und schaut sich dann Wert wieder in der TXT an. Als Faustregel kann man sagen, wenn der Wert die Länge FF hat, dann ist Masked Value = Data Value
  5. Jetzt können wir uns wieder die Checksumme, wie in Schritt 3, berechnen und erhalten einen Wert.
  6. Diesen Wert fügen wir wieder in NCS Dummy als Parameter ein. Die Anleitung dazu findet ihr hier unter Punkt 3.1.4: NCS Dummy - Taking the expert out of NCS Expert
  7. Nun kann man die neu hinzugefügten Werte ganz normal per .MAN Datei in NCS kodieren
Zum Berechnen könnt ihr die Tabelle "Calc_Checksum" verwenden, die ich angehangen habe.

Als praktisches Beispiel seht ihr hier den relevanten Block für die Geschwindigkeitsabfrage des Verdeck:
Screenshot 2021-06-01 at 13.11.17.png
Screenshot 2021-06-01 at 13.06.55.png

Zu schwierig?​

Im Anhang sind DATEN für das CVM.01. Auf Anfrage kann ich auch für die weiteren CVMs die DATEN bearbeiten. Diese haben neue Codierwerte erhalten.

GESCHW_PRUEFUNG
wert_02

GESCHW_VERDECK_AKTIV
wert_02 -> 30km/h
wert_03 -> 50km/h

CHECK_BLOCK_04
wert_02
wert_03
wert_04

Die Datei bei C:/NCSEXPER/DATEN/E85 einfügen, vorher eure CVM_IV.C01 als Backup speichern.
Danach könnt ihr ganz normal über die MAN codieren.

Codieroptionen:
1. Gar keine Geschwindigkeitsprüfung (nicht empfohlen):
GESCHW_VERDECK_AKTIV
wert_01
GESCHW_PRUEFUNG
wert_01
CHECK_BLOCK_04
wert_02

2. Verdecköffnung bis 30km/h (empfohlen):
GESCHW_VERDECK_AKTIV
wert_02
GESCHW_PRUEFUNG
wert_02
CHECK_BLOCK_04
wert_03

3. Verdecköffnung bis 50km/h (empfohlen):
GESCHW_VERDECK_AKTIV
wert_03
GESCHW_PRUEFUNG
wert_02
CHECK_BLOCK_04
wert_04
 

Anhänge

  • Calc_Checksum.xlsx.zip
    8,2 KB · Aufrufe: 28
  • CVM_IV.C01.zip
    1,9 KB · Aufrufe: 33
Zuletzt bearbeitet:
Mit @Moscha hatte ich auch schon einige sehr interessante Telefonate zu diesem Vorgehen allerdings für andere Codierungen. Habe dich auch nicht vergessen, wegen des neuen Versuchs...
Muss nur mal wieder was mehr freie Zeit am Stück haben... :(

Aber zu dem Thema hier maximalen Respekt an euch beide! Das Vorgehen ist soweit auch sehr gut beschrieben, soweit ich es aus den Telefonaten noch in Erinnerung habe. Vielen Dank für eure Mühen, ich kann mir das nur grob vorstellen, aber ihr habt da sicher viel Zeit investiert.

Werde das demnächst testen und gerne auch berichten!
 
Mit @Moscha hatte ich auch schon einige sehr interessante Telefonate zu diesem Vorgehen allerdings für andere Codierungen. Habe dich auch nicht vergessen, wegen des neuen Versuchs...
Muss nur mal wieder was mehr freie Zeit am Stück haben... :(
Genau, das hier baut ziemlich auf den anderen Codierungen auf. Nur, dass NCS erstmal wegen des Checkblock meckert.
Das war dann die Herausforderung den Checkblock zu zerlegen und zu verstehen. Damit sollten jetzt aber auch alle anderen Codierungen am CVM möglich sein. Mal schauen, was da noch so geht
 
Das mit dem Checkblock war schon echt tolle Arbeit von Dir! Hut ab kann ich dazu nur sagen!!! 👍👍👍
Werde nach Feierabend mal meinen 3.0si auslesen, welche CVM Version dort verbaut ist und Dir die Daten zur Verfügung stellen.
 

Zurück zur Checksumme​

Das war jetzt ein großer Ausflug in die Informatik. Wie hilft uns das beim Steuergerät?
Wir müssen jeweils für einen Block die Masked Values per XOR verrechnen. Wie macht man das also?

  1. Zunächst schauen wir uns in NCSDummy (NCS Dummy - Taking the expert out of NCS Expert) die Masked Values an. Dazu gehen wir auf den Tab "Disassembly", wählen im 1. Feld die DATEN File des CVMIV aus und speichern es als Text-Datei.
  2. Nun sehen wir mehrere Spalten. Interessant ist für uns "Function Keyword", "Data", "Masked". Hier wissen wir welche Funktion wir haben wollen, welchen Wert wir brauchen und wie er maskiert ist. z.B. "GESCHW_VERDECK_AKTIV wert_01" | "0A" | "0A". Also wissen wir, dass dieser Wert einen Masked Value von "0A" hat.
  3. Das übertragen wir uns alles in eine Tabelle und rechnen die jeweiligen Masked Values per XOR zusammen und zuletzt nochmal invertieren (XOR FF). Dann müssten wir auf den Check_Block Wert kommen.
  4. Nun können wir einen Wert ändern z.B. von "0A" auf "32" (10 auf 50). Wir müssen schauen, wie der Masked Value sich ändert. Entweder hat man es im Gefühl oder man fügt den Parameter bei NCS ein (1. Tab, Rechtklick, Add Parameter, Export -> Update Module) und disassembled wieder die neue DATEN File und schaut sich dann Wert wieder in der TXT an. Als Faustregel kann man sagen, wenn der Wert die Länge FF hat, dann ist Masked Value = Data Value
  5. Jetzt können wir uns wieder die Checksumme, wie in Schritt 3, berechnen und erhalten einen Wert.
  6. Diesen Wert fügen wir wieder in NCS Dummy als Parameter ein. Die Anleitung dazu findet ihr hier unter Punkt 3.1.4: NCS Dummy - Taking the expert out of NCS Expert
  7. Nun kann man die neu hinzugefügten Werte ganz normal per .MAN Datei in NCS kodieren
Zum Berechnen könnt ihr die Tabelle "Calc_Checksum" verwenden, die ich angehangen habe.

Als praktisches Beispiel seht ihr hier den relevanten Block für die Geschwindigkeitsabfrage des Verdeck:
Anhang anzeigen 498505
Anhang anzeigen 498503
...
Absolut Top!
Hartnäckig analysiert und toll erklärt. Respekt!

So was ähnliches benötigen wir für den E89 auf der CAN-Bus Ebene. Dort stecken noch einige Unbekannte in der Kommunikation mit dem Fahrzeug.
 
CVM_IV.C01 <-- Erledigt :inlove::inlove::inlove:

Jetzt benötigen wir nur noch die Nettodaten-Dumps von den laut NCS-Dummy im E85 verbauten Modulen:
CVM_IV.C02
CVM_IV.C03
CVM_IV.C04
CVM_IV.C07

Also ran an die Laptops und Netto-Daten Dumps vom CVM Eurer ZZZZ ziehen (natürlich dazu schreiben welche Version es ist). :D:D:D
 
CVM_IV.C01 <-- Erledigt :inlove::inlove::inlove:

Jetzt benötigen wir nur noch die Nettodaten-Dumps von den laut NCS-Dummy im E85 verbauten Modulen:
CVM_IV.C02
CVM_IV.C03
CVM_IV.C04
CVM_IV.C07

Also ran an die Laptops und Netto-Daten Dumps vom CVM Eurer ZZZZ ziehen (natürlich dazu schreiben welche Version es ist). :D:D:D

Die habe ich ja. Also die DATEN und NCSDummy, mehr braucht man nicht. Könnte ich theoretisch vorbereiten, so wie sie jmd braucht ;)
 
@elkloso Ja dann immer ran an die fehlenden 4 :D
Dann kann ich nachher relativ schnell gleich den Praxistest draus machen.
 
Als allgemeiner Hinweis: Ich werde bei mir pers. den Limiter auf 50 km/h konfigurieren.

Nicht weil ich ständig mit 50 Sachen das Dach öffnen/schließen möchte! Dies dürfte auf Dauer für das Verdeckgestänge nicht gut sein (Belastung durch Fahrtwind).

Aber Computer sind digital und wenn man den Limiter auf 30 km/h konfiguriert und aus versehen auf 31 km/h beschleunigt, bleibt das Dach einfach in der Luft stehen während man fährt (was dann wirklich sehr suboptimal für das Gestänge ist).

Der Sinn ist eher das man während einer Tour keinen kompletten Stop einlegen muss und bei langsamer Fahrt das Verdeck betätigen kann.
 
Aber Computer sind digital und wenn man den Limiter auf 30 km/h konfiguriert und aus versehen auf 31 km/h beschleunigt, bleibt das Dach einfach in der Luft stehen während man fährt (was dann wirklich sehr suboptimal für das Gestänge ist).

Das sollte mal jmd. ausprobieren. Ich glaube, dass es dann nicht stehen bleibt, weil er das nicht dauerhaft checkt sondern nur bei Betätigung. Aber bin mir nicht sicher
 
Update: Das Speed Limit macht bei mir gerade noch Probleme.

GESCHW_PRUEFUNG funktioniert bei mir aber.
 
Also die Variante 1 ohne Geschwindigkeitsangabe funktioniert bei mir auch.
Variante 3 funktioniert nicht.

Dennoch schon mal sehr gut!

Edit:
Nach 1x Fahrzeug abstellen und „Neustart“ funktioniert Variante 1 auch nicht mehr.
 
Zuletzt bearbeitet:
Kannst du mir deinen Codierindex geben?

Schau mal bitte, ob bei dir POWER_ON_RESET gesetzt ist
 
Den Codierindex hast du benötigt um die richtige Datei zu modfizieren. Ich habe oben ja nur für C01 die Datei bereit gestellt.

Unter INPA -> CVM -> F2 sollte was stehen
 
Ich habe einfach mal versucht :D
Ich prüfe es morgen, wenn ich wieder am Zetti bin.
Hat die C0X was mit den Baujahren zu tun? Falls ja, schätze ich mal, dass ich C01 habe, einer der ersten aus 2003...
 
Ja, wirst du haben. Ich hab mit 2004 auch noch 01. Deswegen hat die Datei auch geklappt ;)

Ich probiere Donnerstag bei meinem nochmal, aber bis jetzt hat er die Werte behalten. Vllt ist bei dir beim Codieren was schief gegangen, mal schauen, was Moscha so berichtet
 
Das ist ja geil, hab zwar noch aus der Ausbildung ein bisschen Knowhow über binär, hexadezimal und co, aber von dem Einleitungspost habe ich glaube ich nur die ersten 80% verstanden.
Bei den Kommentaren hab ich den Anschluss dann ganz verloren, will nicht wissen wie das hier für nen IT/Elektrinik-fremden aussehen muss 🙈 :D
Morgen lese ich mir das ganze nochmal in Ruhe durch und dann guck ich mal ob, wie und wann ich das umgesetzt kriege.
(haben will ich das nämlich schon ne ganze weile!)
 
Das kann man sich alles aneignen. Ich habe auch "nur" ein BWL Studium. Alles was mit der IT und Elektronik zu tun hat, hab ich mir selbst angelesen und ausprobiert :D
Zum Glück haben schon viele vor uns mit NCS rumgespielt und es gibt solche Tools wie NCS Dummy, die es dann doch deutlich einfacher machen.

Ich bin gespannt, wie sich die verschiedenen Fahrzeugvarianten verhalten und was man mit dem CVM noch so anstellen kann.
Es gibt auch noch Systemspezifische Werte auf welche Speicherblöcke er zugreifen darf, aber ob wir da je rausfinden, was die machen, bezweifle ich etwas.
 
Habe den Codierindex auch mit NCS gelesen:

cvm.PNG

Das sollte dann doch auf jeden Fall CVM_IV.C01 sein.

Habe auch die Codierdaten gelesen, sind genau die, die ich für Variante1 codiert habe.
 
Habe gerade noch mal getestet.
Ich kann aus dem Stand das Verdeck betätigen und dann losfahren. Es unterbricht den Vorgang dann nicht.
Vielleicht ein Missverständnis? Hatte es so verstanden, dass man das Verdeck während der Fahrt betätigen kann.
 
Habe gerade noch mal getestet.
Ich kann aus dem Stand das Verdeck betätigen und dann losfahren. Es unterbricht den Vorgang dann nicht.
Vielleicht ein Missverständnis? Hatte es so verstanden, dass man das Verdeck während der Fahrt betätigen kann.
Versuch mal mit Variante 1 das Verdeck bei der Fahrt bis 20kmh zu öffnen. Dann sollte es gehen. Kannst sobald es läuft, auch schneller fahren, dann bricht er nicht ab
Ich versuche als Nächstes die Geschwindigkeit zu verändern
 
Zurück
Oben Unten