Skip to content

Flash API: new information getter #36484

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 29 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
f33923b
drivers/flash: Flash API: device information getters
de-nordic Jun 22, 2021
ddea908
tests/drivers/flash_api: Flash API tests
de-nordic Jun 23, 2021
f46e042
drivers/flash/flash_simulator: Add flash get_page_info API call
de-nordic Jun 22, 2021
da7b421
drivers/flash/nrf: Add flash get_page_info API call
de-nordic Jun 22, 2021
dd19703
drivers/flash/layout: Reimplement layout functions with new API
de-nordic Jul 8, 2021
dabffe6
drivers/flash/nrf_qspi_nor: Add flash get_page_info API call
de-nordic Jul 9, 2021
0e36751
drivers/flash/esp32: Add flash get_page_info API call
de-nordic Jul 14, 2021
23e81c4
drivers/flash/at45: Add flash get_page_info API call
de-nordic Jul 14, 2021
697c62d
drivers/flash/stm32_qspi: Add flash get_page_info API call
de-nordic Jul 14, 2021
f3451f5
drivers/flash/gecko: Add flash get_page_info API call
de-nordic Jul 14, 2021
f7a0d04
drivers/flash/flexspi_nor: Add flash get_page_info API call
de-nordic Jul 14, 2021
feeddde
drivers/flash/flexspi_x25um51345g: Add flash get_page_info API call
de-nordic Jul 14, 2021
1beb563
drivers/flash/flash_sam: Add flash get_page_info API call
de-nordic Jul 14, 2021
d718c51
drivers/flash/soc_flash_mcux: Add flash get_page_info API call
de-nordic Jul 16, 2021
6f08efb
drivers/flash/soc_flash_lpc: Add flash get_page_info API call
de-nordic Jul 16, 2021
acb6a5a
drivers/flash/soc_flash_rv32m1: Add flash get_page_info API call
de-nordic Jul 16, 2021
929d6db
drivers/flash/soc_flash_nios2_qspi: Add flash get_page_info API call
de-nordic Jul 16, 2021
5685abf
drivers/flash/spi_nor: Add flash get_page_info API call
de-nordic Jul 21, 2021
4adeedf
drivers/flash/flash_stm32wbx: Add flash get_page_info API call
de-nordic Jul 23, 2021
fd28f97
drivers/flash/flash_stm32l4x: Add flash get_page_info API call
de-nordic Jul 23, 2021
00f1e90
drivers/flash/flash_stm32g4x: Add flash get_page_info API call
de-nordic Jul 23, 2021
50c536d
drivers/flash/flash_stm32g0x: Add flash get_page_info API call
de-nordic Jul 23, 2021
f16146f
drivers/flash/flash_stm32f4x: Add flash get_page_info API call
de-nordic Jul 23, 2021
7a678fd
drivers/flash/flash_stm32_v1: Add flash get_page_info API call
de-nordic Jul 23, 2021
53274d7
drivers/flash/flash_stm32: Add flash get_page_info API call
de-nordic Jul 23, 2021
93b9c8a
drivers/flash/flash_stm32h7x: Add flash get_page_info API call
de-nordic Jul 23, 2021
116f89b
drivers/flash/flash_stm32f7x: Add flash get_page_info API call
de-nordic Jul 28, 2021
76bc60a
drivers/flash/flash_stm32f2x: Add flash get_page_info API call
de-nordic Jul 29, 2021
000e629
drivers/flash/flash_stm32l5x: Add flash get_page_info API call
de-nordic Jan 18, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion drivers/flash/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ zephyr_library_sources_ifdef(CONFIG_SOC_FLASH_NRF soc_flash_nrf.c)
zephyr_library_sources_ifdef(CONFIG_SOC_FLASH_NRF_RADIO_SYNC_TICKER soc_flash_nrf_ticker.c)
zephyr_library_sources_ifdef(CONFIG_SOC_FLASH_MCUX soc_flash_mcux.c)
zephyr_library_sources_ifdef(CONFIG_SOC_FLASH_LPC soc_flash_lpc.c)
zephyr_library_sources_ifdef(CONFIG_FLASH_PAGE_LAYOUT flash_page_layout.c)
zephyr_library_sources_ifdef(CONFIG_USERSPACE flash_handlers.c)
zephyr_library_sources_ifdef(CONFIG_SOC_FLASH_SAM0 flash_sam0.c)
zephyr_library_sources_ifdef(CONFIG_SOC_FLASH_SAM flash_sam.c)
Expand All @@ -27,6 +26,10 @@ zephyr_library_sources_ifdef(CONFIG_FLASH_MCUX_FLEXSPI_NOR flash_mcux_flexspi_no
zephyr_library_sources_ifdef(CONFIG_FLASH_MCUX_FLEXSPI_HYPERFLASH flash_mcux_flexspi_hyperflash.c)
zephyr_library_sources_ifdef(CONFIG_SOC_FLASH_ESP32 flash_esp32.c)

if (CONFIG_FLASH_PAGE_LAYOUT OR CONFIG_FLASH_PAGE_LAYOUT_WITHOUT_API_PAGE_LAYOUT)
zephyr_library_sources(flash_page_layout.c)
endif()

if(CONFIG_FLASH_MCUX_FLEXSPI_XIP)
dt_chosen(chosen_flash PROPERTY "zephyr,flash")
dt_prop(compat_flash PATH ${chosen_flash} PROPERTY compatible)
Expand Down
9 changes: 8 additions & 1 deletion drivers/flash/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ config FLASH_SHELL

config FLASH_PAGE_LAYOUT
bool "API for retrieving the layout of pages"
depends on FLASH_HAS_PAGE_LAYOUT
depends on FLASH_HAS_PAGE_LAYOUT && !FLASH_PAGE_LAYOUT_WITHOUT_API_PAGE_LAYOUT
default y
help
Enables API for retrieving the layout of flash memory pages.
Expand All @@ -66,6 +66,13 @@ config FLASH_INIT_PRIORITY
priority is used unless the driver implementation has its own
initialization priority

config FLASH_PAGE_LAYOUT_WITHOUT_API_PAGE_LAYOUT
bool "Use new API to emulate page_layout API call"
help
Enables support for flash_page_get_info_by_idx, flash_page_get_info_by_offs and
flash_page_foreach without page_layout Flash API call, with use of the
flash_get_page_info, flash_get_page_count and flash_get_size.

source "drivers/flash/Kconfig.b91"

source "drivers/flash/Kconfig.cc13xx_cc26xx"
Expand Down
33 changes: 33 additions & 0 deletions drivers/flash/flash_esp32.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ struct flash_esp32_dev_data {
static const struct flash_parameters flash_esp32_parameters = {
.write_block_size = FLASH_WRITE_BLK_SZ,
.erase_value = 0xff,
.flags = 0,
};

static inline void flash_esp32_sem_take(const struct device *dev)
Expand Down Expand Up @@ -142,6 +143,35 @@ flash_esp32_get_parameters(const struct device *dev)
return &flash_esp32_parameters;
}

static int
flash_esp32_get_page_info(const struct device *dev, off_t offset, struct flash_page_info *fpi)
{
if (offset < 0 || offset >= DT_REG_SIZE(SOC_NV_FLASH_NODE)) {
return -EINVAL;
}

fpi->offset = offset & ~(FLASH_ERASE_BLK_SZ - 1);
fpi->size = FLASH_ERASE_BLK_SZ;

return 0;
}

static ssize_t
flash_esp32_get_page_count(const struct device *dev)
{
ARG_UNUSED(dev);

return DT_REG_SIZE(SOC_NV_FLASH_NODE) / FLASH_ERASE_BLK_SZ;
}

static ssize_t
flash_esp32_get_size(const struct device *dev)
{
ARG_UNUSED(dev);

return DT_REG_SIZE(SOC_NV_FLASH_NODE);
}

static int flash_esp32_init(const struct device *dev)
{
struct flash_esp32_dev_data *const dev_data = dev->data;
Expand All @@ -156,6 +186,9 @@ static const struct flash_driver_api flash_esp32_driver_api = {
.write = flash_esp32_write,
.erase = flash_esp32_erase,
.get_parameters = flash_esp32_get_parameters,
.get_page_info = flash_esp32_get_page_info,
.get_page_count = flash_esp32_get_page_count,
.get_size = flash_esp32_get_size,
#ifdef CONFIG_FLASH_PAGE_LAYOUT
.page_layout = flash_esp32_page_layout,
#endif
Expand Down
34 changes: 34 additions & 0 deletions drivers/flash/flash_gecko.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,37 @@ flash_gecko_get_parameters(const struct device *dev)
return &flash_gecko_parameters;
}

static int
flash_gecko_get_page_info(const struct device *dev, off_t offset, struct flash_page_info *fpi)
{
ARG_UNUSED(dev);

if (offset < 0 || offset >= DT_REG_SIZE(SOC_NV_FLASH_NODE)) {
return -EINVAL;
}

fpi->offset = offset & ~(DT_PROP(SOC_NV_FLASH_NODE, erase_block_size) - 1);
fpi->size = DT_PROP(SOC_NV_FLASH_NODE, erase_block_size);

return 0;
}

static ssize_t
flash_gecko_get_page_count(const struct device *dev)
{
ARG_UNUSED(dev);

return DT_REG_SIZE(SOC_NV_FLASH_NODE) / DT_PROP(SOC_NV_FLASH_NODE, erase_block_size);
}

static ssize_t
flash_gecko_get_size(const struct device *dev)
{
ARG_UNUSED(dev);

return DT_PROP(SOC_NV_FLASH_NODE, erase_block_size);
}

static int flash_gecko_init(const struct device *dev)
{
struct flash_gecko_data *const dev_data = dev->data;
Expand All @@ -212,6 +243,9 @@ static const struct flash_driver_api flash_gecko_driver_api = {
.write = flash_gecko_write,
.erase = flash_gecko_erase,
.get_parameters = flash_gecko_get_parameters,
.get_page_info = flash_gecko_get_page_info,
.get_page_count = flash_gecko_get_page_count,
.get_size = flash_gecko_get_size,
#ifdef CONFIG_FLASH_PAGE_LAYOUT
.page_layout = flash_gecko_page_layout,
#endif
Expand Down
31 changes: 24 additions & 7 deletions drivers/flash/flash_handlers.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,30 @@ static inline int z_vrfy_flash_write(const struct device *dev, off_t offset,
}
#include <syscalls/flash_write_mrsh.c>

static inline int z_vrfy_flash_get_page_info(const struct device *dev, off_t offset,
struct flash_page_info *fpi)
{
Z_OOPS(Z_SYSCALL_DRIVER_FLASH(dev, get_page_info));
Z_OOPS(Z_SYSCALL_MEMORY_WRITE(fpi, sizeof(*fpi)));
return z_impl_flash_get_page_info((const struct device *)dev, offset,
(struct flash_page_info *)fpi);
}
#include <syscalls/flash_get_page_info_mrsh.c>

static ssize_t z_vrfy_flash_get_page_count(const struct device *dev)
{
Z_OOPS(Z_SYSCALL_DRIVER_FLASH(dev, get_page_count));
return z_impl_flash_get_page_count((const struct device *)dev);
}
#include <syscalls/flash_get_page_count_mrsh.c>

static ssize_t z_vrfy_flash_get_size(const struct device *dev)
{
Z_OOPS(Z_SYSCALL_DRIVER_FLASH(dev, get_size));
return z_impl_flash_get_size((const struct device *)dev);
}
#include <syscalls/flash_get_size_mrsh.c>

static inline size_t z_vrfy_flash_get_write_block_size(const struct device *dev)
{
Z_OOPS(Z_SYSCALL_OBJ(dev, K_OBJ_DRIVER_FLASH));
Expand Down Expand Up @@ -67,13 +91,6 @@ static inline int z_vrfy_flash_get_page_info_by_idx(const struct device *dev,
}
#include <syscalls/flash_get_page_info_by_idx_mrsh.c>

static inline size_t z_vrfy_flash_get_page_count(const struct device *dev)
{
Z_OOPS(Z_SYSCALL_DRIVER_FLASH(dev, page_layout));
return z_impl_flash_get_page_count((const struct device *)dev);
}
#include <syscalls/flash_get_page_count_mrsh.c>

#endif /* CONFIG_FLASH_PAGE_LAYOUT */

#ifdef CONFIG_FLASH_JESD216_API
Expand Down
35 changes: 35 additions & 0 deletions drivers/flash/flash_mcux_flexspi_mx25um51345g.c
Original file line number Diff line number Diff line change
Expand Up @@ -488,6 +488,37 @@ static const struct flash_parameters *flash_flexspi_nor_get_parameters(
return &data->flash_parameters;
}

static int
flash_flexspi_nor_get_page_info(const struct device *dev, off_t offset, struct flash_page_info *fpi)
{
const struct flash_flexspi_nor_config *config = dev->config;

if (offset < 0 || offset > (config->layout.pages_count * SPI_NOR_SECTOR_SIZE)) {
return -EINVAL;
}

fpi->offset = offset & ~(config->layout.pages_size - 1);
fpi->size = config->layout.pages_size;

return 0;
}

static ssize_t
flash_flexspi_nor_get_page_count(const struct device *dev)
{
const struct flash_flexspi_nor_config *config = dev->config;

return config->layout.pages_count;
}

static ssize_t
flash_flexspi_nor_get_size(const struct device *dev)
{
const struct flash_flexspi_nor_config *config = dev->config;

return (config->layout.pages_count * config->layout.pages_size);
}

#if defined(CONFIG_FLASH_PAGE_LAYOUT)
static void flash_flexspi_nor_pages_layout(const struct device *dev,
const struct flash_pages_layout **layout, size_t *layout_size)
Expand Down Expand Up @@ -544,6 +575,9 @@ static const struct flash_driver_api flash_flexspi_nor_api = {
.write = flash_flexspi_nor_write,
.read = flash_flexspi_nor_read,
.get_parameters = flash_flexspi_nor_get_parameters,
.get_page_info = flash_flexspi_nor_get_page_info,
.get_page_count = flash_flexspi_nor_get_page_count,
.get_size = flash_flexspi_nor_get_size,
#if defined(CONFIG_FLASH_PAGE_LAYOUT)
.page_layout = flash_flexspi_nor_pages_layout,
#endif
Expand Down Expand Up @@ -595,6 +629,7 @@ static const struct flash_driver_api flash_flexspi_nor_api = {
.flash_parameters = { \
.write_block_size = NOR_WRITE_SIZE, \
.erase_value = NOR_ERASE_VALUE, \
.flags = 0, \
}, \
}; \
\
Expand Down
33 changes: 33 additions & 0 deletions drivers/flash/flash_mcux_flexspi_nor.c
Original file line number Diff line number Diff line change
Expand Up @@ -454,6 +454,35 @@ static const struct flash_parameters *flash_flexspi_nor_get_parameters(
return &data->flash_parameters;
}

static int flash_flexspi_nor_get_page_info(const struct device *dev, off_t offset,
struct flash_page_info *fpi)
{
const struct flash_flexspi_nor_config *config = dev->config;

if (offset < 0 || offset >= (config->layout.pages_count * config->layout.pages_size)) {
return -EINVAL;
}

fpi->offset = offset & ~(config->layout.pages_size - 1);
fpi->size = config->layout.pages_count;

return 0;
}

static ssize_t flash_flexspi_nor_get_page_count(const struct device *dev)
{
const struct flash_flexspi_nor_config *config = dev->config;

return config->layout.pages_count;
}

static ssize_t flash_flexspi_nor_get_size(const struct device *dev)
{
const struct flash_flexspi_nor_config *config = dev->config;

return config->layout.pages_size;
}

#if defined(CONFIG_FLASH_PAGE_LAYOUT)
static void flash_flexspi_nor_pages_layout(const struct device *dev,
const struct flash_pages_layout **layout, size_t *layout_size)
Expand Down Expand Up @@ -510,6 +539,9 @@ static const struct flash_driver_api flash_flexspi_nor_api = {
.write = flash_flexspi_nor_write,
.read = flash_flexspi_nor_read,
.get_parameters = flash_flexspi_nor_get_parameters,
.get_page_info = flash_flexspi_nor_get_page_info,
.get_page_count = flash_flexspi_nor_get_page_count,
.get_size = flash_flexspi_nor_get_size,
#if defined(CONFIG_FLASH_PAGE_LAYOUT)
.page_layout = flash_flexspi_nor_pages_layout,
#endif
Expand Down Expand Up @@ -561,6 +593,7 @@ static const struct flash_driver_api flash_flexspi_nor_api = {
.flash_parameters = { \
.write_block_size = NOR_WRITE_SIZE, \
.erase_value = NOR_ERASE_VALUE, \
.flags = 0, \
}, \
}; \
\
Expand Down
Loading