5.27 MTD设备
2026/7/20大约 2 分钟设备驱动驱动MTD存储字符设备块设备
5.27 MTD设备
📚 本节导读
学习时长: 约 30 分钟
难度级别: ⭐⭐⭐⭐☆
前置知识: C 语言基础、Flash 存储基础知识、5.1 设备驱动框架
🎯 学习目标
- 理解 MTD(Memory Technology Device)双接口设备模型
- 掌握
os_mtd_geometry几何信息结构体 - 掌握
os_mtd_ops操作函数表 - 理解 MTD 与 Block 设备的关系
一、概述
MTD(Memory Technology Device,内存技术设备)是 OneOS 提供的原始 Flash 存储设备抽象层,为 NAND/NOR Flash 等存储器件提供统一的访问接口。驱动源码位于 drivers/mtd/ 目录下,核心头文件为 mtd.h。
MTD 设备框架的特点:
- 双接口模型:每个 MTD 设备同时注册为字符设备(
char_dev)和 MTD 设备(mtd_dev),支持两种访问方式 - 几何信息:通过
os_mtd_geometry提供页大小、块大小、容量等物理参数 - 页级操作:提供
read_page、write_page、erase_block三级操作 - Block 设备桥梁:MTD 设备可通过 Block 设备层封装为块设备,供文件系统使用
二、核心数据结构
2.1 MTD 几何信息 struct os_mtd_geometry
struct os_mtd_geometry
{
uint32_t page_size; /* 页大小(字节) */
uint32_t block_size; /* 块大小(字节) */
uint32_t capacity; /* 总容量(字节) */
};2.2 MTD 操作函数表 struct os_mtd_ops
struct os_mtd_ops
{
int (*read_page)(os_mtd_device_t *mtd, uint32_t page_addr, uint8_t *buff, uint32_t page_nr);
int (*write_page)(os_mtd_device_t *mtd, uint32_t page_addr, const uint8_t *buff, uint32_t page_nr);
int (*erase_block)(os_mtd_device_t *mtd, uint32_t page_addr, uint32_t page_nr);
};2.3 MTD 设备结构体
struct os_mtd_device
{
struct os_device char_dev; /* 字符设备接口 */
struct os_device mtd_dev; /* MTD 设备接口 */
struct os_mtd_geometry geometry; /* 几何信息 */
const struct os_mtd_ops *mtd_ops; /* 操作函数表 */
void *priv;
};2.4 控制命令
#define OS_DEVICE_CTRL_MTD_GETGEOME IOC_MTD(0) /* 获取几何信息 */
#define OS_DEVICE_CTRL_MTD_SYNC IOC_MTD(1) /* 同步数据 */
#define OS_DEVICE_CTRL_MTD_ERASE IOC_MTD(2) /* 擦除块 */
#define OS_DEVICE_CTRL_MTD_AUTOREFRESH IOC_MTD(3) /* 自动刷新 */三、关键 API
os_err_t mtd_device_register(os_mtd_device_t *mtd_dev, const char *name);
os_err_t mtd_device_unregister(os_mtd_device_t *mtd_dev);四、使用示例
#include <mtd.h>
static int my_mtd_read_page(os_mtd_device_t *mtd, uint32_t page_addr,
uint8_t *buff, uint32_t page_nr) { return page_nr; }
static int my_mtd_write_page(os_mtd_device_t *mtd, uint32_t page_addr,
const uint8_t *buff, uint32_t page_nr) { return page_nr; }
static int my_mtd_erase_block(os_mtd_device_t *mtd, uint32_t page_addr,
uint32_t page_nr) { return OS_SUCCESS; }
static const struct os_mtd_ops my_mtd_ops = {
.read_page = my_mtd_read_page, .write_page = my_mtd_write_page,
.erase_block = my_mtd_erase_block,
};
void mtd_device_init(void)
{
static os_mtd_device_t mtd_dev;
mtd_dev.geometry.page_size = 2048;
mtd_dev.geometry.block_size = 131072;
mtd_dev.geometry.capacity = 128 * 1024 * 1024;
mtd_dev.mtd_ops = &my_mtd_ops;
mtd_device_register(&mtd_dev, "nand0");
}📝 本节小结
本节介绍了 MTD 内存技术设备驱动,包括双接口模型、几何信息、页级操作、Block 设备桥梁等核心概念。