From 51571a6c48d8c2ee79608f5dab0c3429767f0b45 Mon Sep 17 00:00:00 2001 From: Magdalena Pastula Date: Wed, 5 Feb 2025 14:48:57 +0100 Subject: [PATCH 1/3] applications: sdp: mspi: add fix for max frequency Add temporary fix for not starting VTIM when max frequency is set (counter value 0). Signed-off-by: Magdalena Pastula --- applications/sdp/mspi/src/hrt/hrt-nrf54l15.s | 286 ++++++++++--------- applications/sdp/mspi/src/hrt/hrt.c | 7 + 2 files changed, 153 insertions(+), 140 deletions(-) diff --git a/applications/sdp/mspi/src/hrt/hrt-nrf54l15.s b/applications/sdp/mspi/src/hrt/hrt-nrf54l15.s index ecd57028d6d4..8e8db7a3c363 100644 --- a/applications/sdp/mspi/src/hrt/hrt-nrf54l15.s +++ b/applications/sdp/mspi/src/hrt/hrt-nrf54l15.s @@ -9,33 +9,32 @@ .type hrt_tx, @function hrt_tx: lw a5,4(a0) - addi sp,sp,-20 - sw s0,16(sp) - sw s1,12(sp) + addi sp,sp,-16 + sw s0,12(sp) + sw s1,8(sp) sw a2,0(sp) - sw a3,8(sp) beq a5,zero,.L1 li a4,32 div a4,a4,a1 - lui t0,%hi(xfer_shift_ctrl) - addi a3,t0,%lo(xfer_shift_ctrl) - lbu s0,2(a3) - lbu a5,1(a3) - sb a1,2(a3) - lbu a3,3(a3) - li a2,3145728 + lui t2,%hi(xfer_shift_ctrl) + addi a2,t2,%lo(xfer_shift_ctrl) + lbu s1,2(a2) + lbu a5,1(a2) + sb a1,2(a2) + lbu a2,3(a2) + li t1,3145728 slli a5,a5,8 - slli a3,a3,20 - and a3,a3,a2 + slli a2,a2,20 + and a2,a2,t1 andi a5,a5,1792 - or a5,a5,a3 - li a2,126976 - slli a3,a1,12 - and a3,a3,a2 - or a5,a5,a3 + or a5,a5,a2 + li t1,126976 + slli a2,a1,12 + and a2,a2,t1 + or a5,a5,a2 addi a4,a4,-1 andi a4,a4,0xff - sb a4,%lo(xfer_shift_ctrl)(t0) + sb a4,%lo(xfer_shift_ctrl)(t2) andi a4,a4,63 or a5,a5,a4 #APP @@ -46,21 +45,21 @@ hrt_tx: and a5,a5,a4 ori a5,a5,4 sw a5,4(sp) - li a2,0 - li t2,1 - addi t1,t0,%lo(xfer_shift_ctrl) + li t1,0 + addi t0,t2,%lo(xfer_shift_ctrl) .L3: lw a5,4(a0) - bltu a2,a5,.L13 + bltu t1,a5,.L14 .L1: - lw s0,16(sp) - lw s1,12(sp) - addi sp,sp,20 + lw s0,12(sp) + lw s1,8(sp) + addi sp,sp,16 jr ra -.L13: +.L14: lw a5,4(a0) - sub a5,a5,a2 - beq a5,t2,.L4 + li a4,1 + sub a5,a5,t1 + beq a5,a4,.L4 li a4,2 beq a5,a4,.L5 .L6: @@ -68,28 +67,28 @@ hrt_tx: li a5,0 beq a4,zero,.L7 lw a5,0(a0) - slli a4,a2,2 + slli a4,t1,2 add a5,a5,a4 lw a5,0(a5) j .L7 .L4: - lbu a3,1(t1) - lbu a5,2(t1) - li s1,126976 - slli a3,a3,8 + lbu a2,1(t0) + lbu a5,2(t0) + li s0,126976 + slli a2,a2,8 slli a5,a5,12 - and a5,a5,s1 - andi a3,a3,1792 - or a3,a3,a5 + and a5,a5,s0 + andi a2,a2,1792 + or a2,a2,a5 lbu a4,8(a0) - lbu a5,3(t1) - li s1,3145728 + lbu a5,3(t0) + li s0,3145728 addi a4,a4,-1 slli a5,a5,20 andi a4,a4,0xff - and a5,a5,s1 - sb a4,%lo(xfer_shift_ctrl)(t0) - or a5,a3,a5 + and a5,a5,s0 + sb a4,%lo(xfer_shift_ctrl)(t2) + or a5,a2,a5 andi a4,a4,63 or a5,a5,a4 #APP @@ -97,7 +96,7 @@ hrt_tx: #NO_APP lw a5,12(a0) .L7: - beq a1,s0,.L8 + beq a1,s1,.L8 .L9: #APP csrr a4, 3022 @@ -108,47 +107,54 @@ hrt_tx: #APP csrw 3043, a4 #NO_APP - mv s0,a1 + mv s1,a1 .L8: lbu a4,16(a0) - andi a3,a4,0xff + andi a2,a4,0xff beq a4,zero,.L10 - bne a3,t2,.L11 + li a4,1 + bne a2,a4,.L11 #APP csrw 3017, a5 #NO_APP .L11: - bne a2,zero,.L12 + bne t1,zero,.L12 lw a5,0(sp) lbu a5,0(a5) bne a5,zero,.L12 - lw a5,8(sp) + mv a5,a3 + bne a3,zero,.L13 + li a5,1 +.L13: + slli a3,a5,16 + srli a3,a3,16 #APP - csrw 2005, a5 + csrw 2005, a3 #NO_APP lw a5,0(sp) - sb t2,0(a5) + li a4,1 + sb a4,0(a5) .L12: - addi a2,a2,1 + addi t1,t1,1 j .L3 .L5: - lbu a3,1(t1) - lbu a5,2(t1) - li s1,126976 - slli a3,a3,8 + lbu a2,1(t0) + lbu a5,2(t0) + li s0,126976 + slli a2,a2,8 slli a5,a5,12 - and a5,a5,s1 - andi a3,a3,1792 - or a3,a3,a5 + and a5,a5,s0 + andi a2,a2,1792 + or a2,a2,a5 lbu a4,9(a0) - lbu a5,3(t1) - li s1,3145728 + lbu a5,3(t0) + li s0,3145728 addi a4,a4,-1 slli a5,a5,20 andi a4,a4,0xff - and a5,a5,s1 - sb a4,%lo(xfer_shift_ctrl)(t0) - or a5,a3,a5 + and a5,a5,s0 + sb a4,%lo(xfer_shift_ctrl)(t2) + or a5,a2,a5 andi a4,a4,63 or a5,a5,a4 #APP @@ -168,7 +174,7 @@ hrt_tx_rx.constprop.0: lw a4,0(a0) mv a5,a1 lw a1,4(a0) - beq a1,zero,.L18 + beq a1,zero,.L19 li a1,8 div a1,a1,a5 li t1,126976 @@ -189,41 +195,41 @@ hrt_tx_rx.constprop.0: li a1,-16777216 li t0,1 add a3,a3,t1 -.L20: +.L21: lw t1,4(a0) - bltu a5,t1,.L25 -.L18: + bltu a5,t1,.L26 +.L19: ret -.L25: +.L26: lbu t1,16(a0) andi t2,t1,0xff - beq t1,zero,.L21 - bne t2,t0,.L22 + beq t1,zero,.L22 + bne t2,t0,.L23 and t1,a4,a1 #APP csrw 3017, t1 #NO_APP -.L22: +.L23: slli a4,a4,8 - bne a5,zero,.L23 - beq a2,zero,.L23 + bne a5,zero,.L24 + beq a2,zero,.L24 #APP csrw 2002, a3 #NO_APP -.L24: +.L25: addi a5,a5,1 - j .L20 -.L21: + j .L21 +.L22: and t1,a4,a1 #APP csrw 3016, t1 #NO_APP - j .L22 -.L23: + j .L23 +.L24: #APP csrr t1, 3018 #NO_APP - j .L24 + j .L25 .size hrt_tx_rx.constprop.0, .-hrt_tx_rx.constprop.0 .section .text.hrt_write,"ax",@progbits .align 1 @@ -242,23 +248,23 @@ hrt_write: li a5,0 addi a4,a0,4 li a3,4 -.L32: +.L33: lw a2,0(a4) - bne a2,zero,.L31 + bne a2,zero,.L32 addi a5,a5,1 andi a5,a5,0xff addi a4,a4,20 - bne a5,a3,.L32 + bne a5,a3,.L33 li a5,3 -.L31: +.L32: li a4,1 - beq a5,a4,.L33 - li a4,3 beq a5,a4,.L34 + li a4,3 + beq a5,a4,.L35 li a4,0 - bne a5,zero,.L35 + bne a5,zero,.L36 lbu a4,80(s0) -.L35: +.L36: lui a3,%hi(xfer_shift_ctrl+2) sb a4,%lo(xfer_shift_ctrl+2)(a3) #APP @@ -287,21 +293,21 @@ hrt_write: li a2,1 add a5,s0,a5 lw a3,4(a5) - beq a3,a2,.L36 - li a2,2 beq a3,a2,.L37 + li a2,2 + beq a3,a2,.L38 li a5,32 div a5,a5,a4 - j .L53 -.L33: - lbu a4,81(s0) - j .L35 + j .L54 .L34: + lbu a4,81(s0) + j .L36 +.L35: lbu a4,83(s0) - j .L35 -.L36: + j .L36 +.L37: lbu a5,8(a5) -.L53: +.L54: #APP csrw 3022, a5 #NO_APP @@ -311,11 +317,11 @@ hrt_write: lbu a4,89(s0) slli a5,a5,16 srli a5,a5,16 - bne a4,zero,.L40 + bne a4,zero,.L41 #APP csrc 3008, a5 #NO_APP -.L41: +.L42: lhu a3,84(s0) lbu a1,80(s0) addi a2,sp,3 @@ -337,7 +343,7 @@ hrt_write: addi a0,s0,60 call hrt_tx lbu a5,94(s0) - bne a5,zero,.L42 + bne a5,zero,.L43 li a5,16384 addi a5,a5,1 #APP @@ -345,41 +351,41 @@ hrt_write: csrw 3017, 0 csrw 2000, 0 #NO_APP -.L43: +.L44: #APP csrw 2005, 0 #NO_APP lbu a5,88(s0) - bne a5,zero,.L30 + bne a5,zero,.L31 lbu a4,87(s0) li a5,1 sll a5,a5,a4 lbu a4,89(s0) slli a5,a5,16 srli a5,a5,16 - bne a4,zero,.L46 + bne a4,zero,.L47 #APP csrs 3008, a5 #NO_APP -.L30: +.L31: lw ra,12(sp) lw s0,8(sp) addi sp,sp,16 jr ra -.L37: +.L38: lbu a5,9(a5) - j .L53 -.L40: + j .L54 +.L41: #APP csrs 3008, a5 #NO_APP - j .L41 -.L42: + j .L42 +.L43: #APP csrr a5, 3022 #NO_APP andi a5,a5,0xff - bne a5,zero,.L42 + bne a5,zero,.L43 #APP csrw 2000, 0 #NO_APP @@ -390,7 +396,7 @@ hrt_write: #NO_APP lbu a5,94(s0) li a4,1 - bne a5,a4,.L44 + bne a5,a4,.L45 lbu a4,86(s0) sll a5,a5,a4 slli a5,a5,16 @@ -398,10 +404,10 @@ hrt_write: #APP csrc 3008, a5 #NO_APP - j .L43 -.L44: + j .L44 +.L45: li a3,3 - bne a5,a3,.L43 + bne a5,a3,.L44 lbu a5,86(s0) sll a4,a4,a5 slli a4,a4,16 @@ -409,12 +415,12 @@ hrt_write: #APP csrs 3008, a4 #NO_APP - j .L43 -.L46: + j .L44 +.L47: #APP csrc 3008, a5 #NO_APP - j .L30 + j .L31 .size hrt_write, .-hrt_write .section .text.hrt_read,"ax",@progbits .align 1 @@ -430,7 +436,7 @@ hrt_read: lbu a4,87(a0) mv s0,a0 andi s1,s1,0xff - bne a5,zero,.L55 + bne a5,zero,.L56 li a5,1 sll a5,a5,a4 slli a5,a5,16 @@ -438,10 +444,10 @@ hrt_read: #APP csrc 3008, a5 #NO_APP -.L56: +.L57: lbu a4,83(s0) li a5,1 - bne a4,a5,.L57 + bne a4,a5,.L58 lhu a5,90(s0) slli a5,a5,16 srli a5,a5,16 @@ -453,7 +459,7 @@ hrt_read: #APP csrw 3009, a5 #NO_APP -.L57: +.L58: #APP csrw 3011, 2 #NO_APP @@ -504,15 +510,15 @@ hrt_read: call hrt_tx_rx.constprop.0 lbu a4,83(s0) li a5,1 - beq a4,a5,.L58 + beq a4,a5,.L59 lhu a5,92(s0) #APP csrw 3009, a5 #NO_APP -.L58: +.L59: lbu a4,81(s0) lbu a5,83(s0) - beq a4,a5,.L66 + beq a4,a5,.L67 li a5,2031616 slli s1,s1,16 and s1,s1,a5 @@ -530,19 +536,19 @@ hrt_read: csrr a5, 3018 #NO_APP li a4,4 -.L60: +.L61: lw a3,64(s0) - bgtu a3,a4,.L61 + bgtu a3,a4,.L62 #APP csrw 2000, 0 csrw 2001, 0 csrw 3019, 0 #NO_APP lbu a4,88(s0) - bne a4,zero,.L62 + bne a4,zero,.L63 lbu a4,89(s0) lbu a3,87(s0) - bne a4,zero,.L63 + bne a4,zero,.L64 li a4,1 sll a4,a4,a3 slli a4,a4,16 @@ -550,10 +556,10 @@ hrt_read: #APP csrs 3008, a4 #NO_APP -.L62: +.L63: lbu a3,81(s0) lbu a4,83(s0) - beq a3,a4,.L64 + beq a3,a4,.L65 lw a4,60(s0) andi a3,a5,0xff sb a3,0(a4) @@ -568,10 +574,10 @@ hrt_read: lw a4,60(s0) srli a5,a5,24 sb a5,3(a4) -.L64: +.L65: lbu a4,83(s0) li a5,1 - bne a4,a5,.L54 + bne a4,a5,.L55 lhu a5,90(s0) ori a5,a5,4 sh a5,90(s0) @@ -579,13 +585,13 @@ hrt_read: #APP csrw 3009, a5 #NO_APP -.L54: +.L55: lw ra,8(sp) lw s0,4(sp) lw s1,0(sp) addi sp,sp,12 jr ra -.L55: +.L56: li a5,1 sll a5,a5,a4 slli a5,a5,16 @@ -593,8 +599,8 @@ hrt_read: #APP csrs 3008, a5 #NO_APP - j .L56 -.L61: + j .L57 +.L62: #APP csrr a2, 3018 #NO_APP @@ -603,12 +609,12 @@ hrt_read: add a3,a3,a4 sb a2,0(a3) addi a4,a4,1 - j .L60 -.L66: + j .L61 +.L67: li a4,0 li a5,0 - j .L60 -.L63: + j .L61 +.L64: li a4,1 sll a4,a4,a3 slli a4,a4,16 @@ -616,7 +622,7 @@ hrt_read: #APP csrc 3008, a4 #NO_APP - j .L62 + j .L63 .size hrt_read, .-hrt_read .section .sdata.xfer_shift_ctrl,"aw" .align 2 diff --git a/applications/sdp/mspi/src/hrt/hrt.c b/applications/sdp/mspi/src/hrt/hrt.c index f9461a3fb1f4..1022cf02d4cc 100644 --- a/applications/sdp/mspi/src/hrt/hrt.c +++ b/applications/sdp/mspi/src/hrt/hrt.c @@ -104,6 +104,13 @@ static void hrt_tx(volatile hrt_xfer_data_t *xfer_data, uint8_t frame_width, boo } if ((i == 0) && (!*counter_running)) { + /* + * Temporary fix for max frequency. Top value can be set to 0, + * but initial value cannot, because counter will not start. + */ + if (counter_value == 0) { + counter_value = 1; + } /* Start counter */ nrf_vpr_csr_vtim_simple_counter_set(0, counter_value); *counter_running = true; From 3b6d1aa3e309d91f64acc1c5a9acab47235650f2 Mon Sep 17 00:00:00 2001 From: Magdalena Pastula Date: Thu, 6 Mar 2025 11:54:19 +0100 Subject: [PATCH 2/3] drivers: mspi: add calculating CNT0 value Add calculating VTIM CNT0 value base don required frequency. Also, add checking if required frequency is not too small. Signed-off-by: Magdalena Pastula --- drivers/mspi/mspi_nrfe.c | 19 +++++++++++++------ include/drivers/mspi/nrfe_mspi.h | 2 +- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/drivers/mspi/mspi_nrfe.c b/drivers/mspi/mspi_nrfe.c index 8a1e5d3995b6..0edebfff4814 100644 --- a/drivers/mspi/mspi_nrfe.c +++ b/drivers/mspi/mspi_nrfe.c @@ -21,11 +21,12 @@ LOG_MODULE_REGISTER(mspi_nrfe, CONFIG_MSPI_LOG_LEVEL); #include #include -#define MSPI_NRFE_NODE DT_DRV_INST(0) -#define MAX_TX_MSG_SIZE (DT_REG_SIZE(DT_NODELABEL(sram_tx))) -#define MAX_RX_MSG_SIZE (DT_REG_SIZE(DT_NODELABEL(sram_rx))) -#define IPC_TIMEOUT_MS 100 -#define EP_SEND_TIMEOUT_MS 10 +#define MSPI_NRFE_NODE DT_DRV_INST(0) +#define MAX_TX_MSG_SIZE (DT_REG_SIZE(DT_NODELABEL(sram_tx))) +#define MAX_RX_MSG_SIZE (DT_REG_SIZE(DT_NODELABEL(sram_rx))) +#define IPC_TIMEOUT_MS 100 +#define EP_SEND_TIMEOUT_MS 10 +#define CNT0_TOP_CALCULATE(freq) (NRFX_CEIL_DIV(SystemCoreClock, freq * 2) - 1) #define SDP_MPSI_PINCTRL_DEV_CONFIG_INIT(node_id) \ { \ @@ -439,6 +440,12 @@ static int api_dev_config(const struct device *dev, const struct mspi_dev_id *de drv_cfg->mspicfg.max_freq); return -EINVAL; } + + if (CNT0_TOP_CALCULATE(cfg->freq) > UINT16_MAX) { + LOG_ERR("Invalid frequency: %u. MIN: %u", cfg->freq, + NRFX_CEIL_DIV(drv_cfg->mspicfg.max_freq, UINT16_MAX)); + return -EINVAL; + } } if (param_mask & MSPI_DEVICE_CONFIG_IO_MODE) { @@ -467,7 +474,7 @@ static int api_dev_config(const struct device *dev, const struct mspi_dev_id *de mspi_dev_config_msg.dev_config.io_mode = cfg->io_mode; mspi_dev_config_msg.dev_config.cpp = cfg->cpp; mspi_dev_config_msg.dev_config.ce_polarity = cfg->ce_polarity; - mspi_dev_config_msg.dev_config.freq = cfg->freq; + mspi_dev_config_msg.dev_config.cnt0_value = CNT0_TOP_CALCULATE(cfg->freq); mspi_dev_config_msg.dev_config.ce_index = cfg->ce_num; return send_data(NRFE_MSPI_CONFIG_DEV, (void *)&mspi_dev_config_msg, diff --git a/include/drivers/mspi/nrfe_mspi.h b/include/drivers/mspi/nrfe_mspi.h index c7f5758079e9..3d8d55f6fa45 100644 --- a/include/drivers/mspi/nrfe_mspi.h +++ b/include/drivers/mspi/nrfe_mspi.h @@ -49,7 +49,7 @@ typedef struct { enum mspi_cpp_mode cpp; uint8_t ce_index; enum mspi_ce_polarity ce_polarity; - uint32_t freq; + uint16_t cnt0_value; } nrfe_mspi_dev_config_t; typedef struct { From 9160e52ae72ffb3dd0fac8bb63880ff811c5084b Mon Sep 17 00:00:00 2001 From: Magdalena Pastula Date: Thu, 6 Mar 2025 11:55:48 +0100 Subject: [PATCH 3/3] applications: sdp: mspi: add setting CNT0 value Add setting CNT0 value to the one received from APP. Signed-off-by: Magdalena Pastula --- applications/sdp/mspi/src/main.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/applications/sdp/mspi/src/main.c b/applications/sdp/mspi/src/main.c index dc508282fffa..2a8315e5055e 100644 --- a/applications/sdp/mspi/src/main.c +++ b/applications/sdp/mspi/src/main.c @@ -24,8 +24,6 @@ #define DATA_PINS_MAX 8 #define VIO_COUNT 11 -#define MAX_FREQUENCY 64000000 - #define MAX_SHIFT_COUNT 63 #define CE_PIN_UNUSED UINT8_MAX @@ -177,7 +175,7 @@ static void xfer_execute(nrfe_mspi_xfer_packet_msg_t *xfer_packet) volatile nrfe_mspi_dev_config_t *device = &nrfe_mspi_devices[nrfe_mspi_xfer_config_ptr->device_index]; - xfer_params.counter_value = 4; + xfer_params.counter_value = device->cnt0_value; xfer_params.ce_vio = ce_vios[device->ce_index]; xfer_params.ce_hold = nrfe_mspi_xfer_config_ptr->hold_ce; xfer_params.cpp_mode = device->cpp; @@ -261,7 +259,7 @@ void prepare_and_read_data(nrfe_mspi_xfer_packet_msg_t *xfer_packet, volatile ui &nrfe_mspi_devices[nrfe_mspi_xfer_config_ptr->device_index]; nrf_vpr_csr_vio_config_t config; - xfer_params.counter_value = 4; + xfer_params.counter_value = device->cnt0_value; xfer_params.ce_vio = ce_vios[device->ce_index]; xfer_params.ce_hold = nrfe_mspi_xfer_config_ptr->hold_ce; xfer_params.ce_polarity = device->ce_polarity; @@ -400,7 +398,6 @@ static void ep_recv(const void *data, size_t len, void *priv) NRFX_ASSERT(dev_config->dev_config.cpp <= MSPI_CPP_MODE_3); NRFX_ASSERT(dev_config->dev_config.ce_index < ce_vios_count); NRFX_ASSERT(dev_config->dev_config.ce_polarity <= MSPI_CE_ACTIVE_HIGH); - NRFX_ASSERT(dev_config->dev_config.freq <= MAX_FREQUENCY); nrfe_mspi_devices[dev_config->device_index] = dev_config->dev_config;