tests/mtd_mapper: implement pagewise functions

This commit is contained in:
Benjamin Valentin 2020-11-05 18:17:54 +01:00
parent 43ee53a059
commit 5d3de413b3

View File

@ -42,6 +42,8 @@
#define REGION_FLASH_SIZE MEMORY_SIZE / 2 #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 _dummy_memory[MEMORY_SIZE];
static uint8_t _buffer[PAGE_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; 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, static int _write(mtd_dev_t *dev, const void *buff, uint32_t addr,
uint32_t size) uint32_t size)
{ {
@ -81,6 +102,25 @@ static int _write(mtd_dev_t *dev, const void *buff, uint32_t addr,
return 0; 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) static int _erase(mtd_dev_t *dev, uint32_t addr, uint32_t size)
{ {
(void)dev; (void)dev;
@ -99,6 +139,20 @@ static int _erase(mtd_dev_t *dev, uint32_t addr, uint32_t size)
return 0; 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) static int _power(mtd_dev_t *dev, enum mtd_power_state power)
{ {
(void)dev; (void)dev;
@ -112,6 +166,9 @@ static const mtd_desc_t driver = {
.write = _write, .write = _write,
.erase = _erase, .erase = _erase,
.power = _power, .power = _power,
.read_page = _read_page,
.write_page = _write_page,
.erase_sector = _erase_sector,
}; };
static mtd_dev_t dev = { static mtd_dev_t dev = {