Skip to content

Commit 76851ee

Browse files
committed
Clock the PSoC 6 QSPI interface from the PLL
1 parent 2c65e01 commit 76851ee

2 files changed

Lines changed: 32 additions & 6 deletions

File tree

‎hal/psoc6.c‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ static SMIF_Type* QSPIPort = SMIF0;
139139
*
140140
* SMIF Block - SMIF0
141141
*/
142-
#define CY_SMIF_SYSCLK_HFCLK_DIVIDER (CY_SYSCLK_CLKHF_DIVIDE_BY_4)
142+
#define CY_SMIF_SYSCLK_HFCLK_DIVIDER (CY_SYSCLK_CLKHF_DIVIDE_BY_8)
143143
#define CY_SMIF_INIT_TRY_COUNT (10U)
144144
#define CY_SMIF_INIT_RETRY_DELAY_MS (500U)
145145
#define CY_SMIF_INIT_TIMEOUT_US (1000U)
@@ -290,7 +290,7 @@ static const cy_stc_smif_config_t QSPI_config = {
290290
*
291291
* Initialization steps:
292292
* 1. Configure QSPI data, clock, and slave-select GPIO pins
293-
* 2. Enable SMIF HF clock (CLK_HF2) with divide-by-4
293+
* 2. Enable SMIF HF clock (CLK_HF2) from the PLL with divide-by-8
294294
* 3. Initialize SMIF block in normal mode
295295
* 4. Enable SMIF block
296296
* 5. Initialize external memory configuration with retry
@@ -330,9 +330,10 @@ cy_en_smif_status_t hal_ext_flash_init(void)
330330
(void)Cy_GPIO_Pin_Init(qspi_SS_Port, qspi_SS_Pin, &qspi_ss_config);
331331
Cy_GPIO_SetHSIOM(qspi_SS_Port, qspi_SS_Pin, qspi_SS_Mux);
332332

333-
/* Step 2: Enable SMIF HF clock (CLK_HF2) sourced from CLK_PATH0 */
333+
/* Step 2: Enable SMIF HF clock (CLK_HF2) from the PLL, 100 MHz / 8. The
334+
* FLL on CLK_PATH0 keeps whatever the last loader left, even unlocked. */
334335
(void)Cy_SysClk_ClkHfSetSource(CY_SYSCLK_CLKHF_IN_CLKPATH2,
335-
CY_SYSCLK_CLKHF_IN_CLKPATH0);
336+
CY_SYSCLK_CLKHF_IN_CLKPATH1);
336337
(void)Cy_SysClk_ClkHfSetDivider(CY_SYSCLK_CLKHF_IN_CLKPATH2,
337338
CY_SMIF_SYSCLK_HFCLK_DIVIDER);
338339
(void)Cy_SysClk_ClkHfEnable(CY_SYSCLK_CLKHF_IN_CLKPATH2);

‎tools/unit-tests/unit-psoc6-qspi.c‎

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,12 +136,24 @@ void mock_set_hsiom(GPIO_PRT_Type *base, uint32_t pinNum, en_hsiom_sel_t value)
136136
cy_en_gpio_status_t Cy_GPIO_Pin_Init(GPIO_PRT_Type *base, uint32_t pinNum,
137137
const cy_stc_gpio_pin_config_t *config)
138138
{ (void)base; (void)pinNum; (void)config; INIT_ONLY(); return CY_GPIO_SUCCESS; }
139+
static uint32_t smif_clk_src;
140+
static uint32_t smif_clk_div;
139141
cy_en_sysclk_status_t Cy_SysClk_ClkHfSetSource(uint32_t clkHf,
140142
cy_en_clkhf_in_sources_t source)
141-
{ (void)clkHf; (void)source; INIT_ONLY(); return CY_SYSCLK_SUCCESS; }
143+
{
144+
INIT_ONLY();
145+
if (clkHf == 2U)
146+
smif_clk_src = (uint32_t)source;
147+
return CY_SYSCLK_SUCCESS;
148+
}
142149
cy_en_sysclk_status_t Cy_SysClk_ClkHfSetDivider(uint32_t clkHf,
143150
cy_en_clkhf_dividers_t divider)
144-
{ (void)clkHf; (void)divider; INIT_ONLY(); return CY_SYSCLK_SUCCESS; }
151+
{
152+
INIT_ONLY();
153+
if (clkHf == 2U)
154+
smif_clk_div = (uint32_t)divider;
155+
return CY_SYSCLK_SUCCESS;
156+
}
145157
cy_en_sysclk_status_t Cy_SysClk_ClkHfEnable(uint32_t clkHf)
146158
{ (void)clkHf; INIT_ONLY(); return CY_SYSCLK_SUCCESS; }
147159
cy_en_smif_status_t Cy_SMIF_Init(SMIF_Type *base,
@@ -186,6 +198,8 @@ static void setup(void)
186198
dev_sfdp_0.memSize = QSPI_SIZE;
187199
smif_blk_config = &smifBlockConfig_sfdp;
188200
in_init = 0;
201+
smif_clk_src = 0xFFU;
202+
smif_clk_div = 0xFFU;
189203
}
190204

191205
START_TEST(test_write_maps_offset)
@@ -278,6 +292,16 @@ START_TEST(test_init_checks_geometry)
278292
}
279293
END_TEST
280294

295+
/* The SMIF clock comes from the PLL that wolfBoot sets up, never the FLL */
296+
START_TEST(test_init_clocks_smif_from_pll)
297+
{
298+
in_init = 1;
299+
ck_assert_int_eq(hal_ext_flash_init(), CY_SMIF_SUCCESS);
300+
ck_assert_uint_eq(smif_clk_src, (uint32_t)CY_SYSCLK_CLKHF_IN_CLKPATH1);
301+
ck_assert_uint_eq(smif_clk_div, (uint32_t)CY_SYSCLK_CLKHF_DIVIDE_BY_8);
302+
}
303+
END_TEST
304+
281305
START_TEST(test_geometry)
282306
{
283307
ck_assert_int_eq(psoc6_qspi_geometry_ok(0x40000U), 1);
@@ -301,6 +325,7 @@ Suite *psoc6_qspi_suite(void)
301325
tcase_add_test(tc, test_erase_whole_sectors);
302326
tcase_add_test(tc, test_erase_rejects_partial_sectors);
303327
tcase_add_test(tc, test_init_checks_geometry);
328+
tcase_add_test(tc, test_init_clocks_smif_from_pll);
304329
tcase_add_test(tc, test_geometry);
305330
suite_add_tcase(s, tc);
306331
return s;

0 commit comments

Comments
 (0)