dts: flash_map: Automatically generate of the list of flash area

This Patch add functionality for automatic generation of the flash map
using DTS description. Automatic generation allows to replace
C-hardcoded flash_map.

We generate a set of defines based on the index of a partiion:
	#define DT_FLASH_AREA_<IDX>_OFFSET	0
	#define DT_FLASH_AREA_<IDX>_SIZE	131072
	#define DT_FLASH_AREA_<IDX>_DEV		"FLASH_CTRL"
	#define DT_FLASH_AREA_<IDX>_LABEL	MCUBOOT

Additionally we also define:
	#define DT_FLASH_AREA_NUM		4

and:
	#define DT_FLASH_AREA_<PARTNAME>_ID	0

Signed-off-by: Findlay Feng <i@fengch.me>
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
This commit is contained in:
Findlay Feng 2018-07-11 09:39:23 +08:00 committed by Kumar Gala
commit 69c15f0ed1
4 changed files with 81 additions and 94 deletions

View file

@ -26,26 +26,8 @@ struct layout_data {
};
#endif /* CONFIG_FLASH_PAGE_LAYOUT */
struct driver_map_entry {
u8_t id;
const char * const name;
};
static const struct driver_map_entry flash_drivers_map[] = {
#ifdef DT_FLASH_DEV_NAME /* SoC embedded flash driver */
{SOC_FLASH_0_ID, DT_FLASH_DEV_NAME},
#endif
#ifdef CONFIG_SPI_FLASH_W25QXXDV
{SPI_FLASH_0_ID, CONFIG_SPI_FLASH_W25QXXDV_DRV_NAME},
#endif
#ifdef DT_SPI_NOR_DRV_NAME
{SPI_FLASH_0_ID, DT_SPI_NOR_DRV_NAME},
#endif
};
extern const struct flash_area *flash_map;
extern const int flash_map_entries;
static struct device *flash_dev[ARRAY_SIZE(flash_drivers_map)];
static struct flash_area const *get_flash_area_from_id(int idx)
{
@ -80,17 +62,6 @@ void flash_area_close(const struct flash_area *fa)
/* nothing to do for now */
}
static struct device *get_flash_dev_from_id(u8_t id)
{
for (unsigned int i = 0; i < ARRAY_SIZE(flash_drivers_map); i++) {
if (flash_drivers_map[i].id == id) {
return flash_dev[i];
}
}
k_panic();
}
static inline bool is_in_flash_area_bounds(const struct flash_area *fa,
off_t off, size_t len)
{
@ -159,7 +130,7 @@ flash_page_cb cb, struct layout_data *cb_data)
cb_data->ret_len = *cnt;
cb_data->status = 0;
flash_dev = get_flash_dev_from_id(fa->fa_device_id);
flash_dev = device_get_binding(fa->fa_dev_name);
flash_page_foreach(flash_dev, cb, cb_data);
@ -204,7 +175,7 @@ int flash_area_read(const struct flash_area *fa, off_t off, void *dst,
return -1;
}
dev = get_flash_dev_from_id(fa->fa_device_id);
dev = device_get_binding(fa->fa_dev_name);
return flash_read(dev, fa->fa_off + off, dst, len);
}
@ -219,7 +190,7 @@ int flash_area_write(const struct flash_area *fa, off_t off, const void *src,
return -1;
}
flash_dev = get_flash_dev_from_id(fa->fa_device_id);
flash_dev = device_get_binding(fa->fa_dev_name);
rc = flash_write_protection_set(flash_dev, false);
if (rc) {
@ -243,7 +214,7 @@ int flash_area_erase(const struct flash_area *fa, off_t off, size_t len)
return -1;
}
flash_dev = get_flash_dev_from_id(fa->fa_device_id);
flash_dev = device_get_binding(fa->fa_dev_name);
rc = flash_write_protection_set(flash_dev, false);
if (rc) {
@ -262,29 +233,16 @@ u8_t flash_area_align(const struct flash_area *fa)
{
struct device *dev;
dev = get_flash_dev_from_id(fa->fa_device_id);
dev = device_get_binding(fa->fa_dev_name);
return flash_get_write_block_size(dev);
}
int flash_area_has_driver(const struct flash_area *fa)
{
if (get_flash_dev_from_id(fa->fa_device_id) == NULL) {
if (device_get_binding(fa->fa_dev_name) == NULL) {
return -ENODEV;
}
return 1;
}
static int flash_map_init(struct device *dev)
{
unsigned int i;
for (i = 0U; i < ARRAY_SIZE(flash_dev); i++) {
flash_dev[i] = device_get_binding(flash_drivers_map[i].name);
}
return 0;
}
SYS_INIT(flash_map_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY);

View file

@ -8,54 +8,14 @@
#include <zephyr.h>
#include <flash_map.h>
#if defined(DT_FLASH_DEV_NAME)
#define FA_DEV_ID SOC_FLASH_0_ID
#elif defined(CONFIG_SPI_FLASH_W25QXXDV) || defined(DT_JEDEC_SPI_NOR_0_LABEL)
#define FA_DEV_ID SPI_FLASH_0_ID
#endif
#define FLASH_AREA_FOO(i, _) \
{.fa_id = i, \
.fa_off = DT_FLASH_AREA_##i##_OFFSET, \
.fa_dev_name = DT_FLASH_AREA_##i##_DEV, \
.fa_size = DT_FLASH_AREA_##i##_SIZE,},
const struct flash_area default_flash_map[] = {
/* FLASH_AREA_BOOTLOADER */
{
.fa_id = 0,
.fa_device_id = FA_DEV_ID,
.fa_off = FLASH_AREA_MCUBOOT_OFFSET,
.fa_size = FLASH_AREA_MCUBOOT_SIZE,
},
/* FLASH_AREA_IMAGE_0 */
{
.fa_id = 1,
.fa_device_id = FA_DEV_ID,
.fa_off = FLASH_AREA_IMAGE_0_OFFSET,
.fa_size = FLASH_AREA_IMAGE_0_SIZE,
},
/* FLASH_AREA_IMAGE_1 */
{
.fa_id = 2,
.fa_device_id = FA_DEV_ID,
.fa_off = FLASH_AREA_IMAGE_1_OFFSET,
.fa_size = FLASH_AREA_IMAGE_1_SIZE,
},
/* FLASH_AREA_IMAGE_SCRATCH */
{
.fa_id = 3,
.fa_device_id = FA_DEV_ID,
.fa_off = FLASH_AREA_IMAGE_SCRATCH_OFFSET,
.fa_size = FLASH_AREA_IMAGE_SCRATCH_SIZE,
},
#ifdef CONFIG_FS_FLASH_STORAGE_PARTITION
/* FLASH_AREA_STORAGE */
{
.fa_id = 4,
.fa_device_id = FA_DEV_ID,
.fa_off = FLASH_AREA_STORAGE_OFFSET,
.fa_size = FLASH_AREA_STORAGE_SIZE,
},
#endif
UTIL_LISTIFY(DT_FLASH_AREA_NUM, FLASH_AREA_FOO, ~)
};
const int flash_map_entries = ARRAY_SIZE(default_flash_map);