Loading...
Searching...
No Matches
mtd.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2016 OTA keys S.A.
3 * SPDX-License-Identifier: LGPL-2.1-only
4 */
5
6#pragma once
7
71
72#include <stdbool.h>
73#include <stddef.h>
74#include <stdint.h>
75
76#include "xfa.h"
77
78#ifdef __cplusplus
79extern "C" {
80#endif
81
89
100typedef struct mtd_desc mtd_desc_t;
101
108typedef struct {
110 uint32_t sector_count;
112 uint32_t page_size;
113 uint32_t write_size;
114#if defined(MODULE_MTD_WRITE_PAGE) || DOXYGEN
115 void *work_area;
116#endif
117} mtd_dev_t;
118
132#if !DOXYGEN
134#else
136#endif
137
162#define MTD_XFA_ADD(dev, idx) \
163 XFA_CONST(mtd_dev_t, mtd_dev_xfa, idx) *mtd ## idx = (mtd_dev_t *)&(dev)
164
168#define MTD_NUMOF XFA_LEN(mtd_dev_t *, mtd_dev_xfa)
169
175#define MTD_DRIVER_FLAG_DIRECT_WRITE (1 << 0)
176
188#define MTD_DRIVER_FLAG_CLEARING_OVERWRITE (1 << 1)
189
200struct mtd_desc {
209 int (*init)(mtd_dev_t *dev);
210
224 int (*read)(mtd_dev_t *dev,
225 void *buff,
226 uint32_t addr,
227 uint32_t size);
228
244 int (*read_page)(mtd_dev_t *dev,
245 void *buff,
246 uint32_t page,
247 uint32_t offset,
248 uint32_t size);
249
266 const void *buff,
267 uint32_t page,
268 uint32_t offset,
269 uint32_t size);
270
283 int (*erase)(mtd_dev_t *dev,
284 uint32_t addr,
285 uint32_t size);
286
299 uint32_t sector,
300 uint32_t count);
301
312
316 uint8_t flags;
317};
318
330
348int mtd_read(mtd_dev_t *mtd, void *dest, uint32_t addr, uint32_t count);
349
369int mtd_read_page(mtd_dev_t *mtd, void *dest, uint32_t page, uint32_t offset, uint32_t size);
370
393int mtd_write(mtd_dev_t *mtd, const void *src, uint32_t addr, uint32_t count);
394
419int mtd_write_page_raw(mtd_dev_t *mtd, const void *src, uint32_t page,
420 uint32_t offset, uint32_t size);
421
449int mtd_write_page(mtd_dev_t *mtd, const void *src, uint32_t page,
450 uint32_t offset, uint32_t size);
451
468int mtd_erase(mtd_dev_t *mtd, uint32_t addr, uint32_t count);
469
484int mtd_erase_sector(mtd_dev_t *mtd, uint32_t sector, uint32_t num);
485
507int mtd_write_sector(mtd_dev_t *mtd, const void *src, uint32_t sector, uint32_t num);
508
521int mtd_power(mtd_dev_t *mtd, enum mtd_power_state power);
522
531static inline mtd_dev_t *mtd_dev_get(unsigned idx)
532{
533 assert(MTD_NUMOF != 0);
534 assert(idx < MTD_NUMOF);
535
536 return mtd_dev_xfa[idx];
537}
538
539#ifdef __cplusplus
540}
541#endif
542
#define assert(cond)
abort the program if assertion is false
Definition assert.h:143
struct mtd_desc mtd_desc_t
MTD driver interface.
Definition mtd.h:100
mtd_dev_t *const mtd_dev_xfa[]
MTD device array as XFA.
Definition mtd.h:135
mtd_power_state
MTD power states.
Definition mtd.h:85
int mtd_write_sector(mtd_dev_t *mtd, const void *src, uint32_t sector, uint32_t num)
Write data to a MTD device with whole sector writes.
int mtd_write(mtd_dev_t *mtd, const void *src, uint32_t addr, uint32_t count)
Write data to a MTD device.
int mtd_init(mtd_dev_t *mtd)
mtd_init Initialize a MTD device
int mtd_write_page_raw(mtd_dev_t *mtd, const void *src, uint32_t page, uint32_t offset, uint32_t size)
Write data to a MTD device with pagewise addressing.
int mtd_read(mtd_dev_t *mtd, void *dest, uint32_t addr, uint32_t count)
Read data from a MTD device.
int mtd_read_page(mtd_dev_t *mtd, void *dest, uint32_t page, uint32_t offset, uint32_t size)
Read data from a MTD device with pagewise addressing.
int mtd_erase(mtd_dev_t *mtd, uint32_t addr, uint32_t count)
Erase sectors of a MTD device.
static mtd_dev_t * mtd_dev_get(unsigned idx)
Get an MTD device by index.
Definition mtd.h:531
int mtd_write_page(mtd_dev_t *mtd, const void *src, uint32_t page, uint32_t offset, uint32_t size)
Write data to a MTD device with pagewise addressing.
#define MTD_NUMOF
Number of MTDs defined in the MTD device array in XFA.
Definition mtd.h:168
int mtd_power(mtd_dev_t *mtd, enum mtd_power_state power)
Set power mode on a MTD device.
int mtd_erase_sector(mtd_dev_t *mtd, uint32_t sector, uint32_t num)
Erase sectors of a MTD device.
@ MTD_POWER_DOWN
Power down.
Definition mtd.h:87
@ MTD_POWER_UP
Power up.
Definition mtd.h:86
MTD driver interface.
Definition mtd.h:200
int(* read)(mtd_dev_t *dev, void *buff, uint32_t addr, uint32_t size)
Read from the Memory Technology Device (MTD)
Definition mtd.h:224
int(* read_page)(mtd_dev_t *dev, void *buff, uint32_t page, uint32_t offset, uint32_t size)
Read from the Memory Technology Device (MTD) using pagewise addressing.
Definition mtd.h:244
int(* erase)(mtd_dev_t *dev, uint32_t addr, uint32_t size)
Erase sector(s) over the Memory Technology Device (MTD)
Definition mtd.h:283
int(* erase_sector)(mtd_dev_t *dev, uint32_t sector, uint32_t count)
Erase sector(s) of the Memory Technology Device (MTD)
Definition mtd.h:298
int(* power)(mtd_dev_t *dev, enum mtd_power_state power)
Control power of Memory Technology Device (MTD)
Definition mtd.h:311
int(* write_page)(mtd_dev_t *dev, const void *buff, uint32_t page, uint32_t offset, uint32_t size)
Write to the Memory Technology Device (MTD) using pagewise addressing.
Definition mtd.h:265
uint8_t flags
Properties of the MTD driver.
Definition mtd.h:316
int(* init)(mtd_dev_t *dev)
Initialize Memory Technology Device (MTD)
Definition mtd.h:209
MTD device descriptor.
Definition mtd.h:108
uint32_t write_size
Minimum size and alignment of writes to the device.
Definition mtd.h:113
uint32_t pages_per_sector
Number of pages per sector in the MTD.
Definition mtd.h:111
uint32_t sector_count
Number of sector in the MTD.
Definition mtd.h:110
const mtd_desc_t * driver
MTD driver.
Definition mtd.h:109
void * work_area
sector-sized buffer (only present when mtd_write_page is enabled)
Definition mtd.h:115
uint32_t page_size
Size of the pages in the MTD.
Definition mtd.h:112
Cross File Arrays.
#define XFA_USE_CONST(type, name)
Declare an external read-only cross-file array.
Definition xfa.h:110