tests/mtd_mapper: implement pagewise functions
This commit is contained in:
parent
43ee53a059
commit
5d3de413b3
@ -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 = {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user