Skip to content

Commit d4233f9

Browse files
Merge pull request #2314 from VOGL-electronic/litespi_ddr_clk_divider
litespi: use new clk divisor
2 parents 2c1b93f + 3b34ccc commit d4233f9

File tree

2 files changed

+21
-7
lines changed

2 files changed

+21
-7
lines changed

litex/soc/integration/soc.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2181,8 +2181,10 @@ def add_spi_flash(self, name="spiflash", mode="4x", clk_freq=20e6, module=None,
21812181

21822182
# Checks/Parameters.
21832183
assert mode in ["1x", "4x"]
2184-
default_divisor = math.ceil(self.sys_clk_freq/(2*clk_freq)) - 1
2185-
clk_freq = int(self.sys_clk_freq/(2*(default_divisor + 1)))
2184+
default_divisor = math.ceil(self.sys_clk_freq/clk_freq)
2185+
if rate == "1:1":
2186+
default_divisor += default_divisor % 2 # Round up to nearest even number.
2187+
clk_freq = int(self.sys_clk_freq/default_divisor)
21862188

21872189
if "master_with_irq" not in kwargs and self.irq.enabled and name in self.irq.locs.keys():
21882190
# If IRQ is enabled, use master_with_irq.
@@ -2210,6 +2212,7 @@ def add_spi_flash(self, name="spiflash", mode="4x", clk_freq=20e6, module=None,
22102212
# Constants.
22112213
self.add_constant(f"{name}_PHY_FREQUENCY", clk_freq)
22122214
if module is not None:
2215+
self.add_constant(f"{name}_PHY_MIN_DIVISOR", 2 if rate == "1:1" else 1)
22132216
self.add_constant(f"{name}_MODULE_NAME", module.name)
22142217
self.add_constant(f"{name}_MODULE_TOTAL_SIZE", module.total_size)
22152218
self.add_constant(f"{name}_MODULE_PAGE_SIZE", module.page_size)
@@ -2235,8 +2238,10 @@ def add_spi_ram(self, name="spiram", mode="4x", clk_freq=20e6, module=None, phy=
22352238

22362239
# Checks/Parameters.
22372240
assert mode in ["1x", "4x"]
2238-
default_divisor = math.ceil(self.sys_clk_freq/(2*clk_freq)) - 1
2239-
clk_freq = int(self.sys_clk_freq/(2*(default_divisor + 1)))
2241+
default_divisor = math.ceil(self.sys_clk_freq/clk_freq)
2242+
if rate == "1:1":
2243+
default_divisor += default_divisor % 2 # Round up to nearest even number.
2244+
clk_freq = int(self.sys_clk_freq/default_divisor)
22402245

22412246
if "master_with_irq" not in kwargs and self.irq.enabled and name in self.irq.locs.keys():
22422247
# If IRQ is enabled, use master_with_irq.
@@ -2282,6 +2287,7 @@ def add_spi_ram(self, name="spiram", mode="4x", clk_freq=20e6, module=None, phy=
22822287

22832288
# Constants.
22842289
self.add_constant(f"{name}_PHY_FREQUENCY", clk_freq)
2290+
self.add_constant(f"{name}_PHY_MIN_DIVISOR", 2 if rate == "1:1" else 1)
22852291
self.add_constant(f"{name}_MODULE_NAME", module.name)
22862292
self.add_constant(f"{name}_MODULE_TOTAL_SIZE", module.total_size)
22872293
self.add_constant(f"{name}_MODULE_PAGE_SIZE", module.page_size)

litex/soc/software/liblitespi/spiflash.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,11 @@ int spiflash_freq_init(void)
4040
printf("First SPI Flash block erased, unable to perform freq test.\n\r");
4141
return -1;
4242
}
43-
44-
while((crc == crc_test) && (lowest_div-- > 0)) {
43+
#if defined(SPIFLASH_PHY_MIN_DIVISOR) && SPIFLASH_PHY_MIN_DIVISOR == 1
44+
while((crc == crc_test) && (lowest_div-- > 1)) {
45+
#else
46+
while((crc == crc_test) && ((lowest_div -= 2) >= 2)) {
47+
#endif
4548
spiflash_phy_clk_divisor_write((uint32_t)lowest_div);
4649
invd_cpu_dcache_range((void *)SPIFLASH_BASE, SPI_FLASH_BLOCK_SIZE);
4750
flush_l2_cache();
@@ -50,10 +53,15 @@ int spiflash_freq_init(void)
5053
printf("[DIV: %d] %08x\n\r", lowest_div, crc_test);
5154
#endif
5255
}
56+
#if defined(SPIFLASH_PHY_MIN_DIVISOR) && SPIFLASH_PHY_MIN_DIVISOR == 1
5357
lowest_div++;
54-
printf("SPI Flash clk configured to %d MHz\n", CONFIG_CLOCK_FREQUENCY/(2*(1+lowest_div)*1000000));
58+
#else
59+
lowest_div += 2;
60+
#endif
61+
printf("SPI Flash clk configured to %d MHz (div: %d)\n", CONFIG_CLOCK_FREQUENCY/(lowest_div*1000000), lowest_div);
5562

5663
spiflash_phy_clk_divisor_write(lowest_div);
64+
spiflash_mmap_clk_divisor_write(lowest_div);
5765

5866
#else
5967

0 commit comments

Comments
 (0)