diff --git a/flasher/ecu.py b/flasher/ecu.py index 210d92d..90373e3 100644 --- a/flasher/ecu.py +++ b/flasher/ecu.py @@ -144,9 +144,13 @@ def read_memory_by_address (self, offset: int, size: int): raise return data - def clear_adaptive_values (self): - self.bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT)) - self.bus.execute(kwp.commands.InputOutputControlByLocalIdentifier(IOIdentifier.ADAPTIVE_VALUES.value, kwp.enums.InputOutputControlParameter.RESET_TO_DEFAULT)) + def clear_adaptive_values (self, desired_baudrate): + if desired_baudrate is None: + self.bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT)) + self.bus.execute(kwp.commands.InputOutputControlByLocalIdentifier(IOIdentifier.ADAPTIVE_VALUES.value, kwp.enums.InputOutputControlParameter.RESET_TO_DEFAULT)) + else: + self.bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT, desired_baudrate)) + self.bus.execute(kwp.commands.InputOutputControlByLocalIdentifier(IOIdentifier.ADAPTIVE_VALUES.value, kwp.enums.InputOutputControlParameter.RESET_TO_DEFAULT)) class ECUIdentificationException (Exception): pass diff --git a/flasher/immo.py b/flasher/immo.py index 7301b55..fbf64cd 100644 --- a/flasher/immo.py +++ b/flasher/immo.py @@ -12,8 +12,11 @@ 6: 'Invalid key' } -def cli_immo_info (bus): - bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT)) +def cli_immo_info (bus, desired_baudrate): + if desired_baudrate is None: + bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT)) + else: + bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT, desired_baudrate)) try: immo_data = bus.execute(kwp.commands.StartRoutineByLocalIdentifier(Routine.QUERY_IMMO_INFO.value)).get_data() except (kwp.KWPNegativeResponseException): @@ -35,10 +38,12 @@ def cli_immo_info (bus): if (len(immo_data) > 4): print('[*] Smartra status: {}'.format(immo_status[immo_data[4]])) -def cli_limp_home (bus): +def cli_limp_home (bus, desired_baudrate): print('[*] starting default diagnostic session') - bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT)) - + if desired_baudrate is None: + bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT)) + else: + bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT, desired_baudrate)) try: data = bus.execute(kwp.commands.StartRoutineByLocalIdentifier(Routine.BEFORE_LIMP_HOME.value)).get_data() except (kwp.KWPNegativeResponseException): @@ -67,9 +72,12 @@ def cli_limp_home (bus): if (data[1] == 1): print('[*] limp home activated!') -def cli_immo_reset (bus): +def cli_immo_reset (bus, desired_baudrate): print('[*] starting default diagnostic session') - bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT)) + if desired_baudrate is None: + bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT)) + else: + bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT, desired_baudrate)) print('[*] starting routine 0x15') data = bus.execute(kwp.commands.StartRoutineByLocalIdentifier(Routine.BEFORE_IMMO_RESET.value)).get_data() @@ -94,9 +102,12 @@ def cli_immo_reset (bus): print('[*] ECU reseted! Turn ignition off for 10 seconds for changes to take effect') -def cli_smartra_neutralize (bus): +def cli_smartra_neutralize (bus, desired_baudrate): print('[*] starting default diagnostic session') - bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT)) + if desired_baudrate is None: + bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT)) + else: + bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT, desired_baudrate)) print('[*] starting routine 0x25') data = bus.execute(kwp.commands.StartRoutineByLocalIdentifier(Routine.BEFORE_SMARTRA_NEUTRALIZE.value)).get_data() @@ -121,9 +132,12 @@ def cli_smartra_neutralize (bus): print('[*] SMARTRA neutralized! Turn ignition off for 5 seconds for changes to take effect.') -def cli_immo_teach_keys (bus): +def cli_immo_teach_keys (bus, desired_baudrate): print('[*] starting default diagnostic session') - bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT)) + if desired_baudrate is None: + bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT)) + else: + bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT, desired_baudrate)) print('[*] starting routine 0x14') data = bus.execute(kwp.commands.StartRoutineByLocalIdentifier(Routine.BEFORE_IMMO_KEY_TEACHING.value)).get_data() @@ -146,7 +160,7 @@ def cli_immo_teach_keys (bus): break print('[*] Done! Turn off ignition for 10 seconds for changes to take effect') -def cli_read_vin (bus): +def cli_read_vin (bus, desired_baudrate): cmd = kwp.KWPCommand() cmd.command = 0x09 # undocumented service cmd.data = [0x02] @@ -160,9 +174,13 @@ def cli_read_vin (bus): print(' '.join([hex(x) for x in vin])) print(''.join([chr(x) for x in vin])) -def cli_write_vin (bus): +def cli_write_vin (bus, desired_baudrate): print('[*] starting flash reprogramming session') - bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.FLASH_REPROGRAMMING)) + if desired_baudrate is None: + bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.FLASH_REPROGRAMMING)) + else: + bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.FLASH_REPROGRAMMING, desired_baudrate)) + enable_security_access(bus) vin = input('Enter VIN. WARNING! No validation!: ') @@ -174,9 +192,12 @@ def cli_write_vin (bus): return print('[*] VIN changed! Turn ignition off for 5 seconds for changes to take effect.') -def cli_limp_home_teach (bus): +def cli_limp_home_teach (bus, desired_baudrate): print('[*] starting default diagnostic session') - bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT)) + if desired_baudrate is None: + bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT)) + else: + bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT, desired_baudrate)) status = bus.execute(kwp.commands.StartRoutineByLocalIdentifier(Routine.BEFORE_LIMP_HOME_TEACHING.value)).get_data()[1] print('[*] Current ECU status: {}'.format(immo_status[status])) @@ -211,7 +232,7 @@ def cli_limp_home_teach (bus): ['Write VIN', cli_write_vin] ] -def cli_immo (bus): +def cli_immo (bus, desired_baudrate): for key, menu in enumerate(immo_menus): print(' [{}] {}'.format(key, menu[0])) menu = input('Select immo menu: ') @@ -219,6 +240,6 @@ def cli_immo (bus): handler = immo_menus[int(menu)][1] except (KeyError, IndexError, ValueError): print('[!] Invalid choice! Try again') - return cli_immo(bus) - handler(bus) - bus.shutdown() \ No newline at end of file + return cli_immo(bus, desired_baudrate) + handler(bus, desired_baudrate) + bus.shutdown() diff --git a/gkflasher.py b/gkflasher.py index c362a58..735b21f 100644 --- a/gkflasher.py +++ b/gkflasher.py @@ -102,9 +102,9 @@ def cli_flash_eeprom (ecu, input_filename, flash_calibration=True, flash_program ecu.bus.execute(kwp.commands.ECUReset(kwp.enums.ResetMode.POWER_ON_RESET)).get_data() ecu.bus.shutdown() -def cli_clear_adaptive_values (ecu): +def cli_clear_adaptive_values (ecu, desired_baudrate): print('[*] Clearing adaptive values.. ', end='') - ecu.clear_adaptive_values() + ecu.clear_adaptive_values(desired_baudrate) print('Done!') def load_config (config_filename): @@ -196,12 +196,9 @@ def main(bus, args): bus.init(kwp.commands.StartCommunication(), keepalive_payload=kwp.commands.TesterPresent(kwp.enums.ResponseType.REQUIRED), keepalive_timeout=1.5) - if (args.immo): - return cli_immo(bus) - if args.desired_baudrate: try: - desired_baudrate = BAUDRATES[args.desired_baudrate] + desired_baudrate = args.desired_baudrate except KeyError: print('[!] Selected baudrate is invalid! Available baudrates:') for key, baudrate in BAUDRATES.items(): @@ -214,8 +211,12 @@ def main(bus, args): else: print('[*] Trying to start diagnostic session') bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.FLASH_REPROGRAMMING)) + desired_baudrate = None bus.set_timeout(12) + if (args.immo): + return cli_immo(bus, desired_baudrate) + print('[*] Set timing parameters to maximum') try: available_timing = bus.execute( @@ -258,8 +259,9 @@ def main(bus, args): print(' [*] [{}] {}:'.format(hex(parameter_key), parameter['name'])) print(' [HEX]: {}'.format(value_hex)) print(' [ASCII]: {}'.format(value_ascii)) + print('') - cli_immo_info(bus) + cli_immo_info(bus, desired_baudrate) if (args.read): cli_read_eeprom(ecu, eeprom_size, address_start=args.address_start, address_stop=args.address_stop, output_filename=args.output) @@ -278,7 +280,7 @@ def main(bus, args): cli_flash_eeprom(ecu, input_filename=args.flash_program, flash_program=True, flash_calibration=False) if (args.clear_adaptive_values): - cli_clear_adaptive_values(ecu) + cli_clear_adaptive_values(ecu, desired_baudrate) if (args.logger): logger(ecu) diff --git a/gui.py b/gui.py index df8b8e4..f9b325f 100644 --- a/gui.py +++ b/gui.py @@ -204,15 +204,16 @@ def initialize_ecu (self, log_callback): if self.baudratesBox.currentData() == -1: log_callback.emit('[*] Trying to start diagnostic session') bus.execute(StartDiagnosticSession(DiagnosticSession.FLASH_REPROGRAMMING)) + self.desired_baudrate = None # No specific baud rate else: - desired_baudrate = self.baudratesBox.currentData() - log_callback.emit('[*] Trying to start diagnostic session with baudrate {}'.format(BAUDRATES[desired_baudrate])) + self.desired_baudrate = self.baudratesBox.currentData() + log_callback.emit('[*] Trying to start diagnostic session with baudrate {}'.format(BAUDRATES[self.desired_baudrate])) try: - bus.execute(StartDiagnosticSession(DiagnosticSession.FLASH_REPROGRAMMING, desired_baudrate)) + bus.execute(StartDiagnosticSession(DiagnosticSession.FLASH_REPROGRAMMING, self.desired_baudrate)) except gkbus.GKBusTimeoutException: - bus.socket.socket.baudrate = BAUDRATES[desired_baudrate] - bus.execute(StartDiagnosticSession(DiagnosticSession.FLASH_REPROGRAMMING, desired_baudrate)) - bus.socket.socket.baudrate = BAUDRATES[desired_baudrate] + bus.socket.socket.baudrate = BAUDRATES[self.desired_baudrate] + bus.execute(StartDiagnosticSession(DiagnosticSession.FLASH_REPROGRAMMING, self.desired_baudrate)) + bus.socket.socket.baudrate = BAUDRATES[self.desired_baudrate] bus.set_timeout(12) @@ -420,8 +421,13 @@ def display_ecu_identification (self, progress_callback, log_callback): log_callback.emit(' [*] [{}] {}:'.format(hex(parameter_key), parameter['name'])) log_callback.emit(' [HEX]: {}'.format(value_hex)) log_callback.emit(' [ASCII]: {}'.format(value_ascii)) + log_callback.emit('') - ecu.bus.execute(StartDiagnosticSession(DiagnosticSession.DEFAULT)) + if self.baudratesBox.currentData() == -1: + ecu.bus.execute(StartDiagnosticSession(DiagnosticSession.DEFAULT)) + else: + desired_baudrate = self.baudratesBox.currentData() + ecu.bus.execute(StartDiagnosticSession(DiagnosticSession.DEFAULT, desired_baudrate)) try: immo_data = ecu.bus.execute(StartRoutineByLocalIdentifier(Routine.QUERY_IMMO_INFO.value)).get_data() except (KWPNegativeResponseException): @@ -577,7 +583,7 @@ def clear_adaptive_values (self, progress_callback, log_callback): return log_callback.emit('[*] Clearing adaptive values.. ') - ecu.clear_adaptive_values() + ecu.clear_adaptive_values(self.desired_baudrate) log_callback.emit('Done!') self.disconnect_ecu(ecu) diff --git a/requirements.txt b/requirements.txt index 11b3718..0878a18 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ alive_progress==3.1.5 crcmod==1.7 -gkbus==0.1.87 +gkbus==0.2.7 pyqt5==5.15.10 PyYAML==6.0.1