我的首个驱动移植——flash驱动(一)

本文介绍了Linux中的MTD子系统如何为Flash硬件提供抽象接口,分为设备节点、MTD设备层、MTD原始设备层和Flash硬件驱动层四个层次。MTD设备层通过原始设备层接口注册设备,而驱动开发则利用这些接口操作Flash硬件。文章还提到了MTD中重要的数据结构,如mtd_info和mtd_part。
摘要由CSDN通过智能技术生成

二、Linux中Flash硬件知识(略)

二、Linux中Flash软件知识

  1. Linux MTD子系统:

      在Linux系统中,提供了MTD(内存技术设备)子系统来建立Flash针对Linux的统一、抽象的接口。MTD子系统将上层文件系统与底层Flash硬件进行了隔离,使Flash驱动开发者无需再关心Flash作为字符设备或者块设备与Linux内核的接口。MTD将Linux系统Flash设备驱动及接口分成了4个层次,如图所示,从上往下分别为:设备节点、MTD设备层、MTD原始设备层和Flash硬件驱动层。


    设备节点:用户在/dev目录下使用mknod命令建立MTD字符设备节点(主设备号为90),或者MTD块设备节点(主设备号为31),使用该设备节点即可访问MTD设备。
               mknod [optionsname {bc} major minor 
               b:块专用文件             c:字符专用文件
    MTD设备层:基于MTD原始设备层,系统将MTD设备可以定义为MTD字符设备(在/mtd/mtdchar.c中实现)和MTD块设备(在/mtd/mtdblock.c中实现)。

    MTD原始设备层:MTD原始设备层由两个部分组成,分别是MTD原始设备的通用代码和各个特定的Flash的数据,如分区信息。

    Flash硬件驱动层:Flash硬件驱动层负责对Flash硬件的读、写和擦除操作。MTD设备的Nor Flash芯片驱动一般位于drivers/mtd/chips/子目录下,Nand Flash芯片的驱动则位于drivers/mtd/nand/子目录下。

    综合上述我们可知,MTD子系统已经对Flash设备对于上层的应用进行了封装,我们在写硬件驱动的时候直接调用MTD原始设备层提供的接口函数做相应的操作即可。那么,对于MTD设备层,MTD原始设备层提供了哪些接口呢?对于Flash硬件驱动层,MTD原始设备层又提供了哪些接口呢?下面开始了解。
  2. MTD子系统接口:

      在MTD子系统中,MTD设备层、MTD原始设备层和Flash硬件驱动层之间的接口关系如下图所示:

    从上图可知,MTD设备层是通过原始设备层提供的接口来注册MTD字符设备或MTD块设备的,同样,驱动工程师要编写的Flash硬件驱动也是通过原始设备层提供的接口来添加MTD设备和MTD分区的,分别如下:

    //使用这两个接口函数进行添加和删除MTD设备
    int add_mtd_device(struct mtd_info *mtd);
    int del_mtd_device(struct mtd_info *mtd)

     

    //使用这两个接口函数进行添加和删除MTD分区
    int add_mtd_partitions(struct mtd_info *master, struct mtd_partition *parts, int nbparts);
    int del_mtd_partitions(struct mtd_info *master)



    在MTD中,一个MTD原始设备用mtd_info结构体来表示,定义在include/linux/mtd/mtd.h中;一个MTD原始设备分区用mtd_part结构体来表示,定义在drivers/mtd/mtdpart.c中。其中每个分区也被认为是一个mtd_info,比如:有一个MTD原始设备,上面有3个分区,那么将共有3个mtd_info,而这3个mtd_info的指针将被存放在mtd_table的数组中进行管理,定义在drivers/mtd/mtdcore.h中,如下所示:

    extern struct mtd_info *mtd_table[MAX_MTD_DEVICES];//最多有MAX_MTD_DEVICES(默认定义为32)个设备



    1. MTD子系统中重要的一些数据结构:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值