1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/drivers/include/mtd_mapper.h
2022-03-31 10:58:52 +02:00

114 lines
2.9 KiB
C

/*
* Copyright (C) 2020 Koen Zandberg <koen@bergzand.net>
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @defgroup drivers_mtd_mapper MTD address mapper
* @ingroup drivers_storage
* @brief Driver for address remap for flash devices
*
* This MTD module allows for remapping multiple different regions on a single
* MTD device and present them as separate MTD devices. This is similar to
* partitions on a hard drive, although this system only allows hardcoded
* partitions and lacks a partition table.
*
* The use case for this module is to be able to split a single MTD device, for
* example a SPI NOR flash chip into multiple separate regions which all can
* contain their own content or file systems.
*
* ## Usage
*
* To use this module include it in your makefile:
*
* ```
* USEMODULE += mtd_mapper
* ```
*
* To define new regions with an existing MTD device the following is required:
*
* ```
* mtd_mapper_parent_t parent = MTD_PARENT_INIT(MTD_0);
*
* mtd_mapper_region_t region1 = {
* .mtd = {
* .driver = &mtd_mapper_driver,
* .sector_count = SECTOR_COUNT / 2,
* .pages_per_sector = PAGE_PER_SECTOR,
* .page_size = PAGE_SIZE,
* .write_size = WRITE_SIZE,
* },
* .parent = &parent,
* .sector = SECTOR_COUNT / 2
* };
*
* mtd_dev_t *dev = &region.mtd;
* ```
* The snippet here defines a region within an existing `MTD_0` device of half
* the size of `MTD_0` and starting in the middle of the device.
*
* @warning Please ensure that the different configured regions do not overlap.
*
* @{
*
* @brief Interface definitions for mtd mapper support
*
* @author Koen Zandberg <koen@bergzand.net>
*/
#ifndef MTD_MAPPER_H
#define MTD_MAPPER_H
#include <stdint.h>
#include <stdbool.h>
#include "mtd.h"
#include "mutex.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Shortcut macro for initializing the members of an
* @ref mtd_mapper_parent_t struct
*/
#define MTD_PARENT_INIT(_parent) \
{ \
.mtd = _parent, \
.lock = MUTEX_INIT, \
.init = false, \
}
/**
* @brief MTD mapper backing device context
*/
typedef struct {
mtd_dev_t *mtd; /**< Parent MTD device */
mutex_t lock; /**< Mutex for guarding the backing device access */
bool init; /**< Initialization flag */
} mtd_mapper_parent_t;
/**
* @brief MTD mapped region
*/
typedef struct {
mtd_dev_t mtd; /**< MTD context */
mtd_mapper_parent_t *parent; /**< MTD mapper parent device */
uint32_t sector; /**< first sector of the region */
} mtd_mapper_region_t;
/**
* @brief Mapper MTD device operations table
*/
extern const mtd_desc_t mtd_mapper_driver;
#ifdef __cplusplus
}
#endif
#endif /* MTD_MAPPER_H */
/** @} */