aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimofey Titovets <nefelim4ag@gmail.com>2025-04-09 00:35:00 +0200
committerKevinOConnor <kevin@koconnor.net>2025-04-17 11:41:49 -0400
commita9b04e853610c216e8ca9db2949e8b658ed67439 (patch)
treeca041b6054f03f8a4fbfbf101cb590e85435482b
parent841adcfff759b7fc2a229a0627151600b8d1cc25 (diff)
downloadkutter-a9b04e853610c216e8ca9db2949e8b658ed67439.tar.gz
kutter-a9b04e853610c216e8ca9db2949e8b658ed67439.tar.xz
kutter-a9b04e853610c216e8ca9db2949e8b658ed67439.zip
i2c_software: pass pulse ticks from host
Signed-off-by: Timofey Titovets <nefelim4ag@gmail.com>
-rw-r--r--klippy/extras/bus.py12
-rw-r--r--src/i2c_software.c17
2 files changed, 17 insertions, 12 deletions
diff --git a/klippy/extras/bus.py b/klippy/extras/bus.py
index ceeed732..c07ec826 100644
--- a/klippy/extras/bus.py
+++ b/klippy/extras/bus.py
@@ -160,6 +160,8 @@ class MCU_I2C:
self.bus = bus
self.i2c_address = addr
self.oid = self.mcu.create_oid()
+ self.speed = speed
+ self.config_fmt_ticks = None
mcu.add_config_cmd("config_i2c oid=%d" % (self.oid,))
# Generate I2C bus config message
if sw_pins is not None:
@@ -167,6 +169,10 @@ class MCU_I2C:
"i2c_set_software_bus oid=%d"
" scl_pin=%s sda_pin=%s rate=%d address=%d"
% (self.oid, sw_pins[0], sw_pins[1], speed, addr))
+ self.config_fmt_ticks = (
+ "i2c_set_sw_bus oid=%d"
+ " scl_pin=%s sda_pin=%s pulse_ticks=%%d address=%d"
+ % (self.oid, sw_pins[0], sw_pins[1], addr))
else:
self.config_fmt = (
"i2c_set_bus oid=%d i2c_bus=%%s rate=%d address=%d"
@@ -186,6 +192,12 @@ class MCU_I2C:
if '%' in self.config_fmt:
bus = resolve_bus_name(self.mcu, "i2c_bus", self.bus)
self.config_fmt = self.config_fmt % (bus,)
+ if self.config_fmt_ticks:
+ if self.mcu.try_lookup_command("i2c_set_sw_bus oid=%c"
+ " scl_pin=%u sda_pin=%u"
+ " pulse_ticks=%u address=%u"):
+ pulse_ticks = self.mcu.seconds_to_clock(1./self.speed/2)
+ self.config_fmt = self.config_fmt_ticks % (pulse_ticks,)
self.mcu.add_config_cmd(self.config_fmt)
self.i2c_write_cmd = self.mcu.lookup_command(
"i2c_write oid=%c data=%*s", cq=self.cmd_queue)
diff --git a/src/i2c_software.c b/src/i2c_software.c
index 805cef2d..01fce4c6 100644
--- a/src/i2c_software.c
+++ b/src/i2c_software.c
@@ -22,28 +22,21 @@ struct i2c_software {
};
void
-command_i2c_set_software_bus(uint32_t *args)
+command_i2c_set_sw_bus(uint32_t *args)
{
struct i2cdev_s *i2c = i2cdev_oid_lookup(args[0]);
struct i2c_software *is = alloc_chunk(sizeof(*is));
- uint32_t rate = args[3];
- is->ticks = CONFIG_CLOCK_FREQ / (100000 * 2); // 100KHz
+ is->ticks = args[3];
is->addr = (args[4] & 0x7f) << 1; // address format shifted
is->scl_in = gpio_in_setup(args[1], 1);
is->scl_out = gpio_out_setup(args[1], 1);
is->sda_in = gpio_in_setup(args[2], 1);
is->sda_out = gpio_out_setup(args[2], 1);
- while (rate > 100000) {
- rate = rate >> 1;
- if (rate < 100000)
- break;
- is->ticks = is->ticks >> 1;
- }
i2cdev_set_software_bus(i2c, is);
}
-DECL_COMMAND(command_i2c_set_software_bus,
- "i2c_set_software_bus oid=%c scl_pin=%u sda_pin=%u"
- " rate=%u address=%u");
+DECL_COMMAND(command_i2c_set_sw_bus,
+ "i2c_set_sw_bus oid=%c scl_pin=%u sda_pin=%u"
+ " pulse_ticks=%u address=%u");
// The AVR micro-controllers require specialized timing
#if CONFIG_MACH_AVR