Memory Technology Device

Low level Memory Technology Device interface. More...

Detailed Description

Low level Memory Technology Device interface.

Generic memory technology device interface

Modules

 Native MTD
 mtd flash emulation for native
 

Files

file  mtd.h
 

Data Structures

struct  mtd_dev_t
 MTD device descriptor. More...
 
struct  mtd_desc
 MTD driver interface. More...
 

Macros

#define MTD_DRIVER_FLAG_DIRECT_WRITE   (1 << 0)
 MTD driver can write any data to the storage without erasing it first.
 

Typedefs

typedef struct mtd_desc mtd_desc_t
 MTD driver interface. More...
 

Enumerations

enum  mtd_power_state { MTD_POWER_UP, MTD_POWER_DOWN }
 MTD power states. More...
 

Functions

int mtd_init (mtd_dev_t *mtd)
 mtd_init Initialize a MTD device More...
 
int mtd_read (mtd_dev_t *mtd, void *dest, uint32_t addr, uint32_t count)
 Read data from a MTD device. More...
 
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. More...
 
int mtd_write (mtd_dev_t *mtd, const void *src, uint32_t addr, uint32_t count)
 Write data to a MTD device. More...
 
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. More...
 
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. More...
 
int mtd_erase (mtd_dev_t *mtd, uint32_t addr, uint32_t count)
 Erase sectors of a MTD device. More...
 
int mtd_erase_sector (mtd_dev_t *mtd, uint32_t sector, uint32_t num)
 Erase sectors of a MTD device. More...
 
int mtd_power (mtd_dev_t *mtd, enum mtd_power_state power)
 Set power mode on a MTD device. More...
 

Variables

const vfs_file_ops_t mtd_vfs_ops
 MTD driver for VFS.
 

Typedef Documentation

◆ mtd_desc_t

typedef struct mtd_desc mtd_desc_t

MTD driver interface.

This define the functions to access a MTD.

A MTD is composed of pages combined into sectors. A sector is the smallest erasable unit. The number of pages in a sector must be constant for the whole MTD.

The erase operation is available only for entire sectors.

Definition at line 53 of file mtd.h.

Enumeration Type Documentation

◆ mtd_power_state

MTD power states.

Enumerator
MTD_POWER_UP 

Power up.

MTD_POWER_DOWN 

Power down.

Definition at line 38 of file mtd.h.

Function Documentation

◆ mtd_erase()

int mtd_erase ( mtd_dev_t mtd,
uint32_t  addr,
uint32_t  count 
)

Erase sectors of a MTD device.

addr must be aligned on a sector boundary. count must be a multiple of a sector size.

Parameters
mtdthe device to erase
[in]addrthe address of the first sector to erase
[in]countthe number of bytes to erase
Returns
0 if erase successful
< 0 if an error occurred
-ENODEV if mtd is not a valid device
-ENOTSUP if operation is not supported on mtd
-EOVERFLOW if addr or count are not valid, i.e. outside memory
-EIO if I/O error occurred

◆ mtd_erase_sector()

int mtd_erase_sector ( mtd_dev_t mtd,
uint32_t  sector,
uint32_t  num 
)

Erase sectors of a MTD device.

Parameters
mtdthe device to erase
[in]sectorthe first sector number to erase
[in]numthe number of sectors to erase
Returns
0 if erase successful
< 0 if an error occurred
-ENODEV if mtd is not a valid device
-ENOTSUP if operation is not supported on mtd
-EOVERFLOW if addr or sector are not valid, i.e. outside memory
-EIO if I/O error occurred

◆ mtd_init()

int mtd_init ( mtd_dev_t mtd)

mtd_init Initialize a MTD device

Parameters
mtdthe device to initialize
Returns

◆ mtd_power()

int mtd_power ( mtd_dev_t mtd,
enum mtd_power_state  power 
)

Set power mode on a MTD device.

Parameters
mtdthe device to access
[in]powerthe power mode to set
Returns
0 if power mode successfully set
< 0 if an error occurred
-ENODEV if mtd is not a valid device
-ENOTSUP if operation or power state is not supported on mtd
-EIO if I/O error occurred

◆ mtd_read()

int mtd_read ( mtd_dev_t mtd,
void *  dest,
uint32_t  addr,
uint32_t  count 
)

Read data from a MTD device.

No alignment is required on addr and count.

Parameters
mtdthe device to read from
[out]destthe buffer to fill in
[in]addrthe start address to read from
[in]countthe number of bytes to read
Returns
0 on success
< 0 if an error occurred
-ENODEV if mtd is not a valid device
-ENOTSUP if operation is not supported on mtd
-EOVERFLOW if addr or count are not valid, i.e. outside memory
-EIO if I/O error occurred

◆ mtd_read_page()

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.

The MTD layer will take care of splitting up the transaction into multiple reads if it is required by the underlying storage media.

offset must be smaller than the page size

Parameters
mtdthe device to read from
[out]destthe buffer to fill in
[in]pagePage number to start reading from
[in]offsetoffset from the start of the page (in bytes)
[in]sizethe number of bytes to read
Returns
0 on success
< 0 if an error occurred
-ENODEV if mtd is not a valid device
-ENOTSUP if operation is not supported on mtd
-EOVERFLOW if addr or count are not valid, i.e. outside memory
-EIO if I/O error occurred

◆ mtd_write()

int mtd_write ( mtd_dev_t mtd,
const void *  src,
uint32_t  addr,
uint32_t  count 
)

Write data to a MTD device.

addr + count must be inside a page boundary. addr can be anywhere but the buffer cannot overlap two pages. Though some devices might enforce alignment on both addr and buf.

Parameters
mtdthe device to write to
[in]srcthe buffer to write
[in]addrthe start address to write to
[in]countthe number of bytes to write
Returns
0 on success
< 0 if an error occurred
-ENODEV if mtd is not a valid device
-ENOTSUP if operation is not supported on mtd
-EOVERFLOW if addr or count are not valid, i.e. outside memory, or overlapping two pages
-EIO if I/O error occurred
-EINVAL if parameters are invalid (invalid alignment for instance)

◆ mtd_write_page()

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.

The MTD layer will take care of splitting up the transaction into multiple writes if it is required by the underlying storage media.

If the underlying sector needs to be erased before it can be written, the MTD layer will take care of the read-modify-write operation.

offset must be smaller than the page size

Note
this requires the mtd_write_page module
Parameters
mtdthe device to write to
[in]srcthe buffer to write
[in]pagePage number to start writing to
[in]offsetbyte offset from the start of the page
[in]sizethe number of bytes to write
Returns
0 on success
< 0 if an error occurred
-ENODEV if mtd is not a valid device
-ENOTSUP if operation is not supported on mtd
-EOVERFLOW if addr or count are not valid, i.e. outside memory,
-EIO if I/O error occurred
-EINVAL if parameters are invalid

◆ mtd_write_page_raw()

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.

The MTD layer will take care of splitting up the transaction into multiple writes if it is required by the underlying storage media.

This performs a raw write, no automatic read-modify-write cycle is performed.

offset must be smaller than the page size

Parameters
mtdthe device to write to
[in]srcthe buffer to write
[in]pagePage number to start writing to
[in]offsetbyte offset from the start of the page
[in]sizethe number of bytes to write
Returns
0 on success
< 0 if an error occurred
-ENODEV if mtd is not a valid device
-ENOTSUP if operation is not supported on mtd
-EOVERFLOW if addr or count are not valid, i.e. outside memory,
-EIO if I/O error occurred
-EINVAL if parameters are invalid