From 1704243396f715a102ddcc190f00c0f70755d09d Mon Sep 17 00:00:00 2001 From: Timofey Titovets Date: Mon, 15 Dec 2025 03:31:03 +0100 Subject: [PATCH 1/2] bus: i2c sw default i2c bus mcu to first pin mcu That makes config sligtly simpler. Signed-off-by: Timofey Titovets --- klippy/extras/bus.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/klippy/extras/bus.py b/klippy/extras/bus.py index 19e278418..ea6858701 100644 --- a/klippy/extras/bus.py +++ b/klippy/extras/bus.py @@ -227,7 +227,6 @@ class MCU_I2C: def MCU_I2C_from_config(config, default_addr=None, default_speed=100000): # Load bus parameters printer = config.get_printer() - i2c_mcu = mcu.get_printer_mcu(printer, config.get('i2c_mcu', 'mcu')) speed = config.getint('i2c_speed', default_speed, minval=100000) if default_addr is None: addr = config.getint('i2c_address', minval=0, maxval=127) @@ -240,6 +239,8 @@ def MCU_I2C_from_config(config, default_addr=None, default_speed=100000): for name in ['scl', 'sda']] sw_pin_params = [ppins.lookup_pin(config.get(name), share_type=name) for name in sw_pin_names] + mcu_name = sw_pin_params[0]['chip_name'] + i2c_mcu = mcu.get_printer_mcu(printer, config.get('i2c_mcu', mcu_name)) for pin_params in sw_pin_params: if pin_params['chip'] != i2c_mcu: raise ppins.error("%s: i2c pins must be on same mcu" % ( @@ -247,6 +248,7 @@ def MCU_I2C_from_config(config, default_addr=None, default_speed=100000): sw_pins = tuple([pin_params['pin'] for pin_params in sw_pin_params]) bus = None else: + i2c_mcu = mcu.get_printer_mcu(printer, config.get('i2c_mcu', 'mcu')) bus = config.get('i2c_bus', None) sw_pins = None # Create MCU_I2C object From f045d0858d64a4d5641fa0a319ab6f0bacb4997a Mon Sep 17 00:00:00 2001 From: Timofey Titovets Date: Sun, 21 Dec 2025 21:41:20 +0100 Subject: [PATCH 2/2] bus: make sw pins configuration error more verbose Signed-off-by: Timofey Titovets --- klippy/extras/bus.py | 43 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/klippy/extras/bus.py b/klippy/extras/bus.py index ea6858701..fdc6a6c22 100644 --- a/klippy/extras/bus.py +++ b/klippy/extras/bus.py @@ -32,6 +32,25 @@ def resolve_bus_name(mcu, param, bus): pin_resolver.reserve_pin(pin, bus) return bus +def format_cfg_line(params): + if params.get('pin') is not None: + definition = "%s:%s" % (params['chip_name'], params['pin']) + else: + definition = "%s" % (params.get("value")) + return "%s = %s" % (params['cfg_key'], definition) + +def validate_pins(config, pins_params): + ppins = config.get_printer().lookup_object("pins") + for i in range(len(pins_params)-1): + if pins_params[i].get('chip') == pins_params[i+1].get('chip'): + continue + msg = """ + # Pins MUST be on the same MCU + [%s] + """ % (config.get_name(),) + for pin_params in pins_params: + msg += "%s\n" % (format_cfg_line(pin_params),) + raise ppins.error(msg) ###################################################################### # SPI @@ -136,10 +155,15 @@ def MCU_SPI_from_config(config, mode, pin_option="cs_pin", for name in ['miso', 'mosi', 'sclk']] sw_pin_params = [ppins.lookup_pin(config.get(name), share_type=name) for name in sw_pin_names] - for pin_params in sw_pin_params: - if pin_params['chip'] != mcu: - raise ppins.error("%s: spi pins must be on same mcu" % ( - config.get_name(),)) + # Enrich pins info + for i in range(len(sw_pin_params)): + sw_pin_params[i]['cfg_key'] = sw_pin_params[i]['share_type'] + # Define CS as virtual pin to reuse validation + vpin_params = [] + if pin is not None: + cs_pin_params["cfg_key"] = pin_option + vpin_params = [cs_pin_params] + validate_pins(config, sw_pin_params + vpin_params) sw_pins = tuple([pin_params['pin'] for pin_params in sw_pin_params]) bus = None else: @@ -241,10 +265,13 @@ def MCU_I2C_from_config(config, default_addr=None, default_speed=100000): for name in sw_pin_names] mcu_name = sw_pin_params[0]['chip_name'] i2c_mcu = mcu.get_printer_mcu(printer, config.get('i2c_mcu', mcu_name)) - for pin_params in sw_pin_params: - if pin_params['chip'] != i2c_mcu: - raise ppins.error("%s: i2c pins must be on same mcu" % ( - config.get_name(),)) + # Enrich pins info + for i in range(len(sw_pin_params)): + sw_pin_params[i]['cfg_key'] = sw_pin_params[i]['share_type'] + # Define MCU as virtual pin to reuse validation + vpin_params = [{'cfg_key': 'i2c_mcu', 'chip': i2c_mcu, + 'value': i2c_mcu.get_name()}] + validate_pins(config, sw_pin_params + vpin_params) sw_pins = tuple([pin_params['pin'] for pin_params in sw_pin_params]) bus = None else: