From 5d3de413b3b84d0d754cb44aa2cec33fec752417 Mon Sep 17 00:00:00 2001 From: Benjamin Valentin Date: Thu, 5 Nov 2020 18:17:54 +0100 Subject: [PATCH] tests/mtd_mapper: implement pagewise functions --- tests/mtd_mapper/main.c | 57 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/tests/mtd_mapper/main.c b/tests/mtd_mapper/main.c index a756e236c2..5b073a6ab8 100644 --- a/tests/mtd_mapper/main.c +++ b/tests/mtd_mapper/main.c @@ -42,6 +42,8 @@ #define REGION_FLASH_SIZE MEMORY_SIZE / 2 +#define MIN(x, y) (((x) < (y)) ? (x) : (y)) + static uint8_t _dummy_memory[MEMORY_SIZE]; static uint8_t _buffer[PAGE_SIZE]; @@ -65,6 +67,25 @@ static int _read(mtd_dev_t *dev, void *buff, uint32_t addr, uint32_t size) return 0; } +static int _read_page(mtd_dev_t *dev, void *buff, uint32_t page, uint32_t offset, uint32_t size) +{ + uint32_t addr = page * dev->page_size + offset; + + if (page >= dev->sector_count * dev->pages_per_sector) { + return -EOVERFLOW; + } + + if (offset > dev->page_size) { + return -EOVERFLOW; + } + + size = MIN(dev->page_size - offset, size); + + memcpy(buff, _dummy_memory + addr, size); + + return size; +} + static int _write(mtd_dev_t *dev, const void *buff, uint32_t addr, uint32_t size) { @@ -81,6 +102,25 @@ static int _write(mtd_dev_t *dev, const void *buff, uint32_t addr, return 0; } +static int _write_page(mtd_dev_t *dev, const void *buff, uint32_t page, uint32_t offset, uint32_t size) +{ + uint32_t addr = page * dev->page_size + offset; + + if (page >= dev->sector_count * dev->pages_per_sector) { + return -EOVERFLOW; + } + + if (offset > dev->page_size) { + return -EOVERFLOW; + } + + size = MIN(dev->page_size - offset, size); + + memcpy(_dummy_memory + addr, buff, size); + + return size; +} + static int _erase(mtd_dev_t *dev, uint32_t addr, uint32_t size) { (void)dev; @@ -99,6 +139,20 @@ static int _erase(mtd_dev_t *dev, uint32_t addr, uint32_t size) return 0; } +static int _erase_sector(mtd_dev_t *dev, uint32_t sector, uint32_t count) +{ + uint32_t addr = sector * dev->page_size * dev->pages_per_sector; + + if (sector + count > dev->sector_count) { + return -EOVERFLOW; + } + + memset(_dummy_memory + addr, 0xff, + count * dev->page_size * dev->pages_per_sector); + + return 0; +} + static int _power(mtd_dev_t *dev, enum mtd_power_state power) { (void)dev; @@ -112,6 +166,9 @@ static const mtd_desc_t driver = { .write = _write, .erase = _erase, .power = _power, + .read_page = _read_page, + .write_page = _write_page, + .erase_sector = _erase_sector, }; static mtd_dev_t dev = {