private void UnlockControllerForEepromReadWrite(IKW1281Dialog kwp1281) { switch ((ControllerAddress)_controllerAddress) { case ControllerAddress.CCM: case ControllerAddress.CentralLocking: kwp1281.Login(code: 19283, workshopCode: 222); // This is what VDS-PRO uses break; case ControllerAddress.Cluster: // TODO:UnlockCluster() is only needed for EEPROM read, not memory read if (!VdoCluster.UnlockCluster(kwp1281)) { Logger.WriteLine("Unknown cluster software version. EEPROM access will likely fail."); } if (!ClusterRequiresSeedKey(kwp1281)) { Logger.WriteLine( "Cluster is unlocked for EEPROM access. Skipping Seed/Key login."); return; } ClusterSeedKeyAuthenticate(kwp1281); break; } }
private void GetSkc() { if (_controllerAddress == (int)ControllerAddress.Cluster) { var ecuInfo = Kwp1281Wakeup(); if (ecuInfo.Text.Contains("VDO")) { var partNumberMatch = Regex.Match( ecuInfo.Text, "\\b(\\d[a-zA-Z])\\d9(\\d{2})\\d{3}[a-zA-Z][a-zA-Z]?\\b"); if (partNumberMatch.Success) { var family = partNumberMatch.Groups[1].Value; switch (partNumberMatch.Groups[2].Value) { case "19": // Non-CAN Logger.WriteLine($"Cluster is non-Immo so there is no SKC."); return; case "20": // CAN break; default: Logger.WriteLine($"Unknown cluster: {ecuInfo.Text}"); return; } const int startAddress = 0x90; var dumpFileName = DumpClusterEeprom(_kwp1281, startAddress, length: 0x7C); var buf = File.ReadAllBytes(dumpFileName); var skc = VdoCluster.GetSkc(buf, startAddress); if (!string.IsNullOrEmpty(skc)) { Logger.WriteLine($"SKC: {skc}"); } else { Logger.WriteLine($"Unable to determine SKC."); } } else { Console.WriteLine($"ECU Info: {ecuInfo.Text}"); } } else if (ecuInfo.Text.Contains("RB8")) { // Need to quit KWP1281 before switching to KWP2000 _kwp1281.EndCommunication(); _kwp1281 = null; Thread.Sleep(TimeSpan.FromSeconds(2)); var dumpFileName = DumpRB8Eeprom( Kwp2000Wakeup(evenParityWakeup: true), 0x1040E, 2); var buf = File.ReadAllBytes(dumpFileName); var skc = Utils.GetShort(buf, 0).ToString("D5"); Logger.WriteLine($"SKC: {skc}"); } else if (ecuInfo.Text.Contains("M73")) { // TODO: Marelli Console.WriteLine($"Unsupported cluster: {ecuInfo.Text}"); } else { Console.WriteLine($"Unsupported cluster: {ecuInfo.Text}"); } } else if (_controllerAddress == (int)ControllerAddress.Ecu) { // 038906012GN Logger.WriteLine("Not supported for ECUs yet."); } else { Logger.WriteLine("Only supported for clusters (address 17) and ECUs (address 1)"); } }