From 0eb70ab2f4ffcc56c6b8c5f4f67fde7bd20abdfa Mon Sep 17 00:00:00 2001 From: Khoa Nguyen Date: Mon, 30 Sep 2024 10:46:32 +0700 Subject: [PATCH 1/6] manifest: Update renesas hal commit ID for Flash-LP RA4, RA2 This commit is to update renesas commit ID to support Flash-LP Signed-off-by: Khoa Nguyen --- west.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/west.yml b/west.yml index a28c1b6a2331d..2a4f711bf2e7f 100644 --- a/west.yml +++ b/west.yml @@ -224,7 +224,7 @@ manifest: - hal - name: hal_renesas path: modules/hal/renesas - revision: 9d68ee711aaeab39b216a61101a2646c5a1b0fc0 + revision: 9c29341a61a09bc81776d7c5393954e22662d442 groups: - hal - name: hal_rpi_pico From e9eb17602fccae6cd151b83835b26e12d478f507 Mon Sep 17 00:00:00 2001 From: Khoa Nguyen Date: Fri, 1 Nov 2024 08:58:18 +0700 Subject: [PATCH 2/6] drivers: flash: Initial support Flash-LP driver for Renesas RA Initial support Flash-LP driver for Renesas RA Signed-off-by: Khoa Nguyen Signed-off-by: Phi Tran --- drivers/flash/CMakeLists.txt | 1 + drivers/flash/Kconfig.renesas_ra | 24 +- drivers/flash/soc_flash_renesas_ra_lp.c | 356 ++++++++++++++++++ drivers/flash/soc_flash_renesas_ra_lp.h | 73 ++++ .../renesas,ra-flash-lp-controller.yaml | 38 ++ modules/Kconfig.renesas | 5 + 6 files changed, 496 insertions(+), 1 deletion(-) create mode 100644 drivers/flash/soc_flash_renesas_ra_lp.c create mode 100644 drivers/flash/soc_flash_renesas_ra_lp.h create mode 100644 dts/bindings/flash_controller/renesas,ra-flash-lp-controller.yaml diff --git a/drivers/flash/CMakeLists.txt b/drivers/flash/CMakeLists.txt index 8fa4072da49cd..ca99ad9d32ad5 100644 --- a/drivers/flash/CMakeLists.txt +++ b/drivers/flash/CMakeLists.txt @@ -57,6 +57,7 @@ zephyr_library_sources_ifdef(CONFIG_SOC_FLASH_NRF_MRAM soc_flash_nrf_mram.c) zephyr_library_sources_ifdef(CONFIG_SOC_FLASH_NRF_RRAM soc_flash_nrf_rram.c) zephyr_library_sources_ifdef(CONFIG_SOC_FLASH_NUMAKER soc_flash_numaker.c) zephyr_library_sources_ifdef(CONFIG_SOC_FLASH_NUMAKER_RMC soc_flash_numaker_rmc.c) +zephyr_library_sources_ifdef(CONFIG_SOC_FLASH_RENESAS_RA_LP soc_flash_renesas_ra_lp.c) zephyr_library_sources_ifdef(CONFIG_SOC_FLASH_RV32M1 soc_flash_rv32m1.c) zephyr_library_sources_ifdef(CONFIG_SOC_FLASH_SAM flash_sam.c) zephyr_library_sources_ifdef(CONFIG_SOC_FLASH_SAM0 flash_sam0.c) diff --git a/drivers/flash/Kconfig.renesas_ra b/drivers/flash/Kconfig.renesas_ra index 703bfcafd2a4e..b96ab65a997ff 100644 --- a/drivers/flash/Kconfig.renesas_ra +++ b/drivers/flash/Kconfig.renesas_ra @@ -14,7 +14,19 @@ config SOC_FLASH_RENESAS_RA_HP select FLASH_HAS_EX_OP if(SOC_SERIES_RA8M1 || SOC_SERIES_RA8D1 || SOC_SERIES_RA8T1) select USE_RA_FSP_FLASH_HP help - Enable Flash HP driver for RA series + Enable Flash High-Performance driver for RA series + +config SOC_FLASH_RENESAS_RA_LP + bool "RA Flash LP driver" + depends on DT_HAS_RENESAS_RA_FLASH_LP_CONTROLLER_ENABLED + default y + select FLASH_HAS_DRIVER_ENABLED + select FLASH_PAGE_LAYOUT + select FLASH_HAS_PAGE_LAYOUT + select FLASH_HAS_EXPLICIT_ERASE + select USE_RA_FSP_FLASH_LP + help + Enable Flash Low-Power driver for RA series if SOC_FLASH_RENESAS_RA_HP @@ -32,3 +44,13 @@ config FLASH_RENESAS_RA_HP_BGO Enable Background operations (BGOs) endif # SOC_FLASH_RENESAS_RA_HP + +if SOC_FLASH_RENESAS_RA_LP + +config FLASH_RENESAS_RA_LP_BGO + bool "Background operations feature" + default y + help + Enable Background operations (BGOs) + +endif # SOC_FLASH_RENESAS_RA_LP diff --git a/drivers/flash/soc_flash_renesas_ra_lp.c b/drivers/flash/soc_flash_renesas_ra_lp.c new file mode 100644 index 0000000000000..9e6cf48dd925c --- /dev/null +++ b/drivers/flash/soc_flash_renesas_ra_lp.c @@ -0,0 +1,356 @@ +/* + * Copyright (c) 2025 Renesas Electronics Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#define LOG_LEVEL CONFIG_FLASH_LOG_LEVEL +#include +#include +#include +#include +#include +#include +#include +#include +#include "soc_flash_renesas_ra_lp.h" + +LOG_MODULE_REGISTER(flash_renesas_ra_lp, CONFIG_FLASH_LOG_LEVEL); + +static struct flash_pages_layout code_flash_ra_layout[1]; +static struct flash_pages_layout data_flash_ra_layout[1]; + +#if defined(CONFIG_FLASH_RENESAS_RA_LP_BGO) +void fcu_frdyi_isr(void); + +void flash_bgo_callback(flash_callback_args_t *p_args) +{ + atomic_t *event_flag = (atomic_t *)(p_args->p_context); + + if (FLASH_EVENT_ERASE_COMPLETE == p_args->event) { + atomic_or(event_flag, FLASH_FLAG_ERASE_COMPLETE); + } else if (FLASH_EVENT_WRITE_COMPLETE == p_args->event) { + atomic_or(event_flag, FLASH_FLAG_WRITE_COMPLETE); + } else { + atomic_or(event_flag, FLASH_FLAG_GET_ERROR); + } +} +#endif /* CONFIG_FLASH_RENESAS_RA_LP_BGO */ + +static bool flash_ra_valid_range(off_t area_size, off_t offset, size_t len) +{ + if ((offset < 0) || offset >= area_size || (area_size - offset) < len || + (len > UINT32_MAX - offset)) { + return false; + } + + return true; +} + +static int flash_ra_read(const struct device *dev, off_t offset, void *data, size_t len) +{ + struct flash_lp_ra_data *flash_data = dev->data; + + if (!flash_ra_valid_range(flash_data->area_size, offset, len)) { + return -EINVAL; + } + + if (!len) { + return 0; + } + + LOG_DBG("flash: read 0x%lx, len: %u", (long)(offset + flash_data->area_address), len); + + memcpy(data, (uint8_t *)(offset + flash_data->area_address), len); + + return 0; +} + +static int flash_ra_erase(const struct device *dev, off_t offset, size_t len) +{ + struct flash_lp_ra_data *flash_data = dev->data; + struct flash_lp_ra_controller *dev_ctrl = flash_data->controller; + static struct flash_pages_info page_info_off, page_info_len; + fsp_err_t err; + uint32_t block_num; + int rc, rc2, ret = 0; + int key = 0; + bool is_contain_end_block = false; + + if (!flash_ra_valid_range(flash_data->area_size, offset, len)) { + return -EINVAL; + } + + if (!len) { + return 0; + } + + LOG_DBG("flash: erase 0x%lx, len: %u", (long)(offset + flash_data->area_address), len); + + rc = flash_get_page_info_by_offs(dev, offset, &page_info_off); + + if (rc != 0) { + return -EINVAL; + } + + if (offset != page_info_off.start_offset) { + return -EINVAL; + } + + if (flash_data->FlashRegion == CODE_FLASH) { + if ((offset + len) == (uint32_t)FLASH_LP_CF_SIZE) { + page_info_len.index = FLASH_LP_CF_BLOCKS_COUNT; + is_contain_end_block = true; + } + } else { + if ((offset + len) == (uint32_t)FLASH_LP_DF_SIZE) { + page_info_len.index = FLASH_LP_DF_BLOCKS_COUNT; + is_contain_end_block = true; + } + } + + if (!is_contain_end_block) { + rc2 = flash_get_page_info_by_offs(dev, (offset + len), &page_info_len); + if (rc2 != 0) { + return -EINVAL; + } + if ((offset + len) != (page_info_len.start_offset)) { + return -EIO; + } + } + + block_num = (uint32_t)((page_info_len.index) - page_info_off.index); + + if (block_num > 0) { + if (flash_data->FlashRegion == CODE_FLASH) { + /* Disable interrupts during code flash operations */ + key = irq_lock(); + } else { + k_sem_take(&dev_ctrl->ctrl_sem, K_FOREVER); + } + + err = R_FLASH_LP_Erase(&dev_ctrl->flash_ctrl, + (long)(flash_data->area_address + offset), block_num); + + if (err != FSP_SUCCESS) { + ret = -EIO; + goto end; + } + +#if defined(CONFIG_FLASH_RENESAS_RA_LP_BGO) + if (flash_data->FlashRegion == DATA_FLASH) { + /* Wait for the erase complete event flag, if BGO is SET */ + while (!(dev_ctrl->flags & FLASH_FLAG_ERASE_COMPLETE)) { + if (dev_ctrl->flags & FLASH_FLAG_GET_ERROR) { + ret = -EIO; + atomic_and(&dev_ctrl->flags, ~FLASH_FLAG_GET_ERROR); + break; + } + k_sleep(K_USEC(10)); + } + atomic_and(&dev_ctrl->flags, ~FLASH_FLAG_ERASE_COMPLETE); + } +#endif /* CONFIG_FLASH_RENESAS_RA_LP_BGO */ + +end: + if (flash_data->FlashRegion == CODE_FLASH) { + irq_unlock(key); + } else { + k_sem_give(&dev_ctrl->ctrl_sem); + } + } + + return ret; +} + +static int flash_ra_write(const struct device *dev, off_t offset, const void *data, size_t len) +{ + fsp_err_t err; + struct flash_lp_ra_data *flash_data = dev->data; + struct flash_lp_ra_controller *dev_ctrl = flash_data->controller; + int key = 0; + int ret = 0; + + if (!flash_ra_valid_range(flash_data->area_size, offset, len)) { + return -EINVAL; + } + + if (!len) { + return 0; + } + + LOG_DBG("flash: write 0x%lx, len: %u", (long)(offset + flash_data->area_address), len); + + if (flash_data->FlashRegion == CODE_FLASH) { + /* Disable interrupts during code flash operations */ + key = irq_lock(); + } else { + k_sem_take(&dev_ctrl->ctrl_sem, K_FOREVER); + } + + err = R_FLASH_LP_Write(&dev_ctrl->flash_ctrl, (uint32_t)data, + (long)(offset + flash_data->area_address), len); + + if (err != FSP_SUCCESS) { + ret = -EIO; + goto end; + } + +#if defined(CONFIG_FLASH_RENESAS_RA_LP_BGO) + if (flash_data->FlashRegion == DATA_FLASH) { + /* Wait for the write complete event flag, if BGO is SET */ + while (!(dev_ctrl->flags & FLASH_FLAG_WRITE_COMPLETE)) { + if (dev_ctrl->flags & FLASH_FLAG_GET_ERROR) { + ret = -EIO; + atomic_and(&dev_ctrl->flags, ~FLASH_FLAG_GET_ERROR); + break; + } + k_sleep(K_USEC(10)); + } + atomic_and(&dev_ctrl->flags, ~FLASH_FLAG_WRITE_COMPLETE); + } +#endif /* CONFIG_FLASH_RENESAS_RA_LP_BGO */ + +end: + if (flash_data->FlashRegion == CODE_FLASH) { + irq_unlock(key); + } else { + k_sem_give(&dev_ctrl->ctrl_sem); + } + + return ret; +} + +static int flash_ra_get_size(const struct device *dev, uint64_t *size) +{ + struct flash_lp_ra_data *flash_data = dev->data; + *size = (uint64_t)flash_data->area_size; + + return 0; +} + +#ifdef CONFIG_FLASH_PAGE_LAYOUT +void flash_ra_page_layout(const struct device *dev, const struct flash_pages_layout **layout, + size_t *layout_size) +{ + struct flash_lp_ra_data *flash_data = dev->data; + + if (flash_data->FlashRegion == DATA_FLASH) { + data_flash_ra_layout[0].pages_count = FLASH_LP_DF_BLOCKS_COUNT; + data_flash_ra_layout[0].pages_size = FLASH_LP_DF_BLOCK_SIZE; + *layout = data_flash_ra_layout; + } else { + code_flash_ra_layout[0].pages_count = FLASH_LP_CF_BLOCKS_COUNT; + code_flash_ra_layout[0].pages_size = FLASH_LP_CF_BLOCK_SIZE; + *layout = code_flash_ra_layout; + } + + *layout_size = 1; +} +#endif /* CONFIG_FLASH_PAGE_LAYOUT */ + +static const struct flash_parameters *flash_ra_get_parameters(const struct device *dev) +{ + const struct flash_lp_ra_config *config = dev->config; + + return &config->flash_ra_parameters; +} + +static struct flash_lp_ra_controller flash_lp_ra_controller = { + .fsp_config = { + .data_flash_bgo = IS_ENABLED(CONFIG_FLASH_RENESAS_RA_LP_BGO), +#if defined(CONFIG_FLASH_RENESAS_RA_LP_BGO) + .p_callback = flash_bgo_callback, + .p_context = NULL, + .irq = (IRQn_Type)DT_INST_IRQ_BY_NAME(0, frdyi, irq), + .ipl = DT_INST_IRQ_BY_NAME(0, frdyi, priority), +#endif /* CONFIG_FLASH_RENESAS_RA_LP_BGO */ + }}; + +static int flash_ra_init(const struct device *dev) +{ + const struct device *dev_ctrl = DEVICE_DT_INST_GET(0); + struct flash_lp_ra_data *flash_data = dev->data; + + if (!device_is_ready(dev_ctrl)) { + return -ENODEV; + } + + if (flash_data->area_address == FLASH_LP_DF_START) { + flash_data->FlashRegion = DATA_FLASH; + } else { + flash_data->FlashRegion = CODE_FLASH; + } + + flash_data->controller = dev_ctrl->data; + + return 0; +} + +#if defined(CONFIG_FLASH_RENESAS_RA_LP_BGO) +#define FLASH_CONTROLLER_RA_IRQ_INIT \ + { \ + R_ICU->IELSR[DT_IRQ_BY_NAME(DT_DRV_INST(0), frdyi, irq)] = \ + BSP_PRV_IELS_ENUM(EVENT_FCU_FRDYI); \ + \ + IRQ_CONNECT(DT_IRQ_BY_NAME(DT_DRV_INST(0), frdyi, irq), \ + DT_IRQ_BY_NAME(DT_DRV_INST(0), frdyi, priority), fcu_frdyi_isr, \ + DEVICE_DT_INST_GET(0), 0); \ + \ + irq_enable(DT_INST_IRQ_BY_NAME(0, frdyi, irq)); \ + } +#endif /* CONFIG_FLASH_RENESAS_RA_LP_BGO */ + +static int flash_controller_ra_init(const struct device *dev) +{ + fsp_err_t err; + struct flash_lp_ra_controller *data = dev->data; + +#if defined(CONFIG_FLASH_RENESAS_RA_LP_BGO) + FLASH_CONTROLLER_RA_IRQ_INIT +#endif /* CONFIG_FLASH_RENESAS_RA_LP_BGO */ + + k_sem_init(&data->ctrl_sem, 1, 1); + + data->fsp_config.p_context = &data->flags; + + err = R_FLASH_LP_Open(&data->flash_ctrl, &data->fsp_config); + if (err != FSP_SUCCESS) { + LOG_DBG("flash: open error=%d", (int)err); + return -EIO; + } + + return 0; +} + +static DEVICE_API(flash, flash_ra_api) = { + .erase = flash_ra_erase, + .write = flash_ra_write, + .read = flash_ra_read, + .get_parameters = flash_ra_get_parameters, + .get_size = flash_ra_get_size, +#ifdef CONFIG_FLASH_PAGE_LAYOUT + .page_layout = flash_ra_page_layout, +#endif +}; + +#define RA_FLASH_INIT(index) \ + static struct flash_lp_ra_config flash_lp_ra_config_##index = { \ + .flash_ra_parameters = { \ + .write_block_size = DT_PROP(index, write_block_size), \ + .erase_value = 0xff, \ + }}; \ + struct flash_lp_ra_data flash_lp_ra_data_##index = { \ + .area_address = DT_REG_ADDR(index), \ + .area_size = DT_REG_SIZE(index), \ + }; \ + \ + DEVICE_DT_DEFINE(index, flash_ra_init, NULL, &flash_lp_ra_data_##index, \ + &flash_lp_ra_config_##index, POST_KERNEL, CONFIG_FLASH_INIT_PRIORITY, \ + &flash_ra_api); + +DT_FOREACH_CHILD_STATUS_OKAY(DT_DRV_INST(0), RA_FLASH_INIT); + +/* define the flash controller device just to run the init. */ +DEVICE_DT_DEFINE(DT_DRV_INST(0), flash_controller_ra_init, NULL, &flash_lp_ra_controller, NULL, + PRE_KERNEL_1, CONFIG_FLASH_INIT_PRIORITY, NULL); diff --git a/drivers/flash/soc_flash_renesas_ra_lp.h b/drivers/flash/soc_flash_renesas_ra_lp.h new file mode 100644 index 0000000000000..96f8b66a417e8 --- /dev/null +++ b/drivers/flash/soc_flash_renesas_ra_lp.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2025 Renesas Electronics Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef ZEPHYR_DRIVERS_FLASH_SOC_FLASH_RENESAS_RA_LP_H_ +#define ZEPHYR_DRIVERS_FLASH_SOC_FLASH_RENESAS_RA_LP_H_ + +#include +#include +#include +#include +#include + +#define DT_DRV_COMPAT renesas_ra_flash_lp_controller + +#define UNIT_CODE_FLASH_PROGRAMMING 8 + +#define FLASH_LP_CF_START DT_REG_ADDR(DT_NODELABEL(flash0)) +#define FLASH_LP_DF_START DT_REG_ADDR(DT_NODELABEL(flash1)) +#define FLASH_LP_CF_SIZE DT_REG_SIZE(DT_NODELABEL(flash0)) +#define FLASH_LP_DF_SIZE DT_REG_SIZE(DT_NODELABEL(flash1)) + +#define FLASH_LP_VERSION DT_INST_PROP(0, flash_hardware_version) + +#if (FLASH_LP_VERSION == 3) + +#define FLASH_LP_CF_BLOCK_SIZE DT_PHA_BY_IDX(DT_NODELABEL(flash0), erase_blocks, 0, pages_size) +#define FLASH_LP_CF_BLOCKS_COUNT DT_PHA_BY_IDX(DT_NODELABEL(flash0), erase_blocks, 0, pages_count) + +BUILD_ASSERT(FLASH_LP_CF_BLOCK_SIZE == BSP_FEATURE_FLASH_LP_CF_BLOCK_SIZE, + "flash0 pages_size expected to be equal with block size"); +#else +#error This Flash-LP version is not supported +#endif + +#define FLASH_LP_DF_BLOCK_SIZE DT_PROP(DT_NODELABEL(flash1), erase_block_size) +#define FLASH_LP_DF_BLOCKS_COUNT (FLASH_LP_DF_SIZE / FLASH_LP_DF_BLOCK_SIZE) + +BUILD_ASSERT(FLASH_LP_DF_BLOCK_SIZE == BSP_FEATURE_FLASH_LP_DF_BLOCK_SIZE, + "flash1 erase-block-size expected to be equal with block size"); + +enum flash_region { + CODE_FLASH, + DATA_FLASH, +}; + +#if defined(CONFIG_FLASH_RENESAS_RA_LP_BGO) +#define FLASH_FLAG_ERASE_COMPLETE BIT(0) +#define FLASH_FLAG_WRITE_COMPLETE BIT(1) +#define FLASH_FLAG_GET_ERROR BIT(2) +#endif /* CONFIG_FLASH_RENESAS_RA_LP_BGO */ + +struct flash_lp_ra_controller { + struct st_flash_lp_instance_ctrl flash_ctrl; + struct k_sem ctrl_sem; + struct st_flash_cfg fsp_config; + atomic_t flags; +}; + +struct flash_lp_ra_data { + struct flash_lp_ra_controller *controller; + enum flash_region FlashRegion; + uint32_t area_address; + uint32_t area_size; +}; + +struct flash_lp_ra_config { + struct flash_parameters flash_ra_parameters; +}; + +#endif /* ZEPHYR_DRIVERS_FLASH_SOC_FLASH_RENESAS_RA_LP_H_ */ diff --git a/dts/bindings/flash_controller/renesas,ra-flash-lp-controller.yaml b/dts/bindings/flash_controller/renesas,ra-flash-lp-controller.yaml new file mode 100644 index 0000000000000..304b015e62535 --- /dev/null +++ b/dts/bindings/flash_controller/renesas,ra-flash-lp-controller.yaml @@ -0,0 +1,38 @@ +# Copyright (c) 2025 Renesas Electronics Corporation +# SPDX-License-Identifier: Apache-2.0 + +description: Renesas RA family flash low-power controller + +compatible: "renesas,ra-flash-lp-controller" + +include: flash-controller.yaml + +properties: + interrupts: + description: | + IRQ number and priority to use for Flash controller. + Note: If the config FLASH_RENESAS_RA_LP_BGO is not set, + no need to define interrupt for flash controller. + + interrupt-names: + enum: + - "frdyi" + description: | + Interrupts must be given corresponding names so that the driver can recognize them. + + flash-hardware-version: + type: int + required: true + enum: + - 3 + description: | + Version of the Flash peripheral/hardware. + + "#erase-block-cells": + type: int + const: 2 + description: Number of items to expect in a flash layout. + +erase-block-cells: + - pages_count + - pages_size diff --git a/modules/Kconfig.renesas b/modules/Kconfig.renesas index bc713249c4aca..1dd59dcf05339 100644 --- a/modules/Kconfig.renesas +++ b/modules/Kconfig.renesas @@ -104,6 +104,11 @@ config USE_RA_FSP_FLASH_HP help Enable RA FSP FLASH HP driver +config USE_RA_FSP_FLASH_LP + bool + help + Enable RA FSP FLASH LP driver + config USE_RA_FSP_GPT bool help From f578b1b64f9d900887bf92ff5b6128a866100ebd Mon Sep 17 00:00:00 2001 From: Khoa Nguyen Date: Mon, 24 Feb 2025 16:20:25 +0700 Subject: [PATCH 3/6] soc: renesas: ra: remove code_in_ram section in linker file Remove code_in_ram section in linker file of RA4M1, RA2A1 Signed-off-by: Khoa Nguyen --- soc/renesas/ra/ra2a1/CMakeLists.txt | 1 - soc/renesas/ra/ra2a1/data_sections.ld | 13 ------------- soc/renesas/ra/ra4m1/CMakeLists.txt | 1 - soc/renesas/ra/ra4m1/data_sections.ld | 13 ------------- 4 files changed, 28 deletions(-) delete mode 100644 soc/renesas/ra/ra2a1/data_sections.ld delete mode 100644 soc/renesas/ra/ra4m1/data_sections.ld diff --git a/soc/renesas/ra/ra2a1/CMakeLists.txt b/soc/renesas/ra/ra2a1/CMakeLists.txt index 223a8efd7a41c..24837436f85fd 100644 --- a/soc/renesas/ra/ra2a1/CMakeLists.txt +++ b/soc/renesas/ra/ra2a1/CMakeLists.txt @@ -8,7 +8,6 @@ zephyr_sources( ) zephyr_linker_sources(SECTIONS sections.ld) -zephyr_linker_sources(DATA_SECTIONS data_sections.ld) zephyr_linker_sources(RAM_SECTIONS ram_sections.ld) zephyr_linker_sources(ROM_START rom_start.ld) diff --git a/soc/renesas/ra/ra2a1/data_sections.ld b/soc/renesas/ra/ra2a1/data_sections.ld deleted file mode 100644 index 84cb7c088e838..0000000000000 --- a/soc/renesas/ra/ra2a1/data_sections.ld +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright (c) 2024 TOKITA Hiroshi - * - * SPDX-License-Identifier: Apache-2.0 - */ - -.code_in_ram : -{ - . = ALIGN(4); - __Code_In_RAM_Start = .; - KEEP(*(.code_in_ram*)) - __Code_In_RAM_End = .; -} > RAMABLE_REGION diff --git a/soc/renesas/ra/ra4m1/CMakeLists.txt b/soc/renesas/ra/ra4m1/CMakeLists.txt index e9637ecd9e69b..e8764f0f10b31 100644 --- a/soc/renesas/ra/ra4m1/CMakeLists.txt +++ b/soc/renesas/ra/ra4m1/CMakeLists.txt @@ -6,7 +6,6 @@ zephyr_include_directories(.) zephyr_library_sources(soc.c) zephyr_linker_sources(SECTIONS sections.ld) -zephyr_linker_sources(DATA_SECTIONS data_sections.ld) zephyr_linker_sources(RAM_SECTIONS ram_sections.ld) zephyr_linker_sources(ROM_START rom_start.ld) diff --git a/soc/renesas/ra/ra4m1/data_sections.ld b/soc/renesas/ra/ra4m1/data_sections.ld deleted file mode 100644 index 84cb7c088e838..0000000000000 --- a/soc/renesas/ra/ra4m1/data_sections.ld +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright (c) 2024 TOKITA Hiroshi - * - * SPDX-License-Identifier: Apache-2.0 - */ - -.code_in_ram : -{ - . = ALIGN(4); - __Code_In_RAM_Start = .; - KEEP(*(.code_in_ram*)) - __Code_In_RAM_End = .; -} > RAMABLE_REGION From 3d2d6d77979bf59540f814f56c7f494bc65a9dda Mon Sep 17 00:00:00 2001 From: Khoa Nguyen Date: Mon, 18 Nov 2024 15:17:12 +0700 Subject: [PATCH 4/6] dts: arm: renesas: Add support Flash LP for Renesas RA4, RA2 Add dts node to support Flash LP for: - RA4: RA4M1, RA4W1 - RA2: RA2A1, RA2L1 Signed-off-by: Khoa Nguyen --- dts/arm/renesas/ra/ra2/r7fa2a1ab3cfm.dtsi | 17 +++++++++++--- dts/arm/renesas/ra/ra2/r7fa2l1xb.dtsi | 27 ++++++++++++++++++++-- dts/arm/renesas/ra/ra2/ra2l1.dtsi | 22 +++++------------- dts/arm/renesas/ra/ra2/ra2xx.dtsi | 5 +++- dts/arm/renesas/ra/ra4/r7fa4m1ab3cfm.dtsi | 17 +++++++++++++- dts/arm/renesas/ra/ra4/r7fa4m1ab3cfp.dtsi | 25 ++++++++++++++++---- dts/arm/renesas/ra/ra4/r7fa4m1ab3cne.dtsi | 17 +++++++++++++- dts/arm/renesas/ra/ra4/r7fa4w1ad2cng.dtsi | 19 +++++++++++++-- dts/arm/renesas/ra/ra4/ra4-cm4-common.dtsi | 7 ++++-- 9 files changed, 123 insertions(+), 33 deletions(-) diff --git a/dts/arm/renesas/ra/ra2/r7fa2a1ab3cfm.dtsi b/dts/arm/renesas/ra/ra2/r7fa2a1ab3cfm.dtsi index ed2059d993b2b..fc69b22e28312 100644 --- a/dts/arm/renesas/ra/ra2/r7fa2a1ab3cfm.dtsi +++ b/dts/arm/renesas/ra/ra2/r7fa2a1ab3cfm.dtsi @@ -9,13 +9,24 @@ / { soc { flash-controller@407e0000 { + flash-hardware-version = <3>; + #erase-block-cells = <2>; + flash0: flash@0 { - compatible = "soc-nv-flash"; - reg = <0x00000000 DT_SIZE_K(256)>; + compatible = "renesas,ra-nv-code-flash"; + reg = <0x0 DT_SIZE_K(256)>; + write-block-size = <8>; + erase-block-size = <2048>; + erase-blocks = <&flash 128 2048>; + programming-enable; }; + flash1: flash@40100000 { - compatible = "soc-nv-flash"; + compatible = "renesas,ra-nv-data-flash"; reg = <0x40100000 DT_SIZE_K(8)>; + write-block-size = <1>; + erase-block-size = <1024>; + programming-enable; }; }; }; diff --git a/dts/arm/renesas/ra/ra2/r7fa2l1xb.dtsi b/dts/arm/renesas/ra/ra2/r7fa2l1xb.dtsi index b148a4337eb80..85af7e67dae05 100644 --- a/dts/arm/renesas/ra/ra2/r7fa2l1xb.dtsi +++ b/dts/arm/renesas/ra/ra2/r7fa2l1xb.dtsi @@ -1,11 +1,34 @@ /** * Copyright (c) 2024 MUNIC SA + * Copyright (c) 2025 Renesas Electronics Corporation * * Renesas R7FA2AL1AB MCU device tree * * SPDX-License-Identifier: Apache-2.0 */ -&flash0 { - reg = <0x0 DT_SIZE_K(256)>; +/ { + soc { + flash-controller@407e0000 { + flash-hardware-version = <3>; + #erase-block-cells = <2>; + + flash0: flash@0 { + compatible = "renesas,ra-nv-code-flash"; + reg = <0x0 DT_SIZE_K(256)>; + write-block-size = <4>; + erase-block-size = <2048>; + erase-blocks = <&flash 128 2048>; + programming-enable; + }; + + flash1: flash@40100000 { + compatible = "renesas,ra-nv-data-flash"; + reg = <0x40100000 DT_SIZE_K(8)>; + write-block-size = <1>; + erase-block-size = <1024>; + programming-enable; + }; + }; + }; }; diff --git a/dts/arm/renesas/ra/ra2/ra2l1.dtsi b/dts/arm/renesas/ra/ra2/ra2l1.dtsi index ea317d559210a..dcc9a98d67e97 100644 --- a/dts/arm/renesas/ra/ra2/ra2l1.dtsi +++ b/dts/arm/renesas/ra/ra2/ra2l1.dtsi @@ -1,6 +1,6 @@ /** * Copyright (c) 2021-2024 MUNIC SA - * Copyright (c) 2024 Renesas Electronics Corporation + * Copyright (c) 2024-2025 Renesas Electronics Corporation * * Renesas RA2L1 MCU series device tree * @@ -46,23 +46,13 @@ status = "okay"; }; - flcn: flash-controller@407ec000 { - reg = <0x407ec000 0x10000>; - + flash: flash-controller@407e0000 { + compatible = "renesas,ra-flash-lp-controller"; + reg = <0x407e0000 0x20000>; #address-cells = <1>; #size-cells = <1>; - - flash0: code@0 { - compatible = "soc-nv-flash"; - /* "reg" property should be defined in the - * chip specific .dtsi file - */ - }; - - flash1: data@40100000 { - compatible = "soc-nv-flash"; - reg = <0x40100000 DT_SIZE_K(8)>; - }; + interrupts = <30 1>; + interrupt-names = "frdyi"; }; ioport0: gpio@40040000 { diff --git a/dts/arm/renesas/ra/ra2/ra2xx.dtsi b/dts/arm/renesas/ra/ra2/ra2xx.dtsi index 2d9807c278796..3831986fb232d 100644 --- a/dts/arm/renesas/ra/ra2/ra2xx.dtsi +++ b/dts/arm/renesas/ra/ra2/ra2xx.dtsi @@ -240,10 +240,13 @@ status = "disabled"; }; - flash-controller@407e0000 { + flash: flash-controller@407e0000 { + compatible = "renesas,ra-flash-lp-controller"; reg = <0x407e0000 0x10000>; #address-cells = <1>; #size-cells = <1>; + interrupts = <30 1>; + interrupt-names = "frdyi"; }; agt0: agt@40084000 { diff --git a/dts/arm/renesas/ra/ra4/r7fa4m1ab3cfm.dtsi b/dts/arm/renesas/ra/ra4/r7fa4m1ab3cfm.dtsi index c00d5a9f699ce..b7b9fa8850e83 100644 --- a/dts/arm/renesas/ra/ra4/r7fa4m1ab3cfm.dtsi +++ b/dts/arm/renesas/ra/ra4/r7fa4m1ab3cfm.dtsi @@ -15,9 +15,24 @@ / { soc { flash-controller@407e0000 { + flash-hardware-version = <3>; + #erase-block-cells = <2>; + flash0: flash@0 { - compatible = "soc-nv-flash"; + compatible = "renesas,ra-nv-code-flash"; reg = <0x0 DT_SIZE_K(256)>; + write-block-size = <8>; + erase-block-size = <2048>; + erase-blocks = <&flash 128 2048>; + programming-enable; + }; + + flash1: flash@40100000 { + compatible = "renesas,ra-nv-data-flash"; + reg = <0x40100000 DT_SIZE_K(8)>; + write-block-size = <1>; + erase-block-size = <1024>; + programming-enable; }; }; }; diff --git a/dts/arm/renesas/ra/ra4/r7fa4m1ab3cfp.dtsi b/dts/arm/renesas/ra/ra4/r7fa4m1ab3cfp.dtsi index 16bf28fd8b6ec..fa2ff3c93a9d0 100644 --- a/dts/arm/renesas/ra/ra4/r7fa4m1ab3cfp.dtsi +++ b/dts/arm/renesas/ra/ra4/r7fa4m1ab3cfp.dtsi @@ -10,11 +10,26 @@ / { soc { - flash-controller@407e0000 { - flash0: flash@0 { - compatible = "soc-nv-flash"; + flash-controller@407e0000 { + flash-hardware-version = <3>; + #erase-block-cells = <2>; + + flash0: flash@0 { + compatible = "renesas,ra-nv-code-flash"; reg = <0x0 DT_SIZE_K(256)>; - }; - }; + write-block-size = <8>; + erase-block-size = <2048>; + erase-blocks = <&flash 128 2048>; + programming-enable; + }; + + flash1: flash@40100000 { + compatible = "renesas,ra-nv-data-flash"; + reg = <0x40100000 DT_SIZE_K(8)>; + write-block-size = <1>; + erase-block-size = <1024>; + programming-enable; + }; + }; }; }; diff --git a/dts/arm/renesas/ra/ra4/r7fa4m1ab3cne.dtsi b/dts/arm/renesas/ra/ra4/r7fa4m1ab3cne.dtsi index 9f379f43524c4..9d216299eab39 100644 --- a/dts/arm/renesas/ra/ra4/r7fa4m1ab3cne.dtsi +++ b/dts/arm/renesas/ra/ra4/r7fa4m1ab3cne.dtsi @@ -15,9 +15,24 @@ / { soc { flash-controller@407e0000 { + flash-hardware-version = <3>; + #erase-block-cells = <2>; + flash0: flash@0 { - compatible = "soc-nv-flash"; + compatible = "renesas,ra-nv-code-flash"; reg = <0x0 DT_SIZE_K(256)>; + write-block-size = <8>; + erase-block-size = <2048>; + erase-blocks = <&flash 128 2048>; + programming-enable; + }; + + flash1: flash@40100000 { + compatible = "renesas,ra-nv-data-flash"; + reg = <0x40100000 DT_SIZE_K(8)>; + write-block-size = <1>; + erase-block-size = <1024>; + programming-enable; }; }; }; diff --git a/dts/arm/renesas/ra/ra4/r7fa4w1ad2cng.dtsi b/dts/arm/renesas/ra/ra4/r7fa4w1ad2cng.dtsi index 44af76cf559cc..22ade5692ab95 100644 --- a/dts/arm/renesas/ra/ra4/r7fa4w1ad2cng.dtsi +++ b/dts/arm/renesas/ra/ra4/r7fa4w1ad2cng.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Renesas Electronics Corporation + * Copyright (c) 2024-2025 Renesas Electronics Corporation * * SPDX-License-Identifier: Apache-2.0 */ @@ -16,9 +16,24 @@ }; flash-controller@407e0000 { + flash-hardware-version = <3>; + #erase-block-cells = <2>; + flash0: flash@0 { - compatible = "soc-nv-flash"; + compatible = "renesas,ra-nv-code-flash"; reg = <0x0 DT_SIZE_K(512)>; + write-block-size = <8>; + erase-block-size = <2048>; + erase-blocks = <&flash 256 2048>; + programming-enable; + }; + + flash1: flash@40100000 { + compatible = "renesas,ra-nv-data-flash"; + reg = <0x40100000 DT_SIZE_K(8)>; + write-block-size = <1>; + erase-block-size = <1024>; + programming-enable; }; }; diff --git a/dts/arm/renesas/ra/ra4/ra4-cm4-common.dtsi b/dts/arm/renesas/ra/ra4/ra4-cm4-common.dtsi index 5234212dd286e..cb89c0cf7cf41 100644 --- a/dts/arm/renesas/ra/ra4/ra4-cm4-common.dtsi +++ b/dts/arm/renesas/ra/ra4/ra4-cm4-common.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Renesas Electronics Corporation + * Copyright (c) 2024-2025 Renesas Electronics Corporation * * SPDX-License-Identifier: Apache-2.0 */ @@ -37,10 +37,13 @@ status = "okay"; }; - flash-controller@407e0000 { + flash: flash-controller@407e0000 { + compatible = "renesas,ra-flash-lp-controller"; reg = <0x407e0000 0x10000>; #address-cells = <1>; #size-cells = <1>; + interrupts = <23 1>; + interrupt-names = "frdyi"; }; ioport0: gpio@40040000 { From e577b1775badd8866455ff9cba2e694ae246629e Mon Sep 17 00:00:00 2001 From: Khoa Nguyen Date: Mon, 5 May 2025 13:01:13 +0700 Subject: [PATCH 5/6] boards: renesas: Add support Flash-LP for Renesas RA4, RA2 Add support Flash-LP for Renesas boards: - RA4: ek_ra4m1, ek_ra4w1 - RA2: ek_ra2a1, ek_ra2l1 Signed-off-by: Khoa Nguyen --- boards/renesas/ek_ra2a1/ek_ra2a1.dts | 14 ++++++++++++++ boards/renesas/ek_ra2l1/ek_ra2l1.dts | 14 ++++++++++++++ boards/renesas/ek_ra4m1/ek_ra4m1.dts | 14 ++++++++++++++ boards/renesas/ek_ra4w1/ek_ra4w1.dts | 14 ++++++++++++++ 4 files changed, 56 insertions(+) diff --git a/boards/renesas/ek_ra2a1/ek_ra2a1.dts b/boards/renesas/ek_ra2a1/ek_ra2a1.dts index 39d5d372cd96c..9189e8c92e35b 100644 --- a/boards/renesas/ek_ra2a1/ek_ra2a1.dts +++ b/boards/renesas/ek_ra2a1/ek_ra2a1.dts @@ -17,6 +17,7 @@ chosen { zephyr,sram = &sram0; + zephyr,flash-controller = &flash; zephyr,flash = &flash0; zephyr,console = &uart0; zephyr,shell-uart = &uart0; @@ -120,3 +121,16 @@ &wdt { status = "okay"; }; + +&flash1 { + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + storage_partition: partition@0 { + label = "storage"; + reg = <0x0 DT_SIZE_K(8)>; + }; + }; +}; diff --git a/boards/renesas/ek_ra2l1/ek_ra2l1.dts b/boards/renesas/ek_ra2l1/ek_ra2l1.dts index 546451d10acb5..239ef6587bb4f 100644 --- a/boards/renesas/ek_ra2l1/ek_ra2l1.dts +++ b/boards/renesas/ek_ra2l1/ek_ra2l1.dts @@ -22,6 +22,7 @@ chosen { zephyr,sram = &sram0; + zephyr,flash-controller = &flash; zephyr,flash = &flash0; zephyr,console = &uart0; zephyr,shell-uart = &uart0; @@ -60,3 +61,16 @@ &wdt { status = "okay"; }; + +&flash1 { + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + storage_partition: partition@0 { + label = "storage"; + reg = <0x0 DT_SIZE_K(8)>; + }; + }; +}; diff --git a/boards/renesas/ek_ra4m1/ek_ra4m1.dts b/boards/renesas/ek_ra4m1/ek_ra4m1.dts index 054adf4c92517..54736581353d5 100644 --- a/boards/renesas/ek_ra4m1/ek_ra4m1.dts +++ b/boards/renesas/ek_ra4m1/ek_ra4m1.dts @@ -17,6 +17,7 @@ chosen { zephyr,sram = &sram0; + zephyr,flash-controller = &flash; zephyr,flash = &flash0; zephyr,console = &uart1; zephyr,shell-uart = &uart1; @@ -139,3 +140,16 @@ &wdt { status = "okay"; }; + +&flash1 { + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + storage_partition: partition@0 { + label = "storage"; + reg = <0x0 DT_SIZE_K(8)>; + }; + }; +}; diff --git a/boards/renesas/ek_ra4w1/ek_ra4w1.dts b/boards/renesas/ek_ra4w1/ek_ra4w1.dts index 7ab31de3e89eb..5751e3027e2d3 100644 --- a/boards/renesas/ek_ra4w1/ek_ra4w1.dts +++ b/boards/renesas/ek_ra4w1/ek_ra4w1.dts @@ -17,6 +17,7 @@ chosen { zephyr,sram = &sram0; + zephyr,flash-controller = &flash; zephyr,flash = &flash0; zephyr,console = &uart0; zephyr,shell-uart = &uart0; @@ -123,3 +124,16 @@ &wdt { status = "okay"; }; + +&flash1 { + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + storage_partition: partition@0 { + label = "storage"; + reg = <0x0 DT_SIZE_K(8)>; + }; + }; +}; From 62de7bdcfc327c88cd833070fa85a3d36d2cc843 Mon Sep 17 00:00:00 2001 From: Khoa Nguyen Date: Mon, 5 May 2025 13:02:31 +0700 Subject: [PATCH 6/6] tests: drivers: flash: common: Add support for Renesas RA4, RA2 Add support test app `flash/common` for ek_ra4m1, ek_ra4w1, ek_ra2a1, ek_ra2l1 Signed-off-by: Khoa Nguyen --- tests/drivers/flash/common/boards/ek_ra2a1.conf | 4 ++++ tests/drivers/flash/common/boards/ek_ra2l1.conf | 4 ++++ tests/drivers/flash/common/boards/ek_ra4m1.conf | 4 ++++ tests/drivers/flash/common/boards/ek_ra4w1.conf | 4 ++++ 4 files changed, 16 insertions(+) create mode 100644 tests/drivers/flash/common/boards/ek_ra2a1.conf create mode 100644 tests/drivers/flash/common/boards/ek_ra2l1.conf create mode 100644 tests/drivers/flash/common/boards/ek_ra4m1.conf create mode 100644 tests/drivers/flash/common/boards/ek_ra4w1.conf diff --git a/tests/drivers/flash/common/boards/ek_ra2a1.conf b/tests/drivers/flash/common/boards/ek_ra2a1.conf new file mode 100644 index 0000000000000..52f49a5444a22 --- /dev/null +++ b/tests/drivers/flash/common/boards/ek_ra2a1.conf @@ -0,0 +1,4 @@ +# Copyright (c) 2025 Renesas Electronics Corporation +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_TEST_DRIVER_FLASH_SIZE=8192 diff --git a/tests/drivers/flash/common/boards/ek_ra2l1.conf b/tests/drivers/flash/common/boards/ek_ra2l1.conf new file mode 100644 index 0000000000000..52f49a5444a22 --- /dev/null +++ b/tests/drivers/flash/common/boards/ek_ra2l1.conf @@ -0,0 +1,4 @@ +# Copyright (c) 2025 Renesas Electronics Corporation +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_TEST_DRIVER_FLASH_SIZE=8192 diff --git a/tests/drivers/flash/common/boards/ek_ra4m1.conf b/tests/drivers/flash/common/boards/ek_ra4m1.conf new file mode 100644 index 0000000000000..52f49a5444a22 --- /dev/null +++ b/tests/drivers/flash/common/boards/ek_ra4m1.conf @@ -0,0 +1,4 @@ +# Copyright (c) 2025 Renesas Electronics Corporation +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_TEST_DRIVER_FLASH_SIZE=8192 diff --git a/tests/drivers/flash/common/boards/ek_ra4w1.conf b/tests/drivers/flash/common/boards/ek_ra4w1.conf new file mode 100644 index 0000000000000..52f49a5444a22 --- /dev/null +++ b/tests/drivers/flash/common/boards/ek_ra4w1.conf @@ -0,0 +1,4 @@ +# Copyright (c) 2025 Renesas Electronics Corporation +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_TEST_DRIVER_FLASH_SIZE=8192