mirror of
https://github.com/andreili/klipper.git
synced 2025-08-24 03:44:06 +02:00
i2c_software: pass pulse ticks from host
Signed-off-by: Timofey Titovets <nefelim4ag@gmail.com>
This commit is contained in:
parent
841adcfff7
commit
a9b04e8536
@ -160,6 +160,8 @@ class MCU_I2C:
|
|||||||
self.bus = bus
|
self.bus = bus
|
||||||
self.i2c_address = addr
|
self.i2c_address = addr
|
||||||
self.oid = self.mcu.create_oid()
|
self.oid = self.mcu.create_oid()
|
||||||
|
self.speed = speed
|
||||||
|
self.config_fmt_ticks = None
|
||||||
mcu.add_config_cmd("config_i2c oid=%d" % (self.oid,))
|
mcu.add_config_cmd("config_i2c oid=%d" % (self.oid,))
|
||||||
# Generate I2C bus config message
|
# Generate I2C bus config message
|
||||||
if sw_pins is not None:
|
if sw_pins is not None:
|
||||||
@ -167,6 +169,10 @@ class MCU_I2C:
|
|||||||
"i2c_set_software_bus oid=%d"
|
"i2c_set_software_bus oid=%d"
|
||||||
" scl_pin=%s sda_pin=%s rate=%d address=%d"
|
" scl_pin=%s sda_pin=%s rate=%d address=%d"
|
||||||
% (self.oid, sw_pins[0], sw_pins[1], speed, addr))
|
% (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:
|
else:
|
||||||
self.config_fmt = (
|
self.config_fmt = (
|
||||||
"i2c_set_bus oid=%d i2c_bus=%%s rate=%d address=%d"
|
"i2c_set_bus oid=%d i2c_bus=%%s rate=%d address=%d"
|
||||||
@ -186,6 +192,12 @@ class MCU_I2C:
|
|||||||
if '%' in self.config_fmt:
|
if '%' in self.config_fmt:
|
||||||
bus = resolve_bus_name(self.mcu, "i2c_bus", self.bus)
|
bus = resolve_bus_name(self.mcu, "i2c_bus", self.bus)
|
||||||
self.config_fmt = self.config_fmt % (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.mcu.add_config_cmd(self.config_fmt)
|
||||||
self.i2c_write_cmd = self.mcu.lookup_command(
|
self.i2c_write_cmd = self.mcu.lookup_command(
|
||||||
"i2c_write oid=%c data=%*s", cq=self.cmd_queue)
|
"i2c_write oid=%c data=%*s", cq=self.cmd_queue)
|
||||||
|
@ -22,28 +22,21 @@ struct i2c_software {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void
|
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 i2cdev_s *i2c = i2cdev_oid_lookup(args[0]);
|
||||||
struct i2c_software *is = alloc_chunk(sizeof(*is));
|
struct i2c_software *is = alloc_chunk(sizeof(*is));
|
||||||
uint32_t rate = args[3];
|
is->ticks = args[3];
|
||||||
is->ticks = CONFIG_CLOCK_FREQ / (100000 * 2); // 100KHz
|
|
||||||
is->addr = (args[4] & 0x7f) << 1; // address format shifted
|
is->addr = (args[4] & 0x7f) << 1; // address format shifted
|
||||||
is->scl_in = gpio_in_setup(args[1], 1);
|
is->scl_in = gpio_in_setup(args[1], 1);
|
||||||
is->scl_out = gpio_out_setup(args[1], 1);
|
is->scl_out = gpio_out_setup(args[1], 1);
|
||||||
is->sda_in = gpio_in_setup(args[2], 1);
|
is->sda_in = gpio_in_setup(args[2], 1);
|
||||||
is->sda_out = gpio_out_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);
|
i2cdev_set_software_bus(i2c, is);
|
||||||
}
|
}
|
||||||
DECL_COMMAND(command_i2c_set_software_bus,
|
DECL_COMMAND(command_i2c_set_sw_bus,
|
||||||
"i2c_set_software_bus oid=%c scl_pin=%u sda_pin=%u"
|
"i2c_set_sw_bus oid=%c scl_pin=%u sda_pin=%u"
|
||||||
" rate=%u address=%u");
|
" pulse_ticks=%u address=%u");
|
||||||
|
|
||||||
// The AVR micro-controllers require specialized timing
|
// The AVR micro-controllers require specialized timing
|
||||||
#if CONFIG_MACH_AVR
|
#if CONFIG_MACH_AVR
|
||||||
|
Loading…
x
Reference in New Issue
Block a user