mirror of
https://github.com/andreili/klipper.git
synced 2025-08-24 03:44:06 +02:00
software_spi: set rate limiting ticks from the host
Signed-off-by: Timofey Titovets <nefelim4ag@gmail.com>
This commit is contained in:
parent
b826844b34
commit
abc76ee963
@ -43,6 +43,7 @@ class MCU_SPI:
|
|||||||
cs_active_high=False):
|
cs_active_high=False):
|
||||||
self.mcu = mcu
|
self.mcu = mcu
|
||||||
self.bus = bus
|
self.bus = bus
|
||||||
|
self.speed = speed
|
||||||
# Config SPI object (set all CS pins high before spi_set_bus commands)
|
# Config SPI object (set all CS pins high before spi_set_bus commands)
|
||||||
self.oid = mcu.create_oid()
|
self.oid = mcu.create_oid()
|
||||||
if pin is None:
|
if pin is None:
|
||||||
@ -51,11 +52,17 @@ class MCU_SPI:
|
|||||||
mcu.add_config_cmd("config_spi oid=%d pin=%s cs_active_high=%d"
|
mcu.add_config_cmd("config_spi oid=%d pin=%s cs_active_high=%d"
|
||||||
% (self.oid, pin, cs_active_high))
|
% (self.oid, pin, cs_active_high))
|
||||||
# Generate SPI bus config message
|
# Generate SPI bus config message
|
||||||
|
self.config_fmt_ticks = None
|
||||||
if sw_pins is not None:
|
if sw_pins is not None:
|
||||||
self.config_fmt = (
|
self.config_fmt = (
|
||||||
"spi_set_software_bus oid=%d"
|
"spi_set_software_bus oid=%d"
|
||||||
" miso_pin=%s mosi_pin=%s sclk_pin=%s mode=%d rate=%d"
|
" miso_pin=%s mosi_pin=%s sclk_pin=%s mode=%d rate=%d"
|
||||||
% (self.oid, sw_pins[0], sw_pins[1], sw_pins[2], mode, speed))
|
% (self.oid, sw_pins[0], sw_pins[1], sw_pins[2], mode, speed))
|
||||||
|
self.config_fmt_ticks = (
|
||||||
|
"spi_set_sw_bus oid=%d"
|
||||||
|
" miso_pin=%s mosi_pin=%s sclk_pin=%s mode=%d pulse_ticks=%%d"
|
||||||
|
% (self.oid, sw_pins[0], sw_pins[1],
|
||||||
|
sw_pins[2], mode))
|
||||||
else:
|
else:
|
||||||
self.config_fmt = (
|
self.config_fmt = (
|
||||||
"spi_set_bus oid=%d spi_bus=%%s mode=%d rate=%d"
|
"spi_set_bus oid=%d spi_bus=%%s mode=%d rate=%d"
|
||||||
@ -78,6 +85,12 @@ class MCU_SPI:
|
|||||||
if '%' in self.config_fmt:
|
if '%' in self.config_fmt:
|
||||||
bus = resolve_bus_name(self.mcu, "spi_bus", self.bus)
|
bus = resolve_bus_name(self.mcu, "spi_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("spi_set_sw_bus oid=%c miso_pin=%u "
|
||||||
|
"mosi_pin=%u sclk_pin=%u "
|
||||||
|
"mode=%u pulse_ticks=%u"):
|
||||||
|
pulse_ticks = self.mcu.seconds_to_clock(1./self.speed)
|
||||||
|
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.spi_send_cmd = self.mcu.lookup_command(
|
self.spi_send_cmd = self.mcu.lookup_command(
|
||||||
"spi_send oid=%c data=%*s", cq=self.cmd_queue)
|
"spi_send oid=%c data=%*s", cq=self.cmd_queue)
|
||||||
|
@ -112,8 +112,12 @@ SPI_CFG_CMDS = (
|
|||||||
"config_spi oid=%d pin=%s" # Original
|
"config_spi oid=%d pin=%s" # Original
|
||||||
)
|
)
|
||||||
SPI_BUS_CMD = "spi_set_bus oid=%d spi_bus=%s mode=%d rate=%d"
|
SPI_BUS_CMD = "spi_set_bus oid=%d spi_bus=%s mode=%d rate=%d"
|
||||||
SW_SPI_BUS_CMD = "spi_set_software_bus oid=%d " \
|
SW_SPI_BUS_CMDS = (
|
||||||
"miso_pin=%s mosi_pin=%s sclk_pin=%s mode=%d rate=%d"
|
"spi_set_sw_bus oid=%d miso_pin=%s mosi_pin=%s "
|
||||||
|
"sclk_pin=%s mode=%d pulse_ticks=%d",
|
||||||
|
"spi_set_software_bus oid=%d miso_pin=%s mosi_pin=%s "
|
||||||
|
"sclk_pin=%s mode=%d rate=%d",
|
||||||
|
)
|
||||||
SPI_SEND_CMD = "spi_send oid=%c data=%*s"
|
SPI_SEND_CMD = "spi_send oid=%c data=%*s"
|
||||||
SPI_XFER_CMD = "spi_transfer oid=%c data=%*s"
|
SPI_XFER_CMD = "spi_transfer oid=%c data=%*s"
|
||||||
SPI_XFER_RESPONSE = "spi_transfer_response oid=%c response=%*s"
|
SPI_XFER_RESPONSE = "spi_transfer_response oid=%c response=%*s"
|
||||||
@ -1279,6 +1283,8 @@ class MCUConnection:
|
|||||||
'spi_bus', self.enumerations.get('bus'))
|
'spi_bus', self.enumerations.get('bus'))
|
||||||
pin_enums = self.enumerations.get('pin')
|
pin_enums = self.enumerations.get('pin')
|
||||||
if bus == "swspi":
|
if bus == "swspi":
|
||||||
|
mcu_freq = self.clocksync.print_time_to_clock(1)
|
||||||
|
pulse_ticks = mcu_freq//SD_SPI_SPEED
|
||||||
cfgpins = self.board_config['spi_pins']
|
cfgpins = self.board_config['spi_pins']
|
||||||
pins = [p.strip().upper() for p in cfgpins.split(',') if p.strip()]
|
pins = [p.strip().upper() for p in cfgpins.split(',') if p.strip()]
|
||||||
pin_err_msg = "Invalid Software SPI Pins: %s" % (cfgpins,)
|
pin_err_msg = "Invalid Software SPI Pins: %s" % (cfgpins,)
|
||||||
@ -1287,30 +1293,27 @@ class MCUConnection:
|
|||||||
for p in pins:
|
for p in pins:
|
||||||
if p not in pin_enums:
|
if p not in pin_enums:
|
||||||
raise SPIFlashError(pin_err_msg)
|
raise SPIFlashError(pin_err_msg)
|
||||||
bus_cmd = SW_SPI_BUS_CMD % (SPI_OID, pins[0], pins[1], pins[2],
|
bus_cmds = [
|
||||||
|
SW_SPI_BUS_CMDS[0] % (SPI_OID, pins[0], pins[1], pins[2],
|
||||||
|
SPI_MODE, pulse_ticks),
|
||||||
|
SW_SPI_BUS_CMDS[1] % (SPI_OID, pins[0], pins[1], pins[2],
|
||||||
SPI_MODE, SD_SPI_SPEED)
|
SPI_MODE, SD_SPI_SPEED)
|
||||||
|
]
|
||||||
else:
|
else:
|
||||||
if bus not in bus_enums:
|
if bus not in bus_enums:
|
||||||
raise SPIFlashError("Invalid SPI Bus: %s" % (bus,))
|
raise SPIFlashError("Invalid SPI Bus: %s" % (bus,))
|
||||||
bus_cmd = SPI_BUS_CMD % (SPI_OID, bus, SPI_MODE, SD_SPI_SPEED)
|
bus_cmds = SPI_BUS_CMD % (SPI_OID, bus, SPI_MODE, SD_SPI_SPEED)
|
||||||
if cs_pin not in pin_enums:
|
if cs_pin not in pin_enums:
|
||||||
raise SPIFlashError("Invalid CS Pin: %s" % (cs_pin,))
|
raise SPIFlashError("Invalid CS Pin: %s" % (cs_pin,))
|
||||||
cfg_cmds = [ALLOC_OIDS_CMD % (1,), bus_cmd]
|
cfg_cmds = [ALLOC_OIDS_CMD % (1,),]
|
||||||
self._serial.send(cfg_cmds[0])
|
self._serial.send(cfg_cmds[0])
|
||||||
spi_cfg_cmds = [
|
spi_cfg_cmds = [
|
||||||
SPI_CFG_CMDS[0] % (SPI_OID, cs_pin, False),
|
SPI_CFG_CMDS[0] % (SPI_OID, cs_pin, False),
|
||||||
SPI_CFG_CMDS[1] % (SPI_OID, cs_pin),
|
SPI_CFG_CMDS[1] % (SPI_OID, cs_pin),
|
||||||
]
|
]
|
||||||
for cmd in spi_cfg_cmds:
|
cfg_cmds.append(self._try_send_command(spi_cfg_cmds))
|
||||||
try:
|
cfg_cmds.append(self._try_send_command(bus_cmds))
|
||||||
self._serial.send(cmd)
|
self._try_send_command(cfg_cmds)
|
||||||
except self.proto_error:
|
|
||||||
if cmd == spi_cfg_cmds[-1]:
|
|
||||||
raise
|
|
||||||
else:
|
|
||||||
cfg_cmds.insert(1, cmd)
|
|
||||||
break
|
|
||||||
self._serial.send(bus_cmd)
|
|
||||||
config_crc = zlib.crc32('\n'.join(cfg_cmds).encode()) & 0xffffffff
|
config_crc = zlib.crc32('\n'.join(cfg_cmds).encode()) & 0xffffffff
|
||||||
self._serial.send(FINALIZE_CFG_CMD % (config_crc,))
|
self._serial.send(FINALIZE_CFG_CMD % (config_crc,))
|
||||||
config = self.get_mcu_config()
|
config = self.get_mcu_config()
|
||||||
@ -1326,6 +1329,16 @@ class MCUConnection:
|
|||||||
raise SPIFlashError(
|
raise SPIFlashError(
|
||||||
"Failed to Initialize SD Card. Is it inserted?")
|
"Failed to Initialize SD Card. Is it inserted?")
|
||||||
|
|
||||||
|
def _try_send_command(self, cmd_list):
|
||||||
|
for cmd in cmd_list:
|
||||||
|
try:
|
||||||
|
self._serial.send(cmd)
|
||||||
|
except self.proto_error:
|
||||||
|
if cmd == cmd_list[-1]:
|
||||||
|
raise
|
||||||
|
else:
|
||||||
|
return cmd
|
||||||
|
|
||||||
def _configure_mcu_sdiobus(self, printfunc=logging.info):
|
def _configure_mcu_sdiobus(self, printfunc=logging.info):
|
||||||
bus = self.board_config['sdio_bus']
|
bus = self.board_config['sdio_bus']
|
||||||
bus_enums = self.enumerations.get(
|
bus_enums = self.enumerations.get(
|
||||||
|
@ -20,11 +20,10 @@ struct spi_software {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
command_spi_set_software_bus(uint32_t *args)
|
command_spi_set_sw_bus(uint32_t *args)
|
||||||
{
|
{
|
||||||
uint8_t mode = args[4];
|
uint8_t mode = args[4];
|
||||||
uint32_t rate = args[5];
|
uint32_t pulse_ticks = args[5];
|
||||||
uint8_t div = 0;
|
|
||||||
if (mode > 3)
|
if (mode > 3)
|
||||||
shutdown("Invalid spi config");
|
shutdown("Invalid spi config");
|
||||||
|
|
||||||
@ -34,14 +33,12 @@ command_spi_set_software_bus(uint32_t *args)
|
|||||||
ss->mosi = gpio_out_setup(args[2], 0);
|
ss->mosi = gpio_out_setup(args[2], 0);
|
||||||
ss->sclk = gpio_out_setup(args[3], 0);
|
ss->sclk = gpio_out_setup(args[3], 0);
|
||||||
ss->mode = mode;
|
ss->mode = mode;
|
||||||
while (((CONFIG_CLOCK_FREQ/2) >> div) > rate)
|
ss->sck_ticks = pulse_ticks;
|
||||||
div++;
|
|
||||||
ss->sck_ticks = 1 << div;
|
|
||||||
spidev_set_software_bus(spi, ss);
|
spidev_set_software_bus(spi, ss);
|
||||||
}
|
}
|
||||||
DECL_COMMAND(command_spi_set_software_bus,
|
DECL_COMMAND(command_spi_set_sw_bus,
|
||||||
"spi_set_software_bus oid=%c miso_pin=%u mosi_pin=%u sclk_pin=%u"
|
"spi_set_sw_bus oid=%c miso_pin=%u mosi_pin=%u sclk_pin=%u"
|
||||||
" mode=%u rate=%u");
|
" mode=%u pulse_ticks=%u");
|
||||||
|
|
||||||
void
|
void
|
||||||
spi_software_prepare(struct spi_software *ss)
|
spi_software_prepare(struct spi_software *ss)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user