没有合适的资源?快使用搜索试试~ 我知道了~
Linux NAND FLASH 驱动1
需积分: 0 2 下载量 146 浏览量
2022-08-08
19:47:48
上传
评论
收藏 215KB DOCX 举报
温馨提示
试读
22页
硬件驱动层linux MTD 设备的驱动程序,根据不同的 MTD 设备他们存放在不同目录,如 NAND FLASH 驱 动 存 放 在 /driver/mtd/
资源详情
资源评论
资源推荐
这一章学习 NAND FLASH 驱动,和前面的 LCD 驱动一样, Linux 内核里面已经有了一
套代码是支持这类存储器的驱动,叫做 MTD(memory technologydevice 内存技术设备)。 他
帮我们做了很多工作,从而使增加新的内存设备驱动程序变得更简单。但是这一层代码看起
来就不怎么简单了。这一章我们先来了解一下 linux 内核的 MTD 子系统,然后再开始写我
们的 nand flash 驱动。
MTD 子系统
MTD 子系统是在硬件和文件系统层之间的提供了一个抽象的接口,用来访问内存设备
(如: ROM、 flash)的中间层,它将内存设备的共有特性抽取出来,从而使增加新的内存
设备驱动程序变得更简单。MTD 的源代码都在/drivers/mtd 目录中。MTD 中间层细分为四
层,按从上到下依次为:设备节点、 MTD 设备层、 MTD 原始设备层和硬件驱动层。 MTD
中间层层次结构如图 11.1 所示 :
MTD 子系统
MTD 子系统是在硬件和文件系统层之间的提供了一个抽象的接口,用来访问内存设备
(如: ROM、 flash)的中间层,它将内存设备的共有特性抽取出来,从而使增加新的内存
设备驱动程序变得更简单。
MTD 的源代码都在/drivers/mtd 目录中。
MTD 中间层细分为四层,按从上到下依次为:设备节点、 MTD 设备层、 MTD 原始设备
层和硬件驱动层。 MTD 中间层层次结构如图 11.1 所示 :
设备节点层
通过 mknod 在/dev 子目录下建立 MTD 字符设备(规定主设备号 90)和块设备号
(规定的主设备号 31 )
MTD 设备层
这 一 层 分 为 MTD 字 符 设 备 和 MTD 块 设 备 。 MTD 字 符 设 备 的 定 义 在
driver/mtd/mtdchar.c 中,通过 file_operations mtd_fops 结构体,注册 lseek,open ,
close,read,write,ioctl 等 设 备 操 作 函 数 ; MTD 块 设 备 的 定 义 在
driver/mtd/mtdblock.c 中 , 与 字 符 设 备 相 似 , 注 册 设 备 操 作 函 数 的 结 构 体 为
mtd_blktrans_ops,描述块设备的结构体则为 mtdblk_dev。
MTD 原始层
MTD 原始层由两部分组成,一部分是 MTD 原始设备的通用代码,另一部分是各个特
定的 FLASH 的数据,例如分区。
Commented [w1]: 当前 rtu 下没有 MTD 字符设备
硬件驱动层
linux MTD 设备的驱动程序,根据不同的 MTD 设备他们存放在不同目录,如 NAND
FLASH 驱 动 存 放 在 /driver/mtd/nand, 而 NOR FLASH 存 放 于/driver/mtd/chips.
Linux MTD 系统接口
Linux MTD 各层的接口函数和关键结构体如图 11.2 所示:我们这一小节先来看一下一
些结构体,具体的函数我们下一节再结合一个内核包含的 nand flash 驱动来分析。这一节
对下一节也是很有紧密联系的哦。
MTD 原始设备层
先从 MTD 原始设备层看,因为他正好处于中间层,承上启下,比较关键。先来看第一
个结构体: mtd_info
mtd_info 结构体
mtd_info 是表示 MTD 原始设备的结构体,每个分区也被认为是一个 mtd_info.例如有
一个 MTD 设备,他有两个分区,系统认为他有两个 mtd_info。这些 mtd_info 的指针存放
在名为 mtd_table 的数组里。
mtd_info 在 include/linux/mtd/mtd.h 里:
struct mtd_info {
u_char type; /* MTD 类型,包括 MTD_NORFLASH,MTD_NANDFLASH
等(可参考 mtd-abi.h) */
uint32_t flags; /* MTD 属性标志, MTD_WRITEABLE,MTD_NO_ERASE 等
(可参考 mtd-abi.h) */
uint64_t size; /* MTD 设备的大小 */
uint32_t erasesize; /* MTD 设备的擦除单元大小,对于 NandFlash 来说就
是 Block 的大小 */
uint32_t writesize; /* 写大小,对 nandFlash 为一页 */
uint32_t oobsize; /* OOB 字节数 */
uint32_t oobavail; /* 可用的 OOB 字节数 */
unsigned int erasesize_shift; /* 默认为 0,不重要 */
unsigned int writesize_shift;/* 默认为 0,不重要 */
unsigned int erasesize_mask; /* 默认为 1 ,不重要 */
unsigned int writesize_mask; /* 默认为 1 ,不重要 */
const char *name; /* 名字, 不重要*/
int index; /* 索引号,不重要 */
int numeraseregions; /* 通常为 1 */
struct mtd_erase_region_info *eraseregions;/* 可变擦除区域 */
void *priv;/*设备私有数据指针,对 NandFlash 来说指 nand_chip 结构体*/
struct module *owner; /* 一般设置为 THIS_MODULE */
/* 擦除函数 */
int (*erase) (struct mtd_info *mtd, struct erase_info *instr);
/* 读写 flash 函数 */
int (*read) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen,u_char *buf);
int (*write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, constu_char
*buf);
/* 带 oob 读写 Flash 函数 */
int (*read_oob) (struct mtd_info *mtd, loff_t from,struct mtd_oob_ops *ops);
int (*write_oob) (struct mtd_info *mtd, loff_t to,struct mtd_oob_ops *ops);
int (*get_fact_prot_info) (struct mtd_info *mtd, struct otp_info *buf, size_t len);
剩余21页未读,继续阅读
莉雯Liwen
- 粉丝: 22
- 资源: 306
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0